diff --git a/README.md b/README.md index dade37afd8e..5a182f9ddfd 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ [![forthebadge](http://forthebadge.com/images/badges/contains-technical-debt.svg)](http://forthebadge.com) [![forthebadge](http://forthebadge.com/images/badges/fuck-it-ship-it.svg)](http://forthebadge.com) -[Website](http://www.nanotrasen.se/) - [Code](https://github.com/ParadiseSS13/Paradise) - [Discord](https://discordapp.com/invite/gXZMc?utm_source=Discord%20Widget&utm_medium=Connect) +[Website](https://nanotrasen.se/) - [Code](https://github.com/ParadiseSS13/Paradise) - [Discord](https://discordapp.com/invite/gXZMc?utm_source=Discord%20Widget&utm_medium=Connect) --- diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql index a5991c9bcb9..8cf94d61835 100644 --- a/SQL/paradise_schema.sql +++ b/SQL/paradise_schema.sql @@ -88,6 +88,7 @@ CREATE TABLE `characters` ( `socks` mediumtext NOT NULL, `body_accessory` mediumtext NOT NULL, `gear` mediumtext NOT NULL, + `autohiss` tinyint(1) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=18747 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; @@ -265,7 +266,7 @@ CREATE TABLE `player` ( `UI_style` varchar(10) DEFAULT 'Midnight', `UI_style_color` varchar(7) DEFAULT '#ffffff', `UI_style_alpha` smallint(4) DEFAULT '255', - `be_role` mediumtext NOT NULL, + `be_role` mediumtext, `default_slot` smallint(4) DEFAULT '1', `toggles` mediumint(8) DEFAULT '383', `sound` mediumint(8) DEFAULT '31', diff --git a/SQL/paradise_schema_prefixed.sql b/SQL/paradise_schema_prefixed.sql index 845b8702fcd..d1b62ae3767 100644 --- a/SQL/paradise_schema_prefixed.sql +++ b/SQL/paradise_schema_prefixed.sql @@ -88,6 +88,7 @@ CREATE TABLE `SS13_characters` ( `socks` mediumtext NOT NULL, `body_accessory` mediumtext NOT NULL, `gear` mediumtext NOT NULL, + `autohiss` tinyint(1) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=18747 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; @@ -264,7 +265,7 @@ CREATE TABLE `SS13_player` ( `UI_style` varchar(10) DEFAULT 'Midnight', `UI_style_color` varchar(7) DEFAULT '#ffffff', `UI_style_alpha` smallint(4) DEFAULT '255', - `be_role` mediumtext NOT NULL, + `be_role` mediumtext, `default_slot` smallint(4) DEFAULT '1', `toggles` mediumint(8) DEFAULT '383', `sound` mediumint(8) DEFAULT '31', diff --git a/_maps/cyberiad.dm b/_maps/cyberiad.dm index 434cc79eb52..3e03a5036e7 100644 --- a/_maps/cyberiad.dm +++ b/_maps/cyberiad.dm @@ -23,7 +23,7 @@ z7 = empty #include "map_files\cyberiad\z7.dmm" #define MAP_FILE "cyberiad.dmm" - #define MAP_NAME "NSS Cyberiad" + #define MAP_NAME "Cyberiad" #define MAP_TRANSITION_CONFIG list(\ DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL,STATION_CONTACT,REACHABLE,AI_OK)),\ DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\ diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index e1de20e2b01..6e425b0e31f 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -544,9 +544,9 @@ "akx" = (/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/auxsolarport) "aky" = (/turf/simulated/wall/r_wall,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "akz" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "hosprivacy"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/security/hos) -"akA" = (/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/security,/obj/item/clothing/mask/gas/sechailer,/obj/item/clothing/head/helmet/space/hardsuit/security,/obj/item/clothing/shoes/magboots,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/security/brig) +"akA" = (/obj/structure/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/security,/obj/item/clothing/mask/gas/sechailer,/obj/item/clothing/head/helmet/space/hardsuit/security,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/security/brig) "akB" = (/obj/structure/dispenser/oxygen,/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/brig) -"akC" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/security,/obj/item/clothing/mask/gas/sechailer,/obj/item/clothing/head/helmet/space/hardsuit/security,/obj/item/clothing/shoes/magboots,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/security/brig) +"akC" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/structure/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/security,/obj/item/clothing/mask/gas/sechailer,/obj/item/clothing/head/helmet/space/hardsuit/security,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/security/brig) "akD" = (/turf/simulated/wall,/area/security/brig) "akE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/security/brig) "akF" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/security/brig) @@ -569,7 +569,7 @@ "akW" = (/obj/item/clothing/head/festive,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/fore) "akX" = (/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/maintenance/fore) "akY" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "hosprivacy"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/security/hos) -"akZ" = (/obj/structure/table,/obj/item/weapon/contraband/poster,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fore) +"akZ" = (/obj/structure/table,/obj/item/weapon/poster/random_contraband,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fore) "ala" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/table,/obj/item/weapon/stock_parts/manipulator,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fore) "alb" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "alc" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/eastright{base_state = "right"; dir = 8; icon_state = "right"; name = "Fitness Ring"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) @@ -595,7 +595,7 @@ "alw" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes,/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "alx" = (/obj/structure/table,/obj/item/stack/medical/ointment{pixel_x = 3; pixel_y = -2},/obj/item/stack/medical/bruise_pack{pixel_x = -3; pixel_y = 2},/obj/item/weapon/reagent_containers/syringe/epinephrine,/obj/item/weapon/storage/secure/safe{pixel_x = 6; pixel_y = 28},/obj/item/weapon/restraints/handcuffs/cable/pink,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aly" = (/obj/item/weapon/storage/secure/safe{pixel_x = 6; pixel_y = 28},/obj/item/weapon/kitchen/rollingpin,/obj/structure/closet/crate,/obj/item/clothing/suit/xenos,/obj/item/clothing/suit/monkeysuit,/obj/item/clothing/head/xenos,/obj/item/clothing/mask/gas/monkeymask,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"alz" = (/obj/item/stack/sheet/cardboard,/obj/machinery/light_construct/small{dir = 1},/obj/structure/closet/crate,/obj/item/weapon/coin/silver,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/watertank,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"alz" = (/obj/item/stack/sheet/cardboard,/obj/machinery/light_construct/small{dir = 1},/obj/structure/closet/crate,/obj/item/weapon/coin/silver,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/watertank,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/poster/random_contraband,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "alA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/carpet,/area/security/hos) "alB" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/brig) "alC" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light/small,/obj/machinery/camera{c_tag = "Security - EVA Storage"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/brig) @@ -740,7 +740,7 @@ "aol" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/light{dir = 1},/turf/simulated/floor/engine,/area/security/podbay) "aom" = (/obj/machinery/door/poddoor/multi_tile/four_tile_ver{id_tag = "secpodbay"},/obj/structure/spacepoddoor,/turf/simulated/floor/engine,/area/security/podbay) "aon" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/closet/secure_closet/security,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden) -"aoo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/range) +"aoo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/range) "aop" = (/obj/structure/rack{pixel_y = 2},/obj/item/weapon/gun/energy/laser/practice{pixel_x = 2; pixel_y = -2},/obj/item/weapon/gun/energy/laser/practice{pixel_x = -3; pixel_y = 3},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/camera{c_tag = "Firing Range"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/security/range) "aoq" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/fore) "aor" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/camera{c_tag = "Brig - Infirmary"; dir = 1; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/closet/secure_closet/brigdoc,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitered"},/area/security/brig) @@ -816,7 +816,7 @@ "apJ" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/door_control{desc = "A remote control-switch for the pod doors."; id = "secpodbay"; name = "Pod Door Control"; pixel_x = 0; pixel_y = 24; req_access_txt = "71"},/turf/simulated/floor/engine,/area/security/podbay) "apK" = (/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/engine,/area/security/podbay) "apL" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/range) -"apM" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/range) +"apM" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/range) "apN" = (/obj/item/target,/obj/item/target,/obj/item/target/alien,/obj/item/target/alien,/obj/item/target/alien,/obj/item/target/syndicate,/obj/item/target/syndicate,/obj/item/target/syndicate,/obj/structure/closet/crate/secure{desc = "A secure crate containing various materials for building a customised test-site."; name = "Firing Range Gear Crate"; req_access_txt = "1"},/obj/machinery/power/apc{cell_type = 2500; dir = 4; name = "Shooting Range APC"; pixel_x = 24; pixel_y = 0},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/security/range) "apO" = (/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fore) "apP" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fore) @@ -853,7 +853,7 @@ "aqu" = (/mob/living/simple_animal/bot/cleanbot{name = "Mopfficer Sweepsky"; on = 0},/turf/simulated/floor/plating,/area/maintenance/fore) "aqv" = (/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,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aqw" = (/obj/structure/closet/crate,/obj/item/bodybag,/obj/item/device/radio,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fore) -"aqx" = (/obj/structure/table/reinforced,/obj/machinery/light_construct/small{dir = 8},/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/structure/window/reinforced,/obj/item/weapon/contraband/poster/legit,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"aqx" = (/obj/structure/table/reinforced,/obj/machinery/light_construct/small{dir = 8},/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/structure/window/reinforced,/obj/item/weapon/poster/random_official,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aqy" = (/obj/structure/table/reinforced,/obj/item/weapon/folder,/obj/item/weapon/folder,/obj/machinery/door/window/westleft{base_state = "right"; dir = 2; icon_state = "right"; name = "windoor"; req_access_txt = "0"},/obj/item/weapon/book/manual/engineering_hacking,/obj/item/device/tape/random,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aqz" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced,/obj/item/weapon/stock_parts/cell/crap,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aqA" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced,/obj/item/weapon/firealarm_electronics,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) @@ -889,7 +889,7 @@ "are" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/turf/simulated/floor/plasteel,/area/security/main) "arf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool/bed/chair{dir = 8},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main) "arg" = (/obj/machinery/power/apc{cell_type = 5000; dir = 4; name = "Security Office APC"; pixel_x = 24; pixel_y = 0},/obj/structure/cable/yellow,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main) -"arh" = (/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access_txt = "0"; req_one_access_txt = "1;4"},/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,/area/security/range) +"arh" = (/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access_txt = "0"; req_one_access_txt = "1;4"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/security/range) "ari" = (/obj/machinery/door/airlock/maintenance{name = "Storage Room"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fore) "arj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/maintenance/fore) "ark" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light_switch{pixel_x = -26},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) @@ -952,15 +952,15 @@ "asp" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main) "asq" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Security Delivery"; req_access_txt = "1"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/security/main) "asr" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 8; location = "Security"},/obj/structure/plasticflaps{opacity = 1},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/security/main) -"ass" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/maintenance/fore) -"ast" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fore) -"asu" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"asv" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/maintenance/fore) -"asw" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "1;4;38;12"},/turf/simulated/floor/plating,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) -"asx" = (/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,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) -"asy" = (/obj/structure/cable/yellow{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 = 6},/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) -"asz" = (/obj/structure/cable/yellow{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/crew_quarters/fitness{name = "\improper Recreation Area"}) -"asA" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) +"ass" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/maintenance/fore) +"ast" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/maintenance/fore) +"asu" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "1;4;38;12"},/turf/simulated/floor/plating,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) +"asv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) +"asw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) +"asx" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) +"asy" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plating,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) +"asz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) +"asA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "asB" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 2; initialize_directions = 11},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "asC" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "asD" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 2; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) @@ -1023,7 +1023,7 @@ "atI" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/weapon/pen,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor/plasteel,/area/security/main) "atJ" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/wall,/area/security/brig) "atK" = (/turf/simulated/wall/r_wall,/area/security/main) -"atL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fore) +"atL" = (/obj/machinery/door/airlock/glass{name = "space-bridge access"},/obj/machinery/door_control{id = "supplybridge"; name = "Shuttle Bay Space Bridge Control"; pixel_x = 0; pixel_y = 27; req_access_txt = "0"; req_one_access_txt = "0"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "atM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass{name = "Cryodorms"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "atN" = (/obj/structure/closet/lasertag/red,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "atO" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/ears/earmuffs,/obj/item/clothing/accessory/red,/obj/item/clothing/head/soft/red,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) @@ -1087,7 +1087,7 @@ "auU" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden) "auV" = (/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/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden) "auW" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Warden"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden) -"auX" = (/obj/structure/table/reinforced,/obj/machinery/door/window/westleft{base_state = "right"; dir = 4; icon_state = "right"; name = "Outer Window"; req_access_txt = "0"},/obj/machinery/door/window/brigdoor{dir = 8; name = "Brig Control Desk"; req_access_txt = "3"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/item/weapon/folder/red,/obj/item/weapon/folder/red,/obj/item/weapon/contraband/poster/legit,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden) +"auX" = (/obj/structure/table/reinforced,/obj/machinery/door/window/westleft{base_state = "right"; dir = 4; icon_state = "right"; name = "Outer Window"; req_access_txt = "0"},/obj/machinery/door/window/brigdoor{dir = 8; name = "Brig Control Desk"; req_access_txt = "3"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/item/weapon/folder/red,/obj/item/weapon/folder/red,/obj/item/weapon/poster/random_official,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden) "auY" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden) "auZ" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/main) "ava" = (/obj/spacepod/sec,/turf/simulated/floor/engine,/area/security/podbay) @@ -1104,7 +1104,7 @@ "avl" = (/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/main) "avm" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/main) "avn" = (/obj/item/weapon/phone{desc = "Supposedly a direct line to NanoTrasen Central Command. It's not even plugged in."; pixel_x = -3; pixel_y = 3},/obj/item/weapon/cigbutt/cigarbutt{pixel_x = 5; pixel_y = -1},/obj/structure/table/woodentable,/obj/machinery/firealarm{dir = 4; pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/main) -"avo" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) +"avo" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/light,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "avp" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/effect/landmark{name = "JoinLateCryo"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "avq" = (/obj/machinery/cryopod,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "avr" = (/turf/simulated/wall,/area/crew_quarters/mrchangs) @@ -1112,7 +1112,7 @@ "avt" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/crew_quarters/sleep) "avu" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Recreation Area"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/crew_quarters/sleep) "avv" = (/turf/simulated/wall,/area/crew_quarters/sleep) -"avw" = (/obj/structure/closet,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/starboard) +"avw" = (/obj/structure/closet,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/poster/random_contraband,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/starboard) "avx" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/storage/primary) "avy" = (/obj/structure/rack,/obj/item/weapon/extinguisher,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/starboard) "avz" = (/obj/structure/rack,/obj/effect/landmark/costume,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/starboard) @@ -1132,22 +1132,22 @@ "avN" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/pod_4) "avO" = (/obj/item/device/radio/intercom/department/security,/turf/simulated/wall/r_wall,/area/security/podbay) "avP" = (/obj/machinery/computer/podtracker,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/mechanic_workshop) -"avQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"avR" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/light,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"avS" = (/obj/machinery/door/airlock/glass{name = "space-bridge access"},/obj/machinery/door_control{id = "supplybridge"; name = "Shuttle Bay Space Bridge Control"; pixel_x = 0; pixel_y = 27; req_access_txt = "0"; req_one_access_txt = "0"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"avQ" = (/obj/machinery/door/airlock/glass{name = "space-bridge access"; req_one_access_txt = "48;50"},/obj/machinery/door_control{id = "supplybridge"; name = "Shuttle Bay Space Bridge Control"; pixel_x = 0; pixel_y = 27; req_access_txt = "0"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"avR" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/light,/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"avS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "avT" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "avU" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "avV" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"avW" = (/obj/machinery/door/airlock/glass{name = "space-bridge access"; req_one_access_txt = "48;50"},/obj/machinery/door_control{id = "supplybridge"; name = "Shuttle Bay Space Bridge Control"; pixel_x = 0; pixel_y = 27; req_access_txt = "0"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"avX" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/light,/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"avY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"avZ" = (/obj/machinery/door/airlock/maintenance_hatch{name = "Supply Bay Bridge Access"; req_access_txt = "0"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"awa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"avW" = (/obj/machinery/door/airlock/maintenance_hatch{name = "Supply Bay Bridge Access"; req_access_txt = "0"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"avX" = (/obj/effect/spawner/lootdrop{loot = list(/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/item/weapon/cigbutt,/obj/item/trash/cheesie,/obj/item/trash/candy,/obj/item/trash/chips,/obj/item/trash/pistachios,/obj/item/trash/plate,/obj/item/trash/popcorn,/obj/item/trash/raisins,/obj/item/trash/sosjerky,/obj/item/trash/syndi_cakes); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"avY" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"avZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) +"awa" = (/obj/machinery/door/airlock/maintenance{name = "Storage Room"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "awb" = (/obj/machinery/conveyor{dir = 8; id = "QMLoad2"; movedir = 8},/obj/structure/plasticflaps,/turf/simulated/floor/plating,/area/quartermaster/storage) -"awc" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"awc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/maintenance_hatch{name = "Supply Bay Bridge Access"; req_access_txt = "0"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "awd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/landmark/start{name = "Warden"},/obj/structure/stool/bed/chair/office/dark,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden) -"awe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"awf" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"awe" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/gravitygenerator) +"awf" = (/obj/structure/disposalpipe/sortjunction{dir = 1; icon_state = "pipe-j2s"; sortType = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/fore) "awg" = (/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/fore) "awh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/maintenance{name = "Brig Maintenance"; req_access_txt = "0"; req_one_access_txt = "63;12"},/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fore) "awi" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/camera{c_tag = "Labor Shuttle Control Desk"; dir = 4},/obj/machinery/computer/shuttle/labor,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) @@ -1177,9 +1177,9 @@ "awG" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/main) "awH" = (/obj/structure/stool/bed/chair,/obj/machinery/computer/security/telescreen{desc = "Used for watching proceedings in the interrogation room."; dir = 1; layer = 4; name = "interrogation monitor"; network = list("interrogation"); pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/main) "awI" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/structure/table/woodentable,/obj/item/device/radio/intercom{broadcasting = 0; frequency = 1424; listening = 1; name = "Interrogation Intercom"; pixel_x = 0; pixel_y = -31},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/main) -"awJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fore) -"awK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Storage Room"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) -"awL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) +"awJ" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/highsecurity{name = "Gravity Generator Foyer"; req_access_txt = "10"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/gravitygenerator) +"awK" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fore) +"awL" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering) "awM" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/starboard) "awN" = (/obj/machinery/light/small{dir = 8},/obj/structure/chickenstatue,/turf/simulated/floor/wood,/area/crew_quarters/mrchangs) "awO" = (/obj/machinery/vending/chinese,/turf/simulated/floor/wood,/area/crew_quarters/mrchangs) @@ -1202,7 +1202,7 @@ "axf" = (/obj/structure/rack,/obj/item/device/lock_buster,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/security/warden) "axg" = (/obj/machinery/door/airlock/external{req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/starboard) "axh" = (/turf/simulated/wall/r_wall,/area/maintenance/starboard) -"axi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/maintenance_hatch{name = "Supply Bay Bridge Access"; req_access_txt = "0"; req_one_access_txt = "0"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"axi" = (/obj/structure/grille,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/maintenance/starboard) "axj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/effect/landmark{name = "JoinLateCryo"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "axk" = (/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "supplybridge"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "axl" = (/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "supplybridge"},/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHWEST)"; icon_state = "warnplate"; dir = 10},/area/maintenance/fpmaint2{name = "Port Maintenance"}) @@ -1272,7 +1272,7 @@ "ayx" = (/obj/machinery/space_heater,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/maintenance/starboard) "ayy" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/turf/simulated/floor/plating/airless,/area/space) "ayz" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/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/effect/decal/cleanable/cobweb,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"ayA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"ayA" = (/obj/structure/grille,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering) "ayB" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "ayC" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plating,/area/hallway/secondary/entry{name = "Arrivals"}) "ayD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) @@ -1341,7 +1341,7 @@ "azO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "azP" = (/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/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;50"},/turf/simulated/floor/plating,/area/maintenance/fore) "azQ" = (/obj/item/stack/sheet/cardboard,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"azR" = (/obj/structure/disposalpipe/sortjunction{dir = 1; icon_state = "pipe-j2s"; sortType = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/fore) +"azR" = (/obj/machinery/door/airlock/maintenance{name = "Cargo Bay Warehouse Maintenance"; req_access_txt = "0"; req_one_access_txt = "48;50"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/quartermaster/sorting{name = "\improper Warehouse"}) "azS" = (/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"}) "azT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/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"}) "azU" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/siberia) @@ -1389,7 +1389,7 @@ "aAK" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/obj/structure/table/woodentable,/obj/item/weapon/paper,/turf/simulated/floor/wood,/area/crew_quarters/sleep) "aAL" = (/obj/machinery/door/airlock/maintenance{name = "Storage Room"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/starboard) "aAM" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/hallway/primary/port) -"aAN" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/highsecurity{name = "Gravity Generator Foyer"; req_access_txt = "10"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/gravitygenerator) +"aAN" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/window/brigdoor{dir = 1; id = "Holding Cell"; name = "Holding Cell"; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) "aAO" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/starboard) "aAP" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aAQ" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/mining) @@ -1458,7 +1458,7 @@ "aCb" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 4; location = "Engineering"},/obj/structure/plasticflaps{opacity = 1},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/maintenance/starboard) "aCc" = (/obj/machinery/door/window/southright{dir = 4; name = "Engineering Deliveries"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering) "aCd" = (/obj/structure/sign/securearea{pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/engine/engineering) -"aCe" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering) +"aCe" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering) "aCf" = (/obj/machinery/light_switch{pixel_x = 23},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/shower{dir = 8; icon_state = "shower"; name = "emergency shower"; tag = "icon-shower (WEST)"},/obj/structure/sign/securearea{pixel_y = 32},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/engine/engineering) "aCg" = (/turf/simulated/wall/r_wall,/area/engine/engineering) "aCh" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/engine/engineering) @@ -1466,7 +1466,7 @@ "aCj" = (/obj/structure/grille,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering) "aCk" = (/obj/structure/grille,/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/airless,/area/engine/engineering) "aCl" = (/obj/structure/grille,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering) -"aCm" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering) +"aCm" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel,/area/engine/engineering) "aCn" = (/obj/structure/closet/crate,/obj/item/stack/sheet/glass{amount = 10},/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/space) "aCo" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/mining) "aCp" = (/obj/structure/table,/turf/simulated/shuttle/floor,/area/shuttle/mining) @@ -1475,7 +1475,7 @@ "aCs" = (/turf/simulated/wall,/area/quartermaster/miningdock{name = "\improper Mining Office"}) "aCt" = (/obj/machinery/door/airlock/maintenance{name = "Mining Dock Maintenance"; req_access_txt = "48"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/quartermaster/miningdock{name = "\improper Mining Office"}) "aCu" = (/turf/simulated/wall,/area/quartermaster/sorting{name = "\improper Warehouse"}) -"aCv" = (/obj/machinery/door/airlock/maintenance{name = "Cargo Bay Warehouse Maintenance"; req_access_txt = "0"; req_one_access_txt = "48;50"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/quartermaster/sorting{name = "\improper Warehouse"}) +"aCv" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering) "aCw" = (/obj/structure/disposalpipe/segment,/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/fore) "aCx" = (/obj/structure/closet/secure_closet/freezer/money,/obj/item/clothing/head/bearpelt,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/security/nuke_storage) "aCy" = (/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/bluegrid{icon_state = "gcircuit"; luminosity = 2},/area/security/nuke_storage) @@ -1484,7 +1484,7 @@ "aCB" = (/obj/structure/filingcabinet,/obj/item/weapon/folder/documents,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/security/nuke_storage) "aCC" = (/turf/simulated/shuttle/floor,/area/shuttle/siberia) "aCD" = (/obj/machinery/mineral/labor_claim_console{machinedir = 1; pixel_x = 30; pixel_y = 0},/turf/simulated/shuttle/floor,/area/shuttle/siberia) -"aCE" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fore) +"aCE" = (/obj/machinery/alarm{pixel_y = 28},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) "aCF" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id_tag = "Secure Gate"; name = "brig shutters"},/turf/simulated/floor/plating,/area/security/brig) "aCG" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/door/window/brigdoor{dir = 1; id = "Cell 1"; name = "Cell 1"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) "aCH" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/preopen{id_tag = "Secure Gate"; name = "brig shutters"},/turf/simulated/floor/plating,/area/security/brig) @@ -1493,7 +1493,7 @@ "aCK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "innerbrig"; name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) "aCL" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass_security{id_tag = "innerbrig"; name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) "aCM" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/engine/engineering) -"aCN" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/door/window/brigdoor{dir = 1; id = "Holding Cell"; name = "Holding Cell"; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) +"aCN" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) "aCO" = (/turf/simulated/wall/r_wall,/area/security/detectives_office) "aCP" = (/obj/structure/grille,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/turf/simulated/floor/plating,/area/security/detectives_office) "aCQ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Detective's Office"; req_access = null; req_access_txt = "4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel,/area/security/detectives_office) @@ -1509,8 +1509,8 @@ "aDa" = (/obj/item/weapon/wrench,/turf/simulated/floor/plating,/area/maintenance/starboard) "aDb" = (/obj/structure/table,/obj/item/stack/packageWrap,/obj/item/weapon/wrench,/obj/machinery/light{dir = 8},/obj/item/weapon/hand_labeler,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering) "aDc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/engine/engineering) -"aDd" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/engine/engineering) -"aDe" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering) +"aDd" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fore) +"aDe" = (/obj/structure/disposalpipe/sortjunction{sortType = 4},/obj/effect/landmark/start{name = "Station Engineer"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/engine/engineering) "aDf" = (/obj/machinery/door/airlock/external{name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering) "aDg" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay) "aDh" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering) @@ -1534,8 +1534,8 @@ "aDz" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) "aDA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) "aDB" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) -"aDC" = (/obj/machinery/alarm{pixel_y = 28},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) -"aDD" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) +"aDC" = (/obj/machinery/camera/emp_proof{c_tag = "Fore Arm - Far"; dir = 8; network = list("Singulo")},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating/airless,/area/engine/engineering) +"aDD" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/engine/engineering) "aDE" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/security/nuke_storage) "aDF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/bluegrid{icon_state = "gcircuit"; luminosity = 2},/area/security/nuke_storage) "aDG" = (/obj/machinery/nuclearbomb,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/security/nuke_storage) @@ -1566,7 +1566,7 @@ "aEf" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/fore) "aEg" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fore) "aEh" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; layer = 2.9; name = "Bridge Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/bridge) -"aEi" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fore) +"aEi" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating/airless,/area/engine/engineering) "aEj" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aEk" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/item/weapon/bikehorn/rubberducky,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) "aEl" = (/obj/item/weapon/cigbutt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) @@ -1586,12 +1586,12 @@ "aEz" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/obj/machinery/camera{c_tag = "Engineering - Fore"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering) "aEA" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering) "aEB" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/engine/engineering) -"aEC" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/sortjunction{sortType = 4},/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor/plasteel,/area/engine/engineering) +"aEC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/spawner/lootdrop{loot = list(/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/item/weapon/cigbutt,/obj/item/trash/cheesie,/obj/item/trash/candy,/obj/item/trash/chips,/obj/item/trash/pistachios,/obj/item/trash/plate,/obj/item/trash/popcorn,/obj/item/trash/raisins,/obj/item/trash/sosjerky,/obj/item/trash/syndi_cakes); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aED" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering) "aEE" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/engine/engineering) "aEF" = (/obj/item/device/multitool,/turf/simulated/floor/plating/airless,/area/engine/engineering) "aEG" = (/obj/item/device/radio/off,/turf/simulated/floor/plating/airless,/area/engine/engineering) -"aEH" = (/obj/machinery/camera/emp_proof{c_tag = "Fore Arm - Far"; dir = 8; network = list("Singulo")},/turf/simulated/floor/plating/airless,/area/engine/engineering) +"aEH" = (/obj/structure/closet/crate,/obj/item/weapon/ore/glass,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) "aEI" = (/obj/machinery/door/airlock/shuttle{name = "Mining Shuttle Airlock"; req_access_txt = "0"},/obj/docking_port/mobile{dir = 8; dwidth = 3; height = 5; id = "mining"; name = "mining shuttle"; width = 7},/obj/docking_port/stationary{dir = 8; dwidth = 3; height = 5; id = "mining_home"; name = "mining shuttle bay"; width = 7},/turf/simulated/shuttle/plating,/area/shuttle/mining) "aEJ" = (/obj/machinery/door/airlock/external{name = "Mining Dock Airlock"; req_access = null; req_access_txt = "0"},/turf/simulated/floor/plating,/area/quartermaster/miningdock{name = "\improper Mining Office"}) "aEK" = (/turf/simulated/floor/plasteel,/area/quartermaster/miningdock{name = "\improper Mining Office"}) @@ -1605,7 +1605,7 @@ "aES" = (/obj/structure/disposalpipe/segment,/obj/machinery/door_control{id = "qm_mine_warehouse"; name = "Warehouse Door Control"; pixel_x = -24; pixel_y = 28; req_access_txt = "48"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"; tag = "loading"},/area/quartermaster/sorting{name = "\improper Warehouse"}) "aET" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) "aEU" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) -"aEV" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) +"aEV" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/carpet,/area/security/detectives_office) "aEW" = (/obj/structure/closet/crate,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) "aEX" = (/obj/structure/closet/crate{name = "Gold Crate"},/obj/item/stack/sheet/mineral/gold{pixel_x = -1; pixel_y = 5},/obj/item/stack/sheet/mineral/gold{pixel_y = 2},/obj/item/stack/sheet/mineral/gold{pixel_x = 1; pixel_y = -2},/obj/item/weapon/storage/belt/champion,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/security/nuke_storage) "aEY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/bluegrid{icon_state = "gcircuit"; luminosity = 2},/area/security/nuke_storage) @@ -1634,10 +1634,10 @@ "aFv" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/red,/obj/item/weapon/hand_labeler,/turf/simulated/floor/carpet,/area/security/detectives_office) "aFw" = (/obj/effect/landmark/start{name = "Detective"},/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/security/detectives_office) "aFx" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/computer/secure_data,/turf/simulated/floor/carpet,/area/security/detectives_office) -"aFy" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fore) -"aFz" = (/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,/area/maintenance/fore) -"aFA" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fore) -"aFB" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/landmark{name = "blobstart"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plating,/area/maintenance/fore) +"aFy" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fore) +"aFz" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/engine/engineering) +"aFA" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel,/area/engine/engineering) +"aFB" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/engine/engineering) "aFC" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id_tag = "briglockdown"; name = "brig shutters"},/turf/simulated/floor/plating,/area/security/brig) "aFD" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) "aFE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11},/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"}) @@ -1657,13 +1657,13 @@ "aFS" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/engine/engineering) "aFT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering) "aFU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/engine/engineering) -"aFV" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/engine/engineering) +"aFV" = (/obj/machinery/door/poddoor/shutters/preopen{id_tag = "Singularity"; name = "radiation shutters"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/item/clothing/glasses/meson,/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = ""},/area/engine/engineering) "aFW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering) "aFX" = (/obj/machinery/door/poddoor/shutters/preopen{id_tag = "Singularity"; name = "radiation shutters"},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = ""},/area/engine/engineering) "aFY" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = ""},/area/engine/engineering) "aFZ" = (/obj/machinery/camera/emp_proof{c_tag = "Fore Arm - Near"; dir = 4; network = list("Singulo")},/turf/space,/area/space) "aGa" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/construction/Storage{name = "Storage Wing"}) -"aGb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/spawner/lootdrop{loot = list(/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/item/weapon/cigbutt,/obj/item/trash/cheesie,/obj/item/trash/candy,/obj/item/trash/chips,/obj/item/trash/pistachios,/obj/item/trash/plate,/obj/item/trash/popcorn,/obj/item/trash/raisins,/obj/item/trash/sosjerky,/obj/item/trash/syndi_cakes); name = "maint grille or trash spawner"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"aGb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering) "aGc" = (/obj/item/weapon/ore/silver,/obj/item/weapon/ore/silver,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/quartermaster/miningdock{name = "\improper Mining Office"}) "aGd" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/camera{c_tag = "Mining Dock"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/quartermaster/miningdock{name = "\improper Mining Office"}) "aGe" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/simulated/wall,/area/quartermaster/miningdock{name = "\improper Mining Office"}) @@ -1673,7 +1673,7 @@ "aGi" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) "aGj" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) "aGk" = (/obj/structure/closet/crate/freezer,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) -"aGl" = (/obj/structure/closet/crate,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/ore/glass,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) +"aGl" = (/obj/item/stack/sheet/cardboard,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) "aGm" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/apc_electronics,/obj/item/weapon/stock_parts/cell{maxcharge = 2000},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) "aGn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/security/nuke_storage) "aGo" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 6},/area/security/nuke_storage) @@ -1692,12 +1692,12 @@ "aGB" = (/obj/machinery/door/airlock/security{name = "Court Cell"; req_access = null; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) "aGC" = (/obj/structure/table/woodentable,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/power/apc{dir = 8; name = "Detective APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/item/device/taperecorder{pixel_x = 3; pixel_y = 0},/obj/item/weapon/storage/box/evidence,/obj/item/device/flashlight/seclite,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) "aGD" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) -"aGE" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/carpet,/area/security/detectives_office) +"aGE" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) "aGF" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor/carpet,/area/security/detectives_office) "aGG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/security/detectives_office) "aGH" = (/obj/machinery/computer/med_data,/obj/machinery/newscaster{pixel_x = 28},/turf/simulated/floor/carpet,/area/security/detectives_office) -"aGI" = (/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,/area/maintenance/fore) -"aGJ" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fore) +"aGI" = (/obj/machinery/light/small,/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -26},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) +"aGJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/urinal{pixel_y = 29},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) "aGK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) "aGL" = (/obj/machinery/door/airlock{name = "Unisex Showers"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) "aGM" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/sleep) @@ -1709,7 +1709,7 @@ "aGS" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/crew_quarters/sleep) "aGT" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/obj/machinery/door_control{id = "Cabin6"; name = "Dorm Bolt Control"; normaldoorcontrol = 1; pixel_x = -25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/obj/effect/decal/cleanable/cobweb,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/carpet,/area/crew_quarters/sleep) "aGU" = (/obj/structure/closet/secure_closet/personal/cabinet,/obj/machinery/alarm{pixel_y = 23},/obj/item/clothing/under/suit_jacket/navy,/turf/simulated/floor/carpet,/area/crew_quarters/sleep) -"aGV" = (/obj/item/clothing/glasses/meson,/obj/structure/closet/crate,/obj/item/weapon/contraband/poster,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/starboard) +"aGV" = (/obj/item/clothing/glasses/meson,/obj/structure/closet/crate,/obj/item/weapon/poster/random_contraband,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/starboard) "aGW" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/starboard) "aGX" = (/obj/structure/reagent_dispensers/fueltank,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = -30; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering) "aGY" = (/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/engine/engineering) @@ -1717,9 +1717,9 @@ "aHa" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/engine/engineering) "aHb" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/construction/Storage{name = "Storage Wing"}) "aHc" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/engine/engineering) -"aHd" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/engine/engineering) -"aHe" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/engine/engineering) -"aHf" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/engine/engineering) +"aHd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) +"aHe" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 2; initialize_directions = 11},/obj/structure/urinal{pixel_y = 29},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) +"aHf" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warningcorner"; tag = "icon-warningcorner (EAST)"},/area/engine/engineering) "aHg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering) "aHh" = (/obj/machinery/door/poddoor/shutters/preopen{id_tag = "Singularity"; name = "radiation shutters"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = ""},/area/engine/engineering) "aHi" = (/obj/machinery/power/rad_collector{anchored = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = ""},/area/engine/engineering) @@ -1727,7 +1727,7 @@ "aHk" = (/turf/simulated/wall,/area/construction) "aHl" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/construction) "aHm" = (/obj/structure/closet/crate,/obj/item/weapon/coin/silver,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"aHn" = (/obj/structure/closet,/obj/item/weapon/contraband/poster,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"aHn" = (/obj/structure/closet,/obj/item/weapon/poster/random_contraband,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aHo" = (/obj/structure/closet/crate,/turf/simulated/shuttle/floor,/area/shuttle/mining) "aHp" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/shuttle/mining) "aHq" = (/obj/structure/ore_box,/turf/simulated/shuttle/floor,/area/shuttle/mining) @@ -1737,7 +1737,7 @@ "aHu" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) "aHv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) "aHw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/landmark/start{name = "Cargo Technician"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) -"aHx" = (/obj/item/stack/sheet/cardboard,/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 = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) +"aHx" = (/obj/machinery/power/grounding_rod{anchored = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering) "aHy" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/light_construct/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) "aHz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/wall/r_wall,/area/security/nuke_storage) "aHA" = (/obj/structure/sign/securearea,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/wall/r_wall,/area/security/nuke_storage) @@ -1763,16 +1763,16 @@ "aHU" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/flasher_button{id = "holdingflash"; name = "holding cell flasher button"; pixel_x = 23; pixel_y = 23; req_access_txt = "1"},/obj/machinery/camera{c_tag = "Brig - Desk"; dir = 8; network = list("SS13")},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29; pixel_y = -2},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) "aHV" = (/obj/machinery/requests_console{department = "Detective's office"; pixel_x = -30; pixel_y = 0},/obj/structure/table/woodentable,/obj/machinery/light/small{dir = 8},/obj/item/weapon/book/manual/security_space_law,/obj/item/device/camera{desc = "A one use - polaroid camera. 30 photos left."; name = "detective's camera"; pictures_left = 30},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) "aHW" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) -"aHX" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) -"aHY" = (/obj/machinery/light/small,/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -26},/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{icon_state = "grimy"},/area/security/detectives_office) -"aHZ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) +"aHX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"aHY" = (/obj/structure/closet/crate/internals,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) +"aHZ" = (/obj/machinery/door/airlock/maintenance{name = "Detective Maintenance"; req_access_txt = "4"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/security/detectives_office) "aIa" = (/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},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) "aIb" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; layer = 2.9; name = "Bridge Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/bridge) "aIc" = (/obj/structure/toilet{pixel_y = 8},/obj/machinery/light/small{dir = 8},/obj/machinery/newscaster{pixel_x = 0; pixel_y = -32},/obj/machinery/door_control{id = "Toilet3"; name = "Lock Control"; normaldoorcontrol = 1; pixel_x = -25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) "aId" = (/obj/machinery/door/airlock{id_tag = "Toilet3"; name = "Unit 3"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) -"aIe" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) -"aIf" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/urinal{pixel_y = 29},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) -"aIg" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 2; initialize_directions = 11},/obj/structure/urinal{pixel_y = 29},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) +"aIe" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) +"aIf" = (/obj/structure/lattice,/turf/space,/area/engine/engineering) +"aIg" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/fore) "aIh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) "aIi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) "aIj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) @@ -1794,13 +1794,13 @@ "aIz" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering Storage"; req_access_txt = "32"},/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{icon_state = "bot"; dir = 1},/area/engine/engineering) "aIA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/engine/engineering) "aIB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/engine/engineering) -"aIC" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warningcorner"; tag = "icon-warningcorner (EAST)"},/area/engine/engineering) +"aIC" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/fore) "aID" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering) "aIE" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering) "aIF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/engine/engineering) "aIG" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/construction) "aIH" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; layer = 2.9; name = "Bridge Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/bridge) -"aII" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"aII" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/fore) "aIJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aIK" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/mining) "aIL" = (/obj/structure/shuttle/engine/propulsion/burst,/obj/structure/window/reinforced{dir = 1; layer = 2.9},/turf/simulated/shuttle/plating,/area/shuttle/mining) @@ -1813,7 +1813,7 @@ "aIS" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "loadingarea"},/area/quartermaster/sorting{name = "\improper Warehouse"}) "aIT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door_control{id = "qm_warehouse"; name = "Warehouse Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "50"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) "aIU" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/stack/sheet/cardboard,/obj/item/stack/rods{amount = 50},/obj/item/weapon/paper,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) -"aIV" = (/obj/structure/closet/crate/internals,/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) +"aIV" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/fore) "aIW" = (/obj/machinery/power/apc{dir = 4; name = "Warehouse APC"; pixel_x = 27; pixel_y = 0},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) "aIX" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/construction/Storage{name = "Storage Wing"}) "aIY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/construction/Storage{name = "Storage Wing"}) @@ -1838,11 +1838,11 @@ "aJr" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) "aJs" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/item/bodybag,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/mask/surgical,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/detectives_office) "aJt" = (/obj/machinery/door/window{dir = 1; name = "glass door"; pixel_y = 0; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/detectives_office) -"aJu" = (/obj/machinery/door/airlock/maintenance{name = "Detective Maintenance"; req_access_txt = "4"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/security/detectives_office) +"aJu" = (/obj/machinery/door/airlock/maintenance{name = "Law Office Maintenance"; req_access_txt = "38"},/turf/simulated/floor/plating,/area/lawoffice) "aJv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/camera{c_tag = "Restrooms"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) "aJw" = (/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) "aJx" = (/obj/machinery/light/small,/obj/machinery/power/apc{dir = 2; name = "Restrooms APC"; pixel_x = 0; pixel_y = -26},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) -"aJy" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) +"aJy" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fore) "aJz" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) "aJA" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) "aJB" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Unisex Restrooms"; req_access_txt = "0"},/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{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) @@ -1867,10 +1867,10 @@ "aJU" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering) "aJV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/crowbar,/obj/item/weapon/wirecutters,/obj/item/stack/cable_coil,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering) "aJW" = (/obj/machinery/field/generator{anchored = 1; state = 2},/turf/simulated/floor/plating/airless,/area/space) -"aJX" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/turf/simulated/wall/r_wall,/area/space) +"aJX" = (/turf/simulated/floor/wood,/area/lawoffice) "aJY" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; layer = 2.9; name = "Bridge Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/bridge) "aJZ" = (/obj/machinery/door/window/westleft{dir = 4; name = "Bridge Deliveries"; req_access_txt = "19"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; layer = 2.6; name = "Bridge Blast Doors"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/bridge) -"aKa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"aKa" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fore) "aKb" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen,/obj/machinery/requests_console{department = "Mining"; departmentType = 0; pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel{dir = 10; icon_state = "brown"},/area/quartermaster/miningdock{name = "\improper Mining Office"}) "aKc" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/quartermaster/miningdock{name = "\improper Mining Office"}) "aKd" = (/obj/structure/rack{dir = 1},/obj/item/weapon/pickaxe{pixel_x = 5},/obj/item/weapon/shovel{pixel_x = -5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/quartermaster/miningdock{name = "\improper Mining Office"}) @@ -1914,10 +1914,10 @@ "aKP" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) "aKQ" = (/obj/structure/morgue,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/detectives_office) "aKR" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/detectives_office) -"aKS" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/fore) -"aKT" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/fore) +"aKS" = (/obj/effect/spawner/lootdrop/maintenance,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering) +"aKT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aKU" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/starboard) -"aKV" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fore) +"aKV" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/wood,/area/lawoffice) "aKW" = (/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 = "Toilet2"; 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"}) "aKX" = (/obj/machinery/door/airlock{id_tag = "Toilet2"; name = "Unit 2"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) "aKY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) @@ -1988,7 +1988,7 @@ "aMl" = (/turf/simulated/wall/r_wall,/area/crew_quarters/courtroom) "aMm" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Court Cell"; req_access = null; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/courtroom) "aMn" = (/turf/simulated/wall,/area/lawoffice) -"aMo" = (/obj/machinery/door/airlock/maintenance{name = "Law Office Maintenance"; req_access_txt = "38"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/lawoffice) +"aMo" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "1;4;38;12"},/turf/simulated/floor/plating,/area/maintenance/fore) "aMp" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/light_switch{pixel_x = -26},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) "aMq" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) "aMr" = (/obj/machinery/door/airlock{id_tag = "Toilet4"; name = "Unit 4"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) @@ -2060,7 +2060,7 @@ "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/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) +"aNI" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/crew_quarters/locker) "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"}) "aNK" = (/obj/machinery/door/airlock{id_tag = "Toilet1"; name = "Unit 1"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) "aNL" = (/obj/structure/toilet{dir = 4},/obj/machinery/light/small{dir = 4},/obj/machinery/newscaster{pixel_x = 32},/obj/machinery/door_control{id = "Toilet4"; name = "Lock Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; specialfunctions = 4},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) @@ -2090,7 +2090,7 @@ "aOj" = (/obj/item/weapon/crowbar,/turf/space,/area/space) "aOk" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel,/area/construction) "aOl" = (/obj/machinery/door/airlock/engineering{name = "Arrivals Expansion Area"; req_access_txt = "32"},/turf/simulated/floor/plating,/area/construction) -"aOm" = (/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/fpmaint2{name = "Port Maintenance"}) +"aOm" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/engine/engineering) "aOn" = (/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/supply) "aOo" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plating,/area/crew_quarters/courtroom) "aOp" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/conveyor{dir = 2; id = "QMLoad2"; movedir = 2},/turf/simulated/floor/plating,/area/quartermaster/storage) @@ -2126,9 +2126,9 @@ "aOT" = (/obj/effect/landmark/start{name = "Internal Affairs Agent"},/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor/wood,/area/lawoffice) "aOU" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/blue,/obj/item/weapon/folder/blue,/obj/item/weapon/folder/blue,/obj/item/weapon/folder/blue,/obj/item/weapon/stamp/law,/turf/simulated/floor/wood,/area/lawoffice) "aOV" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/wood,/area/lawoffice) -"aOW" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/wood,/area/lawoffice) -"aOX" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/wood,/area/lawoffice) -"aOY" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "1;4;38;12"},/turf/simulated/floor/plating,/area/maintenance/fore) +"aOW" = (/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/plasteel{dir = 2; icon_state = "warningcorner"; tag = "icon-warningcorner (EAST)"},/area/engine/engineering) +"aOX" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = ""},/area/engine/engineering) +"aOY" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/locker) "aOZ" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Unisex Restrooms"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) "aPa" = (/obj/machinery/door/firedoor,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{name = "Dormitories"; req_access_txt = "0"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/sleep) "aPb" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/crew_quarters/sleep) @@ -2206,7 +2206,7 @@ "aQv" = (/obj/machinery/shower{tag = "icon-shower (WEST)"; icon_state = "shower"; dir = 8},/obj/effect/landmark/start{name = "Civilian"},/obj/structure/curtain/open/shower,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) "aQw" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/lawoffice) "aQx" = (/obj/machinery/photocopier,/obj/machinery/camera{c_tag = "Law Office"; dir = 8; network = list("SS13")},/turf/simulated/floor/wood,/area/lawoffice) -"aQy" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/crew_quarters/locker) +"aQy" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/locker) "aQz" = (/obj/structure/closet/secure_closet/personal,/obj/item/clothing/under/assistantformal,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/crew_quarters/locker) "aQA" = (/obj/structure/closet/secure_closet/personal,/obj/machinery/light/small{dir = 1},/obj/item/clothing/under/assistantformal,/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},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/crew_quarters/locker) "aQB" = (/obj/structure/closet/secure_closet/personal,/obj/item/clothing/under/assistantformal,/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},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/crew_quarters/locker) @@ -2229,11 +2229,11 @@ "aQS" = (/obj/machinery/power/emitter,/turf/simulated/floor/plating,/area/engine/engineering) "aQT" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/engine/engineering) "aQU" = (/turf/simulated/floor/plasteel{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/area/engine/engineering) -"aQV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering) -"aQW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/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/plasteel{dir = 2; icon_state = "warningcorner"; tag = "icon-warningcorner (EAST)"},/area/engine/engineering) -"aQX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/engine/engineering) -"aQY" = (/obj/machinery/door/poddoor/shutters/preopen{id_tag = "Singularity"; name = "radiation shutters"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering) -"aQZ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = ""},/area/engine/engineering) +"aQV" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/locker) +"aQW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/crew_quarters/locker) +"aQX" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"}) +"aQY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/engine/engineering) +"aQZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aRa" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering) "aRb" = (/obj/machinery/particle_accelerator/control_box,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/engine/engineering) "aRc" = (/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/plating,/area/engine/engineering) @@ -2275,10 +2275,10 @@ "aRM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/wood,/area/lawoffice) "aRN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/wood,/area/lawoffice) "aRO" = (/obj/structure/filingcabinet/chestdrawer,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/wood,/area/lawoffice) -"aRP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/locker) -"aRQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/locker) -"aRR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/locker) -"aRS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/crew_quarters/locker) +"aRP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering) +"aRQ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/mob/living/simple_animal/mouse,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) +"aRR" = (/obj/structure/table,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/item/device/t_scanner,/turf/simulated/floor/plasteel{dir = 4; icon_state = "brown"},/area/storage/primary) +"aRS" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/landmark/start{name = "Station Engineer"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering) "aRT" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/crew_quarters/locker) "aRU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/locker) "aRV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/junction{dir = 4; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/locker) @@ -2296,7 +2296,7 @@ "aSh" = (/obj/structure/closet/crate,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/rods{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/stack/sheet/mineral/plasma{amount = 30},/obj/item/device/gps,/turf/simulated/floor/plating,/area/engine/engineering) "aSi" = (/obj/machinery/the_singularitygen{anchored = 0},/turf/simulated/floor/plating,/area/engine/engineering) "aSj" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering) -"aSk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/engine/engineering) +"aSk" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering) "aSl" = (/obj/structure/table,/obj/item/weapon/book/manual/engineering_guide{pixel_x = 3; pixel_y = 4},/obj/item/weapon/book/manual/engineering_particle_accelerator{pixel_x = -2; pixel_y = 3},/obj/machinery/door_control{id = "Singularity"; name = "Shutters Control"; pixel_x = 25; pixel_y = 0; req_access_txt = "11"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering) "aSm" = (/obj/machinery/door_control{id = "Singularity"; name = "Shutters Control"; pixel_x = -25; pixel_y = 0; req_access_txt = "11"},/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHWEST)"; icon_state = "warnplate"; dir = 10},/area/engine/engineering) "aSn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/engine/engineering) @@ -2368,12 +2368,12 @@ "aTB" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 8},/area/hallway/secondary/construction{name = "\improper Garden"}) "aTC" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/hallway/secondary/construction{name = "\improper Garden"}) "aTD" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"}) -"aTE" = (/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/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"}) +"aTE" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/obj/structure/disposalpipe/sortjunction{sortType = 5},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/engine/engineering) "aTF" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/hallway/secondary/construction{name = "\improper Garden"}) "aTG" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"}) "aTH" = (/obj/machinery/power/apc{dir = 4; name = "Garden APC"; pixel_x = 27; pixel_y = 2},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/disposal,/obj/machinery/camera{c_tag = "Garden"; dir = 8; network = list("SS13")},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/hallway/secondary/construction{name = "\improper Garden"}) "aTI" = (/obj/machinery/power/apc{cell_type = 10000; dir = 8; name = "Engine Room APC"; pixel_x = -26; pixel_y = 0},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/engine/engineering) -"aTJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/engine/engineering) +"aTJ" = (/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/structure/extinguisher_cabinet{pixel_x = -31; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/incinerator) "aTK" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering) "aTL" = (/obj/structure/table,/obj/item/weapon/book/manual/engineering_hacking{pixel_x = 4; pixel_y = 5},/obj/item/weapon/book/manual/engineering_construction{pixel_x = 0; pixel_y = 3},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/item/weapon/book/manual/engineering_singularity_safety{pixel_x = -4},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering) "aTM" = (/obj/machinery/power/tesla_coil{anchored = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area/space) @@ -2381,7 +2381,7 @@ "aTO" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering) "aTP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/construction) "aTQ" = (/obj/machinery/light_construct{dir = 4},/turf/simulated/floor/plasteel,/area/construction) -"aTR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"aTR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering) "aTS" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/docking_port/mobile/supply,/obj/docking_port/stationary{dir = 8; dwidth = 5; height = 7; id = "supply_home"; name = "supply bay"; width = 12},/turf/simulated/shuttle/plating,/area/shuttle/supply) "aTT" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/quartermaster/storage) "aTU" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/quartermaster/storage) @@ -2421,7 +2421,7 @@ "aUC" = (/obj/structure/rack,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 4; pixel_y = -4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/crew_quarters/locker) "aUD" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/hallway/secondary/construction{name = "\improper Garden"}) "aUE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 8},/area/hallway/secondary/construction{name = "\improper Garden"}) -"aUF" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/hydroponics/soil,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/hallway/secondary/construction{name = "\improper Garden"}) +"aUF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering) "aUG" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/grass,/area/hallway/secondary/construction{name = "\improper Garden"}) "aUH" = (/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/grass,/area/hallway/secondary/construction{name = "\improper Garden"}) "aUI" = (/obj/structure/rack,/obj/item/clothing/gloves/color/fyellow,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/starboard) @@ -2433,8 +2433,8 @@ "aUO" = (/obj/machinery/vending/engivend,/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering) "aUP" = (/obj/machinery/vending/tool,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering) "aUQ" = (/obj/structure/closet/secure_closet/engineering_welding,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering) -"aUR" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/gloves/color/black,/obj/item/weapon/extinguisher{pixel_x = 8},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/obj/item/clothing/glasses/meson,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering) -"aUS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering) +"aUR" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"}) +"aUS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/engine/engineering) "aUT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/crowbar,/obj/item/stack/cable_coil,/obj/item/weapon/screwdriver,/obj/item/weapon/weldingtool,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering) "aUU" = (/obj/structure/window/reinforced,/turf/space,/area/space) "aUV" = (/obj/structure/window/reinforced,/obj/structure/lattice,/turf/space,/area/space) @@ -2442,9 +2442,9 @@ "aUX" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "kitchenwindow"; layer = 2.9; name = "kitchen shutters"; opacity = 0},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/crew_quarters/kitchen) "aUY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/construction) "aUZ" = (/obj/structure/table,/obj/item/stack/cable_coil{amount = 5},/obj/item/device/flashlight,/turf/simulated/floor/plasteel,/area/construction) -"aVa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"aVa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aVb" = (/obj/machinery/door/poddoor{id_tag = "QMLoaddoor"; name = "supply dock loading door"},/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/shuttle/plating,/area/shuttle/supply) -"aVc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"aVc" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/hallway/secondary/construction{name = "\improper Garden"}) "aVd" = (/obj/structure/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/mask/breath,/obj/item/clothing/suit/space/hardsuit/atmos,/obj/item/clothing/head/helmet/space/hardsuit/atmos,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/atmos) "aVe" = (/obj/machinery/conveyor{dir = 9; id = "QMLoad"; movedir = 2},/turf/simulated/floor/plating,/area/quartermaster/storage) "aVf" = (/obj/effect/landmark/start{name = "Cargo Technician"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/quartermaster/storage) @@ -2463,7 +2463,7 @@ "aVs" = (/obj/machinery/camera{c_tag = "NT Representative's Office"; dir = 1; network = list("SS13")},/obj/structure/table/woodentable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/newscaster/security_unit{pixel_y = -32},/obj/machinery/photocopier/faxmachine/longrange,/turf/simulated/floor/wood,/area/ntrep) "aVt" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/item/weapon/folder/yellow,/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor/plasteel{dir = 1; icon_state = "browncorner"},/area/storage/primary) "aVu" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/storage/primary) -"aVv" = (/obj/structure/table,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/item/clothing/gloves/color/yellow,/obj/item/device/t_scanner,/turf/simulated/floor/plasteel{dir = 4; icon_state = "brown"},/area/storage/primary) +"aVv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering) "aVw" = (/obj/structure/table,/obj/item/weapon/aiModule/reset,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/ai_status_display{pixel_x = -32; pixel_y = 0},/obj/machinery/flasher{id = "AI"; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload) "aVx" = (/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "Upload APC"; pixel_y = -24},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/camera/motion{c_tag = "AI Upload Chamber - Port"; dir = 1; network = list("SS13","RD","AIUpload")},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) "aVy" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload) @@ -2495,7 +2495,7 @@ "aVY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{dir = 10; icon_state = "neutral"},/area/hallway/secondary/construction{name = "\improper Garden"}) "aVZ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/hallway/secondary/construction{name = "\improper Garden"}) "aWa" = (/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/hallway/secondary/construction{name = "\improper Garden"}) -"aWb" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/hallway/secondary/construction{name = "\improper Garden"}) +"aWb" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering) "aWc" = (/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 6},/area/hallway/secondary/construction{name = "\improper Garden"}) "aWd" = (/obj/machinery/door/firedoor/border_only{density = 1; dir = 8; icon_state = "door_closed"; name = "Animal Pen B"; opacity = 1},/turf/simulated/floor/grass,/area/hallway/secondary/construction{name = "\improper Garden"}) "aWe" = (/mob/living/simple_animal/cow{name = "Betsy"; real_name = "Betsy"},/turf/simulated/floor/grass,/area/hallway/secondary/construction{name = "\improper Garden"}) @@ -2507,11 +2507,11 @@ "aWk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/engine/engineering) "aWl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering) "aWm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/engine/engineering) -"aWn" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/landmark/start{name = "Station Engineer"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/engine/engineering) -"aWo" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/obj/structure/disposalpipe/sortjunction{sortType = 5},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/engine/engineering) -"aWp" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering) -"aWq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering) -"aWr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering) +"aWn" = (/obj/machinery/light,/obj/machinery/camera{c_tag = "Engineering - Aft"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering) +"aWo" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/engine/engineering) +"aWp" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering) +"aWq" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"aWr" = (/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{icon_state = "warnplate"; dir = 1},/area/maintenance/starboard) "aWs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/engine/engineering) "aWt" = (/obj/machinery/power/rad_collector{anchored = 1},/obj/item/weapon/tank/plasma,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = ""},/area/engine/engineering) "aWu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/engine/engineering) @@ -2562,7 +2562,7 @@ "aXn" = (/obj/structure/table,/obj/item/weapon/hatchet,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/item/weapon/paper/hydroponics,/obj/item/weapon/coin/silver,/obj/item/weapon/cultivator,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"}) "aXo" = (/obj/structure/table,/obj/item/weapon/hatchet,/obj/item/weapon/crowbar,/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/device/plant_analyzer,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"}) "aXp" = (/obj/structure/table,/obj/item/weapon/cultivator,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"}) -"aXq" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"}) +"aXq" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/engine/engineering) "aXr" = (/obj/structure/table,/obj/machinery/light,/obj/item/device/plant_analyzer,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"}) "aXs" = (/obj/item/weapon/book/manual/engineering_hacking{pixel_x = 4; pixel_y = 5},/obj/item/weapon/book/manual/engineering_construction{pixel_x = 0; pixel_y = 3},/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/starboard) "aXt" = (/obj/machinery/power/terminal,/obj/structure/cable,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"; tag = "icon-warnwhite (NORTHEAST)"},/area/engine/engineering) @@ -2573,10 +2573,10 @@ "aXy" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/engine/engineering) "aXz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/engine/engineering) "aXA" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel,/area/engine/engineering) -"aXB" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/engine/engineering) -"aXC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/engine/engineering) -"aXD" = (/turf/simulated/floor/plasteel,/area/engine/engineering) -"aXE" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/engine/engineering) +"aXB" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/engine/engineering) +"aXC" = (/obj/effect/landmark/start{name = "Station Engineer"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/engine/engineering) +"aXD" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/engine/engineering) +"aXE" = (/obj/machinery/camera/emp_proof{c_tag = "Aft Arm - Far"; dir = 8; network = list("Singulo")},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering) "aXF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering) "aXG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/engine/engineering) "aXH" = (/obj/structure/window/reinforced{dir = 4},/turf/space,/area/space) @@ -2643,18 +2643,18 @@ "aYQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light,/obj/machinery/newscaster{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/crew_quarters/locker) "aYR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/crew_quarters/locker) "aYS" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/crew_quarters/locker) -"aYT" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/hallway/secondary/construction{name = "\improper Garden"}) +"aYT" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"}) "aYU" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/power/smes/engineering,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/engine/chiefs_office) "aYV" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/light_switch{pixel_x = -24},/obj/machinery/power/smes/engineering,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/engine/chiefs_office) "aYW" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/engine/engineering) "aYX" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering) "aYY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering) "aYZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering) -"aZa" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering) -"aZb" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering) -"aZc" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light,/obj/machinery/camera{c_tag = "Engineering - Aft"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering) -"aZd" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/area/engine/engineering) -"aZe" = (/obj/effect/landmark/start{name = "Station Engineer"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/engine/engineering) +"aZa" = (/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/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/engine/engineering) +"aZb" = (/obj/machinery/light/small,/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering) +"aZc" = (/obj/structure/grille,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering) +"aZd" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering) +"aZe" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = -29},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots/advance,/obj/item/clothing/suit/space/hardsuit/elite,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/elite,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/chiefs_office) "aZf" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering) "aZg" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = ""},/area/engine/engineering) "aZh" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/space,/area/space) @@ -2664,7 +2664,7 @@ "aZl" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/hallway/secondary/entry{name = "Arrivals"}) "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"}) +"aZo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/engine/break_room) "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) @@ -2710,7 +2710,7 @@ "baf" = (/obj/machinery/vending/clothing,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/crew_quarters/locker) "bag" = (/obj/structure/closet/wardrobe/mixed,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/crew_quarters/locker) "bah" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/starboard) -"bai" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/starboard) +"bai" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/library) "baj" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/hydroponics) "bak" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/lootdrop{loot = list(/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/item/weapon/cigbutt,/obj/item/trash/cheesie,/obj/item/trash/candy,/obj/item/trash/chips,/obj/item/trash/pistachios,/obj/item/trash/plate,/obj/item/trash/popcorn,/obj/item/trash/raisins,/obj/item/trash/sosjerky,/obj/item/trash/syndi_cakes); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/starboard) "bal" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plating,/area/maintenance/starboard) @@ -2722,11 +2722,11 @@ "bar" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering) "bas" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/item/weapon/folder/yellow,/obj/item/weapon/storage/firstaid/fire,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering) "bat" = (/obj/machinery/light_switch,/turf/simulated/wall,/area/engine/engineering) -"bau" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/engine/engineering) +"bau" = (/obj/item/clothing/head/fedora,/obj/structure/table/woodentable/poker,/turf/simulated/floor/wood,/area/crew_quarters/bar) "bav" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering) "baw" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/engine/engineering) "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) +"bay" = (/obj/machinery/hologram/holopad,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/bridge/meeting_room{name = "\improper Command Hallway"}) "baz" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/quartermaster/office{name = "\improper Cargo Office"}) "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"}) @@ -2741,7 +2741,7 @@ "baK" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) "baL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/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},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/hallway/secondary/entry{name = "Arrivals"}) "baM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-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},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitecorner"},/area/hallway/secondary/entry{name = "Arrivals"}) -"baN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"}) +"baN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/wood,/area/crew_quarters/bar) "baO" = (/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 5},/area/hallway/secondary/entry{name = "Arrivals"}) "baP" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"},/turf/simulated/shuttle/plating,/area/shuttle/supply) "baQ" = (/obj/structure/shuttle/engine/propulsion,/turf/simulated/shuttle/plating,/area/shuttle/supply) @@ -2796,8 +2796,8 @@ "bbN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/engine/engineering) "bbO" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{name = "Engine Room"; req_access_txt = "10"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering) "bbP" = (/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 28},/obj/machinery/pipedispenser/disposal,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"; tag = "icon-warnwhite (NORTHEAST)"},/area/atmos) -"bbQ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/light/small,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering) -"bbR" = (/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/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/engine/engineering) +"bbQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/item/weapon/storage/pill_bottle/dice,/obj/structure/table/woodentable/poker,/turf/simulated/floor/wood,/area/crew_quarters/bar) +"bbR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bbS" = (/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/light/small{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engine/engineering) "bbT" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering) "bbU" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/emitter{anchored = 1; dir = 1; state = 2},/turf/simulated/floor/plating/airless,/area/engine/engineering) @@ -3066,7 +3066,7 @@ "bgX" = (/turf/simulated/wall,/area/security/checkpoint2{name = "Customs"}) "bgY" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bgZ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"bha" = (/obj/item/weapon/reagent_containers/glass/bottle/morphine,/obj/item/trash/candy,/obj/structure/disposalpipe/segment{dir = 4},/obj/item/clothing/accessory/stethoscope,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) +"bha" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/carpet,/area/crew_quarters/theatre) "bhb" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/conveyor{backwards = 1; dir = 2; forwards = 2; id = "packageSort2"},/turf/simulated/floor/plasteel{icon_state = "loadingarea"; tag = "loading"},/area/quartermaster/office{name = "\improper Cargo Office"}) "bhc" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/quartermaster/office{name = "\improper Cargo Office"}) "bhd" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/light_switch{pixel_x = -25; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 9; icon_state = "brown"},/area/quartermaster/office{name = "\improper Cargo Office"}) @@ -3200,7 +3200,7 @@ "bjB" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/storage/tech) "bjC" = (/obj/structure/table,/obj/machinery/cell_charger{pixel_y = 0},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/tech) "bjD" = (/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 = "vault"; dir = 5},/area/engine/chiefs_office) -"bjE" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = -29},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/head/helmet/space/hardsuit/elite,/obj/item/clothing/mask/breath,/obj/item/clothing/suit/space/hardsuit/elite,/obj/item/clothing/shoes/magboots/advance,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/chiefs_office) +"bjE" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;27;37"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bjF" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/secure/briefcase,/obj/item/clothing/mask/cigarette/cigar,/obj/machinery/computer/security/telescreen{dir = 1; name = "MiniSat Monitor"; network = list("MiniSat","tcomm"); pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/chiefs_office) "bjG" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/lighter/zippo,/obj/item/clothing/glasses/meson,/obj/machinery/door_control{id = "ceprivacy"; name = "Privacy Shutters Control"; pixel_x = 0; pixel_y = -26},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/chiefs_office) "bjH" = (/obj/structure/filingcabinet/chestdrawer,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/mob/living/simple_animal/parrot/Poly,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/chiefs_office) @@ -3431,7 +3431,7 @@ "bnY" = (/obj/structure/sign/pods,/turf/simulated/wall,/area/security/checkpoint2{name = "Customs"}) "bnZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/wall,/area/security/checkpoint2{name = "Customs"}) "boa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/security{name = "Customs Desk"; req_access = null; req_access_txt = "1"},/turf/simulated/floor/plasteel,/area/security/checkpoint2{name = "Customs"}) -"bob" = (/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/plating,/area/maintenance/incinerator) +"bob" = (/obj/machinery/ignition_switch{id = "Turbine_igniter"; pixel_x = -6; pixel_y = -24},/obj/machinery/embedded_controller/radio/airlock/access_controller{frequency = 1449; id_tag = "turbine_control"; name = "Turbine Access Console"; pixel_x = 6; pixel_y = -26; req_access_txt = "0"; tag_exterior_door = "gas_turbine_exterior"; tag_interior_door = "gas_turbine_interior"},/obj/structure/sign/fire{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "boc" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/starboard) "bod" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;48;50;1"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "boe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/maintenance/fpmaint2{name = "Port Maintenance"}) @@ -3700,7 +3700,7 @@ "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/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/shuttle/arrival/station) -"btk" = (/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/library) +"btk" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "blueshield"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/blueshield) "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"}) "btn" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/primary/port) @@ -3805,7 +3805,7 @@ "bvi" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/space,/area/construction/hallway{name = "\improper MiniSat Exterior"}) "bvj" = (/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"}) "bvk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel,/area/engine/break_room) -"bvl" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel,/area/engine/break_room) +"bvl" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "blueshield"; name = "Privacy Shutters"; opacity = 0},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/blueshield) "bvm" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch{name = "MiniSat Transit Tube"; req_one_access_txt = "32;19"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/break_room) "bvn" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "transittube"; name = "Transit Tube Blast Door"; opacity = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/break_room) "bvo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/break_room) @@ -3818,7 +3818,7 @@ "bvv" = (/obj/structure/transit_tube{tag = "icon-D-SE"; icon_state = "D-SE"},/obj/structure/transit_tube{tag = "icon-D-NE"; icon_state = "D-NE"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/space) "bvw" = (/obj/structure/transit_tube,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/space) "bvx" = (/obj/machinery/door_control{id = "turbinevent"; name = "Turbine Vent Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "12"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) -"bvy" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/clothing/head/fedora,/obj/structure/table/woodentable/poker,/turf/simulated/floor/wood,/area/crew_quarters/bar) +"bvy" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "representative"; name = "Privacy Shutters"; opacity = 0},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/ntrep) "bvz" = (/obj/item/toy/cards/deck{pixel_y = 4},/obj/structure/table/woodentable/poker,/turf/simulated/floor/wood,/area/crew_quarters/bar) "bvA" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 4},/obj/machinery/camera{c_tag = "Arrivals - Lounge"; dir = 4; network = list("SS13")},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/primary/port) "bvB" = (/turf/simulated/floor/carpet,/area/hallway/primary/port) @@ -3884,7 +3884,7 @@ "bwJ" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j1s"; sortType = 19},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/starboard) "bwK" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/starboard) "bwL" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/starboard) -"bwM" = (/obj/machinery/ignition_switch{id = "Incinerator"; pixel_x = -6; pixel_y = -24},/obj/machinery/embedded_controller/radio/airlock/access_controller{frequency = 1449; id_tag = "turbine_control"; name = "Turbine Access Console"; pixel_x = 6; pixel_y = -26; req_access_txt = "12"; tag_exterior_door = "gas_turbine_exterior"; tag_interior_door = "gas_turbine_interior"},/obj/structure/sign/fire{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) +"bwM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "gas_turbine_interior"; locked = 1; name = "Incinerator Interior Airlock"; req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/insulated{dir = 5},/turf/simulated/floor/engine/insulated,/area/maintenance/incinerator) "bwN" = (/obj/item/device/assembly/prox_sensor,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 2; initialize_directions = 11},/turf/simulated/floor/plating,/area/maintenance/starboard) "bwO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/storage/box/lights/mixed,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/starboard) "bwP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/starboard) @@ -3991,7 +3991,7 @@ "byM" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/crew_quarters/bar) "byN" = (/obj/structure/closet/gmcloset{desc = "It's a storage unit."; icon_state = "black"; name = "spare gear"},/obj/item/weapon/wrench,/turf/simulated/floor/wood,/area/crew_quarters/bar) "byO" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/starboard) -"byP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "incinerator_airlock_interior"; locked = 1; name = "Incinerator Interior Airlock"; req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/insulated{dir = 5},/turf/simulated/floor/engine/insulated,/area/maintenance/incinerator) +"byP" = (/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "gas_turbine_exterior"; locked = 1; name = "Incinerator Exterior Airlock"; req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/engine/insulated,/area/maintenance/incinerator) "byQ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge) "byR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/maintenance/starboard) "byS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/toxins/lab) @@ -4145,7 +4145,7 @@ "bBK" = (/turf/simulated/wall,/area/crew_quarters/toilet{name = "\improper Auxiliary Restrooms"}) "bBL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/crew_quarters/toilet{name = "\improper Auxiliary Restrooms"}) "bBM" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"bBN" = (/obj/structure/closet,/obj/effect/decal/cleanable/cobweb2,/obj/item/weapon/contraband/poster,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"bBN" = (/obj/structure/closet,/obj/effect/decal/cleanable/cobweb2,/obj/item/weapon/poster/random_contraband,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bBO" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/wood,/area/library) "bBP" = (/obj/structure/table/woodentable,/obj/machinery/computer/library/public,/turf/simulated/floor/wood,/area/library) "bBQ" = (/turf/simulated/floor/carpet,/area/library) @@ -4187,7 +4187,7 @@ "bCA" = (/obj/structure/sign/securearea{desc = "Under the painting a plaque reads: 'While the meat grinder may not have spared you, fear not. Not one part of you has gone to waste... You were delicious.'"; icon_state = "monkey_painting"; name = "Mr. Deempisi portrait"; pixel_x = 0; pixel_y = 28},/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/obj/machinery/light_switch{pixel_x = 25; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "bCB" = (/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "Bar APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bCC" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bCD" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/wood,/area/crew_quarters/bar) +"bCD" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "representative"; name = "Privacy Shutters"; opacity = 0},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/ntrep) "bCE" = (/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light{dir = 1},/obj/machinery/camera{c_tag = "Club - Fore"; dir = 2; network = list("SS13")},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bCF" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar) "bCG" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_Toxins = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar) @@ -4253,7 +4253,7 @@ "bDO" = (/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/library) "bDP" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/library) "bDQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/central) -"bDR" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/toy/cards/deck{pixel_y = 4},/obj/structure/table/woodentable/poker,/turf/simulated/floor/wood,/area/crew_quarters/bar) +"bDR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bDS" = (/obj/effect/spawner/lootdrop{loot = list(/obj/item/weapon/gun/projectile/revolver/russian,/obj/item/clothing/mask/cigarette/cigar/cohiba,/obj/item/toy/cards/deck/syndicate); name = "gambling valuables spawner"},/obj/structure/table/woodentable/poker,/turf/simulated/floor/wood,/area/crew_quarters/bar) "bDT" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/atmos) "bDU" = (/obj/machinery/door/poddoor/shutters/preopen{dir = 2; 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"}) @@ -4463,7 +4463,7 @@ "bHQ" = (/obj/structure/stool{pixel_y = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "bHR" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/turf/simulated/floor/plating,/area/crew_quarters/bar) "bHS" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bHT" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/item/weapon/storage/pill_bottle/dice,/obj/structure/table/woodentable/poker,/turf/simulated/floor/wood,/area/crew_quarters/bar) +"bHT" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bHU" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/theatre) "bHV" = (/obj/structure/stool/bed/chair/wood/wings,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/landmark/start{name = "Mime"},/turf/simulated/floor/carpet,/area/crew_quarters/theatre) "bHW" = (/turf/simulated/floor/carpet,/area/crew_quarters/theatre) @@ -4507,9 +4507,9 @@ "bII" = (/obj/machinery/computer/shuttle/ferry/request,/turf/simulated/shuttle/floor,/area/shuttle/transport) "bIJ" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor,/area/shuttle/transport) "bIK" = (/obj/structure/stool/bed/chair,/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/transport) -"bIL" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "blueshield"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/blueshield) +"bIL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bIM" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"}) -"bIN" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"bIN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/crew_quarters/theatre) "bIO" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "telelab"; name = "test chamber blast door"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/explab) "bIP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "telelab"; name = "test chamber blast door"; opacity = 0},/turf/simulated/floor/engine,/area/toxins/explab) "bIQ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/wood,/area/security/vacantoffice) @@ -4559,11 +4559,11 @@ "bJI" = (/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "bJJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "bJK" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/centcom{name = "Club"; opacity = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) -"bJL" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar) +"bJL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/theatre) "bJM" = (/obj/structure/stool{pixel_y = 8},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bJN" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "blueshield"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/blueshield) +"bJN" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/carpet,/area/crew_quarters/theatre) "bJO" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/crew_quarters/theatre) -"bJP" = (/obj/structure/table/woodentable,/obj/item/weapon/lipstick{pixel_y = 5},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/obj/machinery/camera{c_tag = "Theatre - Stage"; dir = 8; network = list("SS13")},/obj/machinery/light/small{dir = 4},/obj/item/device/guitar,/turf/simulated/floor/wood,/area/crew_quarters/theatre) +"bJP" = (/obj/structure/table/woodentable,/obj/item/weapon/lipstick{pixel_y = 5},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/obj/machinery/camera{c_tag = "Theatre - Stage"; dir = 8; network = list("SS13")},/obj/machinery/light/small{dir = 4},/obj/item/device/instrument/guitar,/turf/simulated/floor/wood,/area/crew_quarters/theatre) "bJQ" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/scrubber,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "escape"},/area/hallway/primary/starboard) "bJR" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/starboard) "bJS" = (/obj/structure/dispenser{pixel_x = -1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blackcorner"},/area/atmos) @@ -4586,7 +4586,7 @@ "bKj" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/blue,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 31},/obj/item/weapon/folder/blue,/obj/item/weapon/pen/multi,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/tcommsat/computer{name = "\improper Telecoms Control Room"}) "bKk" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/space,/area/construction/hallway{name = "\improper MiniSat Exterior"}) "bKl" = (/turf/simulated/wall/r_wall,/area/tcommsat/server) -"bKm" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "representative"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/ntrep) +"bKm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/carpet,/area/crew_quarters/theatre) "bKn" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/tcommsat/computer{name = "\improper Telecoms Control Room"}) "bKo" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"}) "bKp" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"}) @@ -4617,7 +4617,7 @@ "bKO" = (/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 = 8; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"}) "bKP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"}) "bKQ" = (/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/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"}) -"bKR" = (/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "incinerator_airlock_exterior"; locked = 1; name = "Incinerator Exterior Airlock"; req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/engine/insulated,/area/maintenance/incinerator) +"bKR" = (/obj/machinery/igniter{icon_state = "igniter0"; id = "Turbine_igniter"; luminosity = 2; on = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/engine/insulated/vacuum,/area/maintenance/incinerator) "bKS" = (/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"},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/machinery/camera{c_tag = "Command Hallway - Port"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"}) "bKT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"}) "bKU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"}) @@ -4628,7 +4628,7 @@ "bKZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"}) "bLa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel,/area/bridge/meeting_room{name = "\improper Command Hallway"}) "bLb" = (/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,/area/bridge/meeting_room{name = "\improper Command Hallway"}) -"bLc" = (/obj/machinery/hologram/holopad,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/bridge/meeting_room{name = "\improper Command Hallway"}) +"bLc" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = ""},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bLd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/bridge/meeting_room{name = "\improper Command Hallway"}) "bLe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"}) "bLf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light,/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"}) @@ -4654,15 +4654,15 @@ "bLz" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "bLA" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "bLB" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/centcom{name = "Club"; opacity = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) -"bLC" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bLD" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bLE" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "representative"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/ntrep) +"bLC" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/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 = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"}) +"bLD" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;27"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"bLE" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bLF" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bLG" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/bar) "bLH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/theatre) "bLI" = (/obj/structure/stool/bed/chair/wood/wings{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/landmark/start{name = "Clown"},/turf/simulated/floor/carpet,/area/crew_quarters/theatre) "bLJ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/carpet,/area/crew_quarters/theatre) -"bLK" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/carpet,/area/crew_quarters/theatre) +"bLK" = (/obj/structure/closet/crate,/obj/item/weapon/poster/random_official,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bLL" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/theatre) "bLM" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Doormaint.dmi'; name = "Theatre Stage"; req_access_txt = "0"; req_one_access_txt = "12;46"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/theatre) "bLN" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/starboard) @@ -4706,7 +4706,7 @@ "bMz" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/transport) "bMA" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/light/spot,/turf/simulated/shuttle/floor,/area/shuttle/transport) "bMB" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"}) -"bMC" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;27;37"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"bMC" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bMD" = (/obj/structure/table/woodentable,/obj/item/weapon/folder,/turf/simulated/floor/wood,/area/security/vacantoffice) "bME" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/wood,/area/security/vacantoffice) "bMF" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/wood,/area/security/vacantoffice) @@ -4753,13 +4753,13 @@ "bNu" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 2; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "bNv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "bNw" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) -"bNx" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bNy" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bNz" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bNA" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/theatre) -"bNB" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/crew_quarters/theatre) -"bNC" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/carpet,/area/crew_quarters/theatre) -"bND" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/carpet,/area/crew_quarters/theatre) +"bNx" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) +"bNy" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) +"bNz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) +"bNA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) +"bNB" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Doorsilver.dmi'; name = "Kitchen Cold Room"; req_access_txt = "28"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) +"bNC" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light_switch{pixel_y = -26},/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) +"bND" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera{c_tag = "Kitchen - Coldroom"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "bNE" = (/obj/item/weapon/soap/nanotrasen,/obj/machinery/light/small{dir = 4},/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/crew_quarters/theatre) "bNF" = (/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/plating,/area/maintenance/starboard) "bNG" = (/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/starboard) @@ -4841,7 +4841,7 @@ "bPe" = (/obj/machinery/light_switch{pixel_y = -28},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/light,/turf/simulated/floor/carpet,/area/crew_quarters/theatre) "bPf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/carpet,/area/crew_quarters/theatre) "bPg" = (/obj/structure/table/woodentable,/obj/machinery/light/small,/obj/item/clothing/glasses/regular/hipster{name = "Hipster Glasses"},/turf/simulated/floor/wood,/area/crew_quarters/theatre) -"bPh" = (/obj/item/device/violin,/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/crew_quarters/theatre) +"bPh" = (/obj/item/device/instrument/violin,/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/crew_quarters/theatre) "bPi" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "cmoprivacy"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo) "bPj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 10; icon_state = "yellow"},/area/hallway/primary/starboard) "bPk" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellow"},/area/hallway/primary/starboard) @@ -4874,7 +4874,7 @@ "bPL" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay) "bPM" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"}) "bPN" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;27;37"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"bPO" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = ""},/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"bPO" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/foodcart,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "bPP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bPQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bPR" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = -29},/turf/simulated/floor/wood,/area/security/vacantoffice) @@ -4963,7 +4963,7 @@ "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"}) "bRy" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/camera{c_tag = "Arrivals - Aft Arm"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"}) -"bRz" = (/obj/machinery/igniter{icon_state = "igniter0"; id = "Incinerator"; luminosity = 2; on = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/engine/insulated/vacuum,/area/maintenance/incinerator) +"bRz" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/meter,/obj/machinery/embedded_controller/radio/airlock/access_controller{frequency = 1449; id_tag = "tox_airlock_control"; name = "Toxin Mixing Console"; pixel_x = -24; pixel_y = 0; req_access_txt = "0"; tag_airpump = "tox_airlock_apump"; tag_chamber_sensor = "tox_airlock_sensor"; tag_exterior_door = "tox_airlock_exterior"; tag_exterior_sensor = null; tag_interior_door = "tox_airlock_interior"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhitecorner"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "bRA" = (/obj/machinery/power/apc{dir = 8; name = "Vacant Office APC"; pixel_x = -25},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/wood,/area/security/vacantoffice) "bRB" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/wood,/area/security/vacantoffice) "bRC" = (/obj/machinery/light_construct{dir = 4},/turf/simulated/floor/wood,/area/security/vacantoffice) @@ -5122,7 +5122,7 @@ "bUz" = (/obj/machinery/telecomms/processor/preset_four,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "bUA" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/eastright{dir = 2; name = "MiniSat Walkway Access"; req_access_txt = "13;75"},/obj/machinery/light/small{tag = "icon-bulb1 (EAST)"; icon_state = "bulb1"; dir = 4},/obj/machinery/camera/motion{c_tag = "AI Satellite Exterior South East 2"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"}) "bUB" = (/obj/machinery/door/airlock/external{name = "Auxiliary Airlock"},/turf/simulated/floor/plating,/area/hallway/secondary/entry{name = "Arrivals"}) -"bUC" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;27"},/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/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"bUC" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "bUD" = (/obj/structure/table/woodentable,/obj/item/weapon/paper,/turf/simulated/floor/wood,/area/security/vacantoffice) "bUE" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/white,/turf/simulated/floor/wood,/area/security/vacantoffice) "bUF" = (/obj/item/toy/cards/deck,/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/security/vacantoffice) @@ -5147,7 +5147,7 @@ "bUY" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin,/obj/item/weapon/pen/blue,/obj/item/weapon/folder/blue{pixel_x = 4; pixel_y = 6},/obj/item/weapon/paper/blueshield,/turf/simulated/floor/plasteel{icon_state = "bcarpet05"},/area/blueshield) "bUZ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; layer = 2.4; on = 1},/turf/simulated/floor/plasteel{icon_state = "bcarpet05"},/area/blueshield) "bVa" = (/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/blueshield) -"bVb" = (/obj/structure/sign/poster/legit{pixel_x = -32},/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/ntrep) +"bVb" = (/obj/structure/sign/poster/random{pixel_x = -32},/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/ntrep) "bVc" = (/obj/structure/table/woodentable,/obj/machinery/computer/skills{req_access_txt = "57"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/ntrep) "bVd" = (/obj/structure/table/woodentable,/obj/item/weapon/folder,/obj/item/weapon/stamp/centcom,/obj/item/weapon/pen/multi/fountain,/turf/simulated/floor/carpet,/area/ntrep) "bVe" = (/obj/machinery/door/window{dir = 1; name = "Desk Door"; req_access_txt = "73"},/obj/machinery/keycard_auth{pixel_x = 24; pixel_y = 0},/turf/simulated/floor/wood,/area/ntrep) @@ -5203,15 +5203,15 @@ "bWc" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/hallway/secondary/entry{name = "Arrivals"}) "bWd" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bWe" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/toxins/lab) -"bWf" = (/obj/structure/closet/crate,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/weapon/contraband/poster/legit,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"bWf" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/crew_quarters/kitchen) "bWg" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"bWh" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"bWh" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/starboard) "bWi" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/item/trash/candy,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bWj" = (/obj/machinery/door/airlock/maintenance{name = "Vacant Office Maintenance"; req_access_txt = "32"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/security/vacantoffice) "bWk" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/mask/horsehead,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bWl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bWm" = (/obj/structure/rack,/obj/item/weapon/storage/box,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"bWn" = (/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/compressor{comp_id = "incineratorturbine"; dir = 1},/turf/simulated/floor/engine/insulated/vacuum,/area/maintenance/incinerator) +"bWn" = (/obj/machinery/door/airlock/maintenance{name = "Kitchen Maintenance"; req_access_txt = "28"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/kitchen) "bWo" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bWp" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 4},/obj/item/weapon/pen,/turf/simulated/floor/wood,/area/library) "bWq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/wood,/area/library) @@ -5258,7 +5258,7 @@ "bXf" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "bXg" = (/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{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "bXh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) -"bXi" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) +"bXi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/starboard) "bXj" = (/obj/machinery/requests_console{department = "Kitchen"; departmentType = 2; pixel_x = 30; pixel_y = 0},/obj/machinery/processor,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) "bXk" = (/obj/structure/closet/crate{desc = "It's a storage unit for kitchen clothes and equipment."; name = "Kitchen Crate"},/obj/item/clothing/head/chefhat,/obj/item/clothing/under/rank/chef,/obj/item/weapon/storage/box/mousetraps{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/box/mousetraps,/obj/item/clothing/under/waiter,/obj/item/clothing/under/waiter,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "bXl" = (/obj/effect/landmark/start{name = "Chef"},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) @@ -5325,13 +5325,13 @@ "bYu" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "bYv" = (/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/machinery/power/apc{dir = 2; name = "Kitchen APC"; pixel_y = -24},/obj/structure/cable/yellow,/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) "bYw" = (/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},/obj/item/weapon/kitchen/rollingpin,/obj/machinery/camera{c_tag = "Kitchen"; dir = 1; network = list("SS13")},/obj/machinery/door_control{id = "kitchenhydro"; name = "Service Shutter Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "28"},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) -"bYx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) -"bYy" = (/obj/structure/disposalpipe/segment{dir = 4},/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{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) -"bYz" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Doorsilver.dmi'; name = "Kitchen Cold Room"; req_access_txt = "28"},/obj/structure/disposalpipe/segment{dir = 4},/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{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) -"bYA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/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{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) -"bYB" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/camera{c_tag = "Kitchen - Coldroom"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) -"bYC" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light_switch{pixel_y = -26},/obj/machinery/light,/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{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) -"bYD" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) +"bYx" = (/obj/structure/disposalpipe/sortjunction{dir = 2; sortType = 20},/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/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/starboard) +"bYy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/starboard) +"bYz" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 6},/area/hydroponics) +"bYA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/hydroponics) +"bYB" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/hydroponics) +"bYC" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 10; icon_state = "green"},/area/hydroponics) +"bYD" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Hydroponics Backroom"; req_access_txt = "35"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/hydroponics) "bYE" = (/obj/machinery/cooker/deepfryer,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) "bYF" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "cmoprivacy"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo) "bYG" = (/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor/plating,/area/maintenance/starboard) @@ -5380,10 +5380,10 @@ "bZx" = (/obj/structure/table/reinforced,/obj/machinery/door/window/eastleft{dir = 1; name = "Kitchen Window"; req_access_txt = "28"; req_one_access_txt = "0"},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/weapon/paper,/obj/machinery/door/window/eastleft{dir = 2; name = "Hydroponics Window"; req_access_txt = "0"; req_one_access_txt = "30;35"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/hydroponics) "bZy" = (/obj/machinery/smartfridge,/turf/simulated/wall,/area/hydroponics) "bZz" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/crew_quarters/kitchen) -"bZA" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/crew_quarters/kitchen) -"bZB" = (/obj/machinery/door/airlock/maintenance{name = "Kitchen Maintenance"; req_access_txt = "28"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/crew_quarters/kitchen) -"bZC" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/starboard) -"bZD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/starboard) +"bZA" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/hydroponics) +"bZB" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) +"bZC" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) +"bZD" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/sortjunction{sortType = 21},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/starboard) "bZE" = (/obj/machinery/power/apc{cell_type = 2500; dir = 1; name = "Starboard Maintenance APC"; pixel_x = -1; pixel_y = 26},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/starboard) "bZF" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/starboard) "bZG" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/starboard) @@ -5453,8 +5453,8 @@ "caS" = (/obj/structure/closet{name = "spare parts locker"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/item/weapon/rack_parts,/obj/item/weapon/rack_parts,/obj/item/weapon/wrench,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/crew_quarters/kitchen) "caT" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/window/eastright{dir = 1; name = "Kitchen Delivery"; req_access_txt = "28"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/crew_quarters/kitchen) "caU" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 8; location = "Kitchen"},/obj/structure/plasticflaps{opacity = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/crew_quarters/kitchen) -"caV" = (/obj/structure/disposalpipe/sortjunction{dir = 2; sortType = 20},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/starboard) -"caW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/starboard) +"caV" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Hydroponics Maintenance"; req_access_txt = "35"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/hydroponics) +"caW" = (/obj/item/trash/candy,/obj/structure/disposalpipe/segment{dir = 4},/obj/item/clothing/accessory/stethoscope,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "caX" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plating,/area/maintenance/starboard) "caY" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "rdprivacy"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/crew_quarters/hor) "caZ" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/starboard) @@ -5527,7 +5527,7 @@ "cco" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plating,/area/maintenance/portsolar) "ccp" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/light/small{dir = 4},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor/plating,/area/maintenance/portsolar) "ccq" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"ccr" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/foodcart,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) +"ccr" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"}) "ccs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"}) "cct" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "ccu" = (/turf/simulated/floor/plating{tag = "icon-warnplatecorner (WEST)"; icon_state = "warnplatecorner"; dir = 8},/area/maintenance/aft{name = "Aft Maintenance"}) @@ -5593,7 +5593,7 @@ "cdC" = (/obj/machinery/power/solar_control{id = "aftport"; name = "Aft Port Solar Control"; track = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/portsolar) "cdD" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/portsolar) "cdE" = (/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},/turf/simulated/floor/plating,/area/maintenance/portsolar) -"cdF" = (/obj/structure/rack,/obj/item/weapon/contraband/poster,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"cdF" = (/obj/structure/rack,/obj/item/weapon/poster/random_contraband,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "cdG" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "cdH" = (/obj/structure/closet,/obj/item/device/flashlight,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cdI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/medbay3{name = "Medbay Aft"}) @@ -5654,7 +5654,7 @@ "ceL" = (/obj/effect/spawner/window/reinforced,/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,/area/security/checkpoint/science{name = "Security Post - Research Division"}) "ceM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/external{name = "Solar Maintenance"; req_access = null; req_access_txt = "10; 13"},/turf/simulated/floor/plating,/area/maintenance/portsolar) "ceN" = (/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/aft{name = "Aft Maintenance"}) -"ceO" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) +"ceO" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/item/weapon/poster/random_contraband,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "ceP" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "ceQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "toxins_blastdoor"; layer = 2.7; name = "privacy shutters"; opacity = 0},/obj/machinery/door/airlock/research{name = "Toxins Launch Room Access"; req_access_txt = "8"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "ceR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"}) @@ -5675,7 +5675,7 @@ "cfg" = (/obj/machinery/power/apc{dir = 8; name = "Medical Security Checkpoint APC"; pixel_x = -24; pixel_y = 0},/obj/machinery/alarm{pixel_y = 28},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/structure/closet/secure_closet/security/med,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/checkpoint/medical) "cfh" = (/obj/machinery/recharger{pixel_y = 4},/obj/structure/table/reinforced,/obj/machinery/requests_console{department = "Security"; departmentType = 5; pixel_y = 30},/obj/machinery/light{dir = 1},/obj/machinery/camera{c_tag = "Security Post - Medbay"; dir = 2; network = list("SS13","Medbay")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/checkpoint/medical) "cfi" = (/obj/item/weapon/pen,/obj/structure/table/reinforced,/obj/structure/reagent_dispensers/peppertank{pixel_x = 30; pixel_y = 0},/obj/item/weapon/folder/red,/obj/item/weapon/book/manual/security_space_law{pixel_x = 3; pixel_y = 4},/obj/machinery/newscaster/security_unit{pixel_y = 32},/obj/item/weapon/screwdriver{pixel_y = 10},/obj/item/device/radio/off,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/checkpoint/medical) -"cfj" = (/obj/structure/table,/obj/machinery/power/apc{dir = 4; name = "Morgue APC"; pixel_x = 26; pixel_y = 0},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/item/weapon/folder/white,/obj/item/clothing/gloves/color/latex,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/autopsy_scanner,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue) +"cfj" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteyellow"},/area/medical/medbay{name = "Medbay Central"}) "cfk" = (/obj/structure/sign/greencross,/turf/simulated/wall,/area/medical/medbay{name = "Medbay Central"}) "cfl" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"; tag = "icon-whitehall (WEST)"},/area/medical/medbay{name = "Medbay Central"}) "cfm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"; tag = "icon-whitehall (WEST)"},/area/medical/medbay{name = "Medbay Central"}) @@ -5764,13 +5764,13 @@ "cgR" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 6},/area/hydroponics) "cgS" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "green"},/area/hydroponics) "cgT" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/hydroponics) -"cgU" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/hydroponics) -"cgV" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/hydroponics) -"cgW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Hydroponics Backroom"; req_access_txt = "35"; req_one_access_txt = "0"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/hydroponics) -"cgX" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) -"cgY" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) -"cgZ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Hydroponics Maintenance"; req_access_txt = "35"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/hydroponics) -"cha" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/sortjunction{sortType = 21},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/starboard) +"cgU" = (/obj/machinery/light{dir = 1},/obj/structure/sign/nosmoking_2{pixel_x = 0; pixel_y = 30},/obj/structure/table,/obj/machinery/computer/med_data/laptop,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/sleeper{name = "Sleepers"}) +"cgV" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/sleeper{name = "Sleepers"}) +"cgW" = (/obj/machinery/power/compressor{comp_id = "incineratorturbine"; dir = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/engine/insulated/vacuum,/area/maintenance/incinerator) +"cgX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) +"cgY" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) +"cgZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) +"cha" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) "chb" = (/obj/structure/rack,/obj/item/weapon/extinguisher,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/starboard) "chc" = (/obj/structure/closet,/obj/item/stack/cable_coil/random,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/starboard) "chd" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/incinerator) @@ -5929,7 +5929,6 @@ "cka" = (/obj/structure/sign/nosmoking_2{pixel_x = -28},/obj/machinery/atmospherics/unary/portables_connector{dir = 4; name = "input gas connector port"},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "ckb" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "input port pump"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "ckc" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/insulated{dir = 6},/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) -"ckd" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -31},/mob/living/simple_animal/mouse,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "cke" = (/obj/machinery/sparker{dir = 2; id = "mixingsparker"; pixel_x = 25},/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 4; frequency = 1443; id = "air_in"},/turf/simulated/floor/engine/insulated/vacuum,/area/toxins/mixing{name = "\improper Toxins Lab"}) "ckf" = (/obj/machinery/meter,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "ckg" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/maintenance/starboard) @@ -5970,7 +5969,7 @@ "ckP" = (/obj/machinery/light,/obj/structure/stool/bed/roller,/obj/machinery/camera{c_tag = "Medbay Foyer"; dir = 1; network = list("SS13","Medbay")},/obj/machinery/firealarm{dir = 1; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) "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"}) +"ckS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/toxins/explab) "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/reinforced,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/medical/medbay2{name = "Medbay Storage"}) "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) @@ -6022,7 +6021,7 @@ "clP" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "clQ" = (/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/sleeper{name = "Sleepers"}) "clR" = (/obj/structure/closet/wardrobe/pjs,/obj/machinery/alarm{pixel_y = 24},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/sleeper{name = "Sleepers"}) -"clS" = (/obj/machinery/computer/med_data,/obj/machinery/light{dir = 1},/obj/structure/sign/nosmoking_2{pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/sleeper{name = "Sleepers"}) +"clS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) "clT" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/obj/machinery/power/apc{dir = 1; name = "Sleeper Room APC"; pixel_y = 24},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/item/clothing/accessory/stethoscope,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/sleeper{name = "Sleepers"}) "clU" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 4},/obj/machinery/light_switch{pixel_x = 11; pixel_y = 23},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/sleeper{name = "Sleepers"}) "clV" = (/obj/item/weapon/storage/firstaid/regular{pixel_x = 3; pixel_y = -3},/obj/item/weapon/storage/firstaid/brute{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/brute,/obj/item/weapon/storage/firstaid/brute{pixel_x = -3; pixel_y = -3},/obj/machinery/power/apc{dir = 2; name = "Medbay Storage APC"; pixel_y = -24},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/light_switch{pixel_x = -26; pixel_y = 0},/obj/machinery/light/small,/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 10; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"}) @@ -6176,7 +6175,7 @@ "coN" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_Toxins = 0},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/medical/research{name = "Research Division"}) "coO" = (/obj/machinery/power/apc{cell_type = 10000; dir = 1; name = "Research Division APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/camera{c_tag = "Research Division - Airlock"; dir = 2; network = list("SS13","RD")},/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 5},/area/medical/research{name = "Research Division"}) "coP" = (/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"}) -"coQ" = (/obj/item/weapon/tank/air,/obj/item/weapon/tank/air,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"}) +"coQ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/aft{name = "Aft Maintenance"}) "coR" = (/obj/structure/stool,/obj/machinery/newscaster{pixel_x = -30; pixel_y = 0},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/research{name = "Research Division"}) "coS" = (/obj/structure/stool,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/research{name = "Research Division"}) "coT" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/research{name = "Research Division"}) @@ -6367,7 +6366,7 @@ "csw" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"}) "csx" = (/obj/machinery/light_construct/small{dir = 4},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 30; pixel_y = 0},/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"}) "csy" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/structure/disposalpipe/segment,/obj/effect/spawner/lootdrop{loot = list(/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/item/weapon/cigbutt,/obj/item/trash/cheesie,/obj/item/trash/candy,/obj/item/trash/chips,/obj/item/trash/pistachios,/obj/item/trash/plate,/obj/item/trash/popcorn,/obj/item/trash/raisins,/obj/item/trash/sosjerky,/obj/item/trash/syndi_cakes); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"csz" = (/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/medical/sleeper{name = "Sleepers"}) +"csz" = (/obj/machinery/door/airlock/maintenance{name = "Experimentation Lab Maintenance"; req_access_txt = "8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/toxins/explab) "csA" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio7"; layer = 2.5; name = "containment blast door"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) "csB" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio1"; layer = 2.5; name = "containment blast door"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) "csC" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Observation"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel,/area/medical/surgery) @@ -6456,6 +6455,7 @@ "cuh" = (/obj/structure/disposalpipe/segment,/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) "cui" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"},/area/toxins/lab) "cuj" = (/obj/structure/table,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/toxins/lab) +"cuk" = (/obj/machinery/computer/security/telescreen{desc = "Used for monitoring medbay to ensure patient safety."; dir = 8; name = "Medbay Monitor"; network = list("Medbay"); pixel_x = 29; pixel_y = 0},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = -29},/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/structure/table/glass,/obj/item/weapon/stamp/cmo,/obj/item/key/ambulance{name = "spare ambulance key"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) "cul" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) "cum" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) "cun" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"}) @@ -6489,6 +6489,7 @@ "cuP" = (/obj/structure/stool/bed/roller,/obj/machinery/light/small{dir = 8},/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "cuQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "cuR" = (/obj/structure/stool/bed,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"cuS" = (/obj/vehicle/ambulance,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "cuT" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/cryo) "cuU" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/cryo) "cuV" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/medical/cryo) @@ -6533,19 +6534,20 @@ "cvI" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) "cvJ" = (/obj/machinery/door/firedoor,/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/door/airlock/research{name = "Experimentation Lab"; req_access_txt = "8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/explab) "cvK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/toxins/explab) -"cvL" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) -"cvM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) -"cvN" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) -"cvO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) -"cvP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) -"cvQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/toxins/explab) -"cvR" = (/obj/machinery/door/airlock/maintenance{name = "Experimentation Lab Maintenance"; req_access_txt = "8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/toxins/explab) -"cvS" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/aft{name = "Aft Maintenance"}) +"cvL" = (/obj/structure/stool/bed/amb_trolley,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"cvM" = (/obj/structure/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/medical,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/medical,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) +"cvN" = (/obj/effect/landmark/start{name = "Paramedic"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"cvO" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/newscaster{pixel_x = 0; pixel_y = -32},/obj/machinery/camera{c_tag = "Medbay Recovery Room"; dir = 1; network = list("SS13","Medbay")},/obj/structure/closet/paramedic,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"cvP" = (/turf/space,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating/airless/catwalk,/area/space) +"cvQ" = (/turf/space,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating/airless/catwalk,/area/space) +"cvR" = (/obj/structure/table,/obj/machinery/power/apc{dir = 4; name = "Morgue APC"; pixel_x = 26; pixel_y = 0},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/item/weapon/folder/white,/obj/item/clothing/gloves/color/latex,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/autopsy_scanner,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue) +"cvS" = (/obj/structure/rack,/obj/item/weapon/crowbar/red,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 26},/obj/item/weapon/wrench,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/item/weapon/restraints/handcuffs/cable/zipties,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitegreen"},/area/medical/virology) "cvT" = (/obj/structure/stool/bed/roller,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"}) "cvU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/aft{name = "Aft Maintenance"}) "cvV" = (/obj/structure/barricade/wooden,/obj/structure/girder,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cvW" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cvX" = (/obj/effect/decal/cleanable/blood/gibs/limb,/obj/structure/rack,/obj/item/weapon/storage/firstaid/regular{pixel_x = 0; pixel_y = 0},/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/ointment,/obj/item/clothing/glasses/hud/health,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) +"cvY" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "cvZ" = (/obj/structure/stool,/turf/simulated/floor/wood{tag = "icon-wood-broken7"; icon_state = "wood-broken7"},/area/maintenance/aft{name = "Aft Maintenance"}) "cwa" = (/turf/simulated/floor/wood{tag = "icon-wood-broken6"; icon_state = "wood-broken6"},/area/maintenance/aft{name = "Aft Maintenance"}) "cwb" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"}) @@ -6566,6 +6568,7 @@ "cwq" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/medical/cryo) "cwr" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) "cws" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) +"cwt" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "7;12;47"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cwu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) "cwv" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) "cww" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) @@ -6610,7 +6613,7 @@ "cxj" = (/obj/structure/stool/bed,/obj/effect/decal/cleanable/blood/gibs/limb,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cxk" = (/obj/item/toy/cards/deck,/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"}) "cxl" = (/turf/simulated/floor/wood{tag = "icon-wood-broken4"; icon_state = "wood-broken4"},/area/maintenance/aft{name = "Aft Maintenance"}) -"cxm" = (/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/reagent_containers/food/drinks/cans/beer{pixel_x = -3; pixel_y = 2},/obj/structure/table/woodentable,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/aft{name = "Aft Maintenance"}) +"cxm" = (/obj/item/weapon/poster/random_contraband,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/reagent_containers/food/drinks/cans/beer{pixel_x = -3; pixel_y = 2},/obj/structure/table/woodentable,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/aft{name = "Aft Maintenance"}) "cxn" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; pixel_y = 2},/obj/machinery/light_switch{pixel_x = -28; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "cxo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "cxp" = (/obj/machinery/computer/operating,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) @@ -6641,7 +6644,9 @@ "cxO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "cxP" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "cxQ" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) +"cxR" = (/obj/machinery/door/airlock/research{name = "Research Shuttle Dock"; req_access_txt = "47"},/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"}) "cxS" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/preopen{id_tag = "researchrangeshutters"; name = "blast door"},/turf/simulated/floor/plating,/area/toxins/misc_lab{name = "\improper Research Testing Range"}) +"cxT" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"}) "cxU" = (/turf/simulated/wall,/area/crew_quarters/hor) "cxV" = (/turf/simulated/wall/r_wall,/area/toxins/storage) "cxW" = (/obj/structure/sign/biohazard,/turf/simulated/wall/r_wall,/area/toxins/storage) @@ -6664,6 +6669,7 @@ "cyn" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8},/turf/simulated/floor/plating/airless,/area/space) "cyo" = (/obj/structure/table,/obj/item/weapon/scalpel{pixel_y = 12},/obj/item/weapon/circular_saw,/obj/structure/window/reinforced/polarized{tag = "icon-rwindow (NORTH)"; icon_state = "rwindow"; dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "cyp" = (/obj/structure/table,/obj/item/weapon/cautery{pixel_x = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/razor{pixel_y = 5},/obj/structure/window/reinforced/polarized{tag = "icon-rwindow (NORTH)"; icon_state = "rwindow"; dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"cyq" = (/obj/machinery/light{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"}) "cyr" = (/obj/structure/stool/bed/roller,/obj/machinery/light/small{dir = 8},/obj/structure/sign/nosmoking_2{pixel_x = -28},/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "cys" = (/obj/machinery/light/small{dir = 4; pixel_y = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "cyt" = (/turf/simulated/wall,/area/medical/cryo) @@ -6678,6 +6684,7 @@ "cyC" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) "cyD" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cyE" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) +"cyF" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"}) "cyG" = (/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j1s"; sortType = 11},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"}) "cyH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/spawner/lootdrop{loot = list(/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/item/weapon/cigbutt,/obj/item/trash/cheesie,/obj/item/trash/candy,/obj/item/trash/chips,/obj/item/trash/pistachios,/obj/item/trash/plate,/obj/item/trash/popcorn,/obj/item/trash/raisins,/obj/item/trash/sosjerky,/obj/item/trash/syndi_cakes); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cyI" = (/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j2s"; sortType = 23},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"}) @@ -6709,6 +6716,7 @@ "czi" = (/obj/machinery/computer/area_atmos,/obj/machinery/light/small{dir = 1},/obj/structure/sign/nosmoking_2{pixel_y = 32},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/storage) "czj" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "Toxins Storage APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/toxins/storage) "czk" = (/obj/machinery/portable_atmospherics/scrubber/huge,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/toxins/storage) +"czl" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"}) "czm" = (/obj/structure/grille/broken,/turf/space,/area/space) "czn" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"}) "czo" = (/obj/machinery/vending/assist,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"}) @@ -6722,7 +6730,7 @@ "czw" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) "czx" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/medbay{name = "Medbay Central"}) "czy" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/light_switch{pixel_x = -28; pixel_y = 0},/obj/machinery/newscaster{pixel_x = 0; pixel_y = -30},/obj/machinery/light/small,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) -"czz" = (/obj/structure/rack,/obj/item/clothing/head/helmet/space/hardsuit/medical,/obj/item/clothing/mask/breath,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/medical,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) +"czz" = (/obj/machinery/light{dir = 1},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"}) "czA" = (/obj/structure/table/glass,/obj/item/weapon/pen,/obj/item/clothing/accessory/stethoscope,/obj/structure/extinguisher_cabinet{pixel_x = 6; pixel_y = -30},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) "czB" = (/turf/simulated/wall/r_wall,/area/medical/genetics) "czC" = (/turf/simulated/wall,/area/medical/genetics) @@ -6767,6 +6775,7 @@ "cAp" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) "cAq" = (/obj/item/weapon/storage/box/rxglasses{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/bodybags,/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = -29},/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/genetics) "cAr" = (/obj/item/clothing/gloves/color/latex,/obj/item/clothing/gloves/color/latex,/obj/item/weapon/storage/box/disks{pixel_x = 2; pixel_y = 2},/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/genetics) +"cAs" = (/obj/machinery/power/apc{dir = 2; name = "Research Shuttle Dock APC"; pixel_y = -24},/obj/structure/cable/yellow,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "cAu" = (/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/sign/nosmoking_2{pixel_y = 32},/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/genetics) "cAv" = (/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/medical/genetics) "cAw" = (/obj/structure/noticeboard{desc = "A board for pinning important notices upon. Probably helpful for keeping track of requests."; name = "requests board"; pixel_x = -32; pixel_y = 32},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 5; icon_state = "blue"},/area/medical/genetics) @@ -6863,7 +6872,6 @@ "cCl" = (/obj/structure/stool/bed/roller,/obj/machinery/light/small{dir = 8},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/sign/nosmoking_2{pixel_x = -28},/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "cCm" = (/obj/machinery/bodyscanner,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "cCn" = (/obj/machinery/body_scanconsole,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cCo" = (/obj/structure/stool/bed,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/weapon/bedsheet/medical,/obj/machinery/newscaster{pixel_x = 0; pixel_y = -32},/obj/machinery/camera{c_tag = "Medbay Recovery Room"; dir = 1; network = list("SS13","Medbay")},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "cCp" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/clothing/accessory/stethoscope,/obj/machinery/light/small{dir = 8},/obj/machinery/power/apc{dir = 8; name = "Patient Room B APC"; pixel_x = -26; pixel_y = 0},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/light_switch{pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/exam_room{name = "Patient Room B"}) "cCq" = (/obj/structure/stool/bed/chair/office/light{dir = 8},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/landmark/start{name = "Medical Doctor"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/vending/wallmed1{pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/exam_room{name = "Patient Room B"}) "cCr" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/door_control{id = "isolb"; name = "Privacy Shutters"; pixel_y = 25},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"},/area/medical/exam_room{name = "Patient Room B"}) @@ -6938,8 +6946,6 @@ "cDL" = (/obj/machinery/light/small{dir = 1},/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/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cDM" = (/obj/machinery/door/airlock/external{req_access_txt = "0"; req_one_access_txt = "13,8"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cDN" = (/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/light/small{dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"}) -"cDO" = (/turf/simulated/floor/plating/airless/catwalk,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/space,/area/space) -"cDP" = (/turf/simulated/floor/plating/airless/catwalk,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/space,/area/space) "cDQ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/aft{name = "Aft Maintenance"}) "cDR" = (/obj/machinery/door/airlock/external{req_access_txt = "13"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cDS" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) @@ -7278,7 +7284,6 @@ "cKx" = (/obj/structure/lattice,/turf/space,/area/toxins/mixing{name = "\improper Toxins Lab"}) "cKB" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/wall/r_wall,/area/toxins/mixing{name = "\improper Toxins Lab"}) "cKC" = (/obj/machinery/light,/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hydroponics) -"cKD" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/meter,/obj/machinery/embedded_controller/radio/airlock{tag_airpump = "tox_airlock_pump"; tag_exterior_door = "tox_airlock_exterior"; id_tag = "tox_airlock_control"; tag_interior_door = "tox_airlock_interior"; pixel_x = -24; pixel_y = 0; tag_chamber_sensor = "tox_airlock_sensor"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhitecorner"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cKE" = (/obj/machinery/atmospherics/binary/valve{dir = 4; name = "manual outlet valve"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cKF" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/structure/window/reinforced{dir = 1; pixel_y = 2},/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cKG" = (/obj/structure/closet/wardrobe/grey,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) @@ -7298,7 +7303,6 @@ "cKV" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;5;39;6"},/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/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cKW" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitehall"},/area/medical/medbay3{name = "Medbay Aft"}) "cKX" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay3{name = "Medbay Aft"}) -"cKY" = (/obj/machinery/computer/security/telescreen{desc = "Used for monitoring medbay to ensure patient safety."; dir = 8; name = "Medbay Monitor"; network = list("Medbay"); pixel_x = 29; pixel_y = 0},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = -29},/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/structure/table/glass,/obj/item/weapon/stamp/cmo,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) "cKZ" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitecorner"},/area/medical/medbay3{name = "Medbay Aft"}) "cLa" = (/obj/item/device/healthanalyzer{pixel_x = 1; pixel_y = 4},/obj/structure/sign/nosmoking_2{pixel_x = 0; pixel_y = -30},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitehall"},/area/medical/medbay3{name = "Medbay Aft"}) "cLb" = (/obj/machinery/vending/medical,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitecorner"},/area/medical/medbay3{name = "Medbay Aft"}) @@ -7333,7 +7337,6 @@ "cLH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology) "cLI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology) "cLJ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology) -"cLK" = (/obj/structure/rack,/obj/item/weapon/crowbar/red,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 26},/obj/item/weapon/wrench,/obj/item/weapon/restraints/handcuffs,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitegreen"},/area/medical/virology) "cLL" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"}) "cLM" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreen"},/area/medical/virology) "cLN" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) @@ -7629,10 +7632,8 @@ "cRI" = (/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 = 1; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) "cRJ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) "cRK" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "7;12;47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) -"cRL" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) -"cRM" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "7;12;47"},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/aft{name = "Aft Maintenance"}) "cRN" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"cRO" = (/obj/structure/closet/crate,/obj/item/weapon/contraband/poster/legit,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"}) +"cRO" = (/obj/structure/closet/crate,/obj/item/weapon/poster/random_official,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"}) "cRP" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"}) "cRQ" = (/obj/machinery/power/apc{dir = 8; name = "Aft Starboard Solar APC"; pixel_x = -26; pixel_y = 3},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cRR" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/starboardsolar) @@ -7665,7 +7666,6 @@ "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"}) "cSu" = (/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/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"}) -"cSv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "cSw" = (/obj/structure/stool,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/camera{c_tag = "Aft Starboard Solar Maintenance"; dir = 4; network = list("SS13")},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cSx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cSy" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/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/starboardsolar) @@ -7709,7 +7709,6 @@ "cTk" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cTl" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Secure Lab"; req_access_txt = "47"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cTm" = (/obj/structure/sign/securearea,/turf/simulated/wall,/area/toxins/xenobiology{name = "\improper Secure Lab"}) -"cTn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/research{name = "Research Shuttle Dock"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "cTo" = (/obj/machinery/biogenerator,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"}) "cTp" = (/obj/structure/rack{layer = 2.8},/obj/item/seeds/wheat,/obj/item/seeds/watermelon,/obj/item/seeds/watermelon,/obj/item/seeds/grape,/obj/item/seeds/glowshroom,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"}) "cTq" = (/obj/item/device/plant_analyzer,/obj/item/weapon/cultivator,/obj/item/weapon/reagent_containers/glass/bucket,/obj/structure/rack{layer = 2.8},/obj/item/seeds/corn,/obj/item/seeds/cabbage,/obj/item/seeds/ambrosia,/obj/item/seeds/grass,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"}) @@ -7855,8 +7854,6 @@ "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"}) "cWj" = (/obj/structure/window/reinforced,/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"}) -"cWk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"}) -"cWl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"}) "cWm" = (/obj/machinery/door/airlock/external{name = "Solar Maintenance"; req_access = null; req_access_txt = "10; 13"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cWn" = (/obj/structure/closet/coffin,/turf/simulated/floor/plating,/area/chapel/main) "cWo" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) @@ -7890,7 +7887,6 @@ "cWQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) "cWR" = (/turf/space,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating/airless/catwalk,/area/solar/starboard) "cWS" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/research) -"cWT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"}) "cWU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main) "cWV" = (/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) "cWW" = (/obj/item/weapon/storage/bible,/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) @@ -7908,7 +7904,6 @@ "cXi" = (/obj/structure/closet/l3closet/scientist,/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cXj" = (/obj/structure/closet/coffin,/obj/machinery/light/small,/turf/simulated/floor/plating,/area/chapel/main) "cXk" = (/obj/machinery/light/small{dir = 4},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/camera{c_tag = "Chapel - Funeral Parlour"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) -"cXl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"}) "cXm" = (/obj/item/device/flashlight/lantern{pixel_y = 7},/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) "cXn" = (/obj/effect/landmark/start{name = "Chaplain"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) "cXo" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/shuttle/research) @@ -7920,7 +7915,6 @@ "cXv" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{autoclose = 0; frequency = 1449; icon_state = "door_locked"; id_tag = "xeno_airlock_interior"; locked = 1; name = "Secure Lab Internal Airlock"; req_access_txt = "55"},/obj/machinery/embedded_controller/radio/airlock/access_controller{frequency = 1449; id_tag = "xeno_airlock_control"; pixel_x = -25; pixel_y = -10; req_access_txt = "55"; tag_exterior_door = "xeno_airlock_exterior"; tag_interior_door = "xeno_airlock_interior"},/obj/machinery/access_button{command = "cycle_interior"; master_tag = "xeno_airlock_control"; pixel_x = -25; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cXx" = (/obj/machinery/camera{active_power_usage = 0; c_tag = "Bomb Test Site"; desc = "A specially-reinforced camera with a long lasting battery, used to monitor the bomb testing site. An external light is attached to the top."; dir = 8; invuln = 1; light = null; luminosity = 3; name = "Hardened Bomb-Test Camera"; network = list("Toxins","Research","SS13"); use_power = 0},/obj/item/target/alien{anchored = 1},/turf/simulated/shuttle/plating{dir = 4; icon_state = "warnplate"; luminosity = 2; nitrogen = 0.01; oxygen = 0.01; temperature = 2.7},/area/toxins/test_area) "cXz" = (/obj/machinery/smartfridge/secure/extract,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) -"cXA" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"}) "cXB" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/research) "cXC" = (/obj/structure/grille,/obj/structure/window/full/shuttle,/turf/simulated/shuttle/plating,/area/shuttle/research) "cXD" = (/obj/structure/closet/crate,/turf/simulated/shuttle/floor,/area/shuttle/research) @@ -7967,7 +7961,6 @@ "cYu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cYv" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cYx" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/shuttle/research) -"cYy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"}) "cYz" = (/obj/machinery/computer/shuttle/science,/turf/simulated/shuttle/floor,/area/shuttle/research) "cYA" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/solar{id = "aftstarboard"; name = "Aft-Starboard Solar Array"},/turf/simulated/floor/plating/airless{icon_state = "solarpanel"},/area/solar/starboard) "cYB" = (/turf/simulated/floor/plating/airless/catwalk,/area/solar/starboard) @@ -8044,7 +8037,6 @@ "dab" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "dac" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #2"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "dae" = (/obj/machinery/camera{c_tag = "Head of Personnel's Office"; dir = 1; network = list("SS13")},/obj/structure/table/woodentable,/obj/item/weapon/storage/box/PDAs{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/box/ids,/obj/item/weapon/storage/box/ids,/turf/simulated/floor/wood,/area/crew_quarters/heads) -"daf" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"}) "dag" = (/obj/machinery/door/poddoor{id_tag = "chapelgun"; name = "Chapel Launcher Door"; protected = 0},/obj/structure/fans/tiny,/turf/simulated/floor/plating,/area/chapel/main) "dah" = (/turf/simulated/shuttle/wall{icon_state = "swallc2"; dir = 2},/area/shuttle/escape) "dai" = (/turf/simulated/shuttle/wall{icon_state = "swall0"; dir = 2},/area/shuttle/escape) @@ -8096,7 +8088,6 @@ "dbr" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "dbs" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "dbt" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless/catwalk,/area/solar/starboard) -"dbu" = (/obj/machinery/power/apc{dir = 2; name = "Research Shuttle Dock APC"; pixel_y = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "dbv" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"}) "dbw" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = 6; pixel_y = 0},/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = -3},/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = -3; pixel_y = 8},/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = 6; pixel_y = 8},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 3; pixel_y = -2},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 4; pixel_y = 1},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = -2; pixel_y = 5},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 2; pixel_y = 8},/turf/simulated/shuttle/floor,/area/shuttle/escape) "dbx" = (/obj/structure/table,/obj/item/weapon/scalpel{pixel_y = 12},/obj/item/weapon/circular_saw,/obj/item/weapon/retractor{pixel_x = 4},/obj/item/weapon/hemostat{pixel_x = -4},/obj/item/clothing/gloves/color/latex,/obj/item/clothing/mask/surgical,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -27},/turf/simulated/shuttle/floor,/area/shuttle/escape) @@ -8105,7 +8096,6 @@ "dbB" = (/obj/structure/window/reinforced,/obj/machinery/door_control{id = "xenobio6"; name = "Containment Blast Doors"; pixel_x = 24; pixel_y = 24; req_access_txt = "55"},/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal,/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "dbD" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"}) "dbE" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_se"; name = "southeast of station"; width = 18},/turf/space,/area/space) -"dbF" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "dbI" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen #5"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "dbJ" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/landmark/start{name = "Scientist"},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "dbK" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #6"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) @@ -8287,7 +8277,6 @@ "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/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" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/turf/simulated/shuttle/wall{tag = "icon-diagonalWall3"; icon_state = "diagonalWall3"; dir = 2},/area/shuttle/escape) "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) @@ -8326,7 +8315,6 @@ "dfZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bluecorner"},/area/hallway/secondary/entry{name = "Arrivals"}) "dga" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/area/hallway/secondary/entry{name = "Arrivals"}) "dgb" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/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/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"}) -"dgc" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"}) "dgd" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/door_control{desc = "A remote control-switch for the pod doors."; id = "mechpodbay"; name = "Pod Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "70"},/turf/simulated/floor/engine,/area/engine/mechanic_workshop) "dge" = (/obj/structure/table,/obj/item/weapon/folder/red{pixel_x = 3},/obj/item/weapon/folder/white{pixel_x = -4; pixel_y = 2},/obj/item/weapon/book/manual/security_space_law{pixel_x = -4; pixel_y = 4},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = -28},/turf/simulated/shuttle/floor4,/area/shuttle/escape) "dgf" = (/obj/machinery/door_control{desc = "A remote control-switch for the pod doors."; id = "escapepodbay"; name = "Pod Door Control"; pixel_x = -24; pixel_y = 0; req_access_txt = "13"},/turf/simulated/floor/engine,/area/hallway/secondary/entry{name = "Arrivals"}) @@ -8467,117 +8455,117 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaakIanvanwanxanyanzanAanBanCanDanEakyamtanGamvanIakyabqaaaaaaabqaaaaaaaaaakDakDakDamxalQanKanSanManNanOanPakHanQamCanRagBanTanWanUanVanZanXanYaonaoaaobaocaodaoeaofaogaohaoiaojaokdeUaoHaoLaooaopaheaoqalWaosapiapQajgapRaowakhaoxambaoyamcaozameaoAamgaoBaoCairairairairairaoDaoEaoFaoGapeaoGaaaabqaaaamkaoIaoJankaoJaoKamkabqaaaapgaoMapgasTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehaoOaoPaeGaoQaoRaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaktaoSaktaoTaoUaoVaoWaktaoXaoYaoZapaapbapcapdaphakyabqapfapfalLapfapfaaaakDapSapSamxaqaaqHapjapkaplapmapnapoappapqappaprapsapsaptapuapvapwapxapxapyapzapAapBapCapDapEapFapGapHapIdeYdeXapLapMapNaheamoapPalWarMarOajgaipaowakhajpapTapUapVapWapXapYamgapZaqDairairairairairaqbafbaqcaoGaqdaqeaefaefabqamkaqfaqgaqhaqiaqjamkabqanoapgaqkapgansaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehaqmaqnaeGaqpaqoaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaktaqqaqraqraqraqsaqtaktamuaqvapdakyaqxaqyaqzaqAakyapfapfaqBaqCanEajgajgakDaqFaqEamxamwarSaqTaqIaqJaqKaqLakHaqMaqNaqOagBaqPaqQaqRaxfaqYaqUaqVaqWakHaqXdfnaqZapCaraarbarcardarearfargalSalSarhaheaheajgariajgarjajgajgafbarkarlajpajparmarnaroarparparqapZaqDairairairairairaqbarrarsaoGaqeaoGaoGapeaoGamkartaruankarvarwamkabqapgapgaoMapgansaoGaoGaoGcKIacJaaaaaaaaaaaaaaaaaaaaaaaaaaaaflaeFarxaryarzaeFafgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarBaaaaaaarAaaaarAaaaaaaabqabqabqaaaaaaaaaaaaaaaabqaaaabqaaaabqaaaaktarCarDarEarFarGarHaktapdaqvapdapfarIapdapdapdarJapfarKarUamzarNajganHarWarParRaumazcaCTarVaorarXarYarZagBamKasaamKagBagBamKascamKagBarQaseasfasdashdfnasiapCapCaslasmasnasoarfaspasqasrassastastastasvaswasxasyaszaszasAasBasCasCasDasEasFasGasGasGasHaqDairairairairairaqbasIasJaoGarsasKaouasJasNamkasjasgasQasOasPamkabqansasUasVasWaoGauodgCbkjavNavNblzaaaaaaaaaaaaaaaaaaaaaaaaaaaaflaeFaeFaeFafgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarAabqabqarAarAarAabqaaaarAarAataarAarAaaaabqapfapfalLapfabqaaaabqabqabqabqabqapfalLaktaktatbatcatdaktaktaktaoXateaoZatfapbatgapdapdatiapfaoXaElaEjajgajgatlatmaquapOamxamxamxakDakDatpatqatrasSasRatuatsatvattatwazxatxagBatHanYamLakHatBdfnatCatDatEatFatGauHatIarfauOatKatKamOamOamOamOatLafbaeNatMaeNafbatNatOatPatQatRatSatTatUatVatWatXatYatZatZatZatZatZauaaubayvaoGasJasJasJasJaudamkaueaufaugauhavFamkabqansaujaukaulaoGdgCdgCbnGblAbvublBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaupabqarAabqaupabqarAarAabqarAarAarAarAarAaaaaaaaaaapfauqauCapfautausausausausausauuapfarKauqapfauwauxaoXauyauzapfauAauBauCapfarIatjauDauEarJapfauGaNEaFEajgauIatmakeakfaqwajgauLamxauMauNaqJatqapnauQauPauTauRauSauSauUauVauWauXaqUauYanYakHdfsdfravcauZaveavfaveavhaveaviavjavkavlavlavmavnamOatLafbavoavpavqavravravravravravsavtavuavvavvavvavvavvavwaoGaqGavyavzaoGaoGasJaoGavAawMavCasJavDavEavHavGawZavIavJamkapeansarTavLavMaoGdgCdgCblyavNavNbnHaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAabqarAabqarAarAarAataabqabqabqarAarAabqaaaabqabqalLavQavRavSavTavUavUavUavUavUavVavWavXavYavZawaasuavUawcbflavUaweawfajgajgajgajgajgajgajgajgajgajgawgajgawhajgajgajgajgajgajgamxawiawjaqJatqatrasSavdawdasLawlawkawmaqUawnaqYawsawtawuasdasMdfvdfwawyawzawAawBawCawDawEawFatKawGawHawGawIamOawJawKawLaxjavqavrawNawOawPawoawRawSawTavvawUawVawWavvaoGaoGasJaubasJasIaoGayvaoGavzasJawXasJaoGawYayqamkamkaxaaxbamkayxansansaxdaxeaoGaoGbnIaxhaoGbplaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarAarAarAarAabqarAarAabqauparAarAabqabqabqabqapfapfaxiapfapfaxlaxkaxkaxkaxkaxkaxZapfapfapfapfaxmaxnaxoaxoaxoaxoaxpaxqajgaxraxsaxtaxuaxvaxwaxxaxyaxzaxAaxBaxCajgaxDaxEaxEaxEaxFamEaxGaxHaqJaxIaxJaxKaqYawpagBagBagBawrawqasdagBaxPawQakHakHamOaxLaxRaxSaxLamOaxNaxMamOaxOatKatKaxWaxWaxWamOamOatLafbdeeaAAdefavrayaaybayaawoaycaydayeayfaygayhayiavvathaoGaykaylaymaynaoGasJaoGaoGaoGayoaoGaoGaypbppayramkamkamkamkazrasIazGazFbTiaoGdfCdgCdfEaoGaoGaoGabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqarAarAarAarAarAarAarAarAarAarAarAayyarAabqaupapfapfapfayzayAapfabqabqabqabqabqabqabqabqabqabqabqapfaqBayBapdaoXapdaoXayDayEayFayHayGaAYajgajgajgaxTaxQaxQaxQaxUajgajgayMayNayOatnayMamEamEakDayQayRapnaySaySayTayUaySaySayVayUaySayWaySayVayXayYayZayUazaazbaySaySaySayUaySaOPamxazdazeazeazeazeakDatLafbaxYaWvavqavrazfazgazhavraziazjazkazlazmavvavvavvaznaoGasIasJawXasJaoGayvaoGazpaoGazqdfFazsbpmdfobpobqVbpqbqXbqWbqWbqWbqWdeSdgCdeVdgCdgCdgCaxgazHaxgaWwaWwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaupabqarAataarAarAarAarAazIabqarAarAarAarAarAarAazJazKazJazLazSapfapfabqaaaaaaaaaaaaaaaaaaaaaaaaabqapfapfapfapdaoXapdaoXazNazOazPazRatoaAYajgaaaabqaaaaaaaaaaaaaaaabqaaaaxEazUazVazWazXazYazeazZaAaaAbaAcaAdaAdaAeaAcaAdaAdaxVaAcaAhaAiaAdaAjaAkaAlaAdaAmaAnaAoaApaApaAqaAraAsaAtaAuaAvaAwaAxaAyaAzakDatLafbaxYaWxavqavraABaACaADayJaAFaAGaAHavvaAIaAJaAKavvaALaoGaoGaoGayoaoGaoGasJaoGasJaoGatAaxhaxhawYaANamkaxhaxhaxhaxhaxhaxhaxhaxhaxhayxaxhaxhaxhaxhaxhaAOaxhabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarAarAarAarAarAarAarAarAarAarAabqarAarAarAabqapfapfapfaAPazSapdapfaaaaAQaARaASaARaATabqabqabqabqapfaAUapfaAVavUavUavUaAWaAXajgaCEaAZaBaajgaaaaBbaBbaBbaBbaBbaBbaBbaaaayMaBcaBdaBeayMamEamEakDaBfaBgaBhaBiaBjaBkaBhaBlaBjaBgaBmaBnaBoaBpaBqaBraBsaBtaBuaBvaBwaBxaByaBwaBzaBAaBBaBCaBDaBEaBFaBGaBHakDatLaBIaBIaBIaBIavraBJaPWaBLaBNaBMaBOayeaBPaBQaBRaBSavvaBTaBUaBWaBWaBXaBWaBWaBWaBZaBWdgEaCaaCbaCcaCdaCeaCfaCgaChaCgaCiaCjaCkaCjaClaxhaxhaxhaCiaCjaClaCmaCmaCgabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqarAarAarAarAarAarAarAaCnarAabqabqabqabqapfaoXazSarIalLaaaaCoaCpaCqaCpaCoayKayKayKaCsaCsaCsaCsaCtaCsaCsaCuaCuaCuaCuaCvaCuaCwajgabqaBbaCxaCyaCzaCAaCBaBbaaaayMaCCaCCaCDayMaaaaaaakDayLaCGazwatJayLaCIazwakDayLaCJazwakDaCKamEaCLakDamEazzaCNamEamEaCOaCOaCPaCQaCRaCOaCOaCSakDakDakDakDakDatLaBIaQdaCUaQvavravravravravraCWaCXaCYazlazmavvavvavvaoGaCZasIarrasJasIaDadgIaxhaxhaxhaxhaxhaDbaDcaDdaDeaDfaWyaDfaDhaDiaDjaWzaDkaCjaDlaCjaDmaWzaDjaDiaCmaDnaDoabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqabqabqarAarAarAarAataarAarAarAaDparAarAarAarAabqaaaabqalLayBazSapdapfaaaaASaDqaDraDqaASayKaDsaDtaCsaDuaDvaDwaDxaDyaCsaDzaDAaDBaDCaDDaCuaCwajgaaaaBbaDEaDFaDGaDHaDIaBbaaaaxEaDJaCCaucayMaAfaAfamxaDMaDNaDOakDaDPaDNaDOakDaDQaDNaDOakDaDRaDSaDTakDaDUaDVaDWaDXaDYaCOaDZaEaaEbaEcaEdaEeaCSaEfaEgaEgaEgaEgaEiaBIaRtaEkaRyaBIaEmaEnaEmavvaEoaEpaEqaEraEsaEuaEuaEvaBWaEwaxhaxhaxhaxhaxhaxhaxhaExaExaEyaEzaEAaEBaECaEDaCgaCgaCgabqabqaEEaEFaDiaDiaDiaDiaDiaEGaEEaDiaEHaCgaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqarAarAarAarAarAarAarAabqarAabqabqarAarAabqabqapfapfauyazSapfapfaaaaCobxFaDqaDqaEIaEJaEKaEKaELaEMaENaEOaEPaEQasbaESaETaEUaEVaEWaCuaCwajgaaaaBbaEXaEYaEZaFaaFbaBbaaaayMaFcaCCaCCaFdaFeaFfamxaFgaDNaFhakDaFgaDNaFiakDaFgaDNaFjakDaFkaFlaFmakDaFnaFoaFpaFqaFraCOaFsaFtaFuaFvaFwaFxaCSaFyaFzaFzaFzaFAaFBaBIaTeaFDaThaBIaFFaFGaFGaFHaFIaFJaFKavvavvavvavvavvaoGaFLaxhaFMauraFOauvaFQaFRaFSaFTaFTaFTaFTaFUaFVaFWaFXaFYaCgaFZabqabqaaaaaaaaaabqabqaaaaaaabqaaaaaaaWAaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaarAarAarAarAarAabqabqabqarAarAarAabeaaaabqabqabqapfaAgaoXaoXaGbalLaaaaaaaASaDraDraDraASayKaGcaGdaGeaEMaEKaGfaGgaGhaCsaGiaGjaGkaGlaGmaCuaCwajgabqaBbaGnaGoaGpaGqaGraBbaaaayMaGsaGsaGsayMaAfauFamxaAEaCFaCramxaAEaCFaCramxaAEaCFaCramxaGxaCHaGzamxamxazzaGAamxaGBaCOaGCaGDaGEaGFaGGaGHaCSaGIajgajgajgaGJajgaBIaGKaGLaBIaBIaGMaGNaGOaGPaGQaGRaGSazlaGTaGUawWavvaGVaGWaxhaGXaGYaGZaGZaHaaCMaDcaHcaHdaHeaHeaHeaHfaHgaHhaHiaDLarAaMKaMJaOhaMJaMJaOhaMJaMJaOhaMJaMJaPwabqaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabqabqabqabqabqabqabqabqaHkaHlaHkabfaaaabqaaaabqapfaHmaHnanEazSapfapfaaaaCoaHoaHpaHqaCoayKayKayKaCsaHraEKaHsaGgaHtaCsaHuaHvaHwaHxaHyaCuaCwajgaaaaBbaHzaHAaHBaHCaBbaBbaaaaHDaHEaHEaHEaHFaHGaHHaHGaHIaHJaHIaHKaHIaHJaHIaHLaHIaHJaHMaHNaHOaHPaHQaFCaHSaHTaHUamxazeaCSaHVaHWaHXaHYaHZaIaaCSaGIaBIaIcaIdaIeaIfaIfaIgaIhaIiaIjaIkaIlaImaInaIoaIpayeaIqaIraIsaItavvasJaGWaxhaIuaIvaIwaIxaIyaIzaIAaIBaICaIDaIDaIDaIEaIFaHhaHiaDLaMIaPxarAaPyarAarAaPyarAarAaPyarAarAaPxaMIaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaabqabqaaaaHkaIGaHkabqabqabqabqabqapfauJapdapdaIIaIJapfaaaaIKaARaILaARaIMabqabqabqayKaINaIOaIPaIQaIRaCsaISaITaIUaIVaIWaCuaCwajgaaaabqaaaaGaaIYaGuaaaabqaaaaHGaAfaAfaAfaHGaHGaJaaJbaJcaJdaJeaJfaJgaJhaJhaJiaJhaJjaJgaJkaJlaJmaJnaERaJpaJqaJramxazeaCSaCSaJsaJtaCSaJuaCSaCSaGIaBIaBIaBIaJvaJwaJxaJyaJzaJAaJBaJCaJDaJEaJFaJFaJGaJHavvavvavvavvavvaubaGWaxhaJIaJJaJKaJLaJMaGvaJOaJPaJQaJRaJSaJTaJUaJVaHhaHiaDLaDLaPxaJWaaaaaaaaaaaaaJWaaaaaaaJWarAaPxabqaCgaJXabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaaaaabqaaaaHkaHlaHkaHkaGwaGwaGwaHkaHkaHkaHkaHkbXHaKaapfaaaaaaaaaaaaaaaaaaaaaaaaabqayKaKbaKcaKdaKeaKfaCsaJoaKhaCuaCuaCuaCuaKiajgaKjaGyaHjaHbaKgaHRaIZaIXaKjaHGaKraKsaKsaKtaKuaKvaKwaKxaKyaKzaKAaKBaTiaKDaKEaKCaKFaKGaKHaKIaKJaKKaJNaKMaKNaKOamxazeaKPaCSaKQaKRaCSaKSaKTaFzaKVaBIaKWaKXaKYaKZaBIaLaaLbaLcaBIaLdaLeaLfaLgaLfaLhaLiaLjaLkaLlaLmavvasJaGWaxhaLnaLoaLpaLqaLraFRaLsaLtaJQaLuaCgaCgaLvaLwaCgaDLaDLaDLaPxaaaaaaaaaaaaaaaaLxaaaaaaaaaaTMaRgabqaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaabqaHkaHkaLBaLzaLAaLBaLBaLBaLDaLEaLFaLGaHkaHkazSapfaaaaLHaLIaLIaLIaLIaLIaLJabqaCsaCsaCsauKazTaCsaCsaLMaLNaLOaLPaLQaLRaLSaLTaLUaLVaLWaLXaLYaLWaLZaMaaMbaHGaMcaMdaMeaMfaMfaKkaMfaMfaMfaMfaMfaMfaMfaMfaKkaMfaMhaMiaMjaMkaMkaMkaMlaMlaMlaMlaMlaMkaMmaMkaMnaMnaMnaMnaMoaMnaGIaBIaBIaBIaMpaMqaBIaMraBIaMsaBIaMtaMuaMvazlaMwaMxaMyazlaMzaMAaMBavvaMCaGWaxhaCgaCgaCgaCgaCgaFRaMEaMFaJQaMGaCgaMHaXGaWubssaWuddkaDLaPxaaaaaaabqabqabqabqabqaaaaaaarAaPxarAaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdabdabdabdabdabdabdabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaaaaaaaaaaaHkaMLaMLaMLaLBaLBaLBaLBaLBaLBaMLaMLaMMaHkazSalLaaaaMNaMOaMOaMOaMOaMOaMNabqabqaKlaMQaMRaMSaMTaMUaMVaMWaMXaMYaMZaNaaNbaNcaLRaNdaNeaNfaNgaNhaNiaNjaNkaNlaNmaNnaNoaKmaaaaaaaaaabqaaaaaaaaaabqaaaaaaaaaaKoaNraNsaNtaMkaNuaNvaNwaNxaNyaNzaNAaNBaNCaMkaNDaUfaNFaNGaNHaMnaNIaBIaNJaNKaJwaMqaBIaNLaBIaNMaBIaNNaNOaNPaNQaNQaNQaNQaNQaNQaNQaNQaNQaoGaNRaxhaNSaNTaNUaNVaCgavgaIvaMFaNXaNYaNZaOaaObaOcaOdaOeddRaDLaPxaJWabqabqaOgddSaOiabqaOjaaaarAaPxataaCgaDoabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaaaaUUaUUaUUaUUaUUaaaabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaHkaOkaLBaLBaLBaLBaLBaLBaLBaLBaMLaMLaMLaOlaOmapfaaaaMNaOnaMOaMOaMOaMOaMNaKpaKlaKlaOpaOqaOraOraOsaOtaOuaOvaOwaOxapfaOyapfapfapfapfaOzaOAavxaOCaKnavxaOAaOAaOAaOAaOFaaaaaaaOGaOGaOGaOGaOGaOGaOGaaaaaaaMfaOHaOIaOJaOKaOLaNAaOMaONaOOavBaOQaORaOSaMkaOTaOUaOVaOWaOXaMnaOYaBIaBIaBIaOZaOZaBIaBIaBIaBIaBIaPaaPbaPcaNQaPdaPeaPfaPgaPhaPiaPjaNQaPkaGWaxhaNTaNTaPlaOdaPmaGYaPnaPoaPpaPqaCgaPraPsaPtaPuaPvddUaKLddVaaaaaaabqddWcspaPzabqaaaaaaaTMaRgaMIaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaaaaaaaaaaaaaaaabdabdabdabdabdabdabdaXHaXIaWBaXJaWBaXKaXOabdabdabdabdabdabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaabqaHkaPAaLBaLBaLBaLBaPBaLBaLBaLBaLBaMLaPDaHkaGbapfaaaaMNaMOaMOaMOaMOaMOaPEawbavKawbaPHaPIaPJaPKaPLaPMaPNaPOaPPaPQaPRaPSaPTaPTaPTaPTaPVaOAaYOaPXaPYaPZaQaaQbaQcbeBaQeaQfaQgaQgaQhaQiaQjaQkaQlaQmaQmaQnaQoaQpaKGaNtaMkaQqaNAaQraNAaQsaNAaQtaNAaNAaMkaQubeLaOVaQwaQxaMnaQyaQzaQAaQBaQCaQDaQEaQFaQGaQHaQIaQJaQKaQLaNQaQMaQNaQNaQNaQOaQPaQQaNQawvaGWaxhaQSaQSaQTaOdaPmaJJaQUaQVaQWaQXaQYaQZaRaaRbaRcaRdaOfaDLaPxaaaaReabqaRfddXaRhabqabqaJWarAaPxabqaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaaaaUUaUUaUUaUUaUVaXNbbXbbWbbYbbWbbZbgUaUVaUUaUUaUUaUUaaaabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGwaLBaLBaLBaLBaLBaLBaLBaLBaLBaLBaRiaHkaHkazSapfabqaMNaMOaMOaMOaMOaMOaRkaRlaRmaRlaRnaPIaRoaRoaRpaRoaOuaRqaRraRsapfapfapfapfapfapfazSaOAbgkaRuaRvaRwaRxaRxaRxbgyaOFaaaaOGaRzaRAaRAaRAaRAaRAaRBaOGaaaaMfaRCaMiaMjaMkaRDaREaRFaNAaRGaNAaRHaRIaNAaRJaRKaRLaRMaRNaROaMnaRPaRQaRRaRRaRRaRSaRTaRTaRUaRUaRVaRWaRXaRYaRZaSaaSbaSbaSbaScaSdaSeaNQaSfaGWaxhaQSaSgaShaSiaCgaSjaIvaSkaJQaSlaCgaSmaSnaSoaSoaSoaSpaDLaPxaaaaaaabqabqabqabqabqaaaaaaarAaPxabqaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbcbbcabcabcabcabcabzhbzhbdJbzhbzhbcabcabcabcabcaaXKaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSqaSraSsaaaaGwaLBaLBaLBaLBaLBaLBaStaSuaSuaSvaSwaHkaqBazSapfabqaMNaMOaMOaMOaMOaSxaMNaKpaKlaKlaSyaPIaSzaSAaSBaSCaSDaSEaSFaSGaLKaSIaSJaSKaSLapfaSMaOAaSNaRuaSOaSPaSQaSQaSRaSSaOFaaaaMgaSUaRAaSVaSWaSXaRAaSYaMgaaaaMfaMhaMiaMjaMkaSZaTaaTbaTcaTdaTcbjbaTfaTgaMkbmIaxcaTjaTkaTlaMnaTmaTnaToaTpaTqaTraTsaTtaTuaTvaTwaTxaTyaTzaTAaTBaTCaTDaTEaTFaTGaTHaNQasIaGWaxhaCgaCgaCgaCgaCgaFRaTIaTJaTKaTLaCgaCgaLvaLwaCgaDLaDLaDLaPxaaaaaaaaaabqaaaaaaaaaaaaaaaaTMaRgabqaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbdKbdNbdNbdNbdNbdNbdNbdObdNbdNbdNbdNbdNbdNbdPbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacGaTNbBmaTNacJaHkaLBaLBaLBaLBaLBaLBaLBaLBaLBaTPaTQaHkauAaTRapfaaaaMNaMOaMOaMOaMOaMOaTSaRlaTTaRlaRnaPIaRoaRoaRpaRoaOuaOvaTUaTVaTWaTXaTYaTZaUaapfaUbaUcaUdaRuaRuaUebmJaRuaUgaUhaOFaaaaMPaUjaUkaUlaUmaUlaUkaUnaNpaaaaMfaMhaUpaUqaMkaNqaNqaNqaNqaUsaNqaNqaOoaNqaMkaMnaOBaUvaSHaMnaMnaUxaTnaTpaTqaUyaUzaTnaToaTqaTqaTpaUAaUBaUCaUDaUEaSbaSbaUFaScaUGaUHaNQaUIaGWaxhaUKaULaUMaSTaUOaUPaIvaSkaJQaUQaJSaURaUSaUTaHhaHiaDLaDLaPxaJWaaaaaaaJWaaaaaaaaaaaaaJWarAaPxabqaCgaJXabqabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXbeXbeXbeXbeXbeXbdObeXbeXbeXbeXbeXbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKIaTNaUWaTNcKIaHkaPAaMLaLBaLBaLBaLBaLBaLBaLBaUYaUZaHkaVaaAWapfaaaaMNaMOaMOaMOaMOaMOaVbayjaxXayjaVeaPIaRoaVfaVgaVhaViaVjaOuaVkaVlaVmaVnaVoaVpapfaVqaOAaVraRuaRubmKaVtaVuaUgaVvaOFaaaaOGaVwaVxaUkaVyaRAaVzaVAaOGaaaaMfaVBaOIaOJaVCaVDaVEaVEaVEaNCaVEaVEaVFaVGaMkaVHaVIaVJaVKaVLaVMaVKaVNaVOaVOaVPaVQaVRaVSaVTaVUaVVaVSaVWaVXaNQaVYaVZaWaaWbaWcaWdaWeaNQasJaWfaxhaWgaWhaWiaTOaWkaWlaWmaWnaWoaWpaWqaWqaWraWsaHhaWtaDLbeZaPxarAddZarAarAddZarAarAddZarAarAaPxaMIaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaaaaaaaaaaabdabdaXHbdMbeWbeXbeXbeXbeXaXLaXLaXMaXLaXLbeXbeXbeXbeXbeYbdMaXOabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaWDaWEaWFaWGaWDaHkaLBaMLaWHaWIaWJaLBaLBaLBaLBaUYaWKaHkazSapdalLaaaaMNaOnaMOaMOaMOaMOaMNaKpaKlaKlaWLaPIaRoaRoaRpaRoaOuaVjaWMaWNaVlaWOaWPaWQaWRapfazSaOAaWSaWTaWTaWUaWVaRuaUgaWWaOFabqaOGaOGaOGaWXaWYaWZaOGaOGaOGabqaMfaOHaXaaMjaXbaXcaVEaVEaVEaXdaVEaVEaXeaNCaXbaQCaXfaXgaXhaToayuaToaTnaTpaToaXjaToaXkaTpaTqaToaTqaTpaXlaXmaNQaXnaXoaXpaXqaXraPiaQQaNQaXsaGWaxhaXtaXuaXvaXwaXxaXyaXzaXAaXBaXCaXDaXDaXEaXFaHhaHiaDLarAdeaaMJdebaMJaMJdebaMJaMJdebaMJaMJdecabqaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaabdaaabgMbdMbeWbeXbeXaXLaXLaXLaXLbfabpvaXLaXLaXLbeXbeXbeYbdMbMnaaaabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaWDayCaXQaXRaXSaHkaXTaMLaXUaXVaXWaMLaMLaMLaXXaXYaXZaHkaYaaYbapfabqaYcaYdaMOaMOaMOaYeaYfabqabqaKlaWLaYgaPJaPKaYhaYiaYjaYkaYlaYmaYnaYnaYnaYnaYnapfaYoaYpaYqaYraYraYsaYtaYuaYvaYwaUoaaaaaaaaaaOGaOGaYyaOGaOGaaaaaaaaaaKoaNraYzaMjaYAaYBaYCaYDaYEaNCaNCaYFaYGaNCaYAaQCaYHaYIaYJaYKaYLaYKaYMaYNbmLaYPaYKaYKaYKaYKaYKaYKaYQaYRaYSaNQaNQaNQaNQaYTaNQaNQaNQaNQaoGaGWaxhaYVaYUaYUaSTaYWaYXaYYaYZaZaaZbaZcaZdaZeaZfaFXaZgaCgaaaabqabqaaaaaaaaaaaaabqaaaaaaabqabqarAaDiaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdclHbcbbfcbfbbgNaXLaXLbdIbdIbdIbgPbgObdIbdIaXLaXLbgNbgQbgSbgRaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaWDaWDaZiaZjaWDaWDaWDaZkaWDaWDaZlaZmaWDaWDaWDaZnaWDaWDaZoapfapfabqaZpaZqaZraZraZraZqaZsabqabqaZtaZuaPIaRoaRoaRpaRoaOuaZvaOuaZwaYnaZxaZyaZzaZAapfazSaOAaZBaZCaZDaZEaZFaZGaZHaZIaOFaZJaUraZJaZLaZMaZNaZOaZLaZJaUraZJaMfaZPaZQaZRaZSaMkaMkaMkaMkaZTaZUaZVaNCaZWaMkaQCaZXaTraZYaZZaZZaZZaZZaoGaoGaoGbaababbacbadbaebafaZZbagbagaoGbahazyazybaiazyazyazybakazybalaxhbambambambambanbaobapbaqbarbasbatayIbaubavaCgaCgaCgabqabqbawbaxaDiaDiaDiaDiaDiaDibawaDibayaCgaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabdaXHbgTbicbeXbeXaXLbdIbidbifbiebihbigbiibidbdIaXLbeXbeXbijbgTaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaUNbaAbaBbaCbaDbaEbaBbaFbaGbaHbaGbaIbaJbaGbaKbaLbaMbaNbaOapfaaaaaabaPbaQbaQbaQbaRaaaabqaZtbaSaWLaPIaRoaRobaTbaUaOubaVbaWbaXbaYbaZbbabbbbbcapfazSaOAaOAaOAavxavxayPaOFbbebbeaOFbbgbbhbbiaZLbbjbbkbblaZLbbmbbnbbobbpbbqbbrbbsbbtbbubbvbbwaMkaMkaYAaLLaYAaMkaMkayubbybbzayubbAbbBbbCbbDbbEbbFaoGaoGaoGaoGbbGaoGaoGaoGaoGaoGaoGaGWasIasJbbHbbHbbHbbHbbHbbHbbHbambbIbbJbbKbamazobbMbambbNbbOaFRaFRazAbbQbbRaDfbbSaDfbbTaDibbUaDiaCiaCjbbVaCjaClaDibbUaDiaCmaDnaDoabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabdaXHbdMbeWbeXaXLaXLbdIbikbilbdLbnQbimbjPbjObdIaXLaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaUNbcdbcebcebcfbcebcebcebcgbchbcibcjbckbckbckbclbcmbcnbcoapfaaaaaaabqabqaaaaaaabqabqabqaZtbcpbcqbcrbcsaRobctbcubcvbcwbcxbcybczbcAbcBbcCbcDapfazBbcFbcGbcHbcIbcJbcKbcLbcMbcNbcObcPbcQbcPbcRbcSbcTbcUbcVbcPbcWbcXbcXbcYbcZbdabcXbcXbdbbdcbdcbdcbddbdebdcbdcbdfbdcbdgbdhbdcbdcbdcbdibdjaoGbdkbdobdmbdnbdobdpbdobdqbdobdrazybakbalaubasJbbHbdsbdtbdubdvbdwbdxbambdybdzbdzbdAbdzbdBbambdCbarbdDbdEbdEbdEbdEbdEbdFaCgbdGaCjbdHaCjaDmaCgaCgaCgbdGaCjaDmaCmaCmaCgabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXaXLaXLbdIbjQbilbdIbjRbdIbjTbjSbdIbdIaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaUNaUNbdQaUNaWDaUNbdRaUNbcdbcebdSbdTaUNbdRaUNbdUbdVbdWbdXapfapfapfapfalLalLalLapfapfapfaZtbdYbdZbdZbdZbdZbeaaRobebbecbedbeeaYnaYnaYnaYnaWjapfapfbegapfapfbehbeibejbekbelbembenbekbelbeobepbembeqbekbekbekbelbekbekberbesbekbekbekbekbekbekbekbetbeubekbekbenbevbewbekbekbekbekbexbeybezbezbezbeAbezbezbezaoGbmMaoGaGWaoGaoGbeCbeCbeCbeCbeDbeEbeEbeFbeGbeHbambeIbeJbeKbmNbeMbeNbambeObePbeQbdEbeRbeSbeTbdEbeUaCgaCgaCgaCgaCgaCgaCgazMaCgaCgaCgaCgaCgaLwaCgabqarBbjUabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabdaXHbdMbeWbeXaXLaXLbjWbjVbjYbjXblFblDblIblGblJbdIaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarBaaaaaaarAaaaarAaaaaaaabqabqabqaaaaaaaaaaaaaaaabqaaaabqaaaabqaaaaktarCarDarEarFarGarHaktapdaqvapdapfarIapdapdapdarJapfarKarUamzarNajganHarWarParRaumazcaCTarVaorarXarYarZagBamKasaamKagBagBamKascamKagBarQaseasfasdashdfnasiapCapCaslasmasnasoarfaspasqasrassaEgaEgaEgastasualfaswasvasvasxasBasCasCasDasEasFasGasGasGasHaqDairairairairairaqbasIasJaoGarsasKaouasJasNamkasjasgasQasOasPamkabqansasUasVasWaoGauodgCbkjavNavNblzaaaaaaaaaaaaaaaaaaaaaaaaaaaaflaeFaeFaeFafgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarAabqabqarAarAarAabqaaaarAarAataarAarAaaaabqapfapfalLapfabqaaaabqabqabqabqabqapfalLaktaktatbatcatdaktaktaktaoXateaoZatfapbatgapdapdatiapfaoXaElaEjajgajgatlatmaquapOamxamxamxakDakDatpatqatrasSasRatuatsatvattatwazxatxagBatHanYamLakHatBdfnatCatDatEatFatGauHatIarfauOatKatKamOamOamOamOayGafbasyatMaeNafbatNatOatPatQatRatSatTatUatVatWatXatYatZatZatZatZatZauaaubayvaoGasJasJasJasJaudamkaueaufaugauhavFamkabqansaujaukaulaoGdgCdgCbnGblAbvublBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaupabqarAabqaupabqarAarAabqarAarAarAarAarAaaaaaaaaaapfauqauCapfautausausausausausauuapfarKauqapfauwauxaoXauyauzapfauAauBauCapfarIatjauDauEarJapfauGaNEaFEajgauIatmakeakfaqwajgauLamxauMauNaqJatqapnauQauPauTauRauSauSauUauVauWauXaqUauYanYakHdfsdfravcauZaveavfaveavhaveaviavjavkavlavlavmavnamOayGafbaszavpavqavravravravravravsavtavuavvavvavvavvavvavwaoGaqGavyavzaoGaoGasJaoGavAawMavCasJavDavEavHavGawZavIavJamkapeansarTavLavMaoGdgCdgCblyavNavNbnHaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAabqarAabqarAarAarAataabqabqabqarAarAabqaaaabqabqalLasAavoatLazLapdapdapdapdapdbMKavQavRaoZavWavSatkapdavYavXapdatkaxqajgajgajgajgajgajgajgajgajgajgawgajgawhajgajgajgajgajgajgamxawiawjaqJatqatrasSavdawdasLawlawkawmaqUawnaqYawsawtawuasdasMdfvdfwawyawzawAawBawCawDawEawFatKawGawHawGawIamOayGawaavZaxjavqavrawNawOawPawoawRawSawTavvawUawVawWavvaoGaoGasJaubasJasIaoGayvaoGavzasJawXasJaoGawYayqamkamkaxaaxbamkayxansansaxdaxeaoGaoGbnIaxhaoGbplaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarAarAarAarAabqarAarAabqauparAarAabqabqabqabqapfapfawcapfapfaxlaxkaxkaxkaxkaxkaxZapfapfapfapfaxmaxnaxoaxoaxoaxoaxpaxqajgaxraxsaxtaxuaxvaxwaxxaxyaxzaxAaxBaxCajgaxDaxEaxEaxEaxFamEaxGaxHaqJaxIaxJaxKaqYawpagBagBagBawrawqasdagBaxPawQakHakHamOaxLaxRaxSaxLamOaxNaxMamOaxOatKatKaxWaxWaxWamOamOayGafbdeeaAAdefavrayaaybayaawoaycaydayeayfaygayhayiavvathaoGaykaylaymaynaoGasJaoGaoGaoGayoaoGaoGaypbppayramkamkamkamkazrasIazGazFbTiaoGdfCdgCdfEaoGaoGaoGabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqarAarAarAarAarAarAarAarAarAarAarAayyarAabqaupapfapfapfayzatkapfabqabqabqabqabqabqabqabqabqabqabqapfaqBayBapdaoXapdaoXayDayEayFayHayGaAYajgajgajgaxTaxQaxQaxQaxUajgajgayMayNayOatnayMamEamEakDayQayRapnaySaySayTayUaySaySayVayUaySayWaySayVayXayYayZayUazaazbaySaySaySayUaySaOPamxazdazeazeazeazeakDayGafbaxYaWvavqavrazfazgazhavraziazjazkazlazmavvavvavvaznaoGasIasJawXasJaoGayvaoGazpaoGazqdfFazsbpmawebpobqVbpqbqXbqWbqWbqWbqWdeSdgCdeVdgCdgCdgCaxgazHaxgaWwaWwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaupabqarAataarAarAarAarAazIabqarAarAarAarAarAarAazJazKazJazLatkapfapfabqaaaaaaaaaaaaaaaaaaaaaaaaabqapfapfapfapdaoXapdaoXazNazOazPawfatoaAYajgaaaabqaaaaaaaaaaaaaaaabqaaaaxEazUazVazWazXazYazeazZaAaaAbaAcaAdaAdaAeaAcaAdaAdaxVaAcaAhaAiaAdaAjaAkaAlaAdaAmaAnaAoaApaApaAqaAraAsaAtaAuaAvaAwaAxaAyaAzakDayGafbaxYaWxavqavraABaACaADayJaAFaAGaAHavvaAIaAJaAKavvaALaoGaoGaoGayoaoGaoGasJaoGasJaoGatAaxhaxhawYawJamkaxhaxhaxhaxhaxhaxhaxhaxhaxhaxhayxaxhaxhaxhaxhaxhaAObreabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarAarAarAarAarAarAarAarAarAarAabqarAarAarAabqapfapfapfaAPatkapdapfaaaaAQaARaASaARaATabqabqabqabqapfaAUapfaAVavUavUavUaAWaAXajgawKaAZaBaajgaaaaBbaBbaBbaBbaBbaBbaBbaaaayMaBcaBdaBeayMamEamEakDaBfaBgaBhaBiaBjaBkaBhaBlaBjaBgaBmaBnaBoaBpaBqaBraBsaBtaBuaBvaBwaBxaByaBwaBzaBAaBBaBCaBDaBEaBFaBGaBHakDayGaBIaBIaBIaBIavraBJaPWaBLaBNaBMaBOayeaBPaBQaBRaBSavvaBTaBUaBWaBWaBXaBWaBWaBWaBZaBWdgEaCaaCbaCcaCdawLaCfaCgaChaCgaCiaCjaCjaCkaCjaxiaxhaxhaCgaCiaCjayAaCjaClaCgabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqarAarAarAarAarAarAarAaCnarAabqabqabqabqapfaoXatkarIalLaaaaCoaCpaCqaCpaCoayKayKayKaCsaCsaCsaCsaCtaCsaCsaCuaCuaCuaCuazRaCuaCwajgabqaBbaCxaCyaCzaCAaCBaBbaaaayMaCCaCCaCDayMaaaaaaakDayLaCGazwatJayLaCIazwakDayLaCJazwakDaCKamEaCLakDamEazzaANamEamEaCOaCOaCPaCQaCRaCOaCOaCSakDakDakDakDakDayGaBIaQdaCUaQvavravravravravraCWaCXaCYazlazmavvavvavvaoGaCZasIarrasJasIaDadgIaxhaxhaxhaxhaxhaDbaDcaCmaCeaDfaWyaDfaDhaDiaDiaDjaWzaDkaCjaDlaCjaDmaWzaDjaDiaCvaDnaCgabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqabqabqarAarAarAarAataarAarAarAaDparAarAarAarAabqaaaabqalLayBatkapdapfaaaaASaDqaDraDqaASayKaDsaDtaCsaDuaDvaDwaDxaDyaCsaDzaDAaDBaCEaCNaCuaCwajgaaaaBbaDEaDFaDGaDHaDIaBbaaaaxEaDJaCCaucayMaAfaAfamxaDMaDNaDOakDaDPaDNaDOakDaDQaDNaDOakDaDRaDSaDTakDaDUaDVaDWaDXaDYaCOaDZaEaaEbaEcaEdaEeaCSaEfaEgaEgaEgaEgaDdaBIaRtaEkaRyaBIaEmaEnaEmavvaEoaEpaEqaEraEsaEuaEuaEvaBWaEwaxhaxhaxhaxhaxhaxhaxhaExaExaEyaEzaEAaEBaDeaEDaCgaCgaCgabqabqaDiaEEaEFaDiaDiaDiaDiaDiaEGaEEaDiaDCbbTaCgaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqarAarAarAarAarAarAarAabqarAabqabqarAarAabqabqapfapfauyatkapfapfaaaaCobxFaDqaDqaEIaEJaEKaEKaELaEMaENaEOaEPaEQasbaESaETaEUaETaEWaCuaCwajgaaaaBbaEXaEYaEZaFaaFbaBbaaaayMaFcaCCaCCaFdaFeaFfamxaFgaDNaFhakDaFgaDNaFiakDaFgaDNaFjakDaFkaFlaFmakDaFnaFoaFpaFqaFraCOaFsaFtaFuaFvaFwaFxaCSayGalWalWalWapPalWaBIaTeaFDaThaBIaFFaFGaFGaFHaFIaFJaFKavvavvavvavvavvaoGaFLaxhaFMauraFOauvaFQaFRaFSaFTaFTaFTaFTaFUaDDaFWaFXaFYaCgaFZabqaaaabqaaaaaaaaaabqabqaaaaaaabqaaaaWAaEibbTaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaarAarAarAarAarAabqabqabqarAarAarAabeaaaabqabqabqapfaAgaoXaoXaECalLaaaaaaaASaDraDraDraASayKaGcaGdaGeaEMaEKaGfaGgaGhaCsaGiaGjaGkaEHaGmaCuaCwajgabqaBbaGnaGoaGpaGqaGraBbaaaayMaGsaGsaGsayMaAfauFamxaAEaCFaCramxaAEaCFaCramxaAEaCFaCramxaGxaCHaGzamxamxazzaGAamxaGBaCOaGCaGDaEVaGFaGGaGHaCSayGajgajgajgaFyajgaBIaGKaGLaBIaBIaGMaGNaGOaGPaGQaGRaGSazlaGTaGUawWavvaGVaGWaxhaGXaGYaGZaGZaHaaCMaDcaHcaFAaFzaFzaFzaFBaHgaFVaHiaDLarAaMKaMJaMJaOhaMJaMJaOhaMJaMJaOhaMJaMJaPwaWAaGbaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabqabqabqabqabqabqabqabqaHkaHlaHkabfaaaabqaaaabqapfaHmaHnanEatkapfapfaaaaCoaHoaHpaHqaCoayKayKayKaCsaHraEKaHsaGgaHtaCsaHuaHvaHwaGlaHyaCuaCwajgaaaaBbaHzaHAaHBaHCaBbaBbaaaaHDaHEaHEaHEaHFaHGaHHaHGaHIaHJaHIaHKaHIaHJaHIaHLaHIaHJaHMaHNaHOaHPaHQaFCaHSaHTaHUamxazeaCSaHVaHWaEaaGIaGEaIaaCSayGaBIaIcaIdaHdaGJaGJaHeaIhaIiaIjaIkaIlaImaInaIoaIpayeaIqaIraIsaItavvasJaGWaxhaIuaIvaIwaIxaIyaIzaIAaIBaHfaIDaIDaIDaIEaIFaHhaHiaDLaMIaPxarAarAaPyarAarAaPyarAarAaPyarAarAaPxaWAaHxaCgaDoabqaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaabqabqaaaaHkaIGaHkabqabqabqabqabqapfauJapdapdaHXaIJapfaaaaIKaARaILaARaIMabqabqabqayKaINaIOaIPaIQaIRaCsaISaITaIUaHYaIWaCuaCwajgaaaabqaaaaGaaIYaGuaaaabqaaaaHGaAfaAfaAfaHGaHGaJaaJbaJcaJdaJeaJfaJgaJhaJhaJiaJhaJjaJgaJkaJlaJmaJnaERaJpaJqaJramxazeaCSaCSaJsaJtaCSaHZaCSaCSayGaBIaBIaBIaJvaJwaJxaIeaJzaJAaJBaJCaJDaJEaJFaJFaJGaJHavvavvavvavvavvaubaGWaxhaJIaJJaJKaJLaJMaGvaJOaJPaJQaJRaJSaJTaJUaJVaHhaHiaDLaDLaPxarAaJWaaaaaaaaaaaaaJWaaaaaaaJWarAaPxaIfaGbaCgaLwabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaaaaabqaaaaHkaHlaHkaHkaGwaGwaGwaHkaHkaHkaHkaHkapdatkapfaaaaaaaaaaaaaaaaaaaaaaaaabqayKaKbaKcaKdaKeaKfaCsaJoaKhaCuaCuaCuaCuaKiajgaKjaGyaHjaHbaKgaHRaIZaIXaKjaHGaKraKsaKsaKtaKuaKvaKwaKxaKyaKzaKAaKBaTiaKDaKEaKCaKFaKGaKHaKIaKJaKKaJNaKMaKNaKOamxazeaKPaCSaKQaKRaCSaIgaIIaICaIVaBIaKWaKXaKYaKZaBIaLaaLbaLcaBIaLdaLeaLfaLgaLfaLhaLiaLjaLkaLlaLmavvasJaGWaxhaLnaLoaLpaLqaLraFRaLsaLtaJQaLuaCgaCgaLvaLwaCgaDLaDLaDLaPxarAaaaaaaaaaaaaaaaaLxaaaaaaaaaaTMaRgaIfaGbaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaabqaHkaHkaLBaLzaLAaLBaLBaLBaLDaLEaLFaLGaHkaHkatkapfaaaaLHaLIaLIaLIaLIaLIaLJabqaCsaCsaCsauKazTaCsaCsaLMaLNaLOaLPaLQaLRaLSaLTaLUaLVaLWaLXaLYaLWaLZaMaaMbaHGaMcaMdaMeaMfaMfaKkaMfaMfaMfaMfaMfaMfaMfaMfaKkaMfaMhaMiaMjaMkaMkaMkaMlaMlaMlaMlaMlaMkaMmaMkaMnaMnaMnaMnaJuaMnaJyaBIaBIaBIaMpaMqaBIaMraBIaMsaBIaMtaMuaMvazlaMwaMxaMyazlaMzaMAaMBavvaMCaGWaxhaCgaCgaCgaCgaCgaFRaMEaMFaJQaMGaCgaMHaXGaWubssaWuddkaDLaPxarAaaaaaaabqabqabqabqabqaaaaaaarAaPxaWAaGbaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdabdabdabdabdabdabdabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaaaaaaaaaaaHkaMLaMLaMLaLBaLBaLBaLBaLBaLBaMLaMLaMMaHkatkalLaaaaMNaMOaMOaMOaMOaMOaMNabqabqaKlaMQaMRaMSaMTaMUaMVaMWaMXaMYaMZaNaaNbaNcaLRaNdaNeaNfaNgaNhaNiaNjaNkaNlaNmaNnaNoaKmaaaaaaaaaabqaaaaaaaaaabqaaaaaaaaaaKoaNraNsaNtaMkaNuaNvaNwaNxaNyaNzaNAaNBaNCaMkaNDaUfaNFaNGaJXaMnaKaaBIaNJaNKaJwaMqaBIaNLaBIaNMaBIaNNaNOaNPaNQaNQaNQaNQaNQaNQaNQaNQaNQaoGaNRaxhaNSaNTaNUaNVaCgavgaIvaMFaNXaNYaNZaOaaObaOcaOdaOeddRaDLaPxarAaJWabqabqaOgddSaOiabqaOjaaaarAaPxaWAaKSaCgaDoabqabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaaaaUUaUUaUUaUUaUUaaaabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaHkaOkaLBaLBaLBaLBaLBaLBaLBaLBaMLaMLaMLaOlaKTapfaaaaMNaOnaMOaMOaMOaMOaMNaKpaKlaKlaOpaOqaOraOraOsaOtaOuaOvaOwaOxapfaOyapfapfapfapfaOzaOAavxaOCaKnavxaOAaOAaOAaOAaOFaaaaaaaOGaOGaOGaOGaOGaOGaOGaaaaaaaMfaOHaOIaOJaOKaOLaNAaOMaONaOOavBaOQaORaOSaMkaOTaOUaOVaNHaKVaMnaMoaBIaBIaBIaOZaOZaBIaBIaBIaBIaBIaPaaPbaPcaNQaPdaPeaPfaPgaPhaPiaPjaNQaPkaGWaxhaNTaNTaPlaOdaPmaGYaPnaPoaPpaPqaCgaPraPsaPtaPuaPvddUaKLddVarAaaaaaaabqddWcspaPzabqaaaaaaaTMaRgaIfaHxaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaaaaaaaaaaaaaaaabdabdabdabdabdabdabdaXHaXIaWBaXJaWBaXKaXOabdabdabdabdabdabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaabqaHkaPAaLBaLBaLBaLBaPBaLBaLBaLBaLBaMLaPDaHkaECapfaaaaMNaMOaMOaMOaMOaMOaPEawbavKawbaPHaPIaPJaPKaPLaPMaPNaPOaPPaPQaPRaPSaPTaPTaPTaPTaPVaOAaYOaPXaPYaPZaQaaQbaQcbeBaQeaQfaQgaQgaQhaQiaQjaQkaQlaQmaQmaQnaQoaQpaKGaNtaMkaQqaNAaQraNAaQsaNAaQtaNAaNAaMkaQubeLaOVaQwaQxaMnaNIaQzaQAaQBaQCaQDaQEaQFaQGaQHaQIaQJaQKaQLaNQaQMaQNaQNaQNaQOaQPaQQaNQawvaGWaxhaQSaQSaQTaOdaPmaJJaQUaMFaOWaOmaNZaOXaRaaRbaRcaRdaOfaDLaPxarAaaaaReabqaRfddXaRhabqabqaJWarAaPxaWAaGbaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaaaaUUaUUaUUaUUaUVaXNbbXbbWbbYbbWbbZbgUaUVaUUaUUaUUaUUaaaabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGwaLBaLBaLBaLBaLBaLBaLBaLBaLBaLBaRiaHkaHkatkapfabqaMNaMOaMOaMOaMOaMOaRkaRlaRmaRlaRnaPIaRoaRoaRpaRoaOuaRqaRraRsapfapfapfapfapfapfazSaOAbgkaRuaRvaRwaRxaRxaRxbgyaOFaaaaOGaRzaRAaRAaRAaRAaRAaRBaOGaaaaMfaRCaMiaMjaMkaRDaREaRFaNAaRGaNAaRHaRIaNAaRJaRKaRLaRMaRNaROaMnaQyaOYaQVaQVaQVaQWaRTaRTaRUaRUaRVaRWaRXaRYaRZaSaaSbaSbaSbaScaSdaSeaNQaSfaGWaxhaQSaSgaShaSiaCgaSjaIvaMFaJQaSlaCgaSmaSnaSoaSoaSoaSpaDLaPxarAaaaaaaabqabqabqabqabqaaaaaaarAaPxaWAaGbaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbcbbcabcabcabcabcabzhbzhbdJbzhbzhbcabcabcabcabcaaXKaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSqaSraSsaaaaGwaLBaLBaLBaLBaLBaLBaStaSuaSuaSvaSwaHkaqBatkapfabqaMNaMOaMOaMOaMOaSxaMNaKpaKlaKlaSyaPIaSzaSAaSBaSCaSDaSEaSFaSGaLKaSIaSJaSKaSLapfaSMaOAaSNaRuaSOaSPaSQaSQaSRaSSaOFaaaaMgaSUaRAaSVaSWaSXaRAaSYaMgaaaaMfaMhaMiaMjaMkaSZaTaaTbaTcaTdaTcbjbaTfaTgaMkbmIaxcaTjaTkaTlaMnaTmaTnaToaTpaTqaTraTsaTtaTuaTvaTwaTxaTyaTzaTAaTBaTCaTDaQXaTFaTGaTHaNQasIaGWaxhaCgaCgaCgaCgaCgaFRaTIaQYaTKaTLaCgaCgaLvaLwaCgaDLaDLaDLaPxarAaaaaaaaaaabqaaaaaaaaaaaaaaaaTMaRgaIfaGbaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbdKbdNbdNbdNbdNbdNbdNbdObdNbdNbdNbdNbdNbdNbdPbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacGaTNbBmaTNacJaHkaLBaLBaLBaLBaLBaLBaLBaLBaLBaTPaTQaHkauAaQZapfaaaaMNaMOaMOaMOaMOaMOaTSaRlaTTaRlaRnaPIaRoaRoaRpaRoaOuaOvaTUaTVaTWaTXaTYaTZaUaapfaUbaUcaUdaRuaRuaUebmJaRuaUgaUhaOFaaaaMPaUjaUkaUlaUmaUlaUkaUnaNpaaaaMfaMhaUpaUqaMkaNqaNqaNqaNqaUsaNqaNqaOoaNqaMkaMnaOBaUvaSHaMnaMnaUxaTnaTpaTqaUyaUzaTnaToaTqaTqaTpaUAaUBaUCaUDaUEaSbaSbaSbaScaUGaUHaNQaUIaGWaxhaUKaULaUMaSTaUOaUPaIvaMFaJQaUQaJSaJTaRPaUTaHhaHiaDLaDLaPxarAaJWaaaaaaaJWaaaaaaaaaaaaaJWarAaPxaIfaGbaCgaLwabqabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXbeXbeXbeXbeXbeXbdObeXbeXbeXbeXbeXbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKIaTNaUWaTNcKIaHkaPAaMLaLBaLBaLBaLBaLBaLBaLBaUYaUZaHkatkapdapfaaaaMNaMOaMOaMOaMOaMOaVbayjaxXayjaVeaPIaRoaVfaVgaVhaViaVjaOuaVkaVlaVmaVnaVoaVpapfaVqaOAaVraRuaRubmKaVtaVuaUgaRRaOFaaaaOGaVwaVxaUkaVyaRAaVzaVAaOGaaaaMfaVBaOIaOJaVCaVDaVEaVEaVEaNCaVEaVEaVFaVGaMkaVHaVIaVJaVKaVLaVMaVKaVNaVOaVOaVPaVQaVRaVSaVTaVUaVVaVSaVWaVXaNQaVYaVZaWaaWaaWcaWdaWeaNQasJaWfaxhaWgaWhaWiaTOaWkaWlaWmaRSaTEaSkaTRaTRaUFaWsaHhaWtaDLbeZaPxarAarAddZarAarAddZarAarAddZarAarAaPxaWAaHxaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaaaaaaaaaaabdabdaXHbdMbeWbeXbeXbeXbeXaXLaXLaXMaXLaXLbeXbeXbeXbeXbeYbdMaXOabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaWDaWEaWFaWGaWDaHkaLBaMLaWHaWIaWJaLBaLBaLBaLBaUYaWKaHkatkapdalLaaaaMNaOnaMOaMOaMOaMOaMNaKpaKlaKlaWLaPIaRoaRoaRpaRoaOuaVjaWMaWNaVlaWOaWPaWQaWRapfazSaOAaWSaWTaWTaWUaWVaRuaUgaWWaOFabqaOGaOGaOGaWXaWYaWZaOGaOGaOGabqaMfaOHaXaaMjaXbaXcaVEaVEaVEaXdaVEaVEaXeaNCaXbaQCaXfaXgaXhaToayuaToaTnaTpaToaXjaToaXkaTpaTqaToaTqaTpaXlaXmaNQaXnaXoaXpaURaXraPiaQQaNQaXsaGWaxhaXtaXuaXvaXwaXxaXyaXzaXAaWoaUSaXqaXqaXBaXFaHhaHiaDLarAdeaaMJaMJdebaMJaMJdebaMJaMJdebaMJaMJdecaWAaGbaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaabdaaabgMbdMbeWbeXbeXaXLaXLaXLaXLbfabpvaXLaXLaXLbeXbeXbeYbdMbMnaaaabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaWDayCaXQaXRaXSaHkaXTaMLaXUaXVaXWaMLaMLaMLaXXaXYaXZaHkaVaaYbapfabqaYcaYdaMOaMOaMOaYeaYfabqabqaKlaWLaYgaPJaPKaYhaYiaYjaYkaYlaYmaYnaYnaYnaYnaYnapfaYoaYpaYqaYraYraYsaYtaYuaYvaYwaUoaaaaaaaaaaOGaOGaYyaOGaOGaaaaaaaaaaKoaNraYzaMjaYAaYBaYCaYDaYEaNCaNCaYFaYGaNCaYAaQCaYHaYIaYJaYKaYLaYKaYMaYNbmLaYPaYKaYKaYKaYKaYKaYKaYQaYRaYSaNQaNQaNQaNQaVcaNQaNQaNQaNQaoGaGWaxhaYVaYUaYUaSTaYWaYXaYYaYZaWbaVvaWnaQUaXCaZfaFXaZgaCgaaaabqaaaabqaaaaaaaaaaaaabqaaaaaaabqabqaWAaWpaDhaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdclHbcbbfcbfbbgNaXLaXLbdIbdIbdIbgPbgObdIbdIaXLaXLbgNbgQbgSbgRaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaWDaWDaZiaZjaWDaWDaWDaZkaWDaWDaZlaZmaWDaWDaWDaZnaWDaWDaWqapfapfabqaZpaZqaZraZraZraZqaZsabqabqaZtaZuaPIaRoaRoaRpaRoaOuaZvaOuaZwaYnaZxaZyaZzaZAapfazSaOAaZBaZCaZDaZEaZFaZGaZHaZIaOFaZJaUraZJaZLaZMaZNaZOaZLaZJaUraZJaMfaZPaZQaZRaZSaMkaMkaMkaMkaZTaZUaZVaNCaZWaMkaQCaZXaTraZYaZZaZZaZZaZZaoGaoGaoGbaababbacbadbaebafaZZbagbagaoGbahazyazyaWrazyazyazybakazybalaxhbambambambambanbaobapbaqbarbasbatayIaXDbavaCgaCgaCgabqabqaDibawbaxaDiaDiaDiaDiaDiaDibawaDiaXEaDhaCgaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabdaXHbgTbicbeXbeXaXLbdIbidbifbiebihbigbiibidbdIaXLbeXbeXbijbgTaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaUNbaAbaBbaCbaDbaEbaBbaFbaGbaHbaGbaIbaJbaGbaKbaLbaMaYTbaOapfaaaaaabaPbaQbaQbaQbaRaaaabqaZtbaSaWLaPIaRoaRobaTbaUaOubaVbaWbaXbaYbaZbbabbbbbcapfazSaOAaOAaOAavxavxayPaOFbbebbeaOFbbgbbhbbiaZLbbjbbkbblaZLbbmbbnbbobbpbbqbbrbbsbbtbbubbvbbwaMkaMkaYAaLLaYAaMkaMkayubbybbzayubbAbbBbbCbbDbbEbbFaoGaoGaoGaoGbbGaoGaoGaoGaoGaoGaoGaGWasIasJbbHbbHbbHbbHbbHbbHbbHbambbIbbJbbKbamazobbMbambbNbbOaFRaFRazAaZbaZaaDfbbSaDfbbTaDiaDibbUaDiaCiaCjbbVaCjaClaDibbUaDiaCvaDnaCgabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabdaXHbdMbeWbeXaXLaXLbdIbikbilbdLbnQbimbjPbjObdIaXLaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaUNbcdbcebcebcfbcebcebcebcgbchbcibcjbckbckbckbclbcmbcnbcoapfaaaaaaabqabqaaaaaaabqabqabqaZtbcpbcqbcrbcsaRobctbcubcvbcwbcxbcybczbcAbcBbcCbcDapfazBbcFbcGbcHbcIbcJbcKbcLbcMbcNbcObcPbcQbcPbcRbcSbcTbcUbcVbcPbcWbcXbcXbcYbcZbdabcXbcXbdbbdcbdcbdcbddbdebdcbdcbdfbdcbdgbdhbdcbdcbdcbdibdjaoGbdkbdobdmbdnbdobdpbdobdqbdobdrazybakbalaubasJbbHbdsbdtbdubdvbdwbdxbambdybdzbdzbdAbdzbdBbambdCbarbdDbdEbdEbdEbdEbdEbdFaCgbdGaCjaCjbdHaCjaDmaCgaCgaCgbdGaCjaZdaZcaDmaCgabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXaXLaXLbdIbjQbilbdIbjRbdIbjTbjSbdIbdIaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaUNaUNbdQaUNaWDaUNbdRaUNbcdbcebdSbdTaUNbdRaUNbdUbdVbdWbdXapfapfapfapfalLalLalLapfapfapfaZtbdYbdZbdZbdZbdZbeaaRobebbecbedbeeaYnaYnaYnaYnaWjapfapfbegapfapfbehbeibejbekbelbembenbekbelbeobepbembeqbekbekbekbelbekbekberbesbekbekbekbekbekbekbekbetbeubekbekbenbevbewbekbekbekbekbexbeybezbezbezbeAbezbezbezaoGbmMaoGaGWaoGaoGbeCbeCbeCbeCbeDbeEbeEbeFbeGbeHbambeIbeJbeKbmNbeMbeNbambeObePbeQbdEbeRbeSbeTbdEbeUaCgaCgaCgaCgaCgaCgaCgaCgazMaCgaCgaCgaCgaCgaLwaCgabqbjUabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabdaXHbdMbeWbeXaXLaXLbjWbjVbjYbjXblFblDblIblGblJbdIaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaUNabqaaaabqaaaaUNbfdaUNbfebfebffbfgaUNbfdaUNaUNaWDbfhbfibfjavTavUavUavUbflavUavUbfnavVbfobfpbfqbfqbfrbfsbftbfubfvbfwbfxbfybfwbfzbfAbfwbfBbfCbfDbfEbfFbfGbfHbfIbfJbfKbfKbfLbfMbfNbfObfPbfQbfRbfSbfSbfSbfSbfSbfSbfSbfTbfUbfVbfVbfVbfVbfVbfVbfVbfVbfWbfXbfYbfZbfVbgabfWbfVbfVbgbbgcbgdbezbgebgfbggbghbgibezbgjbmOaoGaGWaoGaaabeCbgmbgnbeCbgobgpbgqbgrbgsbgtbambgubgvbgwbgxbmPbgzbambgAbgBbgCbdEbgDbgEbgFbdEbgGaOdaOdaOdaOdaOdaOdaOdaOdaOdaOdbgKbgLbgKbgLaefaefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdabdaXHbdMbeWbeXaXLaXLbdIblKbilbdIblLbdIbjTbjSbdIbdIaXLbeXbeYbdMaXOabdabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqaaaaUNbdRaUNaUNaUNaUNaUNaUNbdRaUNaaaaWDbgVbgWbgXbgXbgXbgXbgXbgXbgXbgXbgYazQbfwbfwaXibhbaXibfwbfwbfwbhcbfwbhdbhebhfbhgbhhbhibhjbhkbhlbhmbhnbfGbhobfIbhpblhbhqbhrbhqbhsbhqbhtbhubhtaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxbhwbhwbhxbhwbhwbhwbhwbhwbrNbhybfIbhzbezbhAbhBbhCbhDbhEbezbhFbhGaoGaGWapeaaaaZKbhIbhJbbxbhLbhMbhNbhObhPbhQbambhRbhSbhTbhTbhUbhVbambhWbhXbhWbdEbhYbhZbiabdEaChaCgaCgaCgaCgaCgaCgaCgaCgaCgaDLaFRaFRbdFaFRabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaaaaaaaaaabdaaabgMbdMbeWbeXaXLaXLbdIbikbilbdIbdIbdIbjTbjObdIbdIaXLbeXbeYbdMbMnaUUaaaabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabinbiobipbiobiqbiobiobiqbiobipbirbisaWDbgVbitbiubivbiwbixbiybizbiAbgXbgYbiCbiDbiEbiFbiGbiFbiGbiHbiGbiIbfwbiJbiKbiLbiMbiNbazbiPbiQbiRbiSbiTaAMbiVbiWbiXbhqbiYbiZbjabhKbhqbjcbjdbjeabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqbhwbjfbjgbjhbjibjjbjkbjlbhwbjmbjnbjobezbjpbjqbjrbjsbjtbezaoGaoGaoGbjuaoGaaabeCbjvbjwbeCbjxbjybjzbjAbjBbjCbambjDbjEbjFbjGbjHbjIbamaFRbjJaFRbdEbjKbjLbjMbdEdeWavPdfadfcdfbdfdasXdfeanqanqaaaaaaaFRbgLaFRabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaUUaUUblMaXNbmHblNbfbbgNaXLaXLbdIbidbilbmTbnLbnEbnMbidbdIbdIaXLbgNbgQbnNbnPbnOaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabinbiobipbiobiqbiobiobiqbiobipbirbisaWDbgVbitbiubivbiwbixbiybizbiAbgXbgYbiCbiDbiEbiFbiGbiFbiGbiHbiGbiIbfwbiJbiKbiLbiMbiNbazbiPbiQbiRbiSbiTaAMbiVbiWbiXbhqbiYbiZbjabhKbhqbjcbjdbjeabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqbhwbjfbjgbjhbjibjjbjkbjlbhwbjmbjnbjobezbjpbjqbjrbjsbjtbezaoGaoGaoGbjuaoGaaabeCbjvbjwbeCbjxbjybjzbjAbjBbjCbambjDaZebjFbjGbjHbjIbamaFRbjJaFRbdEbjKbjLbjMbdEdeWavPdfadfcdfbdfdasXdfeanqanqaaaaaaaFRbgLaFRabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaUUaUUblMaXNbmHblNbfbbgNaXLaXLbdIbidbilbmTbnLbnEbnMbidbdIbdIaXLbgNbgQbnNbnPbnOaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabinbiobiobjZbkabkbbkcbkdbkebkfbkgbkhbkbbkiblVaUNbgVbgWbbLbklbkmbknbkobkpbkqbkrbksbktbkubkvbkvbkwbkxbkybfwbfwbfwbfwbkzbkAbkBbkCbkDaXibkEbhkbhlbkFbkGbkHbkIbfIbkJbhqbkKbkLbkMbkNbkObkPbkQbccabqabqaBVaCVaBYaDKbkWaEhaCVaDKbkWaEhaBYaBYaEtabqabqbhwaFNblablbblcblbbldblebhwblfbfIblgbwlbezbkkaODbkRbezbezbllblmaoGblnaoGblobeCbeCbeCbeCbbHbbHbbHblpblqbbHbambambambambamaGtaFPbambltblubltbdEbkUblwbkVbdEdffdfhdfgdfgdfjdfkdfkdfkdflabqaaaaaaaaaaWwaaaabqaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWwbnRblEbnTbnSbnUbicbeXbeXaXLaXLbdIbpsbptbdLbqZbpubrbbrabdIbdIaXLbeXbeXbrcbijbrfaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablOblPblQblRbkbblSblTblSblTblSblTblSbkbblUbnFaUNbgVblWbgXblXblYblZbmabmbbmcbgXbmdbmebmfbmgbmhbmibmjbmkbmlbmmbmnbmobmpbmqbmrbmsbmtbmubmvbmwbmxbmybmzbmAbiVbfIbmSbhqbmQbmCbmDbmEbhqbmFbmGbjeabqabqaIbboBbopbpVboHbqfbqdbqhbqgbqkbqjbqlaIHabqabqbhwbmUbmVbmWbmXbmYbmZbnabhwbhybnbbncbndbnebnfbnebngbnhbnibnebnebnebnjbnebnkbnlbnmbnnbnebnebnobnkbngbnjbnpbnqbnobnrbnsbntbnubnvbnwbnxbnybnzbnAbnBbnCbnDblidfmdftdfqdfxdfudfydeZaoNdflabqaaaaaaaaaaWwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaWwbnRblEbnKbrgbrhbeWbrjbeXaXLaXLbdIbrlbrmbifbrIbrnbrQbrKbdIbdIaXLbeXbeXbeXbeYbrfaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiqbkbbkbbipbkbblSblTblSbnVblSblTblSbkbblUbnFaUNbnWbnXbnYbnZboablkaUtblkbiubiubodboebhcbfwbofbogbohboibojbokbolbfwbombonbojbkCboobfwbrXboqborbosbotaAMbkIbfIbkJbhqboubovbowboxbhqboybozbjebkWaJYbkWbsbboCboDboEboDboFboDboEboDboGbscbkWaJYbkWbhwboIboIboIboJboKboLboMbhwboNboOboPboQboRboSboRboTboRboUboRboRboRboVboRboWboXboYboZboRboRbpabpbbpcboVbpdboVbpebpfbpgbntbphbpibpibpjbpkbpibpidfzdfBdfAbljdfDdfIdfHdfKdfJdgddfLdgKazDabqaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqbpraaaaaaaaaabqbsdbsdblMbsebsfbeWbsnaXLaXLaXLbsMbdIblHblHbnJbdIbdIbdIbdIbrkaXLaXLaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablObpwbpxblRbkbblSblTblSblTblSblTblSbkbblUbnFaUNbpybpzbpAbpBbpCbpDbpDbpEbpFbpBbpGbpHbpIbfwbpJbpKbpLbpMbpNbpObpPbfwbpQbpRbpSbpTbpUbfwbsibpWbpXbpYbpZbfGbqabjnbqbbqcbqcbqcbqcbqcbhtbtPbqebhtbkWbtSbtRbtTboEboEboEboEbqiboEboEboEboEbtZbtYbubbkWbqmbqnbqobqpbqqbqrbqrbqsbhwbqtbqubqvbqwbqxbqybqxbqzbqxbqAbqxbqxbqBbqxbqxbqCbqDbqxbqEbqBbqFbqGbqCbqHbqxbqIbqJbqKbqLbqMblsbqObqPbqQbqRbpnbqSbqSbqTdgMdgLdgOdgNdgPanqanqanqanqanqanqanqanqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqaaaabqbsPbsRbsQbsSbrdcKIaXNbsfbsTbsUaXLbsWbsVbsXbribsZbsYbtbbtabtcbrkbtebtdbtgbtfaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrobiobiobjZbrpbkbbrqbkbbrrbrsbkbbrtbkbbkibruaUNbgVbrvbrwbrxbrybrzbrAbrBbrCbrxbrDbrEbrFbfwbrGaXibrHblvbfwbfwbfwbfwbfwaXibrJblxbfwbfwaAMbrLbrMaAMaAMbzObehbfIbrObqcbrPbumbrRbqcbrSbrTbrUbrVaJZburbrYbrZbsabsabvWbwfbwebvWbvWbsabsabsgbshbwgbkWbhwboIboIboIbsjboIboIboIbhwbskbfIbslbZiblCbsoblCbsmbspbspbspbspbspbspaoGaoGbsqaoGaoGaoGbsrbmBaoGaoGaoGbstaoGbsubsvbswbbfbsybszbsAbsBbqSbsCbsCbsDbqUbsEbjNbntbsFbsGbsHbsIbsJbsJbsKbsLabqaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaabuLbudbuMabqbuObuNbuQbuPbuSbuRbuTbBebuVbuUbuWbribuYbuXbvabuZbvcbvbbvebvdbvgbvfaXLbvhbvibdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrobiobthbiobiqbiobiobiqbiobipbtibtjaWDbvjbtlbtmbfGbtnbtobtpbtobtqbfGbtrbtsbttbtubtvbtwbtxbtybtzbtwbtAbtBbtwbtvbtvbtCbtvbtDbtEbtFbtGbtHbtvbtIbtJbtKbkJaKqbtMbtNbtObqcbjebjebjebjebkWbwmbtQboEboEboEbtUboEbtVbtWbtXboEboEbwnbuabAkbucbhwbwobuebufbugbuhboIbuibhwbujbfIbukboAdedbunbuobsmbupbuqbwpbusbutbuubuvbuwbuxaoGbuybuzbuAbuBbuCaoGarrbuDaoGbuEbuFbuGbqNbuHbuHbuHbuIbuJbqSbqSbuKbvlbvkbvnbvmbvpbvobvrbvqbvsbvsbvvbvtbvwbvwbvwbxlbxmbvwbvwbvwbvwbvwbxlbvwbvwbvwbvwbvwbvwbxlbvwbxmbxobxnbxpbxpbxrbxqbxtbxsbxvbxubxxbxwbxzbxybxBbxAbxDbxCbzebxEbzgbzfbzjbzibzlbzkbznbzmbzpbzoaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrobiobthbiobiqbiobiobiqbiobipbtibtjaWDbvjbtlbtmbfGbtnbtobtpbtobtqbfGbtrbtsbttbtubtvbtwbtxbtybtzbtwbtAbtBbtwbtvbtvbtCbtvbtDbtEbtFbtGbtHbtvbtIbtJbtKbkJaKqbtMbtNbtObqcbjebjebjebjebkWbwmbtQboEboEboEbtUboEbtVbtWbtXboEboEbwnbuabAkbucbhwbwobuebufbugbuhboIbuibhwbujbfIbukboAdedbunbuobsmbupbuqbwpbusbutbuubuvbuwbuxaoGbuybuzbuAbuBbuCaoGarrbuDaoGbuEbuFbuGbqNbuHbuHbuHbuIbuJbqSbqSbuKaZobvkbvnbvmbvpbvobvrbvqbvsbvsbvvbvtbvwbvwbvwbxlbxmbvwbvwbvwbvwbvwbxlbvwbvwbvwbvwbvwbvwbxlbvwbxmbxobxnbxpbxpbxrbxqbxtbxsbxvbxubxxbxwbxzbxybxBbxAbxDbxCbzebxEbzgbzfbzjbzibzlbzkbznbzmbzpbzoaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqaaaaUNbdRaUNaUNaUNaUNaUNaUNbdRaUNaaaaWDbzqbzsbzrbfGbvAbvBbvCbvBbvDbfGbvEbvFbvGbvHbvHbvIbvJbvHbvHbvKbvLbvMbvNbvHbvHbvObvHbvHbvHbvPbvQbvRbvRbvSbvTbvUbvVbqcbyobvXbvYbqcbvZbwbbwabwcbwdboEbtQboEbypbywbwhbwibwjbwibwkbyJbyxbAbbyQbAkbwqbhwbwrbwsbwtbwubwvbhwbhwbhwbhybwwbwxbsmbwybwzbwAbsmbwBbwCbwDbwEbwFbwGbwHbwIbwJbwKbwLaKUbwNbwObwPbwQbwRbwSaoGbsubwTbwUbntbwVbwWbwXbwYbwZbxabxbbxcbxdbqUbxebxfbxgbxhbxiaWCaaaaaabxjbsNabqaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaabxkbztbsLabqbBbbzubBdbBcbBgbBfbBibBhbBnbBjbCWbBobCYbCXbDabCZbDibDcbFdbDjbFfbFeaXLbrcbFgbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaUNabqaaaabqaaaaUNbxGaUNbxHbxIbfebxJaUNbxGaUNaUNaWDbgVbxKbxLbfGbxMbvBbxNbvBbxObfGbxPbxQbxRbxSbxTbxUbxVbxWbxXbxYbxZbyabxTbxTbxTbybbxTbycbydbxVbyebxTbxTbyfbygbyhbvVbqcbyibyjbykbylbymbynbymaLybwdbAjbAebyqbyqbyqbyrbysbytbyubyvbyqbyqbyqbBWbCcbkWbhwbyybyzbyAbyBbyCbhwbyDbyEbyFbyGbwxblCbyHbyIbCdbsmbyKbyLbyMbyNbspbspaoGaoGbyOaoGaoGaoGaLCbCeaoGaoGbyRbCIaoGbyTbwTbyUbntbjNbjNbjNbjNbyVbjNbjNbyWbyXbyYbntbntbyZbzabzbbzcaaabqYbzdaaaabqaaaaaaabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqaaaaaabxkbBabFkbGNbGMcKIbsebGSbGObrcaXLbsMbsMbsMbribribICbBkbribribrkbrkbrkaXLaXLaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaUNaUNbdQaUNaWDaUNbdRaUNbzvbaBbzwbzxaUNbdRaUNbzybzzbzAbtlbtmbfGbzBbzCbtpbzCbzBbfGbzDbzEbzFbfGbzGbzHbzIbfGapfbzJapfbzKbzKbtkbzMbzNbtkbzKbzKbzKbzKbzKbzKdeDbzPbzQbzRbzSbzTbzUbzVbzWbzVbzXbzYbzZbAabCfbAcbAdbThbAdbAdbAfbAgbAhbyqbyqbAibyqbCkbAkbhwbAlbAmbAnbAobApbAqbhwaMDbhtbAsbbrbAtbsmbsmbsmbsmbsmbAubAvbspbspbspbAwbAxbspbAybAzbAAaoGazpbABaoGbACbADbAEbAFbAGbAHbAIbAJbAKbAKbAMbAKaNWbAObjNbAPbAQbARbASbATbAUbAVbAWbAXbsJbAYbAZabqabqabqabqabqaaaabqaaaabqaaaabqaaaabqaaaaaaaaaaaaaaaaaaabqbpraaaaaaaaaabqaaaaaaabdaZhbIEbeWbeXbeXbIFaXLbBlbDbbKjbDdbDebDfbDgbDhbBlaXLbIFbeXbeXbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaUNbBpbaBbaCbBqbBrbaBbaBbBsbBtbchbBubBvbBvbBvbBwbBxbBybBzbBAbBBbBCbBDbBEbBFbBGbBBbBHbBIbBJbBKbBKbBLbBKbBKarKbBMbBNbzKbBObBPbBQbBRbBSbzKbBTbBUbzKbBTbBUbzKbzPbfIbkJbqcbBVbClbBXdaebBYbBZbCabCbbwdbAkbDrbyqboEbDVbCgboEboEbAkbChbDWbCjbyqbEfbEgbhwbCmbCnbCobCpbCqbCrbCsbCtbhtbhybbrbhzbspbCubCvbCwbCxbCybCzbCAbspbCBbCCbCDbCEbCFbCGbCHaoGaoGaoGaoGaoGaoGbCIaoGbCJbCKbCLbCMbCNbCNbCNbCNbCNbCMbCMbCNbCObCPbCQbCRbCSbCTbCUbCVbCMbCMbCMabqaaaaaaaaaabqaaaabqaaaabqaaaabeaaaabeaaaaaaaaaaaaaaaaaaaaaabqabqabqabqaaaaaaaaaabdaXHbsfbKkbvhbeXbeXaXLbBlbFhbFibFjbKnbFlbFmbFnbBlaXLbeXbeXbvhbvhbvibdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaUNbcdbcebcebDkbcebDlbDmbDnbDnbDobDnbDpbDqbEJbDsbDtbDubDvbDwbpBbDxbDybDzbDAbDBbDCbDDbDEbDFbDGbDHbDIbDJbBKbDKbDLapdbzKbDMbDNbBQbBRbBSbzKbDObDPbzKbDObDPbzKbDQbfIbkJbqcbqcaPCbqcbqcbqcaPGaPFbsObqcbFJbtQbDXboEbwibwibDYbDZbEabEbbEcbEdbEebshbFUbEhbEibEjbEkbElbEmbEnbhwbEobhtbEpbbrbhzbspbEqbErbCybEsbCybEtbCybEubEvbCHbvybvzbEybEzbEAbEBbECbEDbEEbEFbEGbEHaoGbEIbwTbHCbCMbEKbELbEMbENbEObCMbEPbEQbERbESbzLbEUbEVbEWbEXbEYbEZbFabCMabqabqabqabqabqabqabqaaaabeaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdclHbKpbKobKqbfbbgNaXLbBlbGPbGQbGRbMpbGTbGUbGVbBlaXLbgNbgQbMtbMrbMrbNXaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaUNaUNaWDaUNbdQaUNaWDaUNaUNaUNaWDaUNaWDaWDaWDbnWbnXapfbFoapfapfbFpbFqbFpbFrbFpbFpbFpbFpbBKbBKbFsbFtbBKbBKbBKbFuaoXbzKbFvbFwbBQbFxbzKbzKbFybzKbzKbFzbzKbzKbFAbfIbkJbFBbFCbFDbFEbFFbFGbFDbFDbFHbFIbAkbHDbAdbFKbFLbFMbFNbFObFPbFQbFRbFSbyqbFTbAkbhwbFVbFWbFXbFYbFZbGabhwbGbbhtbhybbrbhzbspbGcbGdbGebGdbGfbGgbGhbGibEvbCHbDRbDSbCHbEvbGlbGmbGnbGobGpbGqbEGbCIaoGbGrbGsbGtbDTbGvbGwbGxbGybGzbCMbGAbGBbGCbGDbzLbGEbGFbGGbGHbGIbGJbGKbCMabqbGLbGLbGLbGLbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaaabPHbNYbdMbeWbeXaXLbBlbIybIzbIAbPJbIBbRobIDbBlaXLbeXbeYbdMbRpbsdbPHaaaabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabGWbGXbGXbGYbGXbGXbGXbGZbGXbGXbHaabqaUNbHbdfOdfPapfbINbHJbHdbFpbHebHfbHgbHhbHibHjbFpbHkbHkbHlbHmbHnbHobBKbFubHpbzKbHqbHrbBQbBRbHsbHtbFwbHubHvbHwbHxbtkbzPbfIbkJbFBbEwbDUbExbExbExbExbExbHzbFIaQRaPUbkWbkWbkWbETbGkbGjbHybGubkWbkWbkWaRjaUibhwbhwbEhbhwbhwbhwbhxbhwbHKbhtbHLbHMbhzbHAbHObHObHObHPbHObHQbHObHRbEvbEvbHSbEvbEvbCHbHEbHUbHVbHWbHXbHYbEGbCIaoGbHZbGsbIabIbbIcbIdbIebIfbIgbHFbIibIjbIkbIlbzLbImbInbIobIpbIqbIrbIsbHGbIubIvbIwbIxbIxbGLabqaaabFcaaabFbaaaabeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdabdabdaXHbdMbeWbeXaXLbKlbKlbKlbHNbRqbHNbKlbKlbKlaXLbeXbeYbdMaXOabdabdabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGWbIGbIHbIIbIJbIJbIKbIJbIJbIJbIKbGYbHHaUNaUNdfQbIMapfbFuaEjaUubFpbIQbHfbHgbIRbISbITbFpbIUbIVbIWbIXbBKbBKbBKbFuatjbzKbIYbIZbBQbBRbBQbBQbBQbBQbBQbJabBQbzMbJbbJcbJdbJebJfbJgbJfbJhbJfbJgbJfbJibCibJkbJjbJmbJlbJpbJnbJnbJqbKYbJrbJsbJtbJubJvbJwbJxbJobJybJzbJobJAbJBbJobJCbJDbJEbJFbwxbJGbCybJHbCybJIbCybJJbCybJKbEvbEvbJLbEvbEvbJMbHIbHUbJObECbHXbJPbEGbCIaoGbJQbJRbyUbDTbJSbIdbJTbIdbJUbJVbJWbJXbJYbJZbzLbKabKbbKcbKdbKebKfbKgbzLabqbzLbKhbIxbKibGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXaXLbMobRrbMqbHNbRsbHNbMsbSXbMuaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKrbKsbKsbKsbKsbKsbKsbKsbKsbKsbKsbKtbKubKvbKudfQbKwapfazSbKyanEbFpbKzbHfbHgbKAbHfbKBbFpbBKbKCbBKbHmbKDbKEbBKbFuapdbzKbKFbHrbKGbKHbKIbKIbKIbKIbKIbKJbKIbKKbygbKLbKMbKNbKObKPbKObKQbSrbKSbKTbKUbKVbKWbKXbKOcnjbKZbLabLbbLcbLdcpcbLebLfbLgbLhbLibLjbLkbLlbLmbLnbLobLpbLibLqbLrbLsbLtbLubLvbLwbLxbLybLybLzbLAbLwbLBbLCbLDbHTbCHbLFbCHbIhbLHbLIbLJbLKbLLbLMbLNaoGbLObLPbLQbLRaUwbLTbLUbLVbLWbzLbLXbLYbLZbMabMbbMcbIobMdbMebMfbMgbMhbItbMjbMkbMlbIxbMmbGLabqaaabFcaaabFbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXaXLbNZbOabObbHNbRqbHNbObbOabOcaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMvbMwbMxbMybMzbMzbMAbMzbMzbMzbMAbGYaUNaUNaUNdfQbMBapfbMCapfapfbFpbMDbMEbMFbHfbHfbHfbFpbMGbMHbBKbMIbBKbBKbBKbMJbMKbMLbFwbFwbJabMMbMNbFwbFwbFwbFwbFwbMPbtkbzPbMQbMRbMSbMSbMTbMUbMVbMSbMSbMWbMWbMXbMYbMWbMZbILbNbbJNbMZbNdbNdbKmbNfbLEbNdbNhbNibNjbNkbNhbNhbHBbNmbNlbNhbNobhtbNpbNqbNrbLGbNtbNubNtbNvbNwbCybCybHRbHSbEvbNxbNybNzbNybLDbNAbNBbNCbNDbNEbEGbNFaoGbNGbNHbNIbNJbNKbNLbNMbNNbNObNPbNQbNRbGIbGFbzLbMibNcbNabNcbNabNgbNebzLabqbGLbGLbGLbGLbGLabqaaabFcaaabFbaaabFcabfabeabqabeabfabfabeabeaaaaaaaaaaaaaaaaaaaaaaaaabdclHbdMbeWbeXaXLbPIbOabOabOabSZbSYbOabOabPKaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabMvbGXbGXbGYbGXbGXbGXbGZbGXbGXbOdabqaUNbOedfQbOfapfbFuatjaqBbFpbOhbHgbOibOjbKBbHfbFpbOkbOlbBKbIUbOmbOnbBKbFuapdbzKbOobOobJabBRbOpbOpbOqbOrbOsbOtbzKbzKbJbbOubOvbMSbOwbOxbOybOzbOAbOBbOCbODbOEbOFbMWbOGbOHbOIbOJbOKbNdbOLbOMbONbOObOPbNhbOQbORbOSbOTbNhbNhbNhbNhbNhbOUbhtbNpbOVbOWbspbOXbOYbHObOZbPabHObPbbspbSsbTZbEvbEvbEvbEvbEvbPdbPebPfbPgbPhbEGbNFaxhbPjbPkbPlbPmbPnbPobPpbPqbPrbPsbPtbPubPvbPwbPwbPxbPybPzbIpbPAbPBbPCbHGbIubIvbPDbPEbPEbGLabqabqbPFabqbPGabqbFcaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXaXLbRnbTabTcbOabTebTdbUzbUybRtaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaUNaUNaWDaUNbdQaUNaWDaUNaUNaUNaWDaUNaWDaWDaWDdfRbPMbPNbPObPPbPQbFpbPRbPSbOibPTbPUbPVbFpbBKbBKbBKbBKbBKbBKbBKbFuapdbzKbPWbFwbJabBRbFwbFwbPYbFwbPZbQabzKbQbbzPbfIbQcbMSbQdbQebQfbQgbQhbOBbQibQjbQkbQlbNsbQnbQobQobQobQpbQqbQrbQsbQtbQsbQubNSbQwbQxbQybQzbNTbQBbQCbQDbNhbQEbhtbQFbQGbQHbQIbQIbQIbNnbQJbQLbQMbQKbQIbQObQIbQPbQQbQRbQSbQTbEGbEGbQUbEGbEGbEGbNFbQVbQWbQXbQVbCMbCMbCMbCMbCMbQYbNObVpbRabRbbGGbRcbRdbRebRfbInbRgbRhbRibzLabqbzLbRjbRkbRlbGLabqaaabFcaaabFbaaabRmarBarBarBarBabearBarBarBaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbUAbfbbgNaXLbKlbVjbVkbOabTbbTdbVXbVlbKlaXLbgNbgQbVYaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaUNaUNbdQaUNaWDaUNbdRaUNbzvbaBbzwbzxaUNbdRaUNbzybzzbzAbtlbtmbfGbzBbzCbtpbzCbzBbfGbzDbzEbzFbfGbzGbzHbzIbfGapfbzJapfbzKbzKbaibzMbzNbaibzKbzKbzKbzKbzKbzKdeDbzPbzQbzRbzSbzTbzUbzVbzWbzVbzXbzYbzZbAabCfbAcbAdbThbAdbAdbAfbAgbAhbyqbyqbAibyqbCkbAkbhwbAlbAmbAnbAobApbAqbhwaMDbhtbAsbbrbAtbsmbsmbsmbsmbsmbAubAvbspbspbspbAwbAxbspbAybAzbAAaoGazpbABaoGbACbADbAEbAFbAGbAHbAIbAJbAKbAKbAMbAKaNWbAObjNbAPbAQbARbASbATbAUbAVbAWbAXbsJbAYbAZabqabqabqabqabqaaaabqaaaabqaaaabqaaaabqaaaaaaaaaaaaaaaaaaabqbpraaaaaaaaaabqaaaaaaabdaZhbIEbeWbeXbeXbIFaXLbBlbDbbKjbDdbDebDfbDgbDhbBlaXLbIFbeXbeXbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaUNbBpbaBbaCbBqbBrbaBbaBbBsbBtbchbBubBvbBvbBvbBwbBxbBybBzbBAbBBbBCbBDbBEbBFbBGbBBbBHbBIbBJbBKbBKbBLbBKbBKarKbBMbBNbzKbBObBPbBQbBRbBSbzKbBTbBUbzKbBTbBUbzKbzPbfIbkJbqcbBVbClbBXdaebBYbBZbCabCbbwdbAkbDrbyqboEbDVbCgboEboEbAkbChbDWbCjbyqbEfbEgbhwbCmbCnbCobCpbCqbCrbCsbCtbhtbhybbrbhzbspbCubCvbCwbCxbCybCzbCAbspbCBbCCbCCbCEbCFbCGbCHaoGaoGaoGaoGaoGaoGbCIaoGbCJbCKbCLbCMbCNbCNbCNbCNbCNbCMbCMbCNbCObCPbCQbCRbCSbCTbCUbCVbCMbCMbCMabqaaaaaaaaaabqaaaabqaaaabqaaaabeaaaabeaaaaaaaaaaaaaaaaaaaaaabqabqabqabqaaaaaaaaaabdaXHbsfbKkbvhbeXbeXaXLbBlbFhbFibFjbKnbFlbFmbFnbBlaXLbeXbeXbvhbvhbvibdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaUNbcdbcebcebDkbcebDlbDmbDnbDnbDobDnbDpbDqbEJbDsbDtbDubDvbDwbpBbDxbDybDzbDAbDBbDCbDDbDEbDFbDGbDHbDIbDJbBKbDKbDLapdbzKbDMbDNbBQbBRbBSbzKbDObDPbzKbDObDPbzKbDQbfIbkJbqcbqcaPCbqcbqcbqcaPGaPFbsObqcbFJbtQbDXboEbwibwibDYbDZbEabEbbEcbEdbEebshbFUbEhbEibEjbEkbElbEmbEnbhwbEobhtbEpbbrbhzbspbEqbErbCybEsbCybEtbCybEubEvbCHbaubvzbEybEzbEAbEBbECbEDbEEbEFbEGbEHaoGbEIbwTbHCbCMbEKbELbEMbENbEObCMbEPbEQbERbESbzLbEUbEVbEWbEXbEYbEZbFabCMabqabqabqabqabqabqabqaaaabeaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdclHbKpbKobKqbfbbgNaXLbBlbGPbGQbGRbMpbGTbGUbGVbBlaXLbgNbgQbMtbMrbMrbNXaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaUNaUNaWDaUNbdQaUNaWDaUNaUNaUNaWDaUNaWDaWDaWDbnWbnXapfbFoapfapfbFpbFqbFpbFrbFpbFpbFpbFpbBKbBKbFsbFtbBKbBKbBKbFuaoXbzKbFvbFwbBQbFxbzKbzKbFybzKbzKbFzbzKbzKbFAbfIbkJbFBbFCbFDbFEbFFbFGbFDbFDbFHbFIbAkbHDbAdbFKbFLbFMbFNbFObFPbFQbFRbFSbyqbFTbAkbhwbFVbFWbFXbFYbFZbGabhwbGbbhtbhybbrbhzbspbGcbGdbGebGdbGfbGgbGhbGibEvbCHbvzbDSbCHbEvbGlbGmbGnbGobGpbGqbEGbCIaoGbGrbGsbGtbDTbGvbGwbGxbGybGzbCMbGAbGBbGCbGDbzLbGEbGFbGGbGHbGIbGJbGKbCMabqbGLbGLbGLbGLbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaaabPHbNYbdMbeWbeXaXLbBlbIybIzbIAbPJbIBbRobIDbBlaXLbeXbeYbdMbRpbsdbPHaaaabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabGWbGXbGXbGYbGXbGXbGXbGZbGXbGXbHaabqaUNbHbdfOdfPapfbWdbHJbHdbFpbHebHfbHgbHhbHibHjbFpbHkbHkbHlbHmbHnbHobBKbFubHpbzKbHqbHrbBQbBRbHsbHtbFwbHubHvbHwbHxbaibzPbfIbkJbFBbEwbDUbExbExbExbExbExbHzbFIaQRaPUbkWbkWbkWbETbGkbGjbHybGubkWbkWbkWaRjaUibhwbhwbEhbhwbhwbhwbhxbhwbHKbhtbHLbHMbhzbHAbHObHObHObHPbHObHQbHObHRbEvbEvbEvbEvbEvbCHbHEbHUbHVbHWbHXbHYbEGbCIaoGbHZbGsbIabIbbIcbIdbIebIfbIgbHFbIibIjbIkbIlbzLbImbInbIobIpbIqbIrbIsbHGbIubIvbIwbIxbIxbGLabqaaabFcaaabFbaaaabeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdabdabdaXHbdMbeWbeXaXLbKlbKlbKlbHNbRqbHNbKlbKlbKlaXLbeXbeYbdMaXOabdabdabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGWbIGbIHbIIbIJbIJbIKbIJbIJbIJbIKbGYbHHaUNaUNdfQbIMapfbgYaEjaUubFpbIQbHfbHgbIRbISbITbFpbIUbIVbIWbIXbBKbBKbBKbFuatjbzKbIYbIZbBQbBRbBQbBQbBQbBQbBQbJabBQbzMbJbbJcbJdbJebJfbJgbJfbJhbJfbJgbJfbJibCibJkbJjbJmbJlbJpbJnbJnbJqbKYbJrbJsbJtbJubJvbJwbJxbJobJybJzbJobJAbJBbJobJCbJDbJEbJFbwxbJGbCybJHbCybJIbCybJJbCybJKbEvbEvbCHbEvbEvbJMbHIbHUbJObECbHXbJPbEGbCIaoGbJQbJRbyUbDTbJSbIdbJTbIdbJUbJVbJWbJXbJYbJZbzLbKabKbbKcbKdbKebKfbKgbzLabqbzLbKhbIxbKibGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXaXLbMobRrbMqbHNbRsbHNbMsbSXbMuaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKrbKsbKsbKsbKsbKsbKsbKsbKsbKsbKsbKtbKubKvbKudfQbKwapfbgYbKyanEbFpbKzbHfbHgbKAbHfbKBbFpbBKbKCbBKbHmbKDbKEbBKbFuapdbzKbKFbHrbKGbKHbKIbKIbKIbKIbKIbKJbKIbKKbygbKLbKMbKNbKObKPbKObKQbSrbKSbKTbKUbKVbKWbKXbKOcnjbKZbLabLbbaybLdcpcbLebLfbLgbLhbLibLjbLkbLlbLmbLnbLobLpbLibLqbLrbLsbLtbLubLvbLwbLxbLybLybLzbLAbLwbLBbaNbbRbbQbCHbLFbCHbIhbLHbLIbLJbhabLLbLMbLNaoGbLObLPbLQbLRaUwbLTbLUbLVbLWbzLbLXbLYbLZbMabMbbMcbIobMdbMebMfbMgbMhbItbMjbMkbMlbIxbMmbGLabqaaabFcaaabFbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXaXLbNZbOabObbHNbRqbHNbObbOabOcaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMvbMwbMxbMybMzbMzbMAbMzbMzbMzbMAbGYaUNaUNaUNdfQbMBapfbjEapfapfbFpbMDbMEbMFbHfbHfbHfbFpbMGbMHbBKbMIbBKbBKbBKbMJbMKbMLbFwbFwbJabMMbMNbFwbFwbFwbFwbFwbMPbaibzPbMQbMRbMSbMSbMTbMUbMVbMSbMSbMWbMWbMXbMYbMWbMZbtkbNbbvlbMZbNdbNdbvybNfbCDbNdbNhbNibNjbNkbNhbNhbHBbNmbNlbNhbNobhtbNpbNqbNrbLGbNtbNubNtbNvbNwbCybCybHRbHSbEvbDRbILbHTbILbbRbJLbINbKmbJNbNEbEGbNFaoGbNGbNHbNIbNJbNKbNLbNMbNNbNObNPbNQbNRbGIbGFbzLbMibNcbNabNcbNabNgbNebzLabqbGLbGLbGLbGLbGLabqaaabFcaaabFbaaabFcabfabeabqabeabfabfabeabeaaaaaaaaaaaaaaaaaaaaaaaaabdclHbdMbeWbeXaXLbPIbOabOabOabSZbSYbOabOabPKaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabMvbGXbGXbGYbGXbGXbGXbGZbGXbGXbOdabqaUNbOedfQbOfapfbgYatjaqBbFpbOhbHgbOibOjbKBbHfbFpbOkbOlbBKbIUbOmbOnbBKbFuapdbzKbOobOobJabBRbOpbOpbOqbOrbOsbOtbzKbzKbJbbOubOvbMSbOwbOxbOybOzbOAbOBbOCbODbOEbOFbMWbOGbOHbOIbOJbOKbNdbOLbOMbONbOObOPbNhbOQbORbOSbOTbNhbNhbNhbNhbNhbOUbhtbNpbOVbOWbspbOXbOYbHObOZbPabHObPbbspbSsbTZbEvbEvbEvbEvbEvbPdbPebPfbPgbPhbEGbNFaxhbPjbPkbPlbPmbPnbPobPpbPqbPrbPsbPtbPubPvbPwbPwbPxbPybPzbIpbPAbPBbPCbHGbIubIvbPDbPEbPEbGLabqabqbPFabqbPGabqbFcaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXaXLbRnbTabTcbOabTebTdbUzbUybRtaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaUNaUNaWDaUNbdQaUNaWDaUNaUNaUNaWDaUNaWDaWDaWDdfRbPMbPNbLcbPPbPQbFpbPRbPSbOibPTbPUbPVbFpbBKbBKbBKbBKbBKbBKbBKbFuapdbzKbPWbFwbJabBRbFwbFwbPYbFwbPZbQabzKbQbbzPbfIbQcbMSbQdbQebQfbQgbQhbOBbQibQjbQkbQlbNsbQnbQobQobQobQpbQqbQrbQsbQtbQsbQubNSbQwbQxbQybQzbNTbQBbQCbQDbNhbQEbhtbQFbQGbQHbQIbQIbQIbNnbQJbQLbQMbQKbQIbQObQIbQPbQQbQRbQSbQTbEGbEGbQUbEGbEGbEGbNFbQVbQWbQXbQVbCMbCMbCMbCMbCMbQYbNObVpbRabRbbGGbRcbRdbRebRfbInbRgbRhbRibzLabqbzLbRjbRkbRlbGLabqaaabFcaaabFbaaabRmarBarBarBarBabearBarBarBaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbUAbfbbgNaXLbKlbVjbVkbOabTbbTdbVXbVlbKlaXLbgNbgQbVYaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaUNbRubzzbaCbRvbaCbaBbaBbRwbaBbzzbaBbRxbzzbaBdfSbRyapfbgYaoXatkbFpbRAbRBbHfbHfbHfbRCbFpbRDbREbRFbRGbRHbRIapfbFuauCbzKbRJbRKbJabRLbRMbRMbRNbFwbFwbRObzKbRPbzPbfIbOvbMSbRQbRRbRSbRTbRUbOBbRVbRWbRXbRYbMWbRZbSabSbbSabScbNdbSdbSebSfbSebSgbNhbShbSibSjbSkbNUbSmbSnbSobNhbSpbhtbSqbbrbOWbQIbVrbVsbStbSubSvbSwbSwbSxbSybQIbQIbQIbQIbQIbQIbQIbEGbSzbSAbSBbEGbSCbQVbSDbSEbSFbQVbSGbSHasJbSIbCMbSJbSKbSLbSMbSNbSObSPbSQbSRbSSbRgbSTbSUbItbMjbMkbSVbPEbSWbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXbIFbKlbUxbOabOabWabVZbXCbWbbKlbIFbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaUNbcdbcebcebcebcedfUdfTdfWdfVdfYdfXdgadfZdgcdgbbTmapfbgYauyatkbFpbHhbTnbHfbHfbTnbTobFpbTparJarLbPPbPQbRHapfbFubTrbzKbTsbTtbTubTvbFwbTwbTxbTybTzbTAbzKbTBbzPbfIbTCbMSbTDbTEbTFbTGbOBbOBbTHbTIbTJbTKbMWbRZbSabSabSabTLbNdbSdbSebTMbTNbTObNhbTPbSibTQbTRbNhbTSbTTbTUbNhbTVbhtbTWbbrbTXaUJbUabUabUbbUcbUdbStbStbUebUfbQIbUgbUhbUibUhbUjbQIbUkbUlbUmbUnbEGbNFbQVbUobUpbUqbQVasJasJasJbUrbCMbSJbUsbUtbCNbCNbCNbUubGGbUvbGGbRgbUwbRibzLabqbGLbGLbGLbGLbGLabqaaaabeaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXbIFbKlbXDbXFbXEbYQbXGcckbZObKlbIFbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaUNaUNbUBbUBaUNaUNbNWaWDbQNdgRbQNdfNaWDapfbUCapfapfapfbgYauCatkbFpbTobUDbUEbHfbUEbUFbFpbUGapdapdatjbUHbXJapfbFuaoXbzKbzKbtkbUIbUJbtkbzKbzKbzKbzKbUKbzKbzKbULbjnbUMbMSbUNbUObUPbUQbURbOBbUSbUTbUUbUVbMWbUWbUXbUYbUZbVabNdbVbbSebVcbVdbVebNhbVfbSibVgbVhbQmcclcdBccmbNhbVmbhtbVnbbrbOWaUXbVtbVqbXcbYtbYsbVubVqbUebVvbQIbVwbVxbVybVzbUjbQIbVAbVBbVCbVDbVEbVFbQVbVGbVHbVIbQVbVJbVKbVLbVMbCMbVNbVObRabVPbCNbVQbSRbGGbSPbVRbVSbVTbPCbHGbIubIvbVUbVVbVWbGLabqaaabFcaaabFbaaabFcaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdclHbdMbeWbeXbeXaXLaXLbKlbKlcepbKlbKlaXLaXLbeXbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaUNbWcbfdaUNdghdgjdgibBtdgkbBtdgldgmapfbWdaVcbWfbWgbWhbWgbWibFpbFpbFpbFpbWjbFpbFpbFpbWkdeJdeHapdbWlbWmapfbFubWobzKbWpbWqbWrbWsbWtbWubWvbzKbWwbWxbWybzKbzPbfIbWzbMSbQdbTEbWAbWBbQdbOBbWCbWDbWEbWFbMWbWGbWHbWIbWJbWKbWLbWMbWNbWObWPbWQbNhbWRbWSbWTbWUbWVbWWbWXbWYbWZbXabhtbXbbbrbOWaUXbYubXdbXdbXebXfbXgbXhbXibXjbQIbXkbVxbXlbXmbXnbQIbXobXpbXqbXrbEGbNFbQVbQVbQVbQVbQVbXsasJasJbXtbCMbVNbVObRaaVdbXvbVQbXwbInbSPbXxbRgbXybRibzLabqbzLbXzbXAbXBbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXbeXbeXbeXbIFbIFceqbIFbIFbeXbeXbeXbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaUNbUBbUBaUNdgndgjbBtbBtdgobBtbsxdgqapfbXHavUavUavUbDLapdatkaoXaqBayBapdbXIauyauCapfapfapfapfapfbXKapfapfbFuatjbzKbXLbXMbXNbXNbWsbWtbXPbzKbXQbXRbXSbzKbDQbfIbXTbMSbQdbXUbXVbXWbXXbOBbXYbXZbYabMWbMWbYbbYcbYdbYebYfbNdbYgbSdaVsbYibYjbNhbYkbYlbYmbYnbNUbYobYobYpbNhbYqbhtbYrbbrbOWbQIbYvbYEbYwbStcbacbbbUcbYxbYybYzbYAbYBbYCbYDccrbQIbEGbEGbEGbEGbEGbNFaoGbYGbUrasJasJchGchFaXPasJbCMbCMbYJbNRbVPbCNbYKbYLbGGbYMbVRbRgbYNbSUbItbMjbMkbYObVVbYPbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXbeXbeXbeXbeXbeXbdObeXbeXbeXbeXbeXbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabredgrdgtdgsdgvdgudgxdgwdgyapfapfapfapfbWmbYRavUbYSbYTbYUbYVbYVdfibYWbYVbYVbYTbYVbYVbYVbYZbYVaPTbZaapdbzKbZbbZcbZdbZebHrbZfbZgbzKbzKbzKbzKbzKbZhbfIbOvdeEbMSbZjbZjbZjbMSbMSbMWbMWbZkbMWbMWbZlbZlbZlbZmbZlbZnbZnbZobZpbZnbZnbNhbNhbNhbNhbNhbNhbZqbZqbZqbNhbZrdeFbZsbbrbZtbZubZvbZvbZvbZwbZvbZvbZxbZybZvbZvbZvbZvbQIbZzbZAbZBbZCbZDbZEasJbZFbZGaoGbVLbZHbZIasJbYHckgasJarrbCMbZJbJWbZKbCNbCNbCNbZLbGGbZMbZNbRgbUwbRibzLabqbGLbGLbGLbGLbGLabqabqbRmabqbPGabqabeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbKkbvhbvhbvhbvhbvhbvhbdObvhbvhbvhbvhbvhbvhbvibdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgrdgfdgzdgzdgzdgzdgzdgAaaaabqaaabZPbZPbZQbZRbZSapfbZTapfapfapfaYabZUbZUbZUbZUbZUbZUbZUapdbZVbZWbZXbzKbZYbZZcaacabbHrbWscaccadcaeayBapfcafbzPcagcahcaicajcakcakcakcalcamcancaocakcapcaqcaicaicarcascarcarcatcarcaucavcavcawcaxcaycazcaAcaBcakcakcakcaCcaDcavcaEbbrcaFcaGbajcaIcaJcaKcaLcaMcaNcaKcaOcaQcaPcaRbQIcaScaTcaUcaVcaWcaXcdobZGcaZaoGaoGaoGaoGaoGcmHbXtbCMbCMbCMcbcbJWbNRcbdbbdbbPbKacbgcbhcbibVScbjbPCbHGbIubIvcbkcblcblbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdclHcerbMrbMrbMrbMrbMrcLLcLLcQccLLcLLbMrbMrbMrbMrbMrbNXaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaUNbcdbcebcebcebcedfUdfTdfWdfVdfYdfXdgadfZbLCdgbbTmapfbgYauyatkbFpbHhbTnbHfbHfbTnbTobFpbTparJarLbPPbPQbRHapfbFubTrbzKbTsbTtbTubTvbFwbTwbTxbTybTzbTAbzKbTBbzPbfIbTCbMSbTDbTEbTFbTGbOBbOBbTHbTIbTJbTKbMWbRZbSabSabSabTLbNdbSdbSebTMbTNbTObNhbTPbSibTQbTRbNhbTSbTTbTUbNhbTVbhtbTWbbrbTXaUJbUabUabUbbUcbUdbStbStbUebUfbQIbUgbUhbUibUhbUjbQIbUkbUlbUmbUnbEGbNFbQVbUobUpbUqbQVasJasJasJbUrbCMbSJbUsbUtbCNbCNbCNbUubGGbUvbGGbRgbUwbRibzLabqbGLbGLbGLbGLbGLabqaaaabeaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXbIFbKlbXDbXFbXEbYQbXGcckbZObKlbIFbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaUNaUNbUBbUBaUNaUNbNWaWDbQNdgRbQNdfNaWDapfbLDapfapfapfbgYauCatkbFpbTobUDbUEbHfbUEbUFbFpbUGapdapdatjbUHbXJapfbFuaoXbzKbzKbaibUIbUJbaibzKbzKbzKbzKbUKbzKbzKbULbjnbUMbMSbUNbUObUPbUQbURbOBbUSbUTbUUbUVbMWbUWbUXbUYbUZbVabNdbVbbSebVcbVdbVebNhbVfbSibVgbVhbQmcclcdBccmbNhbVmbhtbVnbbrbOWaUXbVtbVqbXcbYtbYsbVubVqbUebVvbQIbVwbVxbVybVzbUjbQIbVAbVBbVCbVDbVEbVFbQVbVGbVHbVIbQVbVJbVKbVLbVMbCMbVNbVObRabVPbCNbVQbSRbGGbSPbVRbVSbVTbPCbHGbIubIvbVUbVVbVWbGLabqaaabFcaaabFbaaabFcaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdclHbdMbeWbeXbeXaXLaXLbKlbKlcepbKlbKlaXLaXLbeXbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaUNbWcbfdaUNdghdgjdgibBtdgkbBtdgldgmapfbLEauJbLKaoXbMCbWgbWibFpbFpbFpbFpbWjbFpbFpbFpbWkdeJdeHapdbWlbWmapfbFubWobzKbWpbWqbWrbWsbWtbWubWvbzKbWwbWxbWybzKbzPbfIbWzbMSbQdbTEbWAbWBbQdbOBbWCbWDbWEbWFbMWbWGbWHbWIbWJbWKbWLbWMbWNbWObWPbWQbNhbWRbWSbWTbWUbWVbWWbWXbWYbWZbXabhtbXbbbrbOWaUXbYubXdbXdbXebXfbXgbXhbNxbXjbQIbXkbVxbXlbXmbXnbQIbXobXpbXqbXrbEGbNFbQVbQVbQVbQVbQVbXsasJasJbXtbCMbVNbVObRaaVdbXvbVQbXwbInbSPbXxbRgbXybRibzLabqbzLbXzbXAbXBbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXbeXbeXbeXbIFbIFceqbIFbIFbeXbeXbeXbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaUNbUBbUBaUNdgndgjbBtbBtdgobBtbsxdgqapfbXHavUavUavUbDLapdatkaoXaqBayBapdbXIauyauCapfapfapfapfapfbXKapfapfbFuatjbzKbXLbXMbXNbXNbWsbWtbXPbzKbXQbXRbXSbzKbDQbfIbXTbMSbQdbXUbXVbXWbXXbOBbXYbXZbYabMWbMWbYbbYcbYdbYebYfbNdbYgbSdaVsbYibYjbNhbYkbYlbYmbYnbNUbYobYobYpbNhbYqbhtbYrbbrbOWbQIbYvbYEbYwbStcbacbbbUcbNzbNybNBbNAbNDbNCbUCbPObQIbEGbEGbEGbEGbEGbNFaoGbYGbUrasJasJchGchFaXPasJbCMbCMbYJbNRbVPbCNbYKbYLbGGbYMbVRbRgbYNbSUbItbMjbMkbYObVVbYPbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXbeXbeXbeXbeXbeXbdObeXbeXbeXbeXbeXbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabredgrdgtdgsdgvdgudgxdgwdgyapfapfapfapfbWmbYRavUbYSbYTbYUbYVbYVdfibYWbYVbYVbYTbYVbYVbYVbYZbYVaPTbZaapdbzKbZbbZcbZdbZebHrbZfbZgbzKbzKbzKbzKbzKbZhbfIbOvdeEbMSbZjbZjbZjbMSbMSbMWbMWbZkbMWbMWbZlbZlbZlbZmbZlbZnbZnbZobZpbZnbZnbNhbNhbNhbNhbNhbNhbZqbZqbZqbNhbZrdeFbZsbbrbZtbZubZvbZvbZvbZwbZvbZvbZxbZybZvbZvbZvbZvbQIbZzbWfbWnbWhbXibZEasJbZFbZGaoGbVLbZHbZIasJbYHckgasJarrbCMbZJbJWbZKbCNbCNbCNbZLbGGbZMbZNbRgbUwbRibzLabqbGLbGLbGLbGLbGLabqabqbRmabqbPGabqabeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbKkbvhbvhbvhbvhbvhbvhbdObvhbvhbvhbvhbvhbvhbvibdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgrdgfdgzdgzdgzdgzdgzdgAaaaabqaaabZPbZPbZQbZRbZSapfbZTapfapfapfaYabZUbZUbZUbZUbZUbZUbZUapdbZVbZWbZXbzKbZYbZZcaacabbHrbWscaccadcaeayBapfcafbzPcagcahcaicajcakcakcakcalcamcancaocakcapcaqcaicaicarcascarcarcatcarcaucavcavcawcaxcaycazcaAcaBcakcakcakcaCcaDcavcaEbbrcaFcaGbajcaIcaJcaKcaLcaMcaNcaKcaOcaQcaPcaRbQIcaScaTcaUbYxbYycaXcdobZGcaZaoGaoGaoGaoGaoGcmHbXtbCMbCMbCMcbcbJWbNRcbdbbdbbPbKacbgcbhcbibVScbjbPCbHGbIubIvcbkcblcblbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdclHcerbMrbMrbMrbMrbMrcLLcLLcQccLLcLLbMrbMrbMrbMrbMrbNXaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgrdgJdgzdgzdgzdgzdgDdgraaaabqaaabZSbcEcbncbobZSapdcbpbPQcbqapfcbrbZUcbscbtcbucbvcbwbZUapdaoXbZWaoXbzKbzKbzKbzKbzKbzKbzKbzKbzKaxqaoXapfcbxbzPcbycbzbekbekbekbekbekbekbenbekcbAcbBcbCbembekbekbekbvTcbDcbEcbFbekbekbekbekbekcbGcbHbekbekbenbekbekbekbekcbIbekcbAcbJcbKcbLcbMcbNcbOcbNcbPcbPcbQcbRcbScbPcbOcbTbQIbQIbQIbQIcbUcbVasIarrbdlcbXasIcbXazpbefaoGayoaoGbCMccaccbcccccdcceccfccfccfbMcbGGbGGbGGbRgccgbRibzLabqbzLcchcciccjbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaaabPHbsdbsdbsdbPHbNYbbXcUIcUMcUIbbZaXOabqaaaaaaaaaabqaaaabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgrdgzdgzdgzdgzdgzdgzdgraaaabqabqbZSccnccoccpbZSapdccqaEjapfapfccsbZUchyccuccvccwccxbZUapdapdccybYVbYTbYVbYVbYVcczccAccAccAccAccBbcGccCccDccEccFccGccHccIccJccGccGccGccKccGbdabcXccLbcYbcXbcXbcXccMccNbcZbcYbcXbcXbcXbdbccOccPccQccQccQccRccQccQccQccSccTccOccUccVccWccXccYccZcdacdbcdccddcdecdfcdgcdhcdecdibZvcdjcdkbZvcbUcbVasIasIasIasIasIcdmcdocdocdpcdqcdrcdscdtcducdvcdwcdxbGGbGGbGGbGGbGGbInbGGbRgcdybSUbItbMjbMkcdzcblcdAbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdabdabdabdabdabdabdaXHcerbzhcWjbzhbNXaXOabdabdabdabdabdabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgrdgrdgBdgFdgFdgFdgrdgraaaabqaaabZScdCcdDcdEbZScdFapdcdGapfcdHceNbZUcdJcdKcdLbeVcdNbZUbZUbZUbZUbZUbZUcdObZUbZUcdPcdQcdRaoXauycdSauCcdTcdTcdTcdTcdTcdTcdTcdUcdUcdUcdUcdUcdVcdWcdWcdXcdYcdWcdZcdWceacebbbrceccedceecefceecegcehceeceeceibZubbgbbibbicejbZucekbZuaYxcemaYxbZvcenceocfDcdhcitcescdfcixcdhcetceubZvcevcewbZvcexceycezcdocdocdocdoceAceBceCceDceCceCbPmceFceGceHbGGceIbPwbPwbPwbPwbPwceJbGGbRgbUwceKbCMabqbGLbGLbGLbGLbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaaabsdbsdbsdbsdbsdaaaabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgGdgHdgHdgHdgHdgHdgHdgGaaaabeaaabZSbTYceMbTYbZSapfapfapfapfbZUceNbZUceOcePbfkceRceSbZUceTceUceVbZUceWceXceYbZUceZbZUbZUbZUbZUbZUbZUcdTcfabfmbgHbglcfecffcdUcfgcfhcficdUbgIcfkbgIcflcfmbgIcfkbgIcfncfocfpcfqcfrcOmcftcOmcfucfvcOmcftcOmcfwcfxcfxcfxcfxcfxcfybZucfzcfAcfBbajcfCcbOcdfcdhcdhcdecfDcdhcdhcdecfEbZvcfFcfGbZvcbUbgJcfIceCceCceCceCceCcfJcfKcfLcfKcfKbCMcfMcfNcfOcfPcfQbInbGGbGGceIbPwcfRbSSbRgcfSbRibCMabqabqabqabqabqabqabqabqbPFabqbPGabqbRmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdabdabdabdabdabdabdabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaaaaabTYcfTbTYaaaabqaaaaaaaaabZUceNbZUbZUbZUbZUcfUbZUbZUcfVcfWcfVbZUbZUbZUbZUbZUcfXcfYbZUcfZcgacgbcgccgdcgecgfcggcgfcghcgicgjcgkcglcgmbVocgocgpcgqcgrcgscgtcgucgvcfkcgwcgxcgycftcgzcgAcgBcgCcgDcgEcgFcgGcgHcfxcgIcgJcgKcfxcjUbZucgMcgNcgOcgPcgQcgRcgScgTcgUcgRcgScgTcgTcgRcgVcgWcgXcgYcgZchacbVasIchbchccfKcfKcfKcfKcfKchdchechfbCMchgchhbGGbGGbSPchibIqbIqchjchkchjbIqchlchmbRibCMbCMbCMaUVaUUaUVaUUaUVaaabFcaaaabqaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeabqabqbTYceMbTYabqabqabqabqabqbZUchncjechpbZUchqchrchybZUchtbgZchvchwchxchychzbZUchAchBchCchDbhacmJcoQchHchIchJchKchLchMchNchOcdUchPchQcaHchSchTchUchVchWchXchYchZciacgwcgxcgycibciccidciecifcigcihcihciiciicelcikcilcimcfxcinbZuciocipciqbajcircisciuciucivciuciwciucKCcJFciybZvcizciAciBciCcfJaoGaoGaoGcfKciDciEciFciGciHciIciJbCMciKciLciMciNciOciPciQciRciSciTciUciVciWciXbRiciYciZciYcjacjacjacjacjbabqabeaaaabqaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaacjcaaaaaaabqaaaabqaaabZUbZUbZUceNbZUcjdcjecjfcjgcjhcjicjjchychychycjkbZUcjlcjmbZUcdNcjncjocjpcdTcjqcjrcjscjtcjucjvcjwcjxcjxcjycjxcjzcjAcjBcjBcjCcjDcjEcjFcjGcjHcjIcjJcibciccicciccjKcjLcjMcjNcjOcjPceLcjRcjScjTcfxcjUbZubZubZubZubZvbZvcjVbZvbZvbZvbZvbZvbZvbZvbZvbZvbZvbZvbZvbZvcbUcjXaoGcjYcjZcfKckackbckcckdbhvckfbhHbCMckhckhckickhckjckhckickkckjckjbRickhcklckmcknbCMbCMbCMckockpcjackqckoaaabFcaaaabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaaackraaaaaaabqaaacksckscktckubZUckvckwckxbZUbZUbZUckybibchyckAckBbZUbZUbZUckCckDbZUckEckEckEckEckEckEckEckFcjtckGckHckIcjxckJckKckLckMckNckOckPckQckRckSckTbgIcgwckVcgycOmckWckXckYckZclaclbclccldclecfxclfclgclhcfxclicljcljcljcljcljcllclmcljcljcljclocljcljcljcljcljclqclrboccdocltcluclvclwbVKcfKclxclyclzclybiBbiUbiObCMbCMbCMcgnbzLchRbzLcgnbzLchRchRcijbzLcijbCMbCMbCMabqabqabqclHcjaaWCabqabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabeabqclIabqabqabqaaaabqabqbZUcbtclJclKbZUbZUbZUclLbZUbZUbZUbZUbZUbZUbZUclMclNcjlclOclPckEclQclRclSclTclUckEclVclWclXclYclZcjxcmacmbcmccmdcmecmfcmgcmhcjQcmjcjQcmkcmlckVcmmcmncmocmocmocmocmpcmqcmrbkSbkTcfxcmucmvcmwcfxcmxbkXcmzcmzcmzcmzcmAcmzcmBcmBcmBcmBcmBcmBcmBcmBcmBcmCaoGasJasJasJasJaoGasJasJcfKcmEcmFbkYclybiBbiUbkZblrabqabqcmKabqcmLabqcmKabqcmMcmNcmOabqcmOabqabqabqabqaaaaaacmPcjacmQaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaarBaaacmRaaaabqaaaaaaabqaaabZUcmSbZUchncjecjecmTcjecjecmUcmVcmVcmVcmWcmVcmVcmVcmXcmYcmZcnacnbcnccndcnecnfckEcdTcngckUcnicdTcjxcrjclEcjxcnlcnmcmgcnncnocnpcnqcnrcmgcnscntcnucmobmRcnwcnxcnycnxcnzcmocnAcnBcnCcnDcnCcfxcfxcnEbZUcmzcnFcnGcnHcnIcnJcmBcnKcnKcnKcnLcnMcnNcnKcmBcmCaoGclsasIcnPcnQaoGcnRcnScfKbobbtLbrWbvxbulbiUbwMclAabqbGLcnYbzLcnYbGLcnYbzLcnYbGLcnZbzLcoabGLabqaaaabqabqabqcobcjacocabqabqabeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqarBaaacjcaaaabqaaaaaaabqaaabZUbZUbZUbZUbZUbZUbZUbZUbZUcodcoecoecofcogcogcogcogcohcogcogcogcoicojcokcolcomconcoocopcoqcorcoscotcoucovcowcoxcoycozcoAcoBcoCcoDcoEcmgcoFckVcmmcmpcoGcoHcoIcoJcoKcoLcmocoMcoNcoOcoPcmzcdNcjncrFcrvcmzcoRcoScoTcoUcoVcmBcnKcoWcoXcoYcnKcoZcpacmBcmCaoGaoGaoGaoGaoGaoGaoGaoGcfKcfKcfKclFclAclBbyPclDclAabqbGLcphcpicpjbGLcpkcplcpmbGLcpncpocppbGLabqaaaabqaaabCMcpqcprcpscptaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaaaaabTYcfTbTYaaaabqaaaaaaaaabZUceNbZUbZUbZUbZUcfUbZUbZUcfVcfWcfVbZUbZUbZUbZUbZUcfXcfYbZUcfZcgacgbcgccgdcgecgfcggcgfcghcgicgjcgkcglcgmbVocgocgpcgqcgrcgscgtcgucgvcfkcgwcgxcgycftcgzcgAcgBcgCcgDcgEcgFcgGcgHcfxcgIcgJcgKcfxcjUbZucgMcgNcgOcgPcgQcgRcgScgTbYAbYzbYCbYBbYBbYzbZAbYDbZCbZBcaVbZDcbVasIchbchccfKcfKcfKcfKcfKchdchechfbCMchgchhbGGbGGbSPchibIqbIqchjchkchjbIqchlchmbRibCMbCMbCMaUVaUUaUVaUUaUVaaabFcaaaabqaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeabqabqbTYceMbTYabqabqabqabqabqbZUchncjechpbZUchqchrchybZUchtbgZchvchwchxchychzbZUchAchBchCchDcaWcmJccrchHchIchJchKchLchMchNchOcdUchPchQcaHchSchTchUchVchWchXchYchZciacgwcgxcgycibciccidciecifcigcihcihciiciicelcikcilcimcfxcinbZuciocipciqbajcircisciuciucivciuciwciucKCcJFciybZvcizciAciBciCcfJaoGaoGaoGcfKciDciEciFciGciHciIciJbCMciKciLciMciNciOciPciQciRciSciTciUciVciWciXbRiciYciZciYcjacjacjacjacjbabqabeaaaabqaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaacjcaaaaaaabqaaaabqaaabZUbZUbZUceNbZUcjdcjecjfcjgcjhcjicjjchychychycjkbZUcjlcjmbZUcdNcjncjocjpcdTcjqcjrcjscjtcjucjvcjwcjxcjxcjycjxcjzcjAcjBcjBcjCcjDcjEcjFcjGcjHcjIcjJcibciccicciccjKcjLcjMcjNcjOcjPceLcjRcjScjTcfxcjUbZubZubZubZubZvbZvcjVbZvbZvbZvbZvbZvbZvbZvbZvbZvbZvbZvbZvbZvcbUcjXaoGcjYcjZcfKckackbckcaRQbhvckfbhHbCMckhckhckickhckjckhckickkckjckjbRickhcklckmcknbCMbCMbCMckockpcjackqckoaaabFcaaaabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaaackraaaaaaabqaaacksckscktckubZUckvckwckxbZUbZUbZUckybibchyckAckBbZUbZUbZUckCckDbZUckEckEckEckEckEckEckEckFcjtckGckHckIcjxckJckKckLckMckNckOckPckQckRcfjckTbgIcgwckVcgycOmckWckXckYckZclaclbclccldclecfxclfclgclhcfxclicljcljcljcljcljcllclmcljcljcljclocljcljcljcljcljclqclrboccdocltcluclvclwbVKcfKclxclyclzclybiBbiUbiObCMbCMbCMcgnbzLchRbzLcgnbzLchRchRcijbzLcijbCMbCMbCMabqabqabqclHcjaaWCabqabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabeabqclIabqabqabqaaaabqabqbZUcbtclJclKbZUbZUbZUclLbZUbZUbZUbZUbZUbZUbZUclMclNcjlclOclPckEclQclRcgUclTclUckEclVclWclXclYclZcjxcmacmbcmccmdcmecmfcmgcmhcjQcmjcjQcmkcmlckVcmmcmncmocmocmocmocmpcmqcmrbkSbkTcfxcmucmvcmwcfxcmxbkXcmzcmzcmzcmzcmAcmzcmBcmBcmBcmBcmBcmBcmBcmBcmBcmCaoGasJasJasJasJaoGasJasJcfKcmEcmFbkYclybiBbiUbkZblrabqabqcmKabqcmLabqcmKabqcmMcmNcmOabqcmOabqabqabqabqaaaaaacmPcjacmQaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaarBaaacmRaaaabqaaaaaaabqaaabZUcmSbZUchncjecjecmTcjecjecmUcmVcmVcmVcmWcmVcmVcmVcmXcmYcmZcnacnbcnccndcnecnfckEcdTcngckUcnicdTcjxcrjclEcjxcnlcnmcmgcnncnocnpcnqcnrcmgcnscntcnucmobmRcnwcnxcnycnxcnzcmocnAcnBcnCcnDcnCcfxcfxcnEbZUcmzcnFcnGcnHcnIcnJcmBcnKcnKcnKcnLcnMcnNcnKcmBcmCaoGclsasIcnPcnQaoGcnRcnScfKaTJbtLbrWbvxbulbiUbobclAabqbGLcnYbzLcnYbGLcnYbzLcnYbGLcnZbzLcoabGLabqaaaabqabqabqcobcjacocabqabqabeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqarBaaacjcaaaabqaaaaaaabqaaabZUbZUbZUbZUbZUbZUbZUbZUbZUcodcoecoecofcogcogcogcogcohcogcogcogcoicojcokcolcomconcoocopcoqcorcoscotcoucovcowcoxcoycozcoAcoBcoCcoDcoEcmgcoFckVcmmcmpcoGcoHcoIcoJcoKcoLcmocoMcoNcoOcoPcmzcdNcjncrFcrvcmzcoRcoScoTcoUcoVcmBcnKcoWcoXcoYcnKcoZcpacmBcmCaoGaoGaoGaoGaoGaoGaoGaoGcfKcfKcfKclFclAclBbwMclDclAabqbGLcphcpicpjbGLcpkcplcpmbGLcpncpocppbGLabqaaaabqaaabCMcpqcprcpscptaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabeaaackrabqabqabqabqabqaaabZUcpucpvcpwcpxcpycpzcpAbZUcodcoecpBcpCcpDcpEcpFcoecpGcpHcpIcoecpJcpKcpLcpMcpNcpOcpPcpQcpRcpScpTcpUcpTcpScpTcpVcpWcpXcpYcpZcqacqbcrVcjQcnsckVcrWcmocqdcqecqfcqgcqhcqibyScqkcqlcqmcqncmzcqocqpcqqcsncmzcqscqtcqucqvcqwcmBcnKcnKcqxcnKcnKcqycqzcmBcmCbZUcqAcqBbZUcqCcqDcqFcqEcqHcqGbZUcsoclAcqrbArcqIclAabqbGLcqKcqLcqMbGLcqNcqOcqPbGLcqQcqRcqSbGLabqabqabqabqcptcqTcqUcqVcqWabqabeabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaarBaaackrabqaaaaaaaaaabqaaacmicqYcqZcracrbcpycrccrdbZUcodcoecrecrfcrgcrhcricCKcrkcrlcrmcoeaovaotcrpcrncrobALcrtcructAcrwcrxcrycrycrycrzcrAcrBcrCcrDcpZcrEctBcrGcmgcrHckVcrIcmocrJcrKcrLcrMcrNcrOcmocrPcrQcrRcrScmzcrTcrUctSctEcmzcrXcrYcrZcsacsbcmBcmBcscbANbIObIOcmBbIPcmBcsgcshcsicsjbZUcskchychychycdKcslbZUbKxctucnXbKRcNmctuabqbGLcqKcsqcqKbGLcqNcsrcqNbGLcsscstcssbGLabqaaaabqaaacqWcqUcsucqUcjaaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabeabqckrabqaaaaaaaaaabqaaacmicsvcrccqZcswcpycsxbZUbZUcsycoebMObLSbMObNVbMOcoebMOcsCbMOcoeckEbOgcsEcszckEckEcsGcsHcsIcsJcsJbPcbPXbPicsJcsJcsNcmgcsOcsPcsQcyCcmgcmgcsSckVcsTcmocmocsUcsVcsWcsXcsYcmocsZcnBcfwcfwcmzctacmzctbcmzcmzcfwctcbQvcfwcfwctectfctgcthctictjcrqctlcmBctmbZUctnctobZUctpcdKchychychyctrbZUbKxctubQAbRzbQZbSlabqbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLabqabqabqabqcjacqUcqUcqUcqWabqbFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaabqaaaaaaarBaaaclIaaaaaaaaaaaaabqaaacmictwcqZcswctxcpyctyctzcdOcodcoeczqczpctCctDczJcoectFctGctHcoectIctJctKctLctMbTqctOcgrctPcsJctQctRcABctTbVicsJccvcmgctVctWctXctYcjQctZcuacubcuccudcuecufcugcuhcuicujbWeculcumcuncuocupciccuqcurcusciccutcuucuvciccuwctecuxcuycuzcuAcuBcuCcuDcmBcmCbZUbZUcuEbZUcuFcuGchychycuHcuIcmibKxctuctubWnctuctuabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqaaaabqaaacjacqWcptbCMcptaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaaaaaaabqaaaaaaabeaaacmRabqaaaaaaaaaabqaaacmicmicqZcpycpycqZcqZcuJcdOcodcoecuKcuLcuMcuNcuOcoecuPcuQcuRbXucuTcuUcuVcuWcuXcuYcuZcgrcgsbPccvacvbcvccvdcvecsJchycmgcvfcvgcvhcvicvjcvkcvlckVcvmcvncvocvpcvqcvrcvscvtcvucvvcvwcvxcvycvzcvAcvBcvCcvDcvEcvDcvFcvGcvHcvIcvJcvKcvLcvMcvNcvOcvPcvQcvRcvSbZUcvTcvUcvVcbvchychychycvWcvXbZUbXOcynctubYhctucspaaaaaaaaaaaaaaaabqaaaaaaaaaabqaaaaaaaaaaaaabqaaaabqaaaaaaabqaaaabqaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaarBaaackrabqaaaaaaaaaabqaaacmicqYcqZcracrbcpycrccrdbZUcodcoecrecrfcrgcrhcricCKcrkcrlcrmcoeaovaotcrpcrncrobALcrtcructAcrwcrxcrycrycrycrzcrAcrBcrCcrDcpZcrEctBcrGcmgcrHckVcrIcmocrJcrKcrLcrMcrNcrOcmocrPcrQcrRcrScmzcrTcrUctSctEcmzcrXcrYcrZcsacsbcmBcmBcscbANbIObIOcmBbIPcmBcsgcshcsicsjbZUcskchychychycdKcslbZUbKxctucnXbyPcNmctuabqbGLcqKcsqcqKbGLcqNcsrcqNbGLcsscstcssbGLabqaaaabqaaacqWcqUcsucqUcjaaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabeabqckrabqaaaaaaaaaabqaaacmicsvcrccqZcswcpycsxbZUbZUcsycoebMObLSbMObNVbMOcoebMOcsCbMOcoeckEbOgcsEcgVckEckEcsGcsHcsIcsJcsJbPcbPXbPicsJcsJcsNcmgcsOcsPcsQcyCcmgcmgcsSckVcsTcmocmocsUcsVcsWcsXcsYcmocsZcnBcfwcfwcmzctacmzctbcmzcmzcfwctcbQvcfwcfwctectfctgcthctictjcrqctlcmBctmbZUctnctobZUctpcdKchychychyctrbZUbKxctubQAbKRbQZbSlabqbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLabqabqabqabqcjacqUcqUcqUcqWabqbFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaabqaaaaaaarBaaaclIaaaaaaaaaaaaabqaaacmictwcqZcswctxcpyctyctzcdOcodcoeczqczpctCctDczJcoectFctGctHcoectIctJctKctLctMbTqctOcgrctPcsJctQctRcABctTbVicsJccvcmgctVctWctXctYcjQctZcuacubcuccudcuecufcugcuhcuicujbWeculcumcuncuocupciccuqcurcusciccutcuucuvciccuwctecuxcuycuzcuAcuBcuCcuDcmBcmCbZUbZUcuEbZUcuFcuGchychycuHcuIcmibKxctuctucgWctuctuabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqaaaabqaaacjacqWcptbCMcptaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaaaaaaabqaaaaaaabeaaacmRabqaaaaaaaaaabqaaacmicmicqZcpycpycqZcqZcuJcdOcodcoecuKcuLcuMcuNcuOcoecuPcuQcuRbXucuTcuUcuVcuWcuXcuYcuZcgrcgsbPccvacvbcvccvdcvecsJchycmgcvfcvgcvhcvicvjcvkcvlckVcvmcvncvocvpcvqcvrcvscvtcvucvvcvwcvxcvycvzcvAcvBcvCcvDcvEcvDcvFcvGcvHcvIcvJcvKcgYcgXchacgZclSckScszcoQbZUcvTcvUcvVcbvchychychycvWcvXbZUbXOcynctubYhctucspaaaaaaaaaaaaaaaabqaaaaaaaaaabqaaaaaaaaaaaaabqaaaabqaaaaaaabqaaaabqaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaabqabqaaaaaaarBaaacjcaaaaaaaaaaaaabqaaacmicvZcqZcwacqZcqZcsxbZUbZUcwbcwccwdcuLcwecuNcwfcwgcwhcwicwjcwkcwlcwmcwncwocwpcwqcwrcwscjAbYFcwucwvcwwcwxcwwcwycwzcmgcwAcwBcwCcwDcjQcvkcvlckVcvmcwEcmpcwFcwGcwHcwIcwJbWecwKcwLcwMcwNcwOcwPcwQcwRcihcihcwScwTcwUcwVcwWcwXcwYcwZcxacxbcxccxdcxecmBcmCbZUcxfcxgcxhcsicxicuHchychycxjcmictscttdbjctvdbjarAabqabebFbbFbbFbbFbbFbbFbabebFbbFcbFbbPGabqbFcabqabqabebRmbRmbRmabeabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaabqaaaaaaarBaaackraaaaaaabqabqabqaaacmicxkcpycracpycxlchscxmbZUcodcoecxncxocxpcxqcxrcoecxscxtcxucoecxvcxwcxxcxycxzbTqcxAcgrcxBcsJcxCcxDcxEcxFcxGcsJcxHcmgcmgcxIcmgcmgcmgcmgcxJcxKcxLcmocmocmocmocmocxMcxNcmocmzcmzcxOcxPcxQbYXbYIbYYcxUcxUcxUcxUcxVcxWcxXcxVcmBcmBcmBcxYcxZcyacybcmBcmCbZUcvTcycbZUcydcyecyfcygcygcyhbZUabqabqabqabqabqabqaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaabFcaaaaaaabqaaaaaaabqaaaabqabqaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBarBabqabearBaaaabearBarBabqabqabqckrabqabqabqaaaabqabqcmicpycxlcpycyictqcyjcykcylcymcoecAMcuLcyocypcCScoecyrcxtcyscoecoecoecytcytcytcytcyucyvcywcyxcyycyzcyAcyBcKYcsJcyDcyEcyEcyGcyHcyIchBcyJcyKcyLcyMcyNcyOcyEcyPcyQcyRcyScyTcyUcyVcyWcyXcyYcaYczaczbczcczdczeczfcxVczgczhcziczjczkcmBcmBcmBcmBcmBcmBcmCbZUbZUbZUbZUbZUbZUbZUcmibZUbZUbZUaaaabqaaaaaaaaaabqabqabqabebFcbFcbFcabebFcbFcbFcabebFcbRmbFcbFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczmaaaaaaaaaabqaaaaaaaaaabqaaaaaaabqaaaclIaaaaaaabqaaaabqaaacmicmicmibZUbZUcznczobZUbZUcodcoecMbcuLcwdcuNcMXcoecwdcxtcwdcwdczrcoeczscztczuczvcwrczwczxcsJczyczzczAczBczBczBczBczBczBczBczCczDczCczEczFczGczHczIcMYczKczLbZUczMczMczNczMczMczOczPczQcaYczRczSczTczUczVczWcxVczXczYczZcAacAbcrUcfYclPbZUcAccmYcAdbZUcAecfYbZUaaaabqaaaaaaaaaaaaabqaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaabqaaaabqaaaabqaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaacAfcAfcAfcAfcAfabqabqabqcAfcAfcAfcmRcAfaaaarBaaaabqaaaaaaaaaaaabZUbZUbZUbZUbZUcAgcodcwccwdcuLcwecuNcwdcAhcwdcAicwdcwdczrcoecAjcAkcAlcbecAncAocApcsJcsJcsJcsJczBcAqcArcOUcMscAuczBcAvcAwcAxcAycAzcgxcAAbZUcMZcACcADcAEczMcAFcAGcAHczMcAIcAJcAKcbfcPkcANcAOcAPcAQcARcxVcAScATcAUcAVcAWcrUcAXcAYcAZcBackDcBbcAZcBccvWcmiabqabqabqabqabqabqabqabqabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBarBabqabearBaaaabearBarBabqabqabqckrabqabqabqaaaabqabqcmicpycxlcpycyictqcyjcykcylcymcoecAMcuLcyocypcCScoecyrcxtcyscoecoecoecytcytcytcytcyucyvcywcyxcyycyzcyAcyBcukcsJcyDcyEcyEcyGcyHcyIchBcyJcyKcyLcyMcyNcyOcyEcyPcyQcyRcyScyTcyUcyVcyWcyXcyYcaYczaczbczcczdczeczfcxVczgczhcziczjczkcmBcmBcmBcmBcmBcmBcmCbZUbZUbZUbZUbZUbZUbZUcmibZUbZUbZUaaaabqaaaaaaaaaabqabqabqabebFcbFcbFcabebFcbFcbFcabebFcbRmbFcbFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczmaaaaaaaaaabqaaaaaaaaaabqaaaaaaabqaaaclIaaaaaaabqaaaabqaaacmicmicmibZUbZUcznczobZUbZUcodcoecMbcuLcwdcuNcMXcoecwdcxtcwdcuScvLcoeczscztczuczvcwrczwczxcsJczycvMczAczBczBczBczBczBczBczBczCczDczCczEczFczGczHczIcMYczKczLbZUczMczMczNczMczMczOczPczQcaYczRczSczTczUczVczWcxVczXczYczZcAacAbcrUcfYclPbZUcAccmYcAdbZUcAecfYbZUaaaabqaaaaaaaaaaaaabqaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaabqaaaabqaaaabqaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaacAfcAfcAfcAfcAfabqabqabqcAfcAfcAfcmRcAfaaaarBaaaabqaaaaaaaaaaaabZUbZUbZUbZUbZUcAgcodcwccwdcuLcwecuNcwdcAhcwdcAicwdcvNczrcoecAjcAkcAlcbecAncAocApcsJcsJcsJcsJczBcAqcArcOUcMscAuczBcAvcAwcAxcAycAzcgxcAAbZUcMZcACcADcAEczMcAFcAGcAHczMcAIcAJcAKcbfcPkcANcAOcAPcAQcARcxVcAScATcAUcAVcAWcrUcAXcAYcAZcBackDcBbcAZcBccvWcmiabqabqabqabqabqabqabqabqabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeabqcBdcBecBecBecBecBfckrcBgcBhcBhcBhcBhcBiabqabqabqabqabqabqabqabqbZUcFRcFScFRbZUcBjcBkcoecBlcBmcxpcBncBocoecxscwdcwdcwdcBpcoecBqcBrcBrcBrcBscBtcBucBvcBwcBxcByczBcBzcBAcBBcBCcBDczBcBEcBFcBGcBHcAzcgxcBIcBJcBKcBJcBJcBJczMcBLcBMcAGcxScBOcBPcBQcBRcBScBTcBUcBUcBVcAQcxVcBWcATcBXcBYcBZcrUcbmcCbbZUcmCchycCdbZUchycCebZUaaaabqaaaaaaaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaDaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqcCfcCfcCfcCfcCfaaackraaacCfcCfcCfcCfcCfaaaarBaaaaaaaaaaaaabqabqbZUbZUbZUbZUbZUchycBkcoecCgcChcCicCjcCkcoecClcwdcCmcCncCocoecCpcCqcCrcbWcCtcCucCvcBvcCwcCxcCyczBcCzcCAcCBcCCcCDczBcCEcCFczCczCcCGcgxcmmcBJcCHcCIcCJcFoczMcCLcAGcCMczMcCNcCOcCPcxUcCQcCRcPCcCTcCUcCVcxVcCWcCXcCYcCZcBYcrUbZUbZUbZUctmbZUcDabZUbZUbZUbZUabqabqaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqcCfcCfcCfcCfcCfaaackraaacCfcCfcCfcCfcCfaaaarBaaaaaaaaaaaaabqabqbZUbZUbZUbZUbZUchycBkcoecCgcChcCicCjcCkcoecClcwdcCmcCncvOcoecCpcCqcCrcbWcCtcCucCvcBvcCwcCxcCyczBcCzcCAcCBcCCcCDczBcCEcCFczCczCcCGcgxcmmcBJcCHcCIcCJcFoczMcCLcAGcCMczMcCNcCOcCPcxUcCQcCRcPCcCTcCUcCVcxVcCWcCXcCYcCZcBYcrUbZUbZUbZUctmbZUcDabZUbZUbZUbZUabqabqaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeaaaabqaaaabqabqabqaaacDbaaaabqaaaabqaaaabqaaaarBaaaaaaaaaabqabqaaaabqaefbZUcDcbZUchycBkcoecoecoecoecoecoecoecoecDdcoecoecoecoecDecDfcDgcDhcDicDjcDkcyZcDmcDncDocAmcDqcDrcDscDtcDucbYcDwcDxcDyczCcmlcDzcDAcDBcDCcDDcDDcDEczMcDFcDFcDGczMcgCcCOcDHcxUcxUcxUcxUcxUcxUcxUcxVcxVcxVcDIcxVcxVcrUcAccmYcmYcDKbZUchycDLcDMcDNcDMckscksaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaacAfcAfcAfcAfcAfabqckrabqcAfcAfcAfcAfcAfabqarBaaaaaaaaaabeaaaaaacDOcDPclJcDQcDRcDQcDScljcljcljcljcljcljcljcljcljcDTcDUcDUcDUcDUcDUcDUcDUcDVcDWcDXcDYcDZcEacEbcEccEdcEecEfcEgcEhcEicEjcEkcElcEmcEncgxcEocEpcEqcErcErcEsczMcEtcEucEuczMcEvcEwcExcEycEzcEAcEBcECcEDcEEcEFcEGcEHcEIcEJcEKcfZcELchychybZUbZUcEMbZUbZUbZUbZUabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaacAfcAfcAfcAfcAfabqckrabqcAfcAfcAfcAfcAfabqarBaaaaaaaaaabeaaaaaacvQcvPclJcDQcDRcDQcDScljcljcljcljcljcljcljcljcljcDTcDUcDUcDUcDUcDUcDUcDUcDVcDWcDXcDYcDZcEacEbcEccEdcEecEfcEgcEhcEicEjcEkcElcEmcEncgxcEocEpcEqcErcErcEsczMcEtcEucEuczMcEvcEwcExcEycEzcEAcEBcECcEDcEEcEFcEGcEHcEIcEJcEKcfZcELchychybZUbZUcEMbZUbZUbZUbZUabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqcBdcBecBecBecBecBfckrcBgcBhcBhcBhcBhcBiabqaupabqabqabqarBabqabqabqabqbZUcENbZUcdNckDchychycEObZUbZUbZUbZUbZUcEPcEQcDUcERcEScETcEUcEVcDUcEWcEXcEYcBvcEZcFacFbczBcFccFdcFdcFdcFeczBcFfcFgcFhcFicFjcFkcFlcBJcFmcCIcFncWcczMcFpcFqcFrcxScFscFtcFucbZcFwcFxcFycFzcFAcFBcFCcFDcFBcFEcFFcEKbZUcFGbZUcFHcFHcFIcFJcFKcFLcFMabqabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcFNcALcFNabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqcCfcCfcCfcCfcCfaaaclIabqcCfcCfcCfcCfcCfaaaarBaaaaaaaaaabqaaaaaaaaaaaabZUbZUbZUcfZbZUcjncctcFQbZUcPGcNacNbbZUcFTcFUcFVcFWcFXcFYcFZcGacGbcGccGdcGecBvcGfcGgcGhczBcGicGjcGkcGlcGmczBcGncGocGoczCcGpcGqcGrcGscGtcGucGvcGwczMcGxcGycGzcGAcGBcGCcGDcdlcGFcGGcGHcGIcGIcGJcGKcGLcGMcGNcdncGPcGQcGRcGScGTcGUcGVcGVcGVcGWcBNabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcALcFNcGYcFNcALabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaupaaaabqaaaabqaaaabqaaacmRaaaabqaaaabqabqabqabqaupaaaaaaaaaabqaaaaaaaaaaaaabqaaabZUbZUbZUbZUbZUbZUbZUcNOcNPcNQbZUckDcGZcDUcHacHbcHccHdcHecdIcHgcHhcHicBvcBvcDlcBvczBczBczBczBczBczBczBcHkczCczCcHlcHmczGczHcHncHocHocHpcHqczMcHrcHscHtcDpcHvcHwcHxcdMcHzcHAcHBcHCceEcHEcHFcHGcHHcHIcHJceQcHLcHMcHNcHOcHPcHQcHRcHScHTcBNabqabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcHUcALcHVcHWcHXcALcHUabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaacAfcAfcAfcAfcAfabqcHYabqcAfcAfcAfcAfcAfabqarBaaaaaaaaaabeabqcHZcHZcHZcFvcHZcHZcHZaaaabqaaaaaabZUcOJcOKcfbbZUcIbcEQcDUcIccIdcHbcIecIfcDUcIgcIhcIicDUcIjcIkcIlcImcIncIocIncIpcIncIqcIocIrcImcIscnscgxcItcBJcIucFOcIwcIucIxcIxcIxcIxcIxcIycxPcIzcEycIAcIAcIBcICcIDcIEcIFcIGcIHcIIcIJcEKcIKcILcIMcEycINcBNcBNcFHcBNcFHarAabqaaaaaaabqaaaaaaabqabqabqaaaaaaaaaaaaaaaabqaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqabqcALcALcIOcIPcIPcIPcIQcALcALabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqcBdcBecBecBecBecBfckrcBgcBhcBhcBhcBhcBiabqarBaaaabqabqarBaaacHZcIRcIScIRcITcIRcHZcHZcFvcHZcFvcHZcHZcfccPEcPFcjicQKcDUcDUcDUcDUcDUcDUcDUcfdcIVcIWcIXcIYcIZcJacImcJbcJccIncIocIncJdcJecJfcImcJgcnscgxcvmcwEcJhcJicJjcJkcJlcJmcJncJocJpcJqcCOczQdgSdgSdgSdgSdgSdgScJrcJscJtcJucJvcJwcEKbZUcFGbZUcFHcJxcJycJzcJAcJBarAarAabqabqabqabqabqabqabqaaaabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqcJCcJDcJCcIPcJEcIPcXxcJGcFNabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqcCfcCfcCfcCfcCfaaaclIaaacCfcCfcCfcCfcCfaaaaupabqabqaaaarBabqcHZcJHcJIcJJcJKcJHcGXcJMcJNcJOcJPcJQcHZbZUbZUbZUbZUcJRcJScJScJScJScJUcJVcJWcJXcJYcJZcKacKbcKccKdcKecKfcKgcKfcKfcKhcKicKjcfjcKlcKmcKncFkcKocKpcKqcKrcKscKtcKtcKtcKucKvcJpcgCcCOcKwdgScKxcfHcfscgLdgTcYScKBcKDcKEcKFcEKcrUcKGccscfYcFHcFHcFHcFHcFHcHfcKIarAabqaaaaaaaaaaaaaaaabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabqabqcALcALcKJcIPcIPcIPcKKcALcALabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqcCfcCfcCfcCfcCfaaaclIaaacCfcCfcCfcCfcCfaaaaupabqabqaaaarBabqcHZcJHcJIcJJcJKcJHcGXcJMcJNcJOcJPcJQcHZbZUbZUbZUbZUcJRcJScJScJScJScJUcJVcJWcJXcJYcJZcKacKbcKccKdcKecKfcKgcKfcKfcKhcKicKjcvRcKlcKmcKncFkcKocKpcKqcKrcKscKtcKtcKtcKucKvcJpcgCcCOcKwdgScKxcfHcfscgLdgTcYScKBbRzcKEcKFcEKcrUcKGccscfYcFHcFHcFHcFHcFHcHfcKIarAabqaaaaaaaaaaaaaaaabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabqabqcALcALcKJcIPcIPcIPcKKcALcALabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaaaaaabqabqabqaaaaaacKLabqaaaaaaabqabqaaaaaaarBaaaaaaaaaabeaaacHZcKMcHjcKOcHucKMcKMcKQcKRcKScKTcKUcHZaaaaaaaaacrUcrUcrUcrUcrUbZUcKVcDUcDUcKWcKXcRocDUcKZcLacLbcImcLccIocIncIocInchocLecLfcLgcLhcLicLjcLkcIxcIxcLlcLmcLncLocLpcLqcLrcJpcLscLtcLucBNcKxcfHchuchuchEcLxcLycLzcJucLAcEKcdNcLBceNchycLCbZUabqabqabqabqabqabqabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcHUcALcLDcLEcLFcALcHUabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaupaaaaaaaaaaaaaaaaaaaaacKLaaaaaaaaaaaaabqaaaaaaaupaaaaaaaaaarBabqcHZcLGcLHcLIcLJcLKcjWcLMcLNcLOcLPcLQcLRcIacIacIacLRcLTcLUcLVcHZcLWcLXcDUcLYcLZcMacSBcRUcRUcRUcRUcImcIncIocIncMccIncMdcMecMfcImcMgcMhcgxcmmcIxcMicMjcMkcLocLocMlcMmcMncJpcMocMpcMqdgScKxcfHchuckedgTcYTcKBcMtcMucMvcEKcjnchyceNchycMxbZUabqaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcALcFNcMycFNcALabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaupaaaaaaaaaaaaaaaaaaaaacKLaaaaaaaaaaaaabqaaaaaaaupaaaaaaaaaarBabqcHZcLGcLHcLIcLJcvScjWcLMcLNcLOcLPcLQcLRcIacIacIacLRcLTcLUcLVcHZcLWcLXcDUcLYcLZcMacSBcRUcRUcRUcRUcImcIncIocIncMccIncMdcMecMfcImcMgcMhcgxcmmcIxcMicMjcMkcLocLocMlcMmcMncJpcMocMpcMqdgScKxcfHchuckedgTcYTcKBcMtcMucMvcEKcjnchyceNchycMxbZUabqaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcALcFNcMycFNcALabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabearBarBarBaaaaaaaaacKLaaaaaaaaaarBarBarBauparBabqabqaaaarBaaacFvcMzcMAcMBcMCcMDcMEcMFcMGcMHcMIcMJcMKcMLcMMcMNcMOcMPcMBcMQcMRcMScMTcMUcMScMVcMWcWGcSCcWIcWHcYocRUcImcImcImcImcImcImcNccImcImbZUcNdcgxcmmcIxcNecMjcLocLpcLocNfcNgcNhckzcNjcNkcNldgVdgUdgUdgUdgUdgUcNocNncNpcNqcNrcEKchychyceNchybZUbZUbZUabqabqaaaaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcFNcALcFNabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaaaaarBabqcNtabqarBaaaaaaabqaaaaaaabqaaaabqabqabqaaacHZcNucNvcNwcNxcNyclkcNAcNBcNCcNDcNEcHZcFvcFvcFvcHZcNFcNGcNHcHZcNIcNJcDUcNKcNLcNMcNNcYCdeidehdejcRUcNRcmVcmVcmWcmVcNTcNUcmYcmZcNVcNWcNXcBIcIxcNYcNZcOacOacOacObcOccOdcOecOfcOgcOhcOicOjcOkcOlcJLcOncOocOpclncOrcOscOtcmYcmYcOucOvcOwcOxbZUbZUbZUcksaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaarBaaaabqaaaarBaaaaaaabqabqabqabqaaaaaaaaaabqabqcHZclpcOzcKMcOAclpcOBcODcOCcOEcOFcOGcHZcOHaaaaaacrUcrUcrUcrUcrUbZUcOIcDUcDUcDUcDUcDUcRUdeldekdemcRUcOMbZUbZUbZUbZUbZUbZUbZUbZUczIcONcOOcOPcOQcORcOScOTdeIcOVcOWcLpcOXclCcOZcPacPbcPccPdcPecPfcPgcPhcPicOpclNcPjbZUbZUbZUbZUbZUdenclGcPmclJcPnclJcPoabqabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBarBarBarBarBaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaacHZcPpcPqcKMcPqcPrcPscKMcKMcPtcKMcKMcHZabqabqabqbZUcjncfZcPucmscPwcPxcmYcPycPzcPAcPBcRUdepdeodeqcRUcOMbZUcPHcPIcPJbZUcPKcPLcPMbZUcPNcPOcPPcIxcPQcPRcPScPTcPUcPVcLpcPWcIxcPXcPYciccPccPZcQacQbcKNcQdcQecOpchycPjbZUcQgcQhcQibZUcQjcQkcQlbZUbZUbZUcksaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeaaacHZcQmcQncKMcQocQpcPscQqcQrcQscQtcQucHZaaaabqaaabZUcQvcQxcQxcQycQzcQAcQAcQAcQAcQCcPjcRUcRUdercRUcRUcOMbZUcQDcQEcQFcQGcQHcQIcQJdescQLcQMcQNcIxcIxcIxcIxcIxcQOcIxcQPcrUcrUcfwcQQcfwcOpcOpcOpcOpcOpcOpcOpcOpchycQRcQScQTcQUbeVcQWcQWcQXcQYcQWaaaaaaaaaaaaabqabqaaaaaaabqaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaacHZcQZcRacKMcRacQZcRbcRccRdcRecRfcRgcFvaaaaaacRhbZUcRibZUbZUbZUcRjbZUbZUbZUbZUcRkcRlcRmcRndetcRmcRmcRqcRrcRscRtcRucRvcRwcRxcRycRycRzcRAcRBcRCcRDcmYcmYcmYcRFcmYcRGcmZcRHcRIcRJcRIcRKcjNcjNcRLcRMcOtcmYcmYcmYcRNbZUcnOcROcRPcQWcRQcRRcRScQWabqabqabqabqabqabqabqabqabqabqabqabqaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacRTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcHZcHZcFvcHZcFvcHZdeucRVcRWcRXcRYcRZcHZabqabqcRhcSacSbcRhcSccSdcSecSfcSgcShbZUbZUbZUbZUcSibZUbZUbZUbZUbZUcSjcRtcSkcRtcSlcSmcSncRtcSocSpcSqbZUbZUbZUbZUbZUbZUcCdcSrcfZbZUcSscStcSucfwcicciccSvbZUbZUbZUbZUbZUbZUbZUbZUbZUcuEcQWcSwcSxcSycQWaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeaaaabqabqabqcSzcSAdewcKPcSDcSEcSFcSGcSHcHZaaaaaacRhcSIcSJcRhcSKcSLcSMcSNcRhcRhcSOcSPcSQcSRcSScSRcSTcSUcSOdexcSXcRtcSkcRtcSYcSZcTacRtcTbcTccTdcTecTfcTgcThcTibZUcTjbZUbZUbZUcTkcTlcTmcfwcfwcfwcTnbZUcTocTpcTqbZUcTrcTscTtbZUctocQWcTucTvcmtcQWaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaaabqaaaaaacTxabqdeycHZcHZcHZcHZcHZcHZcHZaaaaaacRhcTycTzcRhcTAcTBcTCcTDcRhcTEcTFcTGcTHcTIcTJcTKcTLcTLcTMcTNcTOcTPcTQcRtcSYcTRcTacRtcSocSpcSYcLScTTcRtcTUcTVbZUcTWbZUabqaaacNzcTYcNzaaaaaacOmcWkbZUchychychycmycjicUbcjicUccUdcQWcOycUfcOycQWaaaabqaaaabqabqaaaaaaabqaupaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeabqabqabqaaaaaaaaaabqabqabqaaaaaaaaaabqaaaaaaaaacRhcUgcUhcUicUjcUkcUlcUmcRhcUncRhcUocUpcUqcUrcUscTHcTHcUtcUucUvcUwcUxcUycSYcUzcTacRtcSocUAcUBcUCcUDcUEcUFcUGbZUcTjbZUabqabqcNzcUHcNzabqaaacOmcWlbZUchychychycUJcUKchycULbZUcmicQWcOycWJcWmcWKcWKcWKcWKcWKcWKcWKcWKcWLarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeaaaaaaaaaaaaaaaabqaaaaaaaaaabqaaaaaaaaacRhcTycUNcRhcUOcUPcUQcURcUScUTcRhcUUcUVcUWcUXcUYcUZcVacSOcSWcTacRtcVccVdcVecVfcVgcUwcVhcVicVjcVkcVkcSVcTScVkbZUaefabqaaaaaacNzcVncNzaaaaaacOmcWkbZUcVocVpcVqbZUcVrcVscVqbZUaaaabqcOycOycOyabqaaaabqaaaaaaabqabqaaacWRarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabeaaaaaaabqabeabfabeabqabeabeabeabqcSOcSOcSOcRhcRhcRhcRhcVtcVucRhcRhcRhcVvcVwcVxcUXcVycVzcVAcSOcSOcTacRtcRtcRtcSYcSZcTacRtcVBcVCcVDcTXabqabqaaaaaaabqaefabqaaacVFcVGcVHcVGcVIaaacOmcWkbZUbZUbZUbZUbZUbZUbZUbZUbZUaaaabqaaaaaaaaaabqabqabqabqabqabqaaaaaacWRarBabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaacTZcVLcVMcSOcVNcVOcVPcVQcVRcVScSOcVTcVUcVVcVWcUXcUYcUZcVacVXcSOcVYcRtcVZcWacWbcrrcWdcWacWecRtcWfcVkaaaabqabqabqabqabqabqabqcVGcWgcWhcWicVGaaacOmdafcWTcWTcWTcXlcXAcWScXBcXCcXBcXCcXBcXoaaaaaaabqabqaaaaaaaaaabqaaaaaacWRaupaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaacTZcWncVMcWocWpcWpcWpcWqcWrcWscWtcWucWvcWucWwcWpcWxcWwcWycWzcSOcWAcWBcWCcWBcWBcWBcWBcWBcWCcWBcWDcTXaaaabqaaaaaaabqaaaaaaaaacVGcWEcWFdezdeAcyncOmcYccYccYccYccZvcYycXZcXDcYbcXHcYdcYecXZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZjaaaaaaaaaaaaaaaaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaacTZcWncWMcVRcWNcWOcUXcWPcWQcZlcZkcZmcWUcWVcWVcWWcWVcWVcWXcWYcSOcWZcXacXbcXacXacXccXacXacXdcXecXfcVkabqabqaaacVGcVGcVGcVGcVGcVGcXgcXhcXicVGcVGcVGcVGcVGcVGcYccZvcYycYacYxcYbcYdcYbcYzcXCaaaabqabqaaaabqaaaaaaaaaaaaaaacVJaaaaaaabqaaaaaaaaaaupaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabqaaacTZcXjcVMcVRcWNcWNcXkcSOcSOcSOcSOcZwcWzcXmcUXcXncUXcXmcZxcZCcSOcXpcTXcXpcTXcTXcTXcTXcTXcXpcTXcXpcTXaaaabqabqcVGcXqcmDcXscXtcVGcXucXvcVGcVGcmGcnhcmIcXzcVGcYccZvcYycXZcYdcYbcYdcYdcYecXZaaaaaaabqauparBaupabqabqabqabqcVJabqabqabqabqabqabearBarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcSOcSOcSOcXEcUXcUXcUXcXFcXGcSOcZQcVacXIcXJcXJcXKcXJcXJcXLcZRcVkcXMcTXcXacTXaaaaaaaaacTXcXNcTXcXacTXaaaabqaaacNzcXOcXPcXQcXRcnkcXScXTcXUcnvcXVcXWcXXcnTcNzcYccZvcYycYGcXBcXCcZycXCcXBcZzaaaaaaabqaaaabqaaaabqaaaaaaaaacYfaaaaaaabqaaaaaaaaaaaaaupaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaacTZcYgcYhcYicYjcYkcXKcYlcYmcSOcSOcSOcSOcUecUecUecUecUecSOcSOcVkcXpcTXcXpcTXaaaabqaaacTXcXpcTXcZUcZTabqabqaaacNzcnUcYpcYqcYrcYrcYscYtcYucYucYucYucYvcnVcNzcYccZvcYycOmcOmcOmcYIcfwaaaaaaaaaaaaabqaaacYAcYAcYAcYAcYAabqcYBabqcYAcYAcYAcYAcYAaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcSOcTZcSOcSOcTZcTZcTZcSOdagcSOaaaaaacYDcYFcYFcYFcYFdahdaXcYFdaicZocYFcZodajcYFcYFcYFdaicZpcYFdcbdalcYEcYJaaacVGcYKcnWcYMcpbcpdcYPcYQcYRdgXdgWcYUcYVcpecVGcYcciccWkdawcOmcZfcZhcOmaaaaaaaaaaaaabqabqcYXcYYcYYcYYcYYcYZcZacZbcZccZccZccZccZdabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaabqaaaaaaaaaaaaaaaabqabqdazdbadaAdcTdcPdaBcZedcncZBdaCcZBdaDcZBdaCdaCdaDdaCdaEcZBdaCcZBcZBdaKdaJaaacVGcZrcZrcZrcZrcTkcZscZtcZucTkcZrcZrcZrcZrcVGdaLciccWkdaMdaOcZicZncfwaaaaaaaaaaaaabqabqcZAcZAcZAcZAcZAaaacYBaaacZAcZAcZAcZAcZAabqarBabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabqabqabqabqcZFdaZcZedbkcZBddadbqdbhcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZgcYFaaacVGcZGcZHcZHcpfcZJcZKcZLcZMcZNcpgcZPcZPcZPcVGcYcdbudbFdbvcfwcfwcOmcfwaaaaaaaaaaaaabqaaaabqaaaabqabqabqaaacYBaaaabqaaaabqaaaabqaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaacHZcQZcRacKMcRacQZcRbcRccRdcRecRfcRgcFvaaaaaacRhbZUcRibZUbZUbZUcRjbZUbZUbZUbZUcRkcRlcRmcRndetcRmcRmcRqcRrcRscRtcRucRvcRwcRxcRycRycRzcRAcRBcRCcRDcmYcmYcmYcRFcmYcRGcmZcRHcRIcRJcRIcRKcjNcjNcvYcwtcOtcmYcmYcmYcRNbZUcnOcROcRPcQWcRQcRRcRScQWabqabqabqabqabqabqabqabqabqabqabqabqaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacRTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcHZcHZcFvcHZcFvcHZdeucRVcRWcRXcRYcRZcHZabqabqcRhcSacSbcRhcSccSdcSecSfcSgcShbZUbZUbZUbZUcSibZUbZUbZUbZUbZUcSjcRtcSkcRtcSlcSmcSncRtcSocSpcSqbZUbZUbZUbZUbZUbZUcCdcSrcfZbZUcSscStcSucfwcicciccCObZUbZUbZUbZUbZUbZUbZUbZUbZUcuEcQWcSwcSxcSycQWaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeaaaabqabqabqcSzcSAdewcKPcSDcSEcSFcSGcSHcHZaaaaaacRhcSIcSJcRhcSKcSLcSMcSNcRhcRhcSOcSPcSQcSRcSScSRcSTcSUcSOdexcSXcRtcSkcRtcSYcSZcTacRtcTbcTccTdcTecTfcTgcThcTibZUcTjbZUbZUbZUcTkcTlcTmcfwcfwcfwcxRbZUcTocTpcTqbZUcTrcTscTtbZUctocQWcTucTvcmtcQWaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaaabqaaaaaacTxabqdeycHZcHZcHZcHZcHZcHZcHZaaaaaacRhcTycTzcRhcTAcTBcTCcTDcRhcTEcTFcTGcTHcTIcTJcTKcTLcTLcTMcTNcTOcTPcTQcRtcSYcTRcTacRtcSocSpcSYcLScTTcRtcTUcTVbZUcTWbZUabqaaacNzcTYcNzaaaaaacOmcxTbZUchychychycmycjicUbcjicUccUdcQWcOycUfcOycQWaaaabqaaaabqabqaaaaaaabqaupaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeabqabqabqaaaaaaaaaabqabqabqaaaaaaaaaabqaaaaaaaaacRhcUgcUhcUicUjcUkcUlcUmcRhcUncRhcUocUpcUqcUrcUscTHcTHcUtcUucUvcUwcUxcUycSYcUzcTacRtcSocUAcUBcUCcUDcUEcUFcUGbZUcTjbZUabqabqcNzcUHcNzabqaaacOmcyqbZUchychychycUJcUKchycULbZUcmicQWcOycWJcWmcWKcWKcWKcWKcWKcWKcWKcWKcWLarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeaaaaaaaaaaaaaaaabqaaaaaaaaaabqaaaaaaaaacRhcTycUNcRhcUOcUPcUQcURcUScUTcRhcUUcUVcUWcUXcUYcUZcVacSOcSWcTacRtcVccVdcVecVfcVgcUwcVhcVicVjcVkcVkcSVcTScVkbZUaefabqaaaaaacNzcVncNzaaaaaacOmcxTbZUcVocVpcVqbZUcVrcVscVqbZUaaaabqcOycOycOyabqaaaabqaaaaaaabqabqaaacWRarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabeaaaaaaabqabeabfabeabqabeabeabeabqcSOcSOcSOcRhcRhcRhcRhcVtcVucRhcRhcRhcVvcVwcVxcUXcVycVzcVAcSOcSOcTacRtcRtcRtcSYcSZcTacRtcVBcVCcVDcTXabqabqaaaaaaabqaefabqaaacVFcVGcVHcVGcVIaaacOmcxTbZUbZUbZUbZUbZUbZUbZUbZUbZUaaaabqaaaaaaaaaabqabqabqabqabqabqaaaaaacWRarBabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaacTZcVLcVMcSOcVNcVOcVPcVQcVRcVScSOcVTcVUcVVcVWcUXcUYcUZcVacVXcSOcVYcRtcVZcWacWbcrrcWdcWacWecRtcWfcVkaaaabqabqabqabqabqabqabqcVGcWgcWhcWicVGaaacOmcyFczlczlczlczzcOmcWScXBcXCcXBcXCcXBcXoaaaaaaabqabqaaaaaaaaaabqaaaaaacWRaupaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaacTZcWncVMcWocWpcWpcWpcWqcWrcWscWtcWucWvcWucWwcWpcWxcWwcWycWzcSOcWAcWBcWCcWBcWBcWBcWBcWBcWCcWBcWDcTXaaaabqaaaaaaabqaaaaaaaaacVGcWEcWFdezdeAcyncOmcYccYccYccYccxTcOmcXZcXDcYbcXHcYdcYecXZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZjaaaaaaaaaaaaaaaaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaacTZcWncWMcVRcWNcWOcUXcWPcWQcZlcZkcZmcWUcWVcWVcWWcWVcWVcWXcWYcSOcWZcXacXbcXacXacXccXacXacXdcXecXfcVkabqabqaaacVGcVGcVGcVGcVGcVGcXgcXhcXicVGcVGcVGcVGcVGcVGcYccxTcOmcYacYxcYbcYdcYbcYzcXCaaaabqabqaaaabqaaaaaaaaaaaaaaacVJaaaaaaabqaaaaaaaaaaupaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabqaaacTZcXjcVMcVRcWNcWNcXkcSOcSOcSOcSOcZwcWzcXmcUXcXncUXcXmcZxcZCcSOcXpcTXcXpcTXcTXcTXcTXcTXcXpcTXcXpcTXaaaabqabqcVGcXqcmDcXscXtcVGcXucXvcVGcVGcmGcnhcmIcXzcVGcYccxTcOmcXZcYdcYbcYdcYdcYecXZaaaaaaabqauparBaupabqabqabqabqcVJabqabqabqabqabqabearBarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcSOcSOcSOcXEcUXcUXcUXcXFcXGcSOcZQcVacXIcXJcXJcXKcXJcXJcXLcZRcVkcXMcTXcXacTXaaaaaaaaacTXcXNcTXcXacTXaaaabqaaacNzcXOcXPcXQcXRcnkcXScXTcXUcnvcXVcXWcXXcnTcNzcYccxTcOmcYGcXBcXCcZycXCcXBcZzaaaaaaabqaaaabqaaaabqaaaaaaaaacYfaaaaaaabqaaaaaaaaaaaaaupaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaacTZcYgcYhcYicYjcYkcXKcYlcYmcSOcSOcSOcSOcUecUecUecUecUecSOcSOcVkcXpcTXcXpcTXaaaaaaaaacTXcXpcTXcZUcZTabqabqaaacNzcnUcYpcYqcYrcYrcYscYtcYucYucYucYucYvcnVcNzcYccxTcOmcOmcOmcOmcYIcfwaaaaaaaaaaaaabqaaacYAcYAcYAcYAcYAabqcYBabqcYAcYAcYAcYAcYAaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcSOcTZcSOcSOcTZcTZcTZcSOdagcSOaaaaaacYDcYFcYFcYFcYFdahdaXcYFdaicZocYFcZodajcYFcYFcYFdaicZpcYFdcbdalcYEcYJaaacVGcYKcnWcYMcpbcpdcYPcYQcYRdgXdgWcYUcYVcpecVGcYccCOcZvdawcOmcZfcZhcOmaaaaaaaaaaaaabqabqcYXcYYcYYcYYcYYcYZcZacZbcZccZccZccZccZdabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaabqaaaaaaaaaaaaaaaabqabqdazdbadaAdcTdcPdaBcZedcncZBdaCcZBdaDcZBdaCdaCdaDdaCdaEcZBdaCcZBcZBdaKdaJaaacVGcZrcZrcZrcZrcTkcZscZtcZucTkcZrcZrcZrcZrcVGdaLcCOcZvdaMdaOcZicZncfwaaaaaaaaaaaaabqabqcZAcZAcZAcZAcZAaaacYBaaacZAcZAcZAcZAcZAabqarBabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabqabqabqabqcZFdaZcZedbkcZBddadbqdbhcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZgcYFaaacVGcZGcZHcZHcpfcZJcZKcZLcZMcZNcpgcZPcZPcZPcVGcYccAscicdbvcfwcfwcOmcfwaaaaaaaaaaaaabqaaaabqaaaabqabqabqaaacYBaaaabqaaaabqaaaabqaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZSdbOcZedbPddccZBcZBdaJcZBcZBdbQdbYdbQdbQdbQcZBdbQdbQdbQdbYdbQcZBcZBdccdaiabqcVGcZPcZPcZPcqccZYcZZdaadabdaccqjcZPcZPcZPcVGcOmcfwcOmcOmcfwaaaaaaaaaaaaaaaaaaaaaabqaaacYAcYAcYAcYAcYAabqcYBabqcYAcYAcYAcYAcYAabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZVdaZcZedcedddcZBcZBdcFcZBcZBcYFdclcYFdcmcYFcZBcYFdcmcYFdclcYFcZBcZBcZBcYFaaacVGaOEcZPcZPcqJdapdaqdardasdatcqXcZHcZHdavcVGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcYXcYYcYYcYYcYYcYZcYBcZbcZccZccZccZccZdabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadalcYEdbaddmddacZBcZBdcocZBcZBdaCdcpdaCdaCdaCcZBdaCdaCdaCdcpdaCcZBcZBdcqdaiaaacVGcZrcZrcZrcZrdaFdaGdaHdaIdaFcZrcZrcZrcZrcVGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcZAcZAcZAcZAcZAaaacYBabqcZAcZAcZAcZAcZAaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/RandomZLevels/academy.dmm b/_maps/map_files/RandomZLevels/academy.dmm index 491938aa3e0..1bf4b376673 100644 --- a/_maps/map_files/RandomZLevels/academy.dmm +++ b/_maps/map_files/RandomZLevels/academy.dmm @@ -412,7 +412,7 @@ "hV" = (/obj/structure/closet,/obj/item/clothing/under/color/lightpurple,/obj/item/weapon/twohanded/staff,/turf/simulated/floor/plasteel,/area/awaymission/academy/academyaft) "hW" = (/obj/structure/closet,/obj/item/weapon/storage/wallet/random,/obj/item/clothing/glasses/regular/hipster,/turf/simulated/floor/plasteel,/area/awaymission/academy/academyaft) "hX" = (/obj/structure/closet,/obj/item/clothing/head/wizard/fake,/obj/item/clothing/suit/wizrobe/fake,/turf/simulated/floor/plasteel,/area/awaymission/academy/academyaft) -"hY" = (/obj/structure/closet,/obj/item/clothing/under/color/purple,/obj/item/weapon/contraband/poster,/turf/simulated/floor/plasteel,/area/awaymission/academy/academyaft) +"hY" = (/obj/structure/closet,/obj/item/clothing/under/color/purple,/obj/item/weapon/poster/random_contraband,/turf/simulated/floor/plasteel,/area/awaymission/academy/academyaft) "hZ" = (/obj/structure/closet,/obj/item/weapon/storage/box/snappops,/obj/item/weapon/storage/backpack,/obj/item/weapon/paper{info = "Current Grade: F. Educator's Notes: No improvement shown despite multiple private lessons. Suggest additional tutilage."; name = "Pyromancy Evaluation"},/turf/simulated/floor/plasteel,/area/awaymission/academy/academyaft) "ia" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft) "ib" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plasteel,/area/awaymission/academy/academyaft) diff --git a/_maps/map_files/RandomZLevels/blackmarketpackers.dmm b/_maps/map_files/RandomZLevels/blackmarketpackers.dmm index 62e480cd89e..05116a7fcfc 100644 --- a/_maps/map_files/RandomZLevels/blackmarketpackers.dmm +++ b/_maps/map_files/RandomZLevels/blackmarketpackers.dmm @@ -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/Aft) "iH" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft) "iI" = (/obj/item/weapon/storage/box/matches,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"iJ" = (/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) +"iJ" = (/obj/item/weapon/poster/random_contraband,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) "iK" = (/turf/simulated/floor/plating,/area/awaymission) "iL" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/item/weapon/grenade/chem_grenade/drugs,/turf/simulated/floor/plating,/area/awaymission) "iM" = (/turf/simulated/mineral/random/high_chance_clown,/area/awaymission) diff --git a/_maps/map_files/RandomZLevels/moonoutpost19.dmm b/_maps/map_files/RandomZLevels/moonoutpost19.dmm index 0bb35cdaab8..4c42fb7ffad 100644 --- a/_maps/map_files/RandomZLevels/moonoutpost19.dmm +++ b/_maps/map_files/RandomZLevels/moonoutpost19.dmm @@ -53,7 +53,7 @@ "ba" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/mob/living/simple_animal/hostile/alien/drone{plants_off = 1},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a5{always_unpowered = 1; has_gravity = 1; name = "The Hive"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "bb" = (/obj/structure/alien/weeds,/obj/effect/decal/cleanable/blood{color = "red"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a5{always_unpowered = 1; has_gravity = 1; name = "The Hive"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "bc" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) -"bd" = (/obj/machinery/vending/cigarette,/obj/structure/sign/poster{icon_state = "poster7"; pixel_y = 32; serial_number = 7; subtype = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) +"bd" = (/obj/machinery/vending/cigarette,/obj/structure/sign/poster/contraband/smoke{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "be" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 10; icon_state = "darkred"; tag = "icon-darkred (SOUTHWEST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "bf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "bg" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "darkred"; tag = "icon-darkred (SOUTHEAST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) @@ -63,7 +63,7 @@ "bk" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/effect/decal/cleanable/blood/gibs{color = "red"; icon_state = "gib2_flesh"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a5{always_unpowered = 1; has_gravity = 1; name = "The Hive"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "bl" = (/turf/simulated/mineral/random/high_chance,/area/awaycontent/a5{always_unpowered = 1; has_gravity = 1; name = "The Hive"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "bm" = (/obj/item/weapon/cigbutt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) -"bn" = (/obj/machinery/light/small{dir = 8},/obj/structure/sign/poster{icon_state = "poster17"; pixel_x = -32; pixel_y = 0; serial_number = 17; subtype = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) +"bn" = (/obj/machinery/light/small{dir = 8},/obj/structure/sign/poster/contraband/power_people{pixel_x = -32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "bo" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "bp" = (/obj/machinery/alarm/monitor{frequency = 1439; locked = 1; pixel_y = 23; req_access = "150"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "bq" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/item/device/radio/off{pixel_x = -4; pixel_y = 4},/obj/item/device/radio/off{pixel_x = 2},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) @@ -102,7 +102,7 @@ "bX" = (/obj/machinery/mineral/unloading_machine{dir = 1; icon_state = "unloader-corner"; input_dir = 4; output_dir = 8},/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plating/airless{name = "plating"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "bY" = (/obj/machinery/conveyor{dir = 2; id = "awaysyndie"},/turf/simulated/floor/plating/airless{dir = 4; icon_state = "warnplate"; name = "plating"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "bZ" = (/turf/simulated/floor/plasteel/airless{icon_state = "floorgrime"; name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) -"ca" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/structure/sign/poster{icon_state = "poster5"; pixel_x = 0; pixel_y = 32; serial_number = 5; subtype = 0},/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "loadingarea"; name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) +"ca" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/structure/sign/poster/contraband/syndicate_recruitment{pixel_y = 32},/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "loadingarea"; name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "cb" = (/obj/effect/decal/cleanable/dirt,/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plasteel/airless{dir = 4; icon_state = "red"; name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "cc" = (/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = "150"},/turf/simulated/floor/plasteel/airless{icon_state = "floorscorched2"; name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "cd" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "red"; name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) @@ -113,7 +113,7 @@ "ci" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/table,/obj/machinery/cell_charger,/obj/machinery/light/small{dir = 8},/obj/item/weapon/stock_parts/cell/high,/obj/item/weapon/paper{info = "Alright, listen up. If you're reading this, I'm either taking a shit or I've been recalled back to Command. Either way, you'll need to know how to restore power. We've stolen this stuff from Nanotrasen, so all the equipment is jury-rigged. We have generators that work on both plasma and uranium, about 50 sheets should power the outpost for quite a while. If the generators aren't working, which is very likely, take the power cell on the desk and put it into the APC in the hallway. That should get the place running, at least for a little while."; name = "Engineering Instructions"},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "cj" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "ck" = (/obj/structure/stool,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) -"cl" = (/obj/machinery/light/small{dir = 4},/obj/structure/sign/poster{icon_state = "poster10"; pixel_x = 32; pixel_y = 0; serial_number = 10; subtype = 0},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) +"cl" = (/obj/machinery/light/small{dir = 4},/obj/structure/sign/poster/contraband/hacking_guide{pixel_x = 32},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "cm" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"; tag = "icon-warnplatecorner (EAST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "cn" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "co" = (/turf/simulated/floor/plasteel/airless{name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) @@ -170,7 +170,7 @@ "dn" = (/turf/simulated/floor/plasteel/airless{dir = 4; icon_state = "warningcorner"; name = "floor"; tag = "icon-warningcorner (NORTH)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "do" = (/obj/structure/closet/crate,/obj/item/weapon/storage/bag/ore,/obj/structure/alien/weeds,/obj/item/device/mining_scanner,/obj/item/weapon/shovel,/obj/item/weapon/pickaxe,/turf/simulated/floor/plating/airless{icon_state = "platingdmg3"; name = "plating"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "dp" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged1"; name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) -"dq" = (/obj/structure/table/woodentable,/obj/structure/sign/poster{icon_state = "poster24"; pixel_x = 0; pixel_y = -32; serial_number = 24; subtype = 0},/obj/item/weapon/pen,/obj/item/weapon/paper{info = "Log 1:
While mining today I noticed the NT station was finished with its renovations. They placed some huge reinforced tumor on the station – looks so ugly. I wouldn't be surprised if those pigs decided to turn that little astronomy outpost into a prison with that thing, it'd be pretty typical of them.

Log 2:
Really dumb of me, but I just waved at an engineer in the outpost, and he waved back. I hope to god he was too dumb or drunk to recognize the suit, because if he isn't, then we might have to pull out before they come looking for us.

Log 3:
That huge reinforced tumor in their science section has been making a lot of noise lately. I've been hearing some banging and scratching from the other side and I'm kind of glad now that they reinforced this thing so much. I'll be sleeping with my gun under my pillow from now on."; name = "Personal Log"},/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "wood"; name = "floor"; tag = "icon-warningcorner (NORTH)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) +"dq" = (/obj/structure/table/woodentable,/obj/structure/sign/poster/contraband/c20r{pixel_y = -32},/obj/item/weapon/pen,/obj/item/weapon/paper{info = "Log 1:
While mining today I noticed the NT station was finished with its renovations. They placed some huge reinforced tumor on the station – looks so ugly. I wouldn't be surprised if those pigs decided to turn that little astronomy outpost into a prison with that thing, it'd be pretty typical of them.

Log 2:
Really dumb of me, but I just waved at an engineer in the outpost, and he waved back. I hope to god he was too dumb or drunk to recognize the suit, because if he isn't, then we might have to pull out before they come looking for us.

Log 3:
That huge reinforced tumor in their science section has been making a lot of noise lately. I've been hearing some banging and scratching from the other side and I'm kind of glad now that they reinforced this thing so much. I'll be sleeping with my gun under my pillow from now on."; name = "Personal Log"},/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "wood"; name = "floor"; tag = "icon-warningcorner (NORTH)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "dr" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective_locked"; locked = 1; name = "personal closet"; req_access_txt = "150"},/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/weapon/suppressor,/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "wood"; name = "floor"; tag = "icon-warningcorner (NORTH)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "ds" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "150"},/obj/item/stack/spacecash/c50,/turf/simulated/floor/wood,/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "dt" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/syndie,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/wood,/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) @@ -257,7 +257,7 @@ "eW" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) "eX" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) "eY" = (/obj/machinery/power/port_gen/pacman{desc = "A portable generator for emergency backup power."; name = "P.A.C.M.A.N.-type portable generator"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/awaycontent/a7) -"eZ" = (/obj/machinery/space_heater,/obj/machinery/light/small{dir = 1},/obj/structure/sign/poster{icon_state = "poster5_legit"; pixel_x = 0; pixel_y = 32; serial_number = 21; subtype = 1},/turf/simulated/floor/plating,/area/awaycontent/a7) +"eZ" = (/obj/machinery/space_heater,/obj/machinery/light/small{dir = 1},/obj/structure/sign/poster/official/build{pixel_y = 32},/turf/simulated/floor/plating,/area/awaycontent/a7) "fa" = (/obj/machinery/power/port_gen/pacman/super{desc = "A portable generator for emergency backup power."; name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaycontent/a7) "fb" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/smes{charge = 1.5e+006; input_level = 10000; inputting = 0; output_level = 200000; outputting = 0},/turf/simulated/floor/plating,/area/awaycontent/a7) "fc" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/turf/simulated/floor/plating,/area/awaycontent/a7) @@ -304,7 +304,7 @@ "fR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/alien/weeds,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) "fS" = (/obj/structure/table,/obj/item/clothing/gloves/color/yellow,/turf/simulated/floor/plating,/area/awaycontent/a7) "fT" = (/obj/structure/filingcabinet,/obj/item/weapon/paper{info = "Entry One — 27/05/2554:
I just arrived, and already I hate my job. I'm stuck on this shithole of an outpost, trying to avoid these damn eggheads running all over the place preparing for god knows what. There's no crimes to stop, no syndies to kill, and I'm not even allowed to beat the fuckin' assistant senseless! They said I was transferred from Space Station 13 for 'good behavior', but this feels more like a punishment than a reward. All I know is that if I don't get some action soon, I'm going to go insane.

Entry Two — 03/06/2554:
Okay, so get this: we got a fuckin' deathsquad coming in today! I thought the day I saw one of them would be the day my employment was 'terminated', if you get my drift. They're escorting some sort of weird alien creature for the eggheads to study. I heard one of the docs telling the chef that this thing killed a whole security force before it was captured. I sure as hell hope that I don't have to fight it.

Entry Three — 08/06/2554:
My first real bit of 'action' today, if you could call it that. Crazy Ivan got in a fight with Kuester today about his Booze-O-Mat. Apparently one of the crewmembers had stolen a couple bottles of booze from the machine after Ivan disabled the ID lock. Tell you the truth, I don't blame the thief. Everyone is going a little stir-crazy in here, and the bartender is being damn stingy with the alcohol. Either way, once they started to pick a fight, I had to take them down. It's a damn shame that we don't have a brig, though. I had to lock Ivan in a fuckin' freezer, for god's sake. Let's hope that we can keep our sanity together, at least for a while.

Entry Four — 10/06/2554:
Jesus fucking Christ riding on a motorbike. These things the scientists are studying are terrifying! Fucking great huge purple bug things as tall as the ceiling, with blades for arms and drooling at the mouth. I don't think my taser will do jack shit against these damn things, but the eggheads say that they're safely contained. If they do, I have a feeling that it's only a matter of time before we're all screwed. These bastards look like walking death.

Entry Five — 18/06/2554:
Finally caught who stole the booze from Kuester. It was that fuckin' loser assistant Steve! He was in the dorms, chugging his worries away. I took one of the bottles back to the barkeep, but no one has to know about this second one. I think I'm gonna enjoy this while watching tomorrow's Thunderdome match.

Entry Six — 19/06/2554:
Oh, great. The chef is still sleeping, so we get Ivan's gruel for breakfast today. I overheard Sano and Douglas saying something about the aliens being restless, so we might get some action today. As long as it happens after the big game, I'm fine with it. I still got one beer to drink before I'm ready to die."; name = "Personal Log — Kenneth Cunningham"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) -"fU" = (/obj/structure/sign/poster{icon_state = "poster21_legit"; pixel_y = 32; serial_number = 21; subtype = 1},/obj/item/device/radio/off,/obj/item/weapon/screwdriver{pixel_y = 10},/turf/simulated/floor/plasteel{dir = 5; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) +"fU" = (/obj/structure/sign/poster/official/safety_report{pixel_y = 32},/obj/item/device/radio/off,/obj/item/weapon/screwdriver{pixel_y = 10},/turf/simulated/floor/plasteel{dir = 5; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) "fV" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a7) "fW" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) "fX" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) @@ -486,7 +486,7 @@ "jr" = (/obj/structure/closet/secure_closet{icon_broken = "rdsecurebroken"; icon_closed = "rdsecure"; icon_locked = "rdsecure1"; icon_off = "rdsecureoff"; icon_opened = "rdsecureopen"; icon_state = "rdsecure1"; locked = 1; name = "research director's locker"; req_access_txt = "271"},/obj/item/weapon/storage/backpack/satchel_tox,/obj/item/clothing/gloves/color/latex,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) "js" = (/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; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "jt" = (/obj/structure/closet/crate/bin,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) -"ju" = (/obj/machinery/vending/snack,/obj/structure/sign/poster{icon_state = "poster14"; pixel_x = 0; pixel_y = 32; serial_number = 14; subtype = 0},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) +"ju" = (/obj/machinery/vending/snack,/obj/structure/sign/poster/official/ue_no{pixel_y = 32},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "jv" = (/obj/structure/stool/bed/chair,/obj/effect/decal/cleanable/generic,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "jw" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "jx" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) @@ -520,7 +520,7 @@ "jZ" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) "ka" = (/obj/machinery/door/airlock/glass_research{name = "Research Storage"; req_access_txt = "271"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) "kb" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/awaycontent/a7) -"kc" = (/obj/structure/closet/crate,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a7) +"kc" = (/obj/structure/closet/crate,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/poster/random_contraband,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a7) "kd" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating/airless{name = "plating"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "ke" = (/obj/structure/grille,/turf/simulated/floor/plating/airless{name = "plating"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "kf" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) @@ -543,7 +543,7 @@ "kw" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "kx" = (/obj/machinery/light/small,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = -32},/obj/machinery/camera{c_tag = "Arrivals North"; dir = 1; network = list("MO19")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "ky" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitecorner"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) -"kz" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = -32; serial_number = 2; subtype = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) +"kz" = (/obj/structure/sign/poster/official/nanotrasen_logo{pixel_y = -32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "kA" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "kB" = (/obj/machinery/door/firedoor{density = 1; icon_state = "door_closed"; opacity = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "kC" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 1; icon_state = "purple"; tag = "icon-purple (NORTH)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) @@ -651,7 +651,7 @@ "mA" = (/obj/structure/table/woodentable,/obj/machinery/door_control{id = "awaydorm2"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = -25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "mB" = (/obj/structure/stool/bed/chair/wood/normal{dir = 8},/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "mC" = (/obj/machinery/computer/arcade,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) -"mD" = (/obj/machinery/vending/cigarette,/obj/structure/sign/poster{icon_state = "poster7"; pixel_y = -32; serial_number = 7; subtype = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) +"mD" = (/obj/machinery/vending/cigarette,/obj/structure/sign/poster/contraband/smoke{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "mE" = (/obj/machinery/light/small{dir = 8},/obj/structure/stool/bed/chair/comfy/beige,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "mF" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey{pixel_x = -6; pixel_y = 6},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 6; pixel_y = 8},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 3; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "mG" = (/obj/structure/stool/bed/chair/comfy/beige,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) diff --git a/_maps/map_files/RandomZLevels/spacebattle.dmm b/_maps/map_files/RandomZLevels/spacebattle.dmm index 8b0cfa0e30a..aa1ef17a354 100644 --- a/_maps/map_files/RandomZLevels/spacebattle.dmm +++ b/_maps/map_files/RandomZLevels/spacebattle.dmm @@ -310,7 +310,7 @@ "fX" = (/obj/structure/artilleryplaceholder{tag = "icon-22"; icon_state = "22"},/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser) "fY" = (/obj/structure/artilleryplaceholder{tag = "icon-23"; icon_state = "23"},/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser) "fZ" = (/obj/structure/artilleryplaceholder{tag = "icon-24"; icon_state = "24"},/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser) -"ga" = (/obj/structure/closet/crate,/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) +"ga" = (/obj/structure/closet/crate,/obj/item/weapon/poster/random_contraband,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) "gb" = (/obj/effect/landmark/corpse/bridgeofficer{mobname = "Robert Faver"; name = "Robert Faver"},/obj/item/ammo_casing/shotgun,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel,/area/awaymission/spacebattle/cruiser) "gc" = (/obj/structure/artilleryplaceholder/decorative{tag = "icon-25"; icon_state = "25"},/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser) "gd" = (/obj/structure/artilleryplaceholder/decorative{tag = "icon-26"; icon_state = "26"},/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser) diff --git a/_maps/map_files/RandomZLevels/terrorspiders.dmm b/_maps/map_files/RandomZLevels/terrorspiders.dmm index fbf21c23670..da4d3ddacb9 100644 --- a/_maps/map_files/RandomZLevels/terrorspiders.dmm +++ b/_maps/map_files/RandomZLevels/terrorspiders.dmm @@ -10,11 +10,11 @@ "aj" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/plaza) "ak" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/plaza) "al" = (/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) -"am" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = 32; serial_number = 2; subtype = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) -"an" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = 32; serial_number = 2; subtype = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) +"am" = (/obj/structure/sign/poster/official/nanotrasen_logo{pixel_y = 32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) +"an" = (/obj/structure/sign/poster/official/nanotrasen_logo{pixel_y = 32},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) "ao" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/plaza) "ap" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/plaza) -"aq" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/structure/sign/poster{icon_state = "poster19_legit"; pixel_x = -32; pixel_y = 0; serial_number = 19; subtype = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/plaza) +"aq" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/structure/sign/poster/official/safety_internals{pixel_x = -32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/plaza) "ar" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) "as" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/plaza) "at" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaymission/UO71/plaza) @@ -69,10 +69,10 @@ "bq" = (/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza) "br" = (/obj/structure/toilet{dir = 1},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/plaza) "bs" = (/obj/structure/toilet{dir = 1},/obj/machinery/light/small{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/plaza) -"bt" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = -32; serial_number = 2; subtype = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) +"bt" = (/obj/structure/sign/poster/official/nanotrasen_logo{pixel_y = -32},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) "bu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) "bv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) -"bw" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = -32; serial_number = 2; subtype = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) +"bw" = (/obj/structure/sign/poster/official/nanotrasen_logo{pixel_y = -32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) "bx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/wall,/area/awaymission/UO71/plaza) "by" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/awaymission/UO71/plaza) "bz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/rust,/area/awaymission/UO71/plaza) @@ -141,7 +141,7 @@ "cK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/awaymission/UO71/plaza) "cL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/rust,/area/awaymission/UO71/plaza) "cM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{id_tag = "awaydorm1"; locked = 0; name = "Dorm 1"; req_access_txt = "271"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) -"cN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/closet,/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating,/area/awaymission/UO71/plaza) +"cN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/closet,/obj/item/weapon/poster/random_contraband,/turf/simulated/floor/plating,/area/awaymission/UO71/plaza) "cO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/plaza) "cP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/stack/rods,/turf/simulated/floor/plating,/area/awaymission/UO71/plaza) "cQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/awaymission/UO71/plaza) @@ -226,7 +226,7 @@ "er" = (/obj/effect/decal/cleanable/dirt,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) "es" = (/obj/structure/table,/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 13; pixel_y = 5},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 8; pixel_y = 8},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 0; pixel_y = 3},/obj/item/weapon/watertank,/turf/simulated/floor/plasteel{dir = 1; icon_state = "vault"},/area/awaymission/UO71/plaza) "et" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "green"},/area/awaymission/UO71/plaza) -"eu" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/device/radio/off,/obj/item/weapon/screwdriver{pixel_y = 10},/obj/structure/sign/poster{icon_state = "poster21_legit"; pixel_y = -32; serial_number = 21; subtype = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/awaymission/UO71/plaza) +"eu" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/device/radio/off,/obj/item/weapon/screwdriver{pixel_y = 10},/obj/structure/sign/poster/official/safety_report{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "red"},/area/awaymission/UO71/plaza) "ev" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 10; icon_state = "red"},/area/awaymission/UO71/plaza) "ew" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/awaymission/UO71/plaza) "ex" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "redcorner"},/area/awaymission/UO71/plaza) @@ -263,7 +263,7 @@ "fc" = (/obj/machinery/smartfridge,/turf/simulated/wall,/area/awaymission/UO71/centralhall) "fd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) "fe" = (/turf/simulated/wall/rust,/area/awaymission/UO71/centralhall) -"ff" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/sign/poster{icon_state = "poster14"; pixel_x = 32; pixel_y = 0; serial_number = 14; subtype = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "greencorner"},/area/awaymission/UO71/plaza) +"ff" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/sign/poster/contraband/eat{pixel_x = 32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "greencorner"},/area/awaymission/UO71/plaza) "fg" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) "fh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/rust,/area/awaymission/UO71/centralhall) "fi" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/window/eastleft{dir = 1; name = "Hydroponics Desk"; req_access_txt = "271"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/centralhall) @@ -508,7 +508,7 @@ "jN" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/research{name = "Research Lab"; req_access_txt = "271"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science) "jO" = (/obj/machinery/door/poddoor{id_tag = "UO71_Containment"; name = "Containment 2"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/prince) "jP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall) -"jQ" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/structure/sign/poster{icon_state = "poster19_legit"; pixel_x = 0; pixel_y = 32; serial_number = 19; subtype = 1},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaymission/UO71/centralhall) +"jQ" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/structure/sign/poster/official/safety_internals{pixel_y = 32},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaymission/UO71/centralhall) "jR" = (/obj/structure/stool/bed/chair{tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall) "jS" = (/obj/structure/table,/obj/item/weapon/kitchen/utensil/fork,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall) "jT" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall) @@ -713,7 +713,7 @@ "nK" = (/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/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/awaymission/UO71/science) "nL" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "neutral"},/area/awaymission/UO71/centralhall) "nM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; tag = "icon-manifold-b-f (EAST)"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "neutral"},/area/awaymission/UO71/centralhall) -"nN" = (/obj/structure/sign/poster{icon_state = "poster7"; pixel_y = 32; serial_number = 7; subtype = 0},/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/centralhall) +"nN" = (/obj/structure/sign/poster/contraband/smoke{pixel_y = 32},/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/centralhall) "nO" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/centralhall) "nP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{id_tag = "awaydorm5"; name = "Dorm 5"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall) "nQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{id_tag = "awaydorm7"; name = "Dorm 7"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall) @@ -1178,7 +1178,7 @@ "wH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/vending/engivend{req_access_txt = "0"},/obj/machinery/camera{c_tag = "Engineering Foyer"; dir = 1; network = list("UO71")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng) "wI" = (/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{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng) "wJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/device/t_scanner,/turf/simulated/floor/plasteel{dir = 6; icon_state = "yellow"},/area/awaymission/UO71/eng) -"wK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/vending/tool,/obj/structure/sign/poster{icon_state = "poster5_legit"; pixel_x = 0; pixel_y = -32; serial_number = 21; subtype = 1},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaymission/UO71/eng) +"wK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/vending/tool,/obj/structure/sign/poster/official/build{pixel_y = -32},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaymission/UO71/eng) "wL" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaymission/UO71/eng) "wM" = (/obj/structure/closet/firecloset,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaymission/UO71/eng) "wN" = (/obj/structure/closet/firecloset,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaymission/UO71/eng) diff --git a/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm b/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm index 9182b9e11df..6536e72fec6 100644 --- a/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm +++ b/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm @@ -30,12 +30,12 @@ "aD" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "aE" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "aF" = (/obj/machinery/door_control{desc = "A remote control-switch to call the elevator to your level."; id = "UO45_useless"; name = "Call Elevator"; pixel_x = -6; pixel_y = 24; req_access_txt = "0"},/obj/machinery/door_control{desc = "A remote control-switch for the elevator doors."; id = "UO45_Elevator"; name = "Elevator Doors"; pixel_x = 6; pixel_y = 24; req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) -"aG" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = 32; serial_number = 2; subtype = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) +"aG" = (/obj/structure/sign/poster/official/nanotrasen_logo{pixel_y = 32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "aH" = (/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) -"aI" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = 32; serial_number = 2; subtype = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) +"aI" = (/obj/structure/sign/poster/official/nanotrasen_logo{pixel_y = 32},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "aJ" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "aK" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) -"aL" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/structure/sign/poster{icon_state = "poster19_legit"; pixel_x = -32; pixel_y = 0; serial_number = 19; subtype = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) +"aL" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/structure/sign/poster/official/safety_internals{pixel_x = -32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "aM" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "aN" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "aO" = (/obj/machinery/light{dir = 8},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) @@ -87,10 +87,10 @@ "bI" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "bJ" = (/obj/structure/toilet{dir = 1},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "bK" = (/obj/structure/toilet{dir = 1},/obj/machinery/light/small{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) -"bL" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = -32; serial_number = 2; subtype = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) +"bL" = (/obj/structure/sign/poster/official/nanotrasen_logo{pixel_y = -32},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "bM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "bN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) -"bO" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = -32; serial_number = 2; subtype = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) +"bO" = (/obj/structure/sign/poster/official/nanotrasen_logo{pixel_y = -32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "bP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/wall,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "bQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "bR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/rust,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) @@ -157,7 +157,7 @@ "da" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{id_tag = "awaydorm2"; name = "Dorm 2"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "db" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "dc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{id_tag = "awaydorm1"; name = "Dorm 1"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) -"dd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/closet,/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) +"dd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/closet,/obj/item/weapon/poster/random_contraband,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "de" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "df" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "dg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/rust,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) @@ -255,7 +255,7 @@ "eU" = (/obj/structure/table,/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 13; pixel_y = 5},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 8; pixel_y = 8},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 0; pixel_y = 3},/obj/item/weapon/watertank,/turf/simulated/floor/plasteel{dir = 1; icon_state = "vault"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "eV" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "eW" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/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/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) -"eX" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/device/radio/off,/obj/item/weapon/screwdriver{pixel_y = 10},/obj/structure/sign/poster{icon_state = "poster21_legit"; pixel_y = -32; serial_number = 21; subtype = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) +"eX" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/device/radio/off,/obj/item/weapon/screwdriver{pixel_y = 10},/obj/structure/sign/poster/official/safety_report{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "eY" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor/plasteel{dir = 10; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "eZ" = (/obj/machinery/computer/security{network = list("UO45")},/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "fa" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "redcorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) @@ -292,7 +292,7 @@ "fF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "fG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "fH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) -"fI" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/sign/poster{icon_state = "poster14"; pixel_x = 32; pixel_y = 0; serial_number = 14; subtype = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "greencorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) +"fI" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/sign/poster/contraband/eat{pixel_x = 32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "greencorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "fJ" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "fK" = (/obj/structure/alien/weeds,/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; dir = 6; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "fL" = (/turf/simulated/wall/r_wall,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) @@ -510,7 +510,7 @@ "jP" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/research{name = "Research Lab"; req_access_txt = "201"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"}) "jQ" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"}) "jR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) -"jS" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/structure/sign/poster{icon_state = "poster19_legit"; pixel_x = 0; pixel_y = 32; serial_number = 19; subtype = 1},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) +"jS" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/structure/sign/poster/official/safety_internals{pixel_y = 32},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) "jT" = (/obj/structure/stool/bed/chair{tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) "jU" = (/obj/structure/table,/obj/item/weapon/kitchen/utensil/fork,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) "jV" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) @@ -698,7 +698,7 @@ "nv" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) "nw" = (/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/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"}) "nx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; tag = "icon-manifold-b-f (EAST)"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) -"ny" = (/obj/machinery/vending/cigarette,/obj/structure/sign/poster{icon_state = "poster7"; pixel_y = 32; serial_number = 7; subtype = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) +"ny" = (/obj/machinery/vending/cigarette,/obj/structure/sign/poster/contraband/smoke{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) "nz" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) "nA" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) "nB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) @@ -909,7 +909,7 @@ "ry" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"}) "rz" = (/obj/machinery/computer/rdservercontrol,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"}) "rA" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"}) -"rB" = (/obj/structure/closet/crate,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/contraband/poster,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"}) +"rB" = (/obj/structure/closet/crate,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/poster/random_contraband,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"}) "rC" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = -32},/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"}) "rD" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"}) "rE" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"}) @@ -1136,7 +1136,7 @@ "vR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = -32},/obj/machinery/vending/engivend{req_access_txt = "0"},/obj/machinery/camera{c_tag = "Engineering Foyer"; dir = 1; network = list("UO45")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"}) "vS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"}) "vT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plasteel{dir = 6; icon_state = "yellow"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"}) -"vU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/vending/tool,/obj/structure/sign/poster{icon_state = "poster5_legit"; pixel_x = 0; pixel_y = -32; serial_number = 21; subtype = 1},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"}) +"vU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/vending/tool,/obj/structure/sign/poster/official/build{pixel_y = -32},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"}) "vV" = (/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{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"}) "vW" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"}) "vX" = (/obj/structure/closet/firecloset,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"}) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 3d34878df09..a83f1199254 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -393,8 +393,8 @@ "ahC" = (/obj/structure/table,/obj/item/weapon/paper,/obj/item/weapon/pen,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/security/permabrig) "ahD" = (/obj/structure/stool/bed,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/security/permabrig) "ahE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig) -"ahF" = (/obj/item/weapon/restraints/handcuffs/pinkcuffs,/turf/simulated/floor/plating,/area/security/permabrig) -"ahG" = (/obj/item/clothing/mask/muzzle/gag,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/security/permabrig) +"ahF" = (/turf/space,/area/shuttle/gamma/station) +"ahG" = (/obj/structure/table,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/lock_buster,/obj/machinery/light{dir = 1; on = 1},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/item/weapon/storage/box/chemimp{pixel_x = 4; pixel_y = 3},/obj/item/weapon/storage/box/trackimp,/obj/item/weapon/storage/lockbox/mindshield,/turf/simulated/floor/plasteel,/area/security/armoury) "ahH" = (/obj/machinery/deployable/barrier,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/armoury) "ahI" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/shuttle/plating/vox,/area/shuttle/vox) "ahJ" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "voxshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end (EAST)"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 4},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox) @@ -411,7 +411,7 @@ "ahU" = (/obj/effect/decal/warning_stripes/northwest,/obj/effect/decal/warning_stripes/southeastcorner,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury) "ahV" = (/obj/effect/decal/warning_stripes/north,/obj/effect/decal/warning_stripes/south,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury) "ahW" = (/obj/machinery/ai_status_display{pixel_x = 0; pixel_y = 32},/obj/effect/decal/warning_stripes/northeast,/obj/effect/decal/warning_stripes/southwestcorner,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury) -"ahX" = (/obj/structure/toilet{pixel_y = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/vacantoffice{name = "\improper Security Toilet"}) +"ahX" = (/obj/structure/toilet{pixel_y = 8},/obj/machinery/newscaster{pixel_x = -30; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/vacantoffice{name = "\improper Security Toilet"}) "ahY" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/security/vacantoffice{name = "\improper Security Toilet"}) "ahZ" = (/obj/machinery/door/airlock/hatch{req_access_txt = "152"},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox) "aia" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/item/device/radio/intercom/locked/prison{pixel_x = -25; pixel_y = 0},/turf/simulated/floor/plating,/area/security/permabrig) @@ -422,7 +422,7 @@ "aif" = (/obj/machinery/deployable/barrier,/obj/structure/window/reinforced{dir = 8},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/armoury) "aig" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig) "aih" = (/turf/simulated/wall/r_wall,/area/security/hos) -"aii" = (/obj/structure/table,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/lock_buster,/obj/machinery/light{dir = 1; on = 1},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/security/armoury) +"aii" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig) "aij" = (/obj/machinery/deployable/barrier,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/security/armoury) "aik" = (/obj/machinery/flasher/portable,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/security/armoury) "ail" = (/turf/simulated/shuttle/plating/vox,/area/shuttle/vox) @@ -434,9 +434,9 @@ "air" = (/obj/effect/decal/warning_stripes/west,/obj/effect/decal/warning_stripes/east,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury) "ais" = (/obj/machinery/door/airlock{name = "Toilet"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/vacantoffice{name = "\improper Security Toilet"}) "ait" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig) -"aiu" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig) +"aiu" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "aiv" = (/turf/simulated/wall/r_wall,/area/security/securearmoury) -"aiw" = (/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "west bump Important Area"; pixel_x = -24; shock_proof = 0},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/armoury) +"aiw" = (/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "west bump Important Area"; pixel_x = -24; shock_proof = 0},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/camera{c_tag = "Brig Armory"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/armoury) "aix" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/armoury) "aiy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) "aiz" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/armoury) @@ -472,7 +472,7 @@ "ajd" = (/obj/item/weapon/storage/toolbox/syndicate,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox) "aje" = (/obj/item/weapon/skeleton/r_arm,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox) "ajf" = (/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"}) -"ajg" = (/obj/structure/rack,/obj/item/weapon/storage/box/chemimp{pixel_x = 4; pixel_y = 3},/obj/item/weapon/storage/box/trackimp,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/weapon/storage/lockbox/mindshield,/obj/machinery/light_switch{pixel_x = -25},/obj/machinery/camera{c_tag = "Brig Armory"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/armoury) +"ajg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig) "ajh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) "aji" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) "ajj" = (/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury) @@ -527,7 +527,7 @@ "akg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"}) "akh" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"}) "aki" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig) -"akj" = (/obj/structure/rack,/obj/item/weapon/storage/box/seccarts{pixel_x = 3; pixel_y = 2},/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/obj/item/weapon/storage/box/handcuffs,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/weapon/storage/box/teargas{pixel_x = -3; pixel_y = -3},/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/armoury) +"akj" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "akk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) "akl" = (/obj/machinery/door/airlock/security{name = "Warden's office"; req_access = null; req_access_txt = "3"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/armoury) "akm" = (/obj/effect/decal/warning_stripes/northwestcorner,/obj/effect/decal/warning_stripes/northeastcorner,/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury) @@ -574,7 +574,7 @@ "alb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig) "alc" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/security/permabrig) "ald" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Prisoner Transfer Center"; req_access = null; req_access_txt = "1"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"}) -"ale" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch/gamma{locked = 1; req_access_txt = "1"; use_power = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/permabrig) +"ale" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch/gamma{locked = 1; req_access_txt = "1"; use_power = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/armoury) "alf" = (/obj/machinery/vending/security,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/armoury) "alg" = (/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/armoury) "alh" = (/obj/effect/decal/warning_stripes/red/hollow,/obj/structure/closet/l3closet/security,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/armoury) @@ -621,7 +621,7 @@ "alW" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating,/area/security/warden) "alX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "Secure Armory"; name = "Secure Armory Shutters"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury) "alY" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating,/area/security/securearmoury) -"alZ" = (/obj/structure/table/reinforced,/obj/machinery/door/window/brigdoor{dir = 2; name = "Secure Armory"; req_access_txt = "3"},/obj/machinery/door/window/brigdoor{dir = 1; name = "Secure Armory"; req_access_txt = "3"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury) +"alZ" = (/obj/structure/table/reinforced,/obj/machinery/door/window/brigdoor{dir = 2; name = "Secure Armory"; req_access_txt = "1"},/obj/machinery/door/window/brigdoor{dir = 1; name = "Secure Armory"; req_access_txt = "3"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury) "ama" = (/obj/structure/closet/secure_closet/security,/obj/structure/window/reinforced{dir = 8},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/main) "amb" = (/obj/structure/table,/obj/item/clothing/suit/tracksuit/red,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/obj/machinery/camera{c_tag = "Brig Security Equipment Lockers"; dir = 4; network = list("SS13")},/obj/machinery/requests_console{department = "Security"; departmentType = 5; name = "Security Requests Console"; pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/main) "amc" = (/obj/structure/closet/secure_closet/security,/obj/structure/sign/goldenplaque{pixel_y = 30},/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/main) @@ -737,7 +737,7 @@ "aoi" = (/obj/effect/landmark/start{name = "Brig Physician"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay) "aoj" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/security/medbay) "aok" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay) -"aol" = (/turf/simulated/floor/plasteel,/area/shuttle/gamma/station) +"aol" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig) "aom" = (/turf/simulated/wall,/area/security/prisonlockers) "aon" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay) "aoo" = (/obj/structure/table/glass,/obj/machinery/computer/med_data/laptop,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/security/medbay) @@ -770,7 +770,7 @@ "aoP" = (/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/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/main) "aoQ" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable,/turf/simulated/floor/plating,/area/security/main) "aoR" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating,/area/security/hos) -"aoS" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/red,/obj/item/weapon/folder/red,/obj/item/weapon/cartridge/detective,/obj/item/device/megaphone,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) +"aoS" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/computer/card/minor/hos,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) "aoT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) "aoU" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/range) "aoV" = (/obj/structure/closet/secure_closet/brig,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/prisonlockers) @@ -824,8 +824,8 @@ "apR" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/landmark/start{name = "Security Pod Pilot"},/turf/simulated/floor/plasteel,/area/security/main) "apS" = (/turf/simulated/wall,/area/security/seceqstorage) "apT" = (/obj/machinery/photocopier,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) -"apU" = (/obj/structure/table/woodentable,/obj/item/device/radio,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/camera{c_tag = "Brig Head of Security's Office"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) -"apV" = (/obj/structure/table/woodentable,/obj/item/device/taperecorder{pixel_y = 0},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) +"apU" = (/obj/structure/table/woodentable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/camera{c_tag = "Brig Head of Security's Office"; dir = 1; network = list("SS13")},/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) +"apV" = (/obj/structure/table/woodentable,/obj/item/device/taperecorder{pixel_x = -5; pixel_y = 0},/obj/machinery/light,/obj/item/device/radio{pixel_x = 5},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) "apW" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) "apX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) "apY" = (/obj/structure/reagent_dispensers/fueltank,/obj/effect/decal/warning_stripes/yellow/hollow,/obj/effect/decal/warning_stripes/northeastcorner,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel,/area/security/podbay) @@ -870,12 +870,12 @@ "aqL" = (/obj/effect/landmark{name = "carpspawn"},/obj/structure/lattice,/turf/space,/area/space) "aqM" = (/obj/effect/decal/warning_stripes/northeast,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/range) "aqN" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/range) -"aqO" = (/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = 32},/obj/machinery/camera{c_tag = "Firing Range"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/range) +"aqO" = (/obj/structure/sign/poster/official/random{pixel_x = 0; pixel_y = 32},/obj/machinery/camera{c_tag = "Firing Range"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/range) "aqP" = (/obj/structure/closet/crate,/obj/item/target,/obj/item/target,/obj/item/target,/obj/item/target,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel,/area/security/range) "aqQ" = (/obj/effect/decal/cleanable/dirt,/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/range) -"aqR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/brig) -"aqS" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/brig) -"aqT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig) +"aqR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig) +"aqS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) +"aqT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) "aqU" = (/obj/machinery/light{dir = 1; on = 1},/obj/item/device/radio/intercom/department/security{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig) "aqV" = (/obj/machinery/ai_status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig) "aqW" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) @@ -908,11 +908,11 @@ "arx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig) "ary" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) "arz" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/camera{c_tag = "Brig Main Hall East 1"; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig) -"arA" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig) +"arA" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/sign/poster/official/random{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig) "arB" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig) "arC" = (/obj/item/device/radio/intercom/department/security{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig) "arD" = (/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig) -"arE" = (/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = 32},/obj/machinery/camera{c_tag = "Brig Main Hall East 2"; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig) +"arE" = (/obj/structure/sign/poster/official/random{pixel_x = 0; pixel_y = 32},/obj/machinery/camera{c_tag = "Brig Main Hall East 2"; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig) "arF" = (/turf/simulated/wall,/area/security/podbay) "arG" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay) "arH" = (/obj/structure/table/reinforced,/obj/item/clothing/suit/jacket/pilot,/obj/item/clothing/head/beret/sec,/obj/machinery/light_switch{pixel_x = -25},/obj/item/device/spacepod_key{id = 100000},/obj/item/device/gps,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay) @@ -924,10 +924,10 @@ "arN" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/range) "arO" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/range) "arP" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/range) -"arQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/plasteel,/area/security/brig) +"arQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) "arR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Firing Range"; req_access_txt = "1"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/range) -"arS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) -"arT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/brig) +"arS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) +"arT" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore) "arU" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxstarboard) "arV" = (/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "burst_r"},/turf/space,/area/shuttle/trade/sol) "arW" = (/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) @@ -955,7 +955,7 @@ "ass" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/disposalpipe/sortjunction{dir = 1; icon_state = "pipe-j1s"; sortType = 7},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) "ast" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) "asu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) -"asv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) +"asv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/sign/poster/official/random{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) "asw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) "asx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) "asy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{dir = 0; name = "station intercom (General)"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) @@ -988,18 +988,18 @@ "asZ" = (/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/range) "ata" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/energy/laser/practice,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor/plating,/area/security/range) "atb" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/range) -"atc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/brig) +"atc" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore) "atd" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating,/area/security/brig) -"ate" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig) +"ate" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/prison/cell_block/B) "atf" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/brig) "atg" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) "ath" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) -"ati" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) +"ati" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/sign/poster/official/random{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) "atj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) "atk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/brig) "atl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{dir = 0; name = "station intercom (General)"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) "atm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) -"atn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) +"atn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/sign/poster/official/random{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) "ato" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkred"},/area/security/brig) "atp" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/brig) "atq" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) @@ -1474,7 +1474,7 @@ "aCr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/prison/cell_block/B) "aCs" = (/obj/machinery/door/window/brigdoor{dir = 8; id = "Cell 6"; name = "Cell 6"; req_access_txt = "2"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/prison/cell_block/B) "aCt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/prison/cell_block/B) -"aCu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/prison/cell_block/B) +"aCu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Paramedic"; req_access_txt = "66"},/turf/simulated/floor/plasteel,/area/medical/paramedic) "aCv" = (/obj/structure/stool/bed/chair,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/obj/machinery/camera{c_tag = "Brig Interrogation Observation"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/interrogation) "aCw" = (/obj/structure/stool/bed/chair,/obj/machinery/light_switch{pixel_x = 25},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/interrogation) "aCx" = (/obj/structure/stool/bed/chair,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/interrogation) @@ -1603,14 +1603,14 @@ "aEQ" = (/obj/structure/table/reinforced,/obj/structure/mirror{pixel_x = 28},/obj/item/weapon/razor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber) "aER" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "solar_chapel_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "solar_chapel_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "solar_chapel_airlock"; pixel_x = 25; req_access_txt = "13"; tag_airpump = "solar_chapel_pump"; tag_chamber_sensor = "solar_chapel_sensor"; tag_exterior_door = "solar_chapel_outer"; tag_interior_door = "solar_chapel_inner"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "aES" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitecorner"},/area/maintenance/abandonedbar) -"aET" = (/obj/structure/table/woodentable,/obj/item/weapon/lipstick/random,/obj/structure/sign/poster{pixel_x = -32},/turf/simulated/floor/plating,/area/maintenance/abandonedbar) +"aET" = (/obj/structure/table/woodentable,/obj/item/weapon/lipstick/random,/obj/structure/sign/poster/contraband/random{pixel_x = -32},/turf/simulated/floor/plating,/area/maintenance/abandonedbar) "aEU" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating{dir = 10; icon_regular_floor = "escape"},/area/maintenance/abandonedbar) "aEV" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "escape"},/area/maintenance/abandonedbar) "aEW" = (/obj/item/stack/rods,/turf/simulated/floor/plasteel{dir = 2; icon_state = "escape"},/area/maintenance/abandonedbar) "aEX" = (/obj/item/trash/pistachios,/obj/machinery/light_construct,/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar) "aEY" = (/obj/structure/stool,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/wood,/area/maintenance/abandonedbar) "aEZ" = (/obj/machinery/light,/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plating,/area/maintenance/abandonedbar) -"aFa" = (/obj/structure/sign/poster{pixel_x = 32},/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar) +"aFa" = (/obj/structure/sign/poster/contraband/random{pixel_x = 32},/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar) "aFb" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/condiment/saltshaker,/obj/item/weapon/reagent_containers/food/condiment/peppermill,/turf/simulated/floor/plating,/area/maintenance/abandonedbar) "aFc" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Airlock"; req_access_txt = "150"},/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "syndicate_elite"; name = "Front Hull Door"; opacity = 1},/turf/simulated/shuttle/plating,/area/shuttle/syndicate_elite) "aFd" = (/turf/simulated/wall/r_wall,/area/maintenance/abandonedbar) @@ -1720,7 +1720,7 @@ "aHd" = (/obj/structure/stool/bed,/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "aHe" = (/obj/machinery/camera{c_tag = "Fore Primary Hallway West"; dir = 4; network = list("SS13")},/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = -27},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore) "aHf" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore) -"aHg" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore) +"aHg" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2) "aHh" = (/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/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs) "aHi" = (/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber) "aHj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber) @@ -2145,7 +2145,7 @@ "aPm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aPn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Unisex Restrooms"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aPo" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet) -"aPp" = (/obj/structure/sign/poster{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/wood,/area/crew_quarters/bar) +"aPp" = (/obj/structure/sign/poster/contraband/random{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/wood,/area/crew_quarters/bar) "aPq" = (/obj/structure/closet/gmcloset{icon_closed = "black"; icon_state = "black"; name = "formal wardrobe"},/obj/machinery/light/small{dir = 4},/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/crew_quarters/bar) "aPr" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/camera{c_tag = "Fore Primary Hallway South"; dir = 4; network = list("SS13")},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore) "aPs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint) @@ -2192,21 +2192,26 @@ "aQh" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aQi" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aQj" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint) -"aQk" = (/obj/effect/decal/cleanable/dirt,/obj/structure/sign/poster{pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/fpmaint) +"aQk" = (/obj/effect/decal/cleanable/dirt,/obj/structure/sign/poster/contraband/random{pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aQl" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aQm" = (/obj/structure/toilet{pixel_y = 8},/obj/machinery/light/small{dir = 8},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aQn" = (/obj/structure/toilet{pixel_y = 8},/obj/machinery/light/small{dir = 8},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aQo" = (/obj/machinery/light/small{dir = 8},/obj/machinery/recharge_station,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aQp" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aQq" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j1 (EAST)"; icon_state = "pipe-j1"; dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"aQr" = (/obj/machinery/modular_computer/console/preset/command,/turf/simulated/floor/plasteel{dir = 10; icon_state = "green"},/area/bridge) +"aQr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/wall,/area/crew_quarters/bar) "aQs" = (/obj/machinery/computer/med_data,/turf/simulated/floor/plasteel{dir = 6; icon_state = "green"},/area/bridge) -"aQt" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "greencorner"},/area/bridge) -"aQu" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel,/area/bridge) -"aQv" = (/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes/stokcubes,/obj/item/weapon/storage/box/monkeycubes/neaeracubes,/obj/structure/table/glass,/obj/item/weapon/storage/box/monkeycubes/wolpincubes,/obj/item/weapon/storage/box/monkeycubes/farwacubes,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (SOUTHEAST)"; icon_state = "whitepurple"; dir = 6},/area/medical/genetics) +"aQt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"aQu" = (/obj/machinery/door/airlock/maintenance{name = "Bar Maintenance"; req_access_txt = "12"},/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/fsmaint2) +"aQv" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/drinks/flask/barflask,/obj/item/weapon/reagent_containers/food/drinks/flask/barflask,/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar) +"aQw" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/medical{name = "Morgue"; req_access_txt = "6"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/medical/morgue) +"aQx" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/closet/secure_closet/exam,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) +"aQy" = (/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/body_scanconsole,/obj/machinery/camera{c_tag = "Medbay Examination Room"; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) "aQz" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/cryopod/right,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep) +"aQA" = (/obj/structure/filingcabinet/chestdrawer{desc = "A large drawer filled with autopsy reports."; name = "Autopsy Reports"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/medical/morgue) "aQB" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aQC" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"aQD" = (/obj/structure/table,/obj/structure/window/reinforced{dir = 4},/obj/machinery/requests_console{department = "Morgue"; departmentType = 5; name = "Morgue Requests Console"; pixel_x = 0; pixel_y = 30},/obj/item/weapon/storage/box/bodybags{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/box/bodybags,/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/morgue) "aQE" = (/obj/structure/table/woodentable,/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) "aQF" = (/obj/structure/table/woodentable,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) "aQG" = (/obj/structure/disposalpipe/segment,/obj/structure/stool,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) @@ -2249,17 +2254,27 @@ "aRr" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aRs" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aRt" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/maintenance/fpmaint) +"aRu" = (/obj/structure/table,/obj/machinery/computer/med_data/laptop,/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/morgue) +"aRv" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/medical/morgue) "aRw" = (/turf/simulated/wall/r_wall,/area/ai_monitored/storage/eva) "aRx" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/ai_monitored/storage/eva) +"aRy" = (/obj/machinery/camera{c_tag = "Medbay Morgue"; network = list("SS13")},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/morgue) "aRz" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore) +"aRA" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/morgue) +"aRB" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/morgue) +"aRC" = (/obj/machinery/alarm{pixel_y = 26},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/morgue) "aRD" = (/obj/machinery/computer/cryopod{density = 0; pixel_x = -32; pixel_y = 0},/obj/machinery/camera{c_tag = "Cryodorms"; c_tag_order = 999; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep) +"aRE" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 25; pixel_y = 0; req_access_txt = "0"},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) +"aRF" = (/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) "aRG" = (/obj/machinery/door/window/eastleft{dir = 2; name = "Boxing Ring"},/obj/structure/window/reinforced{dir = 4},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/wood,/area/crew_quarters/fitness) +"aRH" = (/obj/machinery/photocopier,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/morgue) "aRI" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-stage_stairs"; icon_state = "stage_stairs"},/area/crew_quarters/fitness) "aRJ" = (/obj/structure/table/woodentable,/obj/item/device/paicard,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) "aRK" = (/obj/structure/table/woodentable,/obj/item/stack/tape_roll,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) "aRL" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/sop_general,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) "aRM" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/wood,/area/crew_quarters/fitness) "aRN" = (/obj/structure/window/reinforced,/turf/simulated/floor/wood,/area/crew_quarters/fitness) +"aRO" = (/obj/structure/table,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/paper_bin{pixel_y = -1},/obj/item/weapon/pen,/turf/simulated/floor/plasteel,/area/medical/morgue) "aRP" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/beach/water{icon_state = "seadeep"},/area/crew_quarters/fitness) "aRQ" = (/obj/structure/window/reinforced,/turf/simulated/floor/beach/water{icon_state = "seadeep"},/area/crew_quarters/fitness) "aRR" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) @@ -2302,16 +2317,23 @@ "aSC" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva) "aSD" = (/obj/machinery/camera/motion{c_tag = "EVA North-West"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/ai_monitored/storage/eva) "aSE" = (/obj/machinery/door/airlock/glass_command{name = "Softsuits"; req_access_txt = "18"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva) +"aSF" = (/obj/effect/landmark/start{name = "Coroner"},/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/simulated/floor/plasteel,/area/medical/morgue) +"aSG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel,/area/medical/morgue) +"aSH" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/medical/morgue) +"aSI" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) "aSJ" = (/obj/machinery/camera{c_tag = "EVA North-East"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/ai_monitored/storage/eva) +"aSK" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Morgue"; req_access_txt = "6"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/exam_room) "aSL" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "Softsuits"; req_access_txt = "18"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva) "aSM" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva) "aSN" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore) "aSO" = (/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/fore) "aSP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint) +"aSQ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/crew_quarters/bar) "aSR" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/obj/machinery/cryopod/right,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep) "aSS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/wall,/area/crew_quarters/sleep) "aST" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/cryopod,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep) "aSU" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) +"aSV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/medical/morgue) "aSW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/stool,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) "aSX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/stool,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) "aSY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) @@ -2349,9 +2371,24 @@ "aTE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva) "aTF" = (/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 = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva) "aTG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/table/reinforced,/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) +"aTH" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/structure/table,/obj/item/weapon/storage/firstaid/adv,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) "aTI" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) "aTJ" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/fore) +"aTK" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) +"aTL" = (/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/medical/exam_room) +"aTM" = (/obj/structure/closet/wardrobe/black,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/item/weapon/reagent_containers/glass/bottle/reagent/formaldehyde,/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/morgue) +"aTN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/medical/exam_room) +"aTO" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel,/area/medical/morgue) +"aTP" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/table,/obj/item/weapon/cane{pixel_x = -3; pixel_y = 3},/obj/item/weapon/cane{pixel_x = -5; pixel_y = 6},/obj/item/weapon/cane,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) +"aTQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) +"aTR" = (/obj/structure/table,/obj/item/weapon/storage/box/gloves{pixel_y = 8},/obj/item/device/camera{name = "Autopsy Camera"; pixel_x = -2; pixel_y = -2},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/medical/morgue) +"aTS" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/table,/obj/item/weapon/autopsy_scanner,/obj/item/weapon/scalpel,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/morgue) +"aTT" = (/obj/machinery/light/small,/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/machinery/optable,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/morgue) +"aTU" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/morgue) +"aTV" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/light/small,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/morgue) +"aTW" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/morgue) "aTX" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 6; initialize_directions = 6; level = 2},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"aTY" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/exam_room) "aTZ" = (/obj/structure/closet,/obj/effect/decal/cleanable/cobweb,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aUa" = (/obj/machinery/atmospherics/unary/tank/air{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aUb" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) @@ -2393,6 +2430,8 @@ "aUL" = (/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva) "aUM" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/fore) "aUN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness) +"aUO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Examination Room"; req_access_txt = "5"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/exam_room) +"aUP" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/medical{name = "Morgue"; req_access_txt = "6;5"; req_one_access_txt = "0"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/morgue) "aUQ" = (/turf/simulated/wall,/area/crew_quarters/toilet) "aUR" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 8; initialize_directions = 11; level = 2},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aUS" = (/turf/simulated/wall,/area/crew_quarters/bar) @@ -2426,6 +2465,8 @@ "aVu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva) "aVv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/camera{c_tag = "EVA East"; dir = 8; network = list("SS13")},/obj/structure/table/reinforced,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) "aVw" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) +"aVx" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2) +"aVy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/medbay2) "aVz" = (/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/crew_quarters/toilet) "aVA" = (/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aVB" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; tag = "icon-shower (EAST)"},/obj/machinery/light_switch{pixel_x = -25},/obj/structure/curtain/open/shower,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet) @@ -2435,6 +2476,7 @@ "aVF" = (/obj/machinery/camera{c_tag = "Bar Storage"; network = list("SS13")},/obj/structure/table/woodentable,/obj/machinery/reagentgrinder,/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/wood,/area/crew_quarters/bar) "aVG" = (/obj/machinery/vending/coffee,/turf/simulated/floor/wood,/area/crew_quarters/bar) "aVH" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/shaker,/obj/item/weapon/gun/projectile/revolver/doublebarrel,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/weapon/storage/fancy/candle_box/eternal,/obj/item/weapon/storage/fancy/candle_box/eternal,/obj/item/weapon/storage/fancy/candle_box/eternal,/turf/simulated/floor/wood,/area/crew_quarters/bar) +"aVI" = (/obj/structure/closet/walllocker/emerglocker/north,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2) "aVJ" = (/obj/effect/decal/cleanable/blood/oil/streak,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aVK" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/crew_quarters/fitness) "aVL" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/fitness) @@ -2486,11 +2528,18 @@ "aWF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva) "aWG" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) "aWH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness) +"aWI" = (/obj/machinery/camera{c_tag = "Medbay Fore Starboard"; network = list("SS13")},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2) "aWJ" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/fore) "aWK" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aWL" = (/obj/machinery/door/airlock{name = "Unisex Showers"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet) +"aWM" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/table/reinforced,/obj/item/clothing/head/that{pixel_x = 4; pixel_y = 6},/obj/item/weapon/lighter/zippo,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar) +"aWN" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/crew_quarters/bar) +"aWO" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/medbay2) "aWP" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/crew_quarters/bar) "aWQ" = (/obj/machinery/light/small{dir = 8},/obj/item/weapon/storage/secure/safe{pixel_x = -22; pixel_y = 0},/turf/simulated/floor/wood,/area/crew_quarters/bar) +"aWR" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2) +"aWS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2) +"aWT" = (/obj/machinery/door/window{dir = 4; name = "Bar Door"; req_access_txt = "25"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar) "aWU" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 5; level = 2},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aWV" = (/obj/item/stack/rods{amount = 10},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aWW" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10; initialize_directions = 10; level = 2},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) @@ -2552,9 +2601,23 @@ "aYa" = (/obj/structure/sign/biohazard{pixel_x = 32},/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/plasteel,/area/gateway) "aYb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/table/reinforced,/obj/item/weapon/book/manual/evaguide,/obj/item/stack/tape_roll,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) "aYc" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore) +"aYd" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/obj/item/weapon/pen/blue{pixel_x = 2; pixel_y = 6},/obj/item/weapon/pen/blue{pixel_x = -3; pixel_y = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar) +"aYe" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar) +"aYf" = (/obj/machinery/modular_computer/console/preset/command,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel{dir = 10; icon_state = "green"},/area/bridge) +"aYg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "greencorner"},/area/bridge) "aYh" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/fore) +"aYi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/bridge) +"aYj" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/bridge) +"aYk" = (/obj/machinery/door/window/eastright{name = "Coroner Office"; req_access_txt = "5"},/turf/simulated/floor/plasteel,/area/medical/morgue) +"aYl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2) +"aYm" = (/obj/structure/rack,/obj/item/weapon/storage/box/seccarts{pixel_x = 3; pixel_y = 2},/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/obj/item/weapon/storage/box/handcuffs,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/weapon/storage/box/teargas{pixel_x = -3; pixel_y = -3},/obj/machinery/light{dir = 8},/obj/machinery/light_switch{pixel_x = -22; pixel_y = 9},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/armoury) "aYn" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"aYo" = (/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes/stokcubes,/obj/item/weapon/storage/box/monkeycubes/neaeracubes,/obj/structure/table/glass,/obj/item/weapon/storage/box/monkeycubes/wolpincubes,/obj/item/weapon/storage/box/monkeycubes/farwacubes,/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) +"aYp" = (/obj/machinery/ai_status_display{pixel_y = 32},/obj/machinery/computer/card/minor/rd,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/crew_quarters/hor) +"aYq" = (/obj/item/weapon/paper_bin,/obj/item/weapon/folder/white{pixel_y = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/reagent_containers/food/drinks/coffee,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/accessory/stethoscope,/obj/item/weapon/stamp/cmo,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/structure/table/glass,/obj/item/weapon/pen/multi,/obj/item/weapon/book/manual/sop_medical,/obj/item/device/megaphone,/obj/item/weapon/reagent_containers/glass/bottle/morphine,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/cmo) +"aYr" = (/obj/item/device/radio/intercom/department/medbay{pixel_y = -28},/obj/machinery/computer/card/minor/cmo,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/cmo) "aYs" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"aYt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/folder/yellow,/obj/item/weapon/stamp/ce,/obj/item/weapon/book/manual/sop_engineering,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter/zippo,/obj/item/weapon/pen/multi,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) "aYu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aYv" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aYw" = (/obj/effect/decal/cleanable/fungus,/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/maintenance/fsmaint2) @@ -2614,13 +2677,20 @@ "aZy" = (/obj/structure/stool,/turf/simulated/floor/plasteel,/area/gateway) "aZz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness) "aZA" = (/turf/simulated/floor/plasteel,/area/gateway) +"aZB" = (/obj/machinery/computer/card/minor/ce,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) +"aZC" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/structure/table,/obj/item/clothing/glasses/welding,/obj/item/clothing/glasses/welding,/obj/item/clothing/gloves/color/black,/obj/item/clothing/gloves/color/black,/obj/item/clothing/gloves/color/black,/turf/simulated/floor/plasteel,/area/atmos) "aZD" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar) "aZE" = (/obj/item/device/radio/intercom{pixel_x = 25},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/window/reinforced,/obj/structure/closet/secure_closet/bar{req_access_txt = "25"},/turf/simulated/floor/wood,/area/crew_quarters/bar) "aZF" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/hallway/primary/fore) "aZG" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/fore) +"aZH" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 3; name = "Atmospherics Requests Console"; pixel_y = -30},/obj/item/stack/sheet/glass{amount = 50},/obj/item/clothing/head/welding,/obj/item/clothing/head/welding,/turf/simulated/floor/plasteel,/area/atmos) "aZI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint) +"aZJ" = (/obj/effect/decal/cleanable/cobweb,/obj/item/clothing/mask/muzzle/gag,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) "aZK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"aZL" = (/obj/item/weapon/restraints/handcuffs/pinkcuffs,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) +"aZM" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) "aZN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"aZO" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/weapon/twohanded/required/kirbyplants,/obj/structure/sign/bobross{pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/captain) "aZV" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar) "aZW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aZX" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/junction{tag = "icon-pipe-j1 (EAST)"; icon_state = "pipe-j1"; dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) @@ -2702,7 +2772,6 @@ "bbv" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Dormitories"; req_access_txt = "0"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/fitness) "bbw" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/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/crew_quarters/toilet) "bbx" = (/obj/structure/dispenser/oxygen,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva) -"bby" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/crew_quarters/bar) "bbz" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central/north) "bbA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar) "bbB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/sign/securearea{desc = "Under the painting a plaque reads: 'While the meat grinder may not have spared you, fear not. Not one part of you has gone to waste... You were delicious.'"; icon_state = "monkey_painting"; name = "Mr. Deempisi portrait"; pixel_x = -28; pixel_y = 4},/obj/structure/reagent_dispensers/beerkeg,/turf/simulated/floor/wood,/area/crew_quarters/bar) @@ -2716,9 +2785,7 @@ "bbJ" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "bbK" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "bbL" = (/obj/machinery/door/airlock{name = "Unit B"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet) -"bbM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "bbN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"bbO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "bbP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/wall,/area/crew_quarters/kitchen) "bbQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/wall,/area/crew_quarters/kitchen) "bbR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{name = "Kitchen Maintenance"; req_access_txt = "28"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) @@ -2814,7 +2881,6 @@ "bdD" = (/turf/simulated/floor/plasteel,/area/hallway/primary/central/north) "bdE" = (/obj/machinery/camera{c_tag = "Dormitories Toilets"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "bdF" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Bar Office"; req_access_txt = "25"},/turf/simulated/floor/plasteel,/area/crew_quarters/bar) -"bdG" = (/obj/machinery/door/airlock/maintenance{name = "Bar Maintenance"; req_access_txt = "12"},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "bdH" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/hallway/primary/central/ne) "bdI" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hallway/primary/central/ne) "bdJ" = (/obj/machinery/light/small{dir = 1},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/structure/closet/chefcloset,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) @@ -2898,7 +2964,6 @@ "bfj" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/camera{c_tag = "Bar North"; dir = 2; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/table/reinforced,/obj/machinery/chem_dispenser/soda,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar) "bfk" = (/obj/machinery/requests_console{department = "Bar"; name = "Bar Requests Console"; departmentType = 2; pixel_x = 0; pixel_y = 30},/obj/structure/table/reinforced,/obj/machinery/chem_dispenser/beer,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar) "bfl" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/stool/bed/chair/comfy/brown{dir = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/carpet,/area/crew_quarters/bar) -"bfm" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/drinks/flask/barflask,/obj/item/weapon/reagent_containers/food/drinks/flask/barflask,/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar) "bfn" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/primary/central/ne) "bfo" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/primary/central/ne) "bfp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/primary/central/ne) @@ -2906,7 +2971,6 @@ "bfr" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/stool/bed/chair/comfy/brown{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/bar) "bfs" = (/obj/machinery/light{dir = 1},/obj/machinery/vending/boozeomat,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar) "bft" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar) -"bfu" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/carpet,/area/crew_quarters/bar) "bfv" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "bfw" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "bfx" = (/obj/machinery/door/window/eastright{tag = "icon-right"; name = "Hydroponics Delivery"; icon_state = "right"; dir = 2; req_access_txt = "35"},/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) @@ -3003,7 +3067,6 @@ "bhk" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne) "bhl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/reinforced,/obj/item/stack/packageWrap,/obj/item/weapon/pen/blue{pixel_x = 0; pixel_y = 4},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/disposalpipe/segment{dir = 4},/obj/item/weapon/book/manual/barman_recipes,/obj/item/weapon/book/manual/sop_service,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar) "bhm" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar) -"bhn" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/reinforced,/obj/item/clothing/head/that{pixel_x = 4; pixel_y = 6},/obj/item/weapon/lighter/zippo,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar) "bho" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/kitchenspike,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "bhp" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne) "bhq" = (/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne) @@ -3014,7 +3077,6 @@ "bhv" = (/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar) "bhw" = (/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{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "bhx" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 4},/turf/simulated/floor/carpet,/area/crew_quarters/bar) -"bhy" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/carpet,/area/crew_quarters/bar) "bhz" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 8},/obj/machinery/light{dir = 4},/turf/simulated/floor/carpet,/area/crew_quarters/bar) "bhA" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "bhB" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "asteroid"; tag = "icon-asteroid (NORTH)"},/turf/simulated/floor/plasteel{tag = "icon-siding2 (NORTH)"; icon_state = "siding2"; dir = 1},/mob/living/simple_animal/pig,/turf/simulated/floor/plasteel{tag = "icon-siding1 (NORTH)"; icon_state = "siding1"; dir = 1},/area/hydroponics) @@ -3095,7 +3157,6 @@ "biY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne) "biZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "L8"},/area/hallway/primary/central/north) "bja" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/light_switch{pixel_x = -25},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar) -"bjb" = (/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) "bjc" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/obj/structure/table/woodentable,/obj/item/ashtray/bronze{pixel_x = -1; pixel_y = 1},/turf/simulated/floor/carpet,/area/crew_quarters/bar) "bjd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne) "bje" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne) @@ -3181,7 +3242,6 @@ "bkG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/ne) "bkH" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne) "bkI" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar) -"bkJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/obj/item/weapon/pen/blue{pixel_x = 2; pixel_y = 6},/obj/item/weapon/pen/blue{pixel_x = -3; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar) "bkK" = (/obj/machinery/vending/cigarette{pixel_x = 0; pixel_y = 0},/turf/simulated/floor/carpet,/area/crew_quarters/bar) "bkL" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/freezer{req_access_txt = "28"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "bkM" = (/obj/machinery/slot_machine,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar) @@ -3220,7 +3280,7 @@ "blt" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "blu" = (/obj/machinery/status_display{pixel_y = 30},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor4,/area/shuttle/escape) "blv" = (/obj/machinery/status_display{pixel_y = 30},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape) -"blw" = (/obj/structure/sign/poster/legit{pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) +"blw" = (/obj/structure/sign/poster/official/random{pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "blx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "bly" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry) "blz" = (/obj/effect/decal/warning_stripes/east,/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) @@ -3265,7 +3325,6 @@ "bmm" = (/obj/structure/stool,/turf/simulated/floor/wood,/area/crew_quarters/bar) "bmn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/stool,/turf/simulated/floor/wood,/area/crew_quarters/bar) "bmo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bmp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar) "bmq" = (/turf/simulated/floor/wood,/area/crew_quarters/bar) "bmr" = (/obj/structure/noticeboard{pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bms" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) @@ -3398,7 +3457,7 @@ "boR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) "boS" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) "boT" = (/obj/machinery/firealarm{dir = 2; pixel_y = -24},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) -"boU" = (/obj/structure/sign/poster/legit{pixel_y = -32},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) +"boU" = (/obj/structure/sign/poster/official/random{pixel_y = -32},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) "boV" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) "boW" = (/obj/machinery/camera{c_tag = "Arrivals Hallway"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) "boX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) @@ -3408,7 +3467,7 @@ "bpb" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/table,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/toolbox/emergency,/turf/simulated/floor/plating,/area/storage/emergency2) "bpc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/wood,/area/civilian/pet_store) "bpd" = (/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor/plasteel,/area/crew_quarters/locker) -"bpe" = (/obj/structure/sign/poster/legit{pixel_x = 32},/turf/simulated/floor/plasteel,/area/crew_quarters/locker) +"bpe" = (/obj/structure/sign/poster/official/random{pixel_x = 32},/turf/simulated/floor/plasteel,/area/crew_quarters/locker) "bpf" = (/obj/structure/grille/broken,/turf/simulated/floor/plating,/area/maintenance/port) "bpg" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/wood,/area/civilian/pet_store) "bph" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/storage/emergency2) @@ -3702,7 +3761,7 @@ "buL" = (/obj/machinery/hydroponics/constructable,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) "buM" = (/obj/structure/table/woodentable,/obj/item/weapon/kitchen/utensil/fork,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/wood,/area/crew_quarters/bar) "buN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 16},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) -"buO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/sign/poster/legit{pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) +"buO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/sign/poster/official/random{pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) "buP" = (/obj/machinery/light{dir = 8},/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) "buQ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) "buR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) @@ -3902,7 +3961,7 @@ "byD" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/west) "byE" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/west) "byF" = (/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/central/west) -"byG" = (/obj/machinery/photocopier,/obj/structure/sign/poster/legit{pixel_x = -32},/turf/simulated/floor/wood,/area/bridge/meeting_room) +"byG" = (/obj/machinery/photocopier,/obj/structure/sign/poster/official/random{pixel_x = -32},/turf/simulated/floor/wood,/area/bridge/meeting_room) "byH" = (/obj/machinery/door_control{id = "heads_meeting"; name = "Privacy Shutters Control"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/wood,/area/bridge/meeting_room) "byI" = (/obj/machinery/newscaster{pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor/wood,/area/bridge/meeting_room) "byJ" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/camera{c_tag = "Bridge Conference Room"; dir = 2; network = list("SS13")},/turf/simulated/floor/wood,/area/bridge/meeting_room) @@ -3921,7 +3980,6 @@ "byW" = (/obj/machinery/ai_status_display{pixel_y = 32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "byX" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "north bump Important Area"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/wood,/area/crew_quarters/captain) "byY" = (/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) -"byZ" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bza" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/ne) "bzb" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne) "bzc" = (/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) @@ -4100,7 +4158,7 @@ "bCt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port) "bCu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage) "bCv" = (/obj/item/stack/sheet/cardboard,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage) -"bCw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/poster{pixel_x = -32},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port) +"bCw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/poster/contraband/random{pixel_x = -32},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port) "bCx" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) "bCy" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage) "bCz" = (/obj/machinery/camera{c_tag = "Cargo Bay Storage"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage) @@ -4209,7 +4267,6 @@ "bEy" = (/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"},/turf/simulated/wall,/area/medical/reception) "bEz" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/medical/reception) "bEA" = (/turf/simulated/wall/r_wall,/area/assembly/robotics) -"bEB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/medical{name = "Morgue"; req_access_txt = "6"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/medical/morgue) "bEC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/genetics) "bED" = (/turf/simulated/wall/r_wall,/area/toxins/lab) "bEE" = (/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) @@ -4243,7 +4300,7 @@ "bFg" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/port) "bFh" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) "bFi" = (/obj/effect/decal/cleanable/cobweb,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/port) -"bFj" = (/obj/structure/sign/poster{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage) +"bFj" = (/obj/structure/sign/poster/contraband/random{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage) "bFk" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage) "bFl" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/port) "bFm" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/quartermaster/storage) @@ -4295,17 +4352,8 @@ "bGg" = (/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) "bGh" = (/obj/structure/closet/walllocker/emerglocker/north,/obj/structure/table,/obj/machinery/computer/mob_healer_terminal,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception) "bGi" = (/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) -"bGj" = (/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) -"bGk" = (/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) -"bGl" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) -"bGm" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal,/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/morgue) -"bGn" = (/obj/structure/table,/obj/item/device/camera{name = "Autopsy Camera"; pixel_x = -2; pixel_y = -2},/obj/item/clothing/gloves/color/latex,/obj/item/weapon/reagent_containers/glass/bottle/reagent/formaldehyde,/obj/item/weapon/reagent_containers/syringe,/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/medical/morgue) -"bGo" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/morgue) -"bGp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/morgue) "bGq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/assembly/chargebay) "bGr" = (/turf/simulated/wall/r_wall,/area/assembly/chargebay) -"bGs" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/morgue) -"bGt" = (/obj/machinery/camera{c_tag = "Medbay Morgue"; network = list("SS13")},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/morgue) "bGu" = (/obj/machinery/computer/rdconsole/robotics,/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) "bGv" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/turf/simulated/floor/plasteel,/area/medical/morgue) "bGw" = (/obj/machinery/r_n_d/circuit_imprinter,/obj/item/weapon/reagent_containers/glass/beaker/sulphuric,/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) @@ -4314,7 +4362,7 @@ "bGz" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "mechbay"; name = "Mech Bay"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/chargebay) "bGA" = (/obj/structure/table,/obj/item/weapon/book/manual/robotics_cyborgs{pixel_x = 2; pixel_y = 5},/obj/item/weapon/storage/belt/utility,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/machinery/requests_console{department = "Robotics"; departmentType = 2; name = "Robotics Requests Console"; pixel_y = 30},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) "bGB" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "robotics"; name = "Robotics Lab Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/assembly/robotics) -"bGC" = (/obj/machinery/autolathe,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) +"bGC" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) "bGD" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 0},/obj/item/weapon/storage/belt/utility,/obj/item/clothing/gloves/color/latex,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) "bGE" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/window/eastright{base_state = "left"; dir = 2; icon_state = "left"; name = "Robotics Desk"; req_access_txt = "29"},/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/weapon/folder/white,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "robotics"; name = "Robotics Lab Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/assembly/robotics) "bGF" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 10; icon_state = "purple"},/area/hallway/primary/starboard/east) @@ -4382,14 +4430,8 @@ "bHP" = (/obj/structure/stool,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/reception) "bHQ" = (/turf/simulated/floor/plasteel,/area/medical/morgue) "bHR" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) -"bHS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/medical/morgue) -"bHT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) "bHU" = (/obj/structure/morgue,/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/plasteel,/area/medical/morgue) -"bHV" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) -"bHW" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/closet/secure_closet/exam,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) "bHX" = (/turf/simulated/floor/plasteel,/area/assembly/chargebay) -"bHY" = (/obj/structure/table,/obj/item/weapon/autopsy_scanner,/obj/item/weapon/scalpel,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/morgue) -"bHZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/medical/morgue) "bIa" = (/turf/simulated/wall,/area/assembly/robotics) "bIb" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/plasteel,/area/medical/morgue) "bIc" = (/obj/structure/stool/bed/chair/office/light{dir = 1},/obj/effect/landmark/start{name = "Roboticist"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) @@ -4480,16 +4522,8 @@ "bJJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) "bJK" = (/obj/item/weapon/hand_labeler,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the 'Space' from Space Cleaner and written in Chemistry. Scrawled on the back is, 'Okay, whoever filled this with polytrinic acid, it was only funny the first time. It was hard enough replacing the CMO's first cat!'"; name = "Chemistry Cleaner"},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) "bJL" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/reception) -"bJM" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel,/area/medical/morgue) -"bJN" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) -"bJO" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/medical/morgue) "bJP" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Examination Room"; req_access_txt = "5"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/exam_room) -"bJQ" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) -"bJR" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/stool/bed,/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 25; pixel_y = 0; req_access_txt = "0"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) -"bJS" = (/obj/structure/filingcabinet/chestdrawer{desc = "A large drawer filled with autopsy reports."; name = "Autopsy Reports"},/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/morgue) "bJT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/bluegrid,/area/assembly/chargebay) -"bJU" = (/obj/machinery/optable,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/medical/morgue) -"bJV" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/obj/machinery/light/small{dir = 4},/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/plasteel,/area/medical/morgue) "bJW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 12},/turf/simulated/floor/plating,/area/maintenance/genetics) "bJX" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/bluegrid,/area/assembly/chargebay) "bJY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) @@ -4503,7 +4537,7 @@ "bKg" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_research{name = "Robotics Lab"; req_access_txt = "29"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) "bKh" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) "bKi" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) -"bKj" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/sign/poster/legit{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) +"bKj" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/sign/poster/official/random{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) "bKk" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = 6},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/clothing/head/welding{pixel_x = -3; pixel_y = 5},/obj/item/clothing/glasses/welding,/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/headset/headset_sci{pixel_x = -3},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) "bKl" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bKm" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/shuttle/escape) @@ -4574,14 +4608,10 @@ "bLz" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/reception) "bLA" = (/obj/structure/table,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/phone{pixel_x = -3; pixel_y = 3},/turf/simulated/floor/plasteel{dir = 5; icon_state = "blue"},/area/medical/reception) "bLB" = (/obj/structure/table,/obj/machinery/door/window/northright{name = "Medbay Lobby"; req_access_txt = "5"},/obj/item/device/radio/intercom/department/medbay,/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/reception) -"bLC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/medical/morgue) "bLD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/reception) "bLE" = (/turf/simulated/floor/mech_bay_recharge_floor,/area/assembly/chargebay) "bLF" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/structure/closet/secure_closet/medical_wall{name = "Pill Cabinet"; pixel_y = -32},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/item/weapon/reagent_containers/syringe/charcoal,/obj/item/weapon/reagent_containers/syringe/insulin,/obj/item/weapon/reagent_containers/glass/bottle/morphine,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine,/obj/item/weapon/reagent_containers/syringe,/obj/item/stack/medical/bruise_pack/advanced,/obj/item/stack/medical/ointment/advanced,/obj/item/weapon/reagent_containers/food/pill/patch/styptic,/obj/item/weapon/reagent_containers/food/pill/patch/styptic,/obj/item/weapon/reagent_containers/food/pill/patch/silver_sulf,/obj/item/weapon/reagent_containers/food/pill/patch/silver_sulf,/obj/item/weapon/storage/pill_bottle/painkillers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) -"bLG" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/table,/obj/item/weapon/cane,/obj/item/weapon/cane{pixel_x = -3; pixel_y = 2},/obj/item/weapon/cane{pixel_x = -6; pixel_y = 4},/obj/item/weapon/storage/box/rxglasses,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) -"bLH" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_y = -10},/obj/item/weapon/clipboard,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) "bLI" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/assembly/robotics) -"bLJ" = (/obj/structure/table,/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/storage/box/bodybags,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/morgue) "bLK" = (/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel,/area/assembly/robotics) "bLL" = (/obj/machinery/mecha_part_fabricator,/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel,/area/assembly/robotics) "bLM" = (/obj/machinery/mecha_part_fabricator,/obj/effect/decal/warning_stripes/northeast,/turf/simulated/floor/plasteel,/area/assembly/robotics) @@ -4605,7 +4635,7 @@ "bMe" = (/obj/machinery/mass_driver{id_tag = "trash"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/disposal) "bMf" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/lab) "bMg" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/item/stack/packageWrap,/obj/item/weapon/pen,/obj/item/weapon/hand_labeler,/obj/structure/table/glass,/obj/item/weapon/book/manual/sop_science,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) -"bMh" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/structure/sign/poster{pixel_x = 32},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"bMh" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/structure/sign/poster/contraband/random{pixel_x = 32},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bMi" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/hallway/secondary/entry) "bMj" = (/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/hallway/secondary/entry) "bMk" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plating,/area/maintenance/disposal) @@ -4668,17 +4698,9 @@ "bNp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHEAST)"; icon_state = "whiteblue"; dir = 6},/area/medical/reception) "bNq" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/reception) "bNr" = (/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"},/turf/simulated/wall,/area/medical/exam_room) -"bNs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) -"bNt" = (/obj/structure/table,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/computer/med_data/laptop,/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) -"bNu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/morgue) -"bNv" = (/obj/structure/morgue,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/medical/morgue) -"bNw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/morgue) -"bNx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/morgue) -"bNy" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/morgue) "bNz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/assembly/chargebay) "bNA" = (/obj/machinery/light_switch{name = "light switch "; dir = 2; pixel_x = 0; pixel_y = -22},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/morgue) "bNB" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/assembly/chargebay) -"bNC" = (/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/morgue) "bND" = (/obj/machinery/hologram/holopad,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/assembly/chargebay) "bNE" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/assembly/robotics) "bNF" = (/obj/structure/table,/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/stack/cable_coil,/obj/item/device/flash,/obj/item/device/flash,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/assembly/robotics) @@ -4751,7 +4773,7 @@ "bOU" = (/turf/simulated/wall,/area/medical/chemistry) "bOV" = (/obj/effect/decal/warning_stripes/yellow/partial,/obj/effect/decal/warning_stripes/arrow,/turf/simulated/floor/plasteel,/area/medical/reception) "bOW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/warning_stripes/yellow/partial,/obj/effect/decal/warning_stripes/arrow,/turf/simulated/floor/plasteel,/area/medical/reception) -"bOX" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/poster/legit{pixel_x = -32},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se) +"bOX" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/poster/official/random{pixel_x = -32},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se) "bOY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se) "bOZ" = (/turf/simulated/floor/plasteel,/area/medical/reception) "bPa" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Chemistry Lab"; req_access_txt = "33"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) @@ -4762,10 +4784,6 @@ "bPf" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/warning_stripes/yellow/partial{dir = 1},/obj/effect/decal/warning_stripes/arrow{dir = 1},/turf/simulated/floor/plasteel,/area/medical/reception) "bPg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/medical/morgue) "bPh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/warning_stripes/yellow/partial{dir = 1},/obj/effect/decal/warning_stripes/arrow{dir = 1},/turf/simulated/floor/plasteel,/area/medical/reception) -"bPi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/medical/morgue) -"bPj" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/medical/exam_room) -"bPk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Examination Room"; req_access_txt = "5"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/exam_room) -"bPl" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/medical{name = "Morgue"; req_access_txt = "6;5"; req_one_access_txt = "0"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/morgue) "bPm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/genetics) "bPn" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel,/area/assembly/robotics) "bPo" = (/turf/simulated/floor/plasteel,/area/assembly/robotics) @@ -4819,7 +4837,7 @@ "bQk" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/crew_quarters/heads) "bQl" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/carpet,/area/crew_quarters/heads) "bQm" = (/turf/simulated/floor/plasteel,/area/engine/gravitygenerator) -"bQn" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/sign/poster/legit{pixel_x = 32},/turf/simulated/floor/plasteel,/area/crew_quarters/heads) +"bQn" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/sign/poster/official/random{pixel_x = 32},/turf/simulated/floor/plasteel,/area/crew_quarters/heads) "bQo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/space,/area/space) "bQp" = (/obj/structure/stool/bed/chair/office/dark,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator) "bQq" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator) @@ -4848,20 +4866,13 @@ "bQN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyerStar"; name = "Medbay Entrance Starboard"; req_access_txt = "5"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/medical/medbay2) "bQO" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyerStar"; name = "Medbay Entrance Starboard"; req_access_txt = "5"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/medical/medbay2) "bQP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/wall,/area/medical/medbay2) -"bQQ" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2) -"bQR" = (/obj/structure/disposalpipe/segment,/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{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/medbay2) "bQS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/closet/walllocker/emerglocker/north,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2) "bQT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2) -"bQU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/closet/walllocker/emerglocker/north,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2) "bQV" = (/turf/simulated/wall,/area/medical/medbay2) -"bQW" = (/obj/machinery/camera{c_tag = "Medbay Fore Starboard"; network = list("SS13")},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2) "bQX" = (/turf/simulated/floor/plating,/area/maintenance/genetics) -"bQY" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2) -"bQZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2) "bRa" = (/obj/structure/extinguisher_cabinet{pixel_x = -27},/obj/machinery/light{dir = 8},/turf/simulated/floor/bluegrid,/area/assembly/chargebay) "bRb" = (/turf/simulated/floor/bluegrid,/area/assembly/chargebay) "bRc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/bluegrid,/area/assembly/chargebay) -"bRd" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/medbay2) "bRe" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/genetics) "bRf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/genetics) "bRg" = (/obj/machinery/light/small{dir = 1},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 14},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/genetics) @@ -4874,7 +4885,7 @@ "bRn" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"}) "bRo" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera{c_tag = "Research Hallway Entrance"; dir = 2; network = list("Research","SS13")},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"}) "bRp" = (/obj/machinery/door_control{id = "rdlab2"; name = "Research and Development Lab Shutters Control"; pixel_x = -24; pixel_y = -24; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) -"bRq" = (/obj/structure/table,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 0; pixel_y = 0},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 0; pixel_y = 0},/obj/item/stack/tape_roll,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) +"bRq" = (/obj/structure/table,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 0; pixel_y = 0},/obj/item/stack/tape_roll,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) "bRr" = (/obj/structure/shuttle/engine/propulsion/burst{dir = 8},/turf/space,/area/shuttle/research) "bRs" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/shuttle/research) "bRt" = (/obj/machinery/computer/shuttle/science,/turf/simulated/shuttle/floor,/area/shuttle/research) @@ -4938,10 +4949,8 @@ "bSz" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2) "bSA" = (/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/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyerStar"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = -26; range = 6},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/medbay2) "bSB" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2) -"bSC" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2) "bSD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2) "bSE" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2) -"bSF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/junction{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2) "bSG" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2) "bSH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j2s"; sortType = 23},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2) "bSI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2) @@ -5031,7 +5040,7 @@ "bUo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2) "bUp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2) "bUq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2) -"bUr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/sign/poster/legit{pixel_y = -32},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2) +"bUr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/sign/poster/official/random{pixel_y = -32},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2) "bUs" = (/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{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2) "bUt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2) "bUu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2) @@ -5048,7 +5057,7 @@ "bUF" = (/obj/machinery/computer/operating{name = "Robotics Operating Computer"},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) "bUG" = (/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/genetics) "bUH" = (/obj/structure/closet/wardrobe/robotics_black,/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) -"bUI" = (/obj/structure/table,/obj/item/weapon/storage/box/bodybags{pixel_x = -4; pixel_y = -4},/obj/structure/sign/poster/legit{pixel_x = -32},/obj/item/weapon/storage/box/masks,/obj/item/weapon/storage/box/gloves{pixel_x = 4; pixel_y = 4},/obj/item/weapon/tank/anesthetic,/obj/item/clothing/mask/breath/medical,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"},/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 4},/area/assembly/robotics) +"bUI" = (/obj/structure/table,/obj/item/weapon/storage/box/bodybags{pixel_x = -4; pixel_y = -4},/obj/structure/sign/poster/official/random{pixel_x = -32},/obj/item/weapon/storage/box/masks,/obj/item/weapon/storage/box/gloves{pixel_x = 4; pixel_y = 4},/obj/item/weapon/tank/anesthetic,/obj/item/clothing/mask/breath/medical,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"},/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 4},/area/assembly/robotics) "bUJ" = (/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) "bUK" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "bUL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) @@ -5327,7 +5336,6 @@ "bZY" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/rack,/obj/item/weapon/circuitboard/aicore{pixel_x = -2; pixel_y = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/crew_quarters/hor) "bZZ" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "caa" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research_shuttle_dock) -"cab" = (/obj/machinery/ai_status_display{pixel_y = 32},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/crew_quarters/hor) "cac" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cad" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/medical/research_shuttle_dock) "cae" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/shuttle/administration) @@ -5356,7 +5364,7 @@ "caB" = (/obj/machinery/camera{c_tag = "Central Hallway South-East"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se) "caC" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "acute1"; name = "Acute 1 Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper) "caD" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "acute1"; name = "Acute 1 Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper) -"caE" = (/obj/structure/sign/poster/legit{pixel_x = -32},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2) +"caE" = (/obj/structure/sign/poster/official/random{pixel_x = -32},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2) "caF" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2) "caG" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2) "caH" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/item/device/radio/intercom/department/medbay{pixel_y = 25},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2) @@ -5384,7 +5392,6 @@ "cbd" = (/turf/simulated/wall/r_wall,/area/toxins/server_coldroom) "cbe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/toxins/server_coldroom) "cbf" = (/turf/simulated/wall/r_wall,/area/toxins/server) -"cbg" = (/turf/simulated/floor/plasteel{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/medical/genetics) "cbh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/toxins/storage) "cbi" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "Server Room"; req_access = null; req_access_txt = "30"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server) "cbj" = (/turf/simulated/wall/r_wall,/area/toxins/storage) @@ -5701,7 +5708,6 @@ "chi" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint) "chj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "paramedic"; name = "Paramedic Garage"},/turf/simulated/floor/plasteel,/area/medical/paramedic) "chk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/medical/paramedic) -"chl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/diamond{name = "Paramedic"; req_access_txt = "66"},/turf/simulated/floor/plasteel,/area/medical/paramedic) "chm" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "acutesep"; name = "Acute Separation Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper) "chn" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "acutesep"; name = "Acute Separation Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/sleeper) "cho" = (/obj/structure/sign/greencross,/turf/simulated/wall,/area/medical/sleeper) @@ -5737,7 +5743,7 @@ "chS" = (/mob/living/simple_animal/mouse/white,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage) "chT" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage) "chU" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/camera{c_tag = "Research Toxins Storage Room"; dir = 4; network = list("Research","SS13"); pixel_y = -22},/turf/simulated/floor/plasteel,/area/toxins/storage) -"chV" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/sign/poster/legit{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) +"chV" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/sign/poster/official/random{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "chW" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "chX" = (/obj/machinery/door/firedoor,/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"}) "chY" = (/obj/machinery/atmospherics/pipe/simple/insulated{dir = 6},/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) @@ -5971,7 +5977,6 @@ "cmt" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Chief Medical Officer"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cmo) "cmu" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "cmooffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo) "cmv" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "cmooffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo) -"cmw" = (/obj/item/weapon/paper_bin,/obj/item/weapon/folder/white{pixel_y = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/reagent_containers/food/drinks/coffee,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/accessory/stethoscope,/obj/item/weapon/stamp/cmo,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/structure/table/glass,/obj/item/weapon/pen/multi,/obj/item/weapon/book/manual/sop_medical,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/cmo) "cmx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (WEST)"; icon_state = "whitebluecorner"; dir = 8},/area/medical/medbay2) "cmy" = (/obj/machinery/photocopier,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHWEST)"; icon_state = "whiteblue"; dir = 10},/area/medical/medbay2) "cmz" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "staffroom"; name = "Staff Room Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/medbreak) @@ -6040,7 +6045,6 @@ "cnK" = (/obj/machinery/light,/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plasteel{dir = 10; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/cmo) "cnL" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "cmooffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo) "cnM" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/cmo) -"cnN" = (/obj/structure/table,/obj/item/device/megaphone,/obj/item/weapon/reagent_containers/glass/bottle/morphine,/obj/item/device/radio/intercom/department/medbay{pixel_y = -28},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/cmo) "cnO" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "cmooffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo) "cnP" = (/obj/machinery/computer/crew,/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 6; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/cmo) "cnQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2) @@ -6104,7 +6108,7 @@ "coW" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/apmaint) "coX" = (/obj/structure/table/woodentable,/obj/item/ashtray/glass{pixel_x = -4; pixel_y = -4},/obj/item/weapon/lighter/zippo/blue{pixel_x = 7; pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "bcarpet05"},/area/blueshield) "coY" = (/obj/machinery/keycard_auth{pixel_x = -24; pixel_y = 0},/obj/machinery/door/window{dir = 1; name = "Desk Door"; req_access_txt = "67"},/turf/simulated/floor/wood,/area/blueshield) -"coZ" = (/obj/structure/sign/poster/legit{pixel_x = 32},/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/blueshield) +"coZ" = (/obj/structure/sign/poster/official/random{pixel_x = 32},/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/blueshield) "cpa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/wall,/area/ntrep) "cpb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/ntrep) "cpc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/carpet,/area/ntrep) @@ -6196,7 +6200,7 @@ "cqK" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/turf/simulated/floor/plasteel{icon_state = "bcarpet05"},/area/blueshield) "cqL" = (/obj/item/flag/nt,/turf/simulated/floor/wood,/area/blueshield) "cqM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/ntrep) -"cqN" = (/obj/item/flag/nt,/obj/structure/sign/poster/legit{pixel_x = -32},/turf/simulated/floor/wood,/area/ntrep) +"cqN" = (/obj/item/flag/nt,/obj/structure/sign/poster/official/random{pixel_x = -32},/turf/simulated/floor/wood,/area/ntrep) "cqO" = (/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/carpet,/area/ntrep) "cqP" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint) "cqQ" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Nanotrasen Representative"},/turf/simulated/floor/carpet,/area/ntrep) @@ -6239,7 +6243,7 @@ "crB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2) "crC" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2) "crD" = (/turf/simulated/wall,/area/medical/psych) -"crE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera{c_tag = "Medbay Psych Office Corridor West"; network = list("SS13")},/obj/structure/sign/poster/legit{pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2) +"crE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera{c_tag = "Medbay Psych Office Corridor West"; network = list("SS13")},/obj/structure/sign/poster/official/random{pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2) "crF" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/medical/psych) "crG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/disposalpipe/segment,/obj/structure/closet/walllocker/emerglocker/north,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/medbay2) "crH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Psych Office"; req_access_txt = "64"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/psych) @@ -6299,7 +6303,7 @@ "csJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/engine/controlroom) "csK" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) "csL" = (/turf/simulated/floor/plating,/area/maintenance/asmaint) -"csM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/poster/legit{pixel_x = 32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) +"csM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/poster/official/random{pixel_x = 32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) "csN" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/closet/firecloset,/obj/item/taperoll/engineering,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/engine/controlroom) "csO" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 30},/obj/structure/closet/firecloset,/obj/item/taperoll/engineering,/turf/simulated/floor/plasteel,/area/engine/controlroom) "csP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/medical/sleeper) @@ -6416,7 +6420,7 @@ "cuW" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) "cuX" = (/obj/machinery/camera{c_tag = "Research Hallway South"; dir = 1; network = list("Research","SS13"); pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "cuY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible{dir = 6; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"cuZ" = (/obj/machinery/atmospherics/pipe/manifold/visible,/obj/structure/sign/poster/legit{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) +"cuZ" = (/obj/machinery/atmospherics/pipe/manifold/visible,/obj/structure/sign/poster/official/random{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) "cva" = (/obj/machinery/atmospherics/binary/valve{dir = 4},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) "cvb" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) "cvc" = (/obj/item/device/assembly/prox_sensor{pixel_x = -5; pixel_y = -5},/obj/item/device/assembly/prox_sensor{pixel_x = -4; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = 5; pixel_y = 5},/obj/structure/table,/obj/item/device/assembly/prox_sensor,/obj/item/device/assembly/prox_sensor{pixel_x = -5; pixel_y = -5},/obj/item/device/assembly/prox_sensor,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) @@ -6497,7 +6501,7 @@ "cwz" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/apmaint) "cwA" = (/obj/structure/table,/obj/machinery/light/small{dir = 1},/obj/item/stack/sheet/metal{amount = 2},/turf/simulated/floor/plating,/area/maintenance/apmaint) "cwB" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating,/area/maintenance/apmaint) -"cwC" = (/obj/structure/sign/poster{pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/apmaint) +"cwC" = (/obj/structure/sign/poster/contraband/random{pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/apmaint) "cwD" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plating,/area/maintenance/apmaint) "cwE" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/apmaint) "cwF" = (/turf/simulated/floor/plasteel,/area/maintenance/consarea) @@ -6567,7 +6571,7 @@ "cxR" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance{name = "E.X.P.E.R.I-MENTOR Lab Maintenance"; req_access_txt = "47"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cxS" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/maintenance/asmaint2) "cxT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/wall,/area/toxins/explab) -"cxU" = (/obj/structure/sign/poster{pixel_x = 0; pixel_y = 32},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cxU" = (/obj/structure/sign/poster/contraband/random{pixel_x = 0; pixel_y = 32},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cxV" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cxW" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Xenobiology Research"; req_access_txt = "47"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) "cxX" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 4},/turf/simulated/floor/plating/airless,/area/maintenance/incinerator) @@ -6782,7 +6786,7 @@ "cBY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cBZ" = (/obj/machinery/alarm{pixel_y = 22},/obj/structure/table,/obj/item/device/radio/electropack,/obj/item/device/assembly/signaler,/obj/item/device/healthanalyzer,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) "cCa" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Xenobiology Research"; req_access_txt = "47"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) -"cCb" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/clothing/ears/earmuffs,/obj/item/device/multitool,/obj/item/clothing/ears/earmuffs,/obj/structure/sign/poster/legit{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) +"cCb" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/clothing/ears/earmuffs,/obj/item/device/multitool,/obj/item/clothing/ears/earmuffs,/obj/structure/sign/poster/official/random{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) "cCc" = (/obj/structure/reagent_dispensers/fueltank,/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) "cCd" = (/obj/structure/closet/bombcloset,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) "cCe" = (/obj/structure/closet/secure_closet/scientist,/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) @@ -6873,7 +6877,7 @@ "cDL" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "cDM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/toxins/test_area) "cDN" = (/obj/machinery/camera{c_tag = "Research Toxins Test Chamber South"; dir = 1; network = list("Toxins","Research","SS13")},/obj/machinery/light,/turf/simulated/floor/plasteel/airless,/area/toxins/test_area) -"cDO" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/structure/sign/poster{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) +"cDO" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/structure/sign/poster/contraband/random{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "cDP" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 0; icon_state = "in"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine/insulated,/area/maintenance/incinerator) "cDQ" = (/obj/structure/closet/toolcloset,/turf/simulated/floor/plating,/area/maintenance/apmaint) "cDR" = (/obj/item/weapon/table_parts,/turf/simulated/floor/plasteel,/area/maintenance/consarea) @@ -7540,7 +7544,7 @@ "cQC" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cQD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/aft) "cQE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/hallway/primary/aft) -"cQF" = (/obj/structure/table,/obj/structure/sign/poster{pixel_x = -32},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/assembly/assembly_line) +"cQF" = (/obj/structure/table,/obj/structure/sign/poster/contraband/random{pixel_x = -32},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/assembly/assembly_line) "cQG" = (/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/assembly/assembly_line) "cQH" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/assembly/assembly_line) "cQI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/aft) @@ -7851,15 +7855,13 @@ "cWB" = (/obj/structure/closet/secure_closet/engineering_welding,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "cWC" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) "cWD" = (/obj/structure/closet/secure_closet/engineering_chief{req_access_txt = "0"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) -"cWE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/folder/yellow,/obj/item/weapon/stamp/ce,/obj/item/weapon/book/manual/sop_engineering,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) "cWF" = (/obj/structure/table/reinforced,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/photocopier/faxmachine{department = "Chief Engineer's Office"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) -"cWG" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter/zippo,/obj/item/weapon/pen/multi,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) "cWH" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "cWI" = (/obj/structure/table,/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/item/weapon/storage/belt/utility,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "cWJ" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "cWK" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "cWL" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/weapon/storage/belt/utility,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) -"cWM" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/item/weapon/stock_parts/cell/high,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/sign/poster/legit{pixel_x = 32},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) +"cWM" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/item/weapon/stock_parts/cell/high,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/sign/poster/official/random{pixel_x = 32},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "cWN" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/atmos) "cWO" = (/obj/machinery/atmospherics/pipe/manifold/visible/purple{dir = 4},/turf/simulated/floor/plasteel,/area/atmos) "cWP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) @@ -7909,7 +7911,6 @@ "cXH" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/stool/bed/chair{dir = 1},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) "cXI" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump Engineering"; pixel_x = 24; shock_proof = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) "cXJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/atmos) -"cXK" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/structure/table,/obj/item/clothing/gloves/color/black,/obj/item/clothing/gloves/color/black,/obj/item/clothing/gloves/color/black,/turf/simulated/floor/plasteel,/area/atmos) "cXL" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/closet/secure_closet/engineering_electrical,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "cXM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/table,/obj/item/device/t_scanner,/obj/item/device/radio/headset/headset_eng,/obj/item/device/multitool{pixel_x = 5},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "cXN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) @@ -7975,7 +7976,6 @@ "cYV" = (/obj/machinery/atmospherics/pipe/manifold4w/visible,/turf/simulated/floor/plasteel,/area/atmos) "cYW" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold4w/visible,/turf/simulated/floor/plasteel,/area/atmos) "cYX" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall/r_wall,/area/engine/engineering) -"cYY" = (/obj/structure/table,/obj/item/clothing/head/welding{pixel_x = -5; pixel_y = 3},/obj/item/stack/sheet/glass{amount = 50},/obj/item/clothing/head/welding{pixel_x = -5; pixel_y = 3},/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 3; name = "Atmospherics Requests Console"; pixel_y = -30},/turf/simulated/floor/plasteel,/area/atmos) "cYZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/turf/simulated/wall/r_wall,/area/atmos) "cZa" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/weapon/wrench,/obj/item/device/pipe_painter,/obj/item/device/pipe_painter,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 9},/turf/simulated/floor/plasteel,/area/atmos) "cZb" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "Waste to Port"},/turf/simulated/floor/plasteel,/area/atmos) @@ -8014,7 +8014,7 @@ "cZI" = (/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 = ""},/turf/simulated/floor/plasteel,/area/engine/engineering) "cZJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel,/area/engine/engineering) "cZK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering) -"cZL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/engine/engineering) +"cZL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/sign/poster/official/random{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/engine/engineering) "cZM" = (/turf/simulated/wall,/area/engine/engineering) "cZN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/engine/engineering) "cZO" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/glass_engineering{name = "Engine Room"; req_access_txt = "10"; req_one_access_txt = null},/turf/simulated/floor/plasteel,/area/engine/engineering) @@ -8090,7 +8090,7 @@ "dbg" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "dbh" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "dbi" = (/obj/structure/closet/crate,/obj/item/clothing/under/color/lightpurple,/obj/item/stack/spacecash/c200,/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"dbj" = (/obj/structure/sign/poster{pixel_x = -32},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) +"dbj" = (/obj/structure/sign/poster/contraband/random{pixel_x = -32},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) "dbk" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "dbl" = (/obj/machinery/floodlight,/turf/simulated/floor/plating,/area/storage/secure) "dbm" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreencorner"},/area/medical/virology) @@ -8403,7 +8403,7 @@ "dhh" = (/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/space) "dhi" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk9"; icon_state = "catwalk9"},/area/space) "dhj" = (/obj/machinery/door/airlock/atmos{name = "Turbine Access"; req_access_txt = "12;24"},/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/turbine) -"dhk" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/obj/item/toy/minimeteor,/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"dhk" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/obj/item/toy/minimeteor,/obj/item/weapon/poster/random_contraband,/turf/simulated/floor/plating,/area/maintenance/asmaint) "dhl" = (/obj/machinery/the_singularitygen{anchored = 0},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/storage/secure) "dhm" = (/obj/machinery/power/port_gen/pacman,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/storage/secure) "dhn" = (/obj/structure/grille,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering) @@ -9046,21 +9046,21 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNagkagjagmaglagoagnagqagpagragrafsagsagsaftagsagvabNaabaabaabaabaabaaaaaaaaaaabaaaafOafXafXafOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiCaiDaiEaiFaiGaiHagwahZagZahZagZahZagwaiIaiJaiKaiLaiDaiMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNagMagLagNagOagPagQafvafuafUafwafUafVafYafWagPagWabNaaaaaaaabaaaaabaabaivaivaivaivaaaafOafXafXafOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahJaiDahaahaahaajdagwahaahaahaahaahaagwahaahaajeahaaiDahMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNabNabNabNabNabNahjahkabNabNabNabNabNabNabNagtagtagtagtagtagtagtaaaaguaivagSagRaivaguaaaafOafXafXagUagTagTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwajzajAajBajCajDagwajEahaahaahaajFagwajGahaajHajIajzagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNagVahDahCabNahEaigacWahGahFabNaaaaaaaaaagtahHahRagtahTahSagtaaaaivahUahVahVahWaivaaaaaaafOafXagTahXahYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwajYajYagZagZagZagwajZahaahaahaakaagwagZagZagZajYajYagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNaiaaicaibaieaidaitabNabNabNabNabNabNabNagtaifaijaiiainaikagtaaaaivaioaiqaipairaivaaaaaaaaaagTagTaisagTagTagTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahsakpakpahnaaaaaaagwakqahaahaahaakragwaaaaaaahsakpakpahnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahQahQahQahQahQahQajJaiuabNaolaolaolaolaolaolagtaiwaiyaixannaizagtaivaivaiAaiNaiBaiOaivaivaaaaabagTaiQaiPaiSaiRagTaaaanHaiTaiVaiUanHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwakAahaahaahaakragwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahQahQahQahQaiZaiXajfajaahQahEaigabNaolaolaolaolaolaolagtajgajiajhajlajkajnajmajpajoajrajqajLajKaivaaaajMagTajOajNajQajPanAanHanHajRajTajSanHanHaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwakRakPahZakRakPagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajWajUakcakbakeakdakhakgahQakiaitalcaolaolaolaolaolaolajnakjanWakkannanWaklajjajjakmajjaksakwaktaivaabaabagTakCakxakEakDanAakFakGaoJaoJakHakJakIakvakKakMakLakNaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvalvalvalwalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwalxalyahaalzalAagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajWakOakSakQakVakTalaakYaldalbaitaleaolaolaolaolaolaolagtalfalgakkalialhajnaljallalkalnalmakfakuaivanHanHanAanAanAanAaloanAalpalralqalualtalFalCalGaiYaiYaiYalHaihaihaaaaaaaaaajbajbajbajbajbajbajbalIalJaaaabpaaaaaaalvaaaaabaaaamhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwamiamjahaamkamlagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajWalKalMalLalOalNalQalPahQalRalSalcaolaolaolaolaolaolagtagtalUalTapPagtagtalValWaivalYalXalZaivaivanHambamaamdamcamfameanAamgaoJammampamnalFamqamrajVamvamsamuamtaihaaaaaaaaaajbajsajtajvajuajwajxajyaaaaaaaaaaaaaaaamWaabamUaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahsagZamYamZanaagZahnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahQahQaqqahQahQahQahQahQahQamwaigapFapFapFapFapFapFapFapFamxamzamyamzamAamCamBamEamDamGamFamIamHamJauiaoJamKamKamKamKamLakIaoJapmamMamOamNamQamPamTamSanbamXandancaneaaaaaaaaaajbajXajwajwajwajwajxajyaaaaaaaaaaaaamWalvaaaanGaaaalvamWamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahsagZagZagZahnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanfangaomanianhankanjanlajJanmapGanpanoanranqantansapFanuanwanvanzanyanCanBanEanDanIanFanJanJanJanKaoJanLanNanManPanOanQaofaofanRanTanSalFanUanVajVajVanXanZanYaoaaaaaaaaaaajbaknajwakoajwajwajxajyaaaaaaaaaaaaamWaabaabanGaabaabaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwalwalvalwalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanfangaomaocaobaoeaodaohaogaitapGaojaoiaonaokaopaooapFaoqaosaoraouaotaowaovaoxalWaozaoyaoBaoAaoDaoCaoJaoEaoGaoFaoFaoHaoLaoIaoIaoMaoPaoNalFaoQaoRaiYaiYaiYaoTaoSaihaabaaaaaaajbakyajwajwajwajwakzajyaaaaaaaaaaaaamWaaaaaaaoKaaaaaaaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaaaabaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanfaoUaomaoValEaoXaoWanlajJaigapGaoZaoYapbapaapdapcapFapeapgapfaphamyapjapiapkapSapAaplapCapBapEapDapIapHapJapJapLapKapNapMapOaoJapQaoJapRapNapTaiYapVapUapXapWaihaaaaabaabajbapYaqaapZaqcaqbajbalIaqeaaaaaaaaaamWaabappapnapqaabaabamWamWamWamWamWamWaqpamWamWamWamWamWamWamWamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapsaprapuaptapwapraprapxapraprapvaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaabapyaabalvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBakBakBakBaslakWakZaomaomaomaomakUaqsapFapGapGapGaqtaquapGapFaqvalUaqwaqwalTaqxaqxapPapSapSaqyaqzapSapSapSanAaqAaqCaqBanxanAanAaqAaqDanxaqFaqEanxanAaqGaqGaqGaqGaqHaihaihaqIaqIaqIaqIajbalsaqJaqKalsajbaabaaaaaaaaaaaaamWaaaappaqdapqaaaaaaaabaabaabaabaabaabaabaabaqLaabaabaabaaaaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqfaqhaqiaqgaqkaqlaqlaqlaqmaqjaqoaaaaaaaaaalwalwalwalvalvaabaabaaaaqnaaaaabaabalvalvalwalwalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBakXaqraqMaqNaqraqOapzaqQaqPakWaqRaqTaqSaqVaqUaqXaqWariaqYarjaqXaqXaqXaqXarkaqXaqXaqXarlarnarmarparoarrarqarsarsarsartarsaruarwarvarxaqXaryaqWaqXarzarBarAarCaqXariaqXaqXarDarEaqVaqXarFarHarGarJarIajbaabaaaaaaaaaaaaamWaaaappaqdapqaaaaaaaabaqZaraaraaraaraarbaraaraaraaraarcaabaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaardaqhareargaqlarharharharharharfaaaaaaaaaalwaaaaaaaabaaaaabaaaaaaaqnaaaaaaaabaaaaabaaaaaaalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBalDarKalDarLalDarNarMarParOarRarQarTarSasdascaseaseasfaseasgaseaseaseasiashasiasjasiasiassaskasnasmaspasoasoasoasoasqasoasoasoasrastasAasvasuasxaswaszasyasAasAasCasBasBasDasEasEasEasFasHasGasIamRamVaaaaaaaaaaaaaaaamWaabappaqdapqaaaaaaaabarUaabaaaaaaaabarUaabaabaaaaaaarUaabaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarVaqharWarYarharharharharZasaaqoaaaaaaaaaalwaabarXarXarXarXarXaaaasbaaaarXarXarXarXarXaabalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBamoasYasXasZasYasYataatbalBakWatcateatdatgatfatiathatkatjatmatlatnatjatpatoatratqatratsatuattatwatvatyatxatAatzatCatBatEatDatAatOatRatQaFLaFLaFLaFLaFLaFLaFLaxeatSatSatSatTatSatSatSarFatVatUatXatWajbaaaaaaaaaaaaaabamWaaaappaqdapqaabaabappapnapqaabaabappapnapqaabaabappapnapqaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNagVahDahCabNahEaigacWahFahFahFahFahFahFagtahHahRagtahTahSagtaaaaivahUahVahVahWaivaaaaaaafOafXagTahXahYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwajYajYagZagZagZagwajZahaahaahaakaagwagZagZagZajYajYagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNaiaaicaibaieaidaitabNahFahFahFahFahFahFagtaifaijahGainaikagtaaaaivaioaiqaipairaivaaaaaaaaaagTagTaisagTagTagTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahsakpakpahnaaaaaaagwakqahaahaahaakragwaaaaaaahsakpakpahnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahQahQahQahQahQahQaiiaigaiuahFahFahFahFahFahFagtaiwaiyaixannaizagtaivaivaiAaiNaiBaiOaivaivaaaaabagTaiQaiPaiSaiRagTaaaanHaiTaiVaiUanHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwakAahaahaahaakragwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahQahQahQahQaiZaiXajfajaahQajgaolakjahFahFahFahFahFahFalealgajiajhajlajkajnajmajpajoajrajqajLajKaivaaaajMagTajOajNajQajPanAanHanHajRajTajSanHanHaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwakRakPahZakRakPagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajWajUakcakbakeakdakhakgahQakiaitalcahFahFahFahFahFahFajnaYmanWakkannanWaklajjajjakmajjaksakwaktaivaabaabagTakCakxakEakDanAakFakGaoJaoJakHakJakIakvakKakMakLakNaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvalvalvalwalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwalxalyahaalzalAagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajWakOakSakQakVakTalaakYaldalbaitaleahFahFahFahFahFahFagtalfalgakkalialhajnaljallalkalnalmakfakuaivanHanHanAanAanAanAaloanAalpalralqalualtalFalCalGaiYaiYaiYalHaihaihaaaaaaaaaajbajbajbajbajbajbajbalIalJaaaabpaaaaaaalvaaaaabaaaamhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwamiamjahaamkamlagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajWalKalMalLalOalNalQalPahQalRalSabNahFahFahFahFahFahFagtagtalUalTapPagtagtalValWaivalYalXalZaivaivanHambamaamdamcamfameanAamgaoJammampamnalFamqamramvajVamsamuamtaihaaaaaaaaaajbajsajtajvajuajwajxajyaaaaaaaaaaaaaaaamWaabamUaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahsagZamYamZanaagZahnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahQahQaqqahQahQahQahQahQahQamwaigapFapFapFapFapFapFapFapFamxamzamyamzamAamCamBamEamDamGamFamIamHamJauiaoJamKamKamKamKamLakIaoJapmamMamOamNamQamPamTamSanbamXandancaneaaaaaaaabajbajXajwajwajwajwajxajyaaaaaaaaaaaaamWalvaaaanGaaaalvamWamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahsagZagZagZahnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanfangaomanianhankanjanlajJanmapGanpanoanranqantansapFanuanwanvanzanyanCanBanEanDanIanFanJanJanJanKaoJanLanNanManPanOanQaofaofanRanTanSalFanUanVajVajVanXanZanYaoaaaaaabaabajbaknajwakoajwajwajxajyaaaaaaaaaaaaamWaabaabanGaabaabaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwalwalvalwalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanfangaomaocaobaoeaodaohaogaitapGaojaoiaonaokaopaooapFaoqaosaoraouaotaowaovaoxalWaozaoyaoBaoAaoDaoCaoJaoEaoGaoFaoFaoHaoLaoIaoIaoMaoPaoNalFaoQaoRaiYaiYaiYaoTaoSaihaqIaqIaqIajbakyajwajwajwajwakzajyaaaaaaaaaaaaamWaaaaaaaoKaaaaaaaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaaaabaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanfaoUaomaoValEaoXaoWanlajJaigapGaoZaoYapbapaapdapcapFapeapgapfaphamyapjapiapkapSapAaplapCapBapEapDapIapHapJapJapLapKapNapMapOaoJapQaoJapRapNapTaiYapVapUapXapWaihaZJaZMaZLajbapYaqaapZaqcaqbajbalIaqeaaaaaaaaaamWaabappapnapqaabaabamWamWamWamWamWamWaqpamWamWamWamWamWamWamWamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapsaprapuaptapwapraprapxapraprapvaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaabapyaabalvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBakBakBakBaslakWakZaomaomaomaomakUaqsapFapGapGapGaqtaquapGapFaqvalUaqwaqwalTaqxaqxapPapSapSaqyaqzapSapSapSanAaqAaqCaqBanxanAanAaqAaqDanxaqFaqEanxanAaqGaqGaqGaqGaqHaihaihaqIaucaqIaqIajbalsaqJaqKalsajbaabaaaaaaaaaaaaamWaaaappaqdapqaaaaaaaabaabaabaabaabaabaabaabaqLaabaabaabaaaaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqfaqhaqiaqgaqkaqlaqlaqlaqmaqjaqoaaaaaaaaaalwalwalwalvalvaabaabaaaaqnaaaaabaabalvalvalwalwalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBakXaqraqMaqNaqraqOapzaqQaqPakWaqRaqSaqXaqVaqUaqXaqWariaqYarjaqXaqXaqXaqXarkaqXaqXaqXarlarnarmarparoarrarqarsarsarsartarsaruarwarvarxaqXaryaqWaqXarzarBarAarCaqXariaqXaqXarDarEaqVaqXarFarHarGarJarIajbaabaaaaaaaaaaaaamWaaaappaqdapqaaaaaaaabaqZaraaraaraaraarbaraaraaraaraarcaabaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaardaqhareargaqlarharharharharharfaaaaaaaaaalwaaaaaaaabaaaaabaaaaaaaqnaaaaaaaabaaaaabaaaaaaalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBalDarKalDarLalDarNarMarParOarRaqTarSarQasdascaseaseasfaseasgaseaseaseasiashasiasjasiasiassaskasnasmaspasoasoasoasoasqasoasoasoasrastasAasvasuasxaswaszasyasAasAasCasBasBasDasEasEasEasFasHasGasIamRamVaaaaaaaaaaaaaaaamWaabappaqdapqaaaaaaaabarUaabaaaaaaaabarUaabaabaaaaaaarUaabaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarVaqharWarYarharharharharZasaaqoaaaaaaaaaalwaabarXarXarXarXarXaaaasbaaaarXarXarXarXarXaabalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBamoasYasXasZasYasYataatbalBakWaryatgatgatgatfatiathatkatjatmatlatnatjatpatoatratqatratsatuattatwatvatyatxatAatzatCatBatEatDatAatOatRatQaFLaFLaFLaFLaFLaFLaFLaxeatSatSatSatTatSatSatSarFatVatUatXatWajbaaaaaaaaaaaaaabamWaaaappaqdapqaabaabappapnapqaabaabappapnapqaabaabappapnapqaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasJaprapraprapwapraprapxapraprasKaaaaaaaaaalwaaaasMasLasLasLasLasNasPasOasQasQasQasQasRaaaalwaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaakBakBakBakBakBakBakBatYauaatZakWaubaudapFaufaueawKaugauhawKawKawKawKaujaukaucatdaulatdaucaunaumawHawHawHawHauAauoawVauEauEawXauEauFauEauEaFLauGauHaFLauHauIaFLauJauLauKauNauMauPauOauQajbajbajbajbajbajbaaaaaaaaaaaaaaaamWaaaappaqdapqaaaaaaappaqdapqaaaaaaappaqdapqaaaaaaappaqdapqaabaqpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaabatFatFatFatFatFaaaatHaaaatFatFatFatFatFaabalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBauRauTauSakWauUauVapGauXauWaucauYavaauZavcavbauZavdavfaveavhavgaviaveavjaAzavlavkavmavlavoavnavzavravBavAaAFavCaCyavDaFLauIavFavEavFauIaFLavGavHayVayVavIavKavJavLaHEaaaaabaaaaaaaaaaaaaaaaaaaaaaaaamWaaaappaqdapqaaaaaaappaqdapqaaaaaaappaqdapqaaaaaaappaqdapqaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaaaaaaaaaabaaaaaaaaaautaaaaaaaaaaabaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasSasUasTasWasVaaaaaaawBawBaudaudaudaudavMavNaucavOauWaucavPavRavQavTavSavUavdavfavVavXavWavZavYavjaAzawbawaawdawcawfaweawgaCyawhavAaAFawiawnawjaFLawAawDawCawEawAaFLawFawGayVawJawIawLawGawMaHEaabaabaaaaaaaaaaaaaaaaaaaaaaaaamWaaaappaqdapqaabaabappaqdapqaabaabappaqdapqaabaabappaqdapqaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9071,12 +9071,12 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxiazeazgazhaxiaaaaxkazfazjaziaxkalwaabarXarXarXarXarXaaaatHaaaarXarXarXarXarXaabalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauvaxoawzaxmatIatMatNazVauyawBaudaudaudaznazXazWazsazrawKazYazZawWaAcaAaawWaAdaAqaxLaAraBHaAsaxLazyaAtaxpaAuaAvaxpaAwavnaxvaAyaACaAAaAEaADaAHaAGawlaAIaAKaAJawlaydavqavqaxhaxhaxhdmoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarUazUaAbaraaraaraazbaraaraaraaraazbaraaraaraaraaALaaaaaaamWaaaaAfaAfaAgaAgaAgaAgaAgaAgaAfaAfaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxiaAhazgazhaxiaaaaxkaAiaykaykaxkalwaaaasMasLasLasLasLasNasPasOasQasQasQasQasRaaaalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatIaymawzawzayhauyayoaAMauCaAmaAnaAlaAnaApaApaANaApaAoaElaAOaAPawKaxSaARawKaATaAVaAUaAWaxLaAZaAXaBbaBaawHaBiayeawHaBraBpaBsaBsaBsaBsaBsawVaBuaBtawlaBvaBRaBvawlaBwavqavqatGaupaurauqauqausaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaAYaBxaByaabaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaamWaAfaAfaBdaBcaBeaBgaBhaBfaBjaBeaAfaAfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxiaAhazgazhaxiaaaaxkaBkaykaBlaxkaabaBmatFatFatFatFatFaaaatHaaaatFatFatFatFatFaabalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatIazkazkazkatIatMaBAaBzaBBaAmaCaaAnaAnaBCaApaBDaBqaBoaElaBEaBFauZavcaBGauZaAdaxLaxLaBJaBIaBKaxLaxLazxavlaBLavmavlaBNaBMaBPaBOaBSaBQaBsaCcaCfaCeaZIaCgavqaSPavqaChavqavqavsavqavtavpavuavwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaabaabaBTaabaabaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaAfaAfaAfaAfaBUaBgaBVaBgaBVaBXaBgaBgaBgaBWaAfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxiazgazgazgaBYaaaaxkaBkaykaBlaxkalwaaaaaaaabaaaaabaaaaaaaBZaaaaaaaabaaaaabaaaaaaalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAeaAkaAkaAkaAjaaaaaaaaaaaaaBnaAnaAnaAnaCiaCkaCjaCdaCbaElavPaCmaClavTaCnaCoavdaxLaEBaCpaEBaCqaEBaxLaAzazAaCrawdaCsaCuaCtaBsaCvaCxaCwaBsaCzaCBaCAaCCaZIaZIaCgavqavqaybaycatGavqawkauqauqawmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaCLaabaabaaaaaaaabaaaaabaabaaaaaaaaaaaaaaaaaaaaaaAfaCNaCOaCPaCMaCRaCQaCSaBgaBgaCUaCVaBgaCWaAfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxiazgazgazgaBYaaaaxkaBkaykaBlaxkalwaaaaaaaabaaaaabaaaaaaaBZaaaaaaaabaaaaabaaaaaaalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAeaAkaAkaAkaAjaaaaaaaaaaaaaBnaAnaAnaAnaCiaCkaCjaCdaCbaElavPaCmaClavTaCnaCoavdaxLaEBaCpaEBaCqaEBaxLaAzazAaCrawdaCsateaCtaBsaCvaCxaCwaBsaCzaCBaCAaCCaZIaZIaCgavqavqaybaycatGavqawkauqauqawmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaCLaabaabaaaaaaaabaaaaabaabaaaaaaaaaaaaaaaaaaaaaaAfaCNaCOaCPaCMaCRaCQaCSaBgaBgaCUaCVaBgaCWaAfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxiaCTazgazgaCXaaaaxkaCYaykaykaCZalwalwalwaabaabaabaabaDbaDaaDbaabaabaabaabalwalwalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBnaDdaDcaCEaCDaCGaCFaCHaDiaElauYaCIawWaCKaCJawWaDeaDfaEBaDgaFFaDhaEBaDkaDjaxpaDlaDmaxpaDoaDnaBsaDpaDraDqaBsaDsaDNaDNaDNaDNaDPaDPaDRaDRaDRaDRatGatGatGatGaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaaaaabaaaaabaabaDSaDKaDSaabaabaaaaabaaaaaaaabaabaaaaaaaaaaaaaaaaaaaAfaDUaDTaDWaDVaDYaDXaBgaBgaBgaDZaEaaBgaEcaAfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxiaEbazgaEeaxiaaaaxkaEfaykaykaxkaabaaaaabaaaaaaaabaaaaDbaEgaEdaaaaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEiaEiaEiaEiaEiaEiaEiaAmaElaElaElaDtaElaElaElaDuaAmaAxaAxaAxaAxaAxaAxaEBaEBaDvaDgaFFaDhaDvaDvaDvaEpaEpaEpaEpaDxaDwaBsaDyaDAaDzaBsaDsaDNaELaEMaEKaDPaENaDBaEOaEQaDRaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaabaabaaaaabaabaabaabaabaaaaDSaERaDSaaaaabaaaaabaaaaaaaaaaabaabaaaaaaaaaaaaaaaaAfaETaESaCPaEUaEWaEVaEXaBgaEZaEYaFbaFaaAfaFdaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFeaFfaFcaFfaFgaaaaFiaFhaykaFkaFiaabaaaaabaaaaaaaabaDbaDbaFjaFmaDbaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEiaFlaFoaDCaDDaFvaFwaFsaDFaDEaDDaDGaFvaFvaDIaDHaFBaFAaFyaFyaFyaFyaFyaFyaFyaDJaDLaGraDMaEjaDOavqavqavqavqavqaBsaDQaEkaEhaEnaEmaBsaEoaDNaFTaFUaFPaDPaFVaEqaFWaFYaDPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaabaabaDSaDSaFZaDSaDSaabaaaaabaaaaaaaaaaaaaabaabaaaaaaaaaaaaaAfaGbaGaaCPaAfaCPaCPaGdaGcaAfaAfaAfaAfaAfaAfaabaabaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaFeaGfaFgaaaaaaaGgaFiaGeaFiaGhaabaaaaabaaaaaaaabaGjaGiaGlaGkaGjaGnaGnaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGoaGmaEraGpaEtaEsaEuaEsaEvaEsaExaEwaGraGraEzaEyaGraGraGraGraGraGraGraGraGraECaEEaEDaEGaEFaEHaAQaASaEIaASaAQaBsaEJaFnaEPaFnaFnaBsaDsaDNaFpaGNaFqaDPaFraGRaGQaEQaDPaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaabaGTaGUaGSaGWaGTaabaaaaabaaaaaaaabaaaaaaaabaabaaaaaaaGXaAfaCPaAfaCPaGYaGVaGYaMzaGYaGYaGYaHbaGXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaGnaGnaGnaGnaGnaGnaGnaGnaabaabaGjaHcaHaaGZaGjaHdaGnaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGoaHeaHgaHfaFuaFtaFxaHnaFzaHnaFCaHqaHnaHnaFEaFDaHnaHnaHnaHnaHnaHnaHnaFHaFJaFIaFKaHvaHxaEjaFMaAQaFNaASaFOaAQaBsaBsaBsaBsaBsaBsaBsaFQaDNaHCaFUaFRaDPaFSaHGaFWaHHaDPaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaabaGTaHKaHIaHJaGTaabaaaaabaaaaaaaabaaaaaaaGXaHNaGXaHNaGXaHbaGYaGYaGYaGYaGYaGYaGYaGYaGYaHOaHPaGXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaGnaGnaGnaGnaGnaGnaGnaGnaabaabaGjaHcaHaaGZaGjaHdaGnaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGoaHearTaHfaFuaFtaFxaHnaFzaHnaFCaHqaHnaHnaFEaFDaHnaHnaHnaHnaHnaHnaHnaFHaFJaFIaFKaHvaHxaEjaFMaAQaFNaASaFOaAQaBsaBsaBsaBsaBsaBsaBsaFQaDNaHCaFUaFRaDPaFSaHGaFWaHHaDPaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaabaGTaHKaHIaHJaGTaabaaaaabaaaaaaaabaaaaaaaGXaHNaGXaHNaGXaHbaGYaGYaGYaGYaGYaGYaGYaGYaGYaHOaHPaGXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaHQaHLaHQaaaaaaaaaaGnaHSaHTaHSaHRaHMaHUaGnaaaaaaaGjaHVaHXaHWaIaaHSaGnaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIbaIcaIcaIeaIeaFXaLAaIhaIhaGqaLAaGsaIlaIiaIiaIlaGtaIlaIoaIoaIoaIoaIoaIoaImaIoaIoaInaIraIpaEjaGuavqaAQaAQaAQavqavqavqaydaGvaGwavqavqaGxaDNaIwaFUaGyaDPaGzaGRaGQaEQaDPaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaHQaIzaHQaaaaabaGTaIBaIAaICaGTaIFaIFaIFaIFaIFaHNaHNaHNaGXaIDaGYaHOaHPaMzaGYaMzaMzaMzaGXaIEaGXaGXaGXaGXaGXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaIIaIGaIIaaaaaaaabaGnaIHaILaHSaHSaIJaHSaGnaIIaIIaGjaGjaIMaIKaIaaHSaGnaGnaIIaIIaIIaGnaGnaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaIbaIPaGAaGCaGBaGDaLAaGFaGEaGGaLAaGHaIlaIWaIZaGJaGIaJbaJaaJdaJcaJfaJeaJhaJgaJjaJiaJkaFFaFGaEjaGKavqavqavqavqavqavqavqavqavqavqavqavqaGLaGOaGMaHhaGPaDPaHiaHjaJyaJBaDPaabaJEaJFaJFaJFaJFaJFaJGaabaabaaaaaaaaaaaaaHNaJCaHNaaaaIFaGTaGTaJDaJHaGTaJIaGYaGYaGYaMzaJJaGYaJMaGXaGYaGYaGYaJKaMzaGYaGXaJNaJLaGXaGYaJOaGXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJPaJSaJQaaaaJRaJVaJTaabaabaIIaHSaIIaaaaaaaabaGnaJXaJYaJZaJWaJUaKaaGnaKbaHSaKdaKcaKfaKeaKeaKeaKeaKeaKeaKeaKeaKgaGnaaaaKhaaaaaaaaaaaaaaaaaaaaaaaaaIbaKkaHkaKmaKnaHlaLAaHmaKraHoaLAaGHaIlaKtaKuaKvaGIaJbaKqaKsaKsaKsaKsaKsaJgaKwaJiaFyaFFaFGaEjaFMaLPaLPaLPaLPaLPaHpaKOaKOaKOaKOaKOaKOaKOaDNaDNaHraDNaDPaDPaHsaDPaDPaDPaKOaKPaKQaKQaKQaKQaKQaKPaKOaabaaaaaaaaaaaaaHNaKJaKMaaaaIFaKRaKTaKSaKWaGYaGYaGYaMzaGYaMzaKXaGYaGYaGXaGYaKVaKUaKXaIEaGYaGXaKZaKYaGXaGYaLcaGXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9087,52 +9087,52 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPVaSdaSdaLdaMsaPZaQaaLdaMsaPZaQaaLdaGnaLkaGnaGnaGnaGnaGnaHSaGnaHSaQbaPXaHSaHSaGnaLsaGnaPYaabaPYaGnaJYaOZaGnaQeaQcaGnaNAaKaaGnaLsaMAaMAaQgaQgaQgaQgaQgaQgaQgaQgaQgaPiaPiaPjaQhaQiaQjaQkaQlaQdaKEaKDaKFaKFaKFaKFaKFaKGaKIaKHaKFaKFaKFaKKaKKaKLaLzaKNaLBaEjaHBaLPaQzaKpaLNaLPaITaOpaPAaQEaQFaOpaMVaPCaPDaPDaPEaQGaOqaPGaPIaPIaPJaKBaKCaODaKQaKQaKQaKQaKQaODaQHaPMaODaaaaaaaGXaQIaGYaGYaQBaMzaQCaHOaQLaQJaHbaGXaOFaHbaGXaQKaGYaGXaQMaGYaGXaQOaQNaQPaOGaQQaOGaQSaQRaQUaQTaQVaQYaQWaMqaMraMrafOafOaMraMraMraMraabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQXaRbaOQaRbaQZaQZaQZaRaaQZaQZaQZaRdaRcaReaReaReaReaRfaGnaHSaGnaRhaRgaRiaHSaRjaPcaLsaGnaGnaGnaGnaGnaGnaPcaGnaHSaRiaLkaHSaHSaHSaRkaRmaRlaRnaRnaRnaRnaRoaRnaRnaRpaRqaRlaRsaRraRraRraRraRraRraRraRtaRwaRwaRwaRwaRxaRwaRwaLDaRwaRwaRxaRwaRwaRwaRwaRzaLFaLKaLGaLLaLPaRDaLMaLWaLOaLXaOpaRJaRKaRLaOpaMVaRMaRNaRNaRGaMWaOqaRPaRQaRQaRIaLYaLZaOzaKQaKQaKQaKQaKQaOAaRVaRRaODaaaaaaaGXaGYaGYaGYaGYaGYaGYaQPaOGaOGaOGaOGaOGaOGaOGaKSaGYaGYaGYaGYaMnaGYaGYaMkaGYaRTaRSaRXaRWaRYaOLaOLaOLaRZaMqaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaSdaSdaSbaSfaScaSgaSiaSjaShaSkaSjaSmaSlaSjaSjaSnaGnaHSaGnaSoaHSaHSaSpaSqaGnaNIaKgaHSaHSaHSaHSaHSaHSaPcaSsaHSaGnaNxaNxaGnaSraMAaSuaSwaSvaSvaSvaSxaSvaSvaSvaSyaSuaSzaSAaSAaSAaSAaSAaSAaSAaPiaRwaSBaSCaSEaSDaMdaMcaMDaMBaMEaSJaSLaSCaSMaRwaSNaFFaSOaEjaMFaLPaSRaMGaSTaSSaMHaSUaSXaSWaSWaMIaMJaSZaSYaTaaTaaTbaTeaTcaMVaMVaTdaKBaThaTfaKQaKQaKQaKQaKQaTfaKOaKOaKOaGXaGXaGXaHbaMzaMzaIEaGXaGXaMkaMzaGXaTgaMzaGXaIEaGXaMkaQIaMzaGXaIEaGXaGYaQIaMkaGYaTiaMqaTjaQRaTlaTkaTmaQRaTnaMqaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaMsaSdaRUaSdaToaSfaSfaTpaSdaRUaSdaTqaTraTsaTtaGnaHSaPcaPcaGnaGnaGnaTuaTuaTuaIfaTuaTuaTuaTuaTuaHSaGnaGnaGnaGnaGnaGnaGnaSraKbaStaaaaabaaaaabaaaaabaaaaabaaaaSuaSzaSAaTwaTvaTyaTxaTAaSAaPiaRwaTzaTzaTCaTBaTEaTDaTFaTDaMKaTGaTIaTzaTzaRwaSNaFFaTJaEjaMFaLPaOnaKpaLNaLPaMNaMLaMUaMTaMYaMXaNaaMZaNdaNcaNdaNeaNSaNRaNUaNTaNXaNVaKOaTfaKQaKQaKQaKQaKQaTfaGXaLcaGYaTXaUaaMzaGXaMzaLcaGYaGXaLcaMkaGXaTZaGYaGXaUbaGYaMzaUdaUcaGXaUeaGYaMzaIEaIEaMkaIEaUfaMqaUgaQRaUiaUhaUiaQRaUjaMqaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaMsaSdaRUaSdaToaSfaSfaTpaSdaRUaSdaTqaTraTsaTtaGnaHSaPcaPcaGnaGnaGnaTuaTuaTuaIfaTuaTuaTuaTuaTuaHSaGnaGnaGnaGnaGnaGnaGnaSraKbaStaaaaabaaaaabaaaaabaaaaabaaaaSuaSzaSAaTwaTvaTyaTxaTAaSAaPiaRwaTzaTzaTCaTBaTEaTDaTFaTDaMKaTGaTIaTzaTzaRwatcaFFaTJaEjaMFaLPaOnaKpaLNaLPaMNaMLaMUaMTaMYaMXaNaaMZaNdaNcaNdaNeaNSaNRaNUaNTaNXaNVaKOaTfaKQaKQaKQaKQaKQaTfaGXaLcaGYaTXaUaaMzaGXaMzaLcaGYaGXaLcaMkaGXaTZaGYaGXaUbaGYaMzaUdaUcaGXaUeaGYaMzaIEaIEaMkaIEaUfaMqaUgaQRaUiaUhaUiaQRaUjaMqaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaLdaLdaSdaOQaSdaUkaUoaUmaUlaSdaOQaSdaSdaLdaUnaUpaGnaHSaHSaHSaHSaHSaHSaTuaUuaUvaUqaUxaUsaUzaUuaTuaUwaUAaUyaUyaUyaUyaUyaUyaUBaNxaStaabaUEaUEaUEaUEaUEaUEaUEaabaSuaSzaSAaUFaUCaUHaUDaUFaSAaPiaRwaUJaUJaUJaUGaULaSCaUIaSCaULaUKaUJaUJaUJaRwaSNaFFaUMaEjaMFaLPaOjaKpaLNaLPaNYaUNaUQaUQaUQaUQaUQaUQaUQaNZaUQaUSaUSaUSaUSaUSaOaaGXaKOaTfaKQaKQaKQaKQaKQaTfaGXaGXaGYaURaUaaMzaUTaGXaGYaGYaGXaGYaMkaMzaGYaGYaGXaGYaGYaMzaMkaGVaGXaGYaGYaMzaUWaGYaMkaGYaUUaUYaUYaMqaMqaMqaMqaMqaMqaMqaMraMraMraMraMraabaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdaRUaSdaSdaSdaSdaSdaSdaRUaSdaUZaLdaUVaUXaVcaVcaVcaVcaVcaVcaVaaTuaUuaVeaUqaVfaVeaVeaUuaTuaVgaVbaViaViaViaViaViaViaViaViaVjaaaaUEaVkaVdaVmaVlaVnaUEaaaaSuaSzaSAaVpaVoaVraVqaUFaSAaPiaRwaVsaVsaTCaVtaVuaTDaTFaTDaVuaVvaVwaTzaTzaRwaSNaFFaSOaEjaObaLPaOdaOcaLNaLPaOeaUNaUQaVzaVAaVCaVCaUQaVBaOfaVDaUSaVGaVFaVHaUSaOgaGXaaaaVKaVLaVLaVLaVLaVLaVMaaaaGXaGYaVNaVJaMzaMzaGXaGXaMzaMzaVOaVPaMzaGXaHPaGXaGXaMzaMzaVRaVQaGXaGXaGXaQLaUWaGYaMkaGYaUUaHOaHbaOFaYPbcDaVhbcDaYPaYPaYPaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVVaVSaVXaVSaVSaVYaVZaVSaVSaVXaWaaVWaLdaToaWbaVcaWdaWcaWfaWeaWhaWgaTuaUuaVeaUqaWjaVeaVeaUuaTuaWkaWlaWiaWnaWmaWoaWqaWraWpaWtaVjaabaUEaWuaWsaWwaWvaWxaUEaabaSuaSzaSAaWzaWAaWyaWCaWBaSAaPiaRwaSBaSCaWEaWDaULaSCaWFaSCaULaWGaSLaSCaSMaRwaSNaFFaWJaEjaMFaLPaISaOhaLNaLPaOiaWHaUQaWKaVEaVEaVEaWLaOlaOkaOmaUSaWQaWPaOxaOtaPgaHPaaaaaaaaaaaaaaaaaaaaaaaaaaaaGXaWVaWUaWXaWWaWYaGXaNhaGYaQIaMkaGYaGXaaaaGXaGYaGYaGYaGYaMkaXbaXaaWZaWZaWZaWZaXcaXeaXdaXhaXiaXfaXiaXgaVTaVTaVUaXkaXjaXlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVVaWaaVSaXmaXraXsaXtaXuaXvaXwaXxaXyaXzaXpaXnaSdaToaXqaVcaXBaXAaXFaXGaXFaXCaTuaXIaVeaXDaXHaXEaXHaXJaXLaXKaXMaXQaXQaXQaXQaXQaXQaXNaXSaVjaaaaUEaXOaWsaXPaWvaXRaUEaaaaSuaSzaSAaXTaXXaXVaXUaYaaSAaPiaRwaXWaXWaTCaXYaVuaTDaXZaTDaVuaYbaTIaTzaTzaRwaYcaIraYhaEjaMFaLPaLPaLPaLPaLPaPlaPkaPnaPmaPoaUQaUQaUQaUQaUQaUQaUSaPpaZVaPqaUSaOgaYwaHPaGXaGXaGXaGXaGXaGXaGXaGXaGXaGXaGXaGXaYnaGXaGXaGXaGXaGYaMkaWVaHNaabaHNaGYaYsaYvaYuaYyaYxaYzaYEaYEaYEaYEaYFaYGaYAaYIaYJaYKaYJaYBaYJaYJaYCaXoaYOaYPaYQaYRaYSaYSaYSaYSaYSaYSaYSaYSaYSafXajcaaaaaaaaaaaaaaaaaaaaaaYDaYUaYHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXpaYMaYLaYNaXzaYZaXsaYZaXsaYZaXsaYZaXzaYVaYTaSdaToaYWaVcaYYaYXaZfaZaaZhaZbaTuaZjaUraZcaZlaZmaZnaZdaTuaZeaZgaXQaXQaXQaXQaXQaXQaXNaZraVjaabaUEaZkaZiaZpaZoaZqaUEaabaSuaSzaSAaZsaZyaZtaZAaZuaSAaPiaRwaUJaUJaUJaZvaULaSCaUIaSCaULaZwaUJaUJaUJaRwaZxaZFaZGaEjaPtaPsaPsaPsaPsaPuaPxaPvaUQaPyaPzaUQaQmaQfaQnaUQaQoaUSaZDaZVaZEaUSaQpaZKaQqaZNaZNaZKaZXaZWaZWaZWaZWaZWaZZaZYaZWbaabacbabbaebadbagbafbaibahbajbahbalbakaGYaGXbarbambanbaubavbaobaxbaybazbapbazbaBbasbaqbatbaFbaAbawbaIbaCbaEbaDaYPbaMbaNbaObaGbaQbaRbaHbaTbaUbaVaaaaaaaaaaaaaaaaaaaaaaYDbaWbaXbaYaYHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaZaXsaXsaVXaXzaYZaXsaYZbbaaYZaXsaYZaXzaYVaYTaSdaTobaJaVcaVcbaKaUtbaLaUtaVcaTuaTuaTuaTubaSbaPbbhbbbaTubbjbbcbblaXQaXQbbmaXQbbebbdbbpaVjaaaaUEaUEbbqbbfbbqaUEaUEaaaaSuaSzaSAbbibbgbbkaZAbbnaSAaPiaRwaSBaSCbboaWDaULaSCaUIaSCaULaWGbbxaRwaRwaRwbbrbbzbbtbbsbbCbbDatGatGbbEbbFbbvbbuaUQbbwaVEaUQbbJaUQbbKaUQbbLbbybbBbbAbbHbbGbbMbbIbbObbNbbQbbPbbRbbQbbQbbSbbQbbIbbTbbIaXfbbUbbIbbVbbXbbWbbZbbYbcbbcabcdbccbcfbceaXibcmbcgbcobcpbchbcibcsbcjbaybcubckbazbcwbcxbclbczbaFbcAbcBbcCbcDbcnbcFaYPbcqbcHbcHbcIbaTbaTbaTbaTbaUbaVaaaaaaaaaaaaaaaaaaaYDbaWbcJbcKbcLbaYaYHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXpbcrbcNaYNaXzaYZaXsaYZaXsaYZaXsaYZaXzaYVaYTaSdaTobcvbctbcEbcybcSbcSaSfbcGbcMbcVbcWbcXbcPbcOaVebcQaTubdbbcRbddbdebcTbdgbdhbdibcUbdkaVjaaaaabaaabcYbcZbcYaaaaabaaaaSuaSzaSAbdcbdabdjbdfbdraSAaPiaRwbdmbdlaTCbdnbdoaTDbdpaTDbdsbdqbdzaRwbdubdtbdvbdDbdxbdwbdybdHaaaaaabbEbdIbdBbdAaUQbdCbdEaVEaVEbdNaVEaVEaVEbdOaUSbdFaUSbdQbdRaUSbdGaUSbdTbdUbdKbdJbdMbdLbdTbdPbeabebbecbebbebbebbebbdSbeebebbefbdVbdWbeibebbdXaGYbaubekbcpbelbembenbeobepbeqberbdYbazbetbeubevbewbdZbcAbcBbcCbcDbaEbedaYPbegbcHbcHbcIbaTbaTbaTbaTbaUbaVaaaaaaaaaaaaaaaaaaaYUbeAbeBbeCbeBbeDaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabehbejaVSaXmaXzaXsbeGbesaXsaXsbexbeGaXzaXpbeyaSdaTobeEbezbeMbeFbeMbeMbeMbeMbeMbeHaSfaTubePbeQbePaTuaTubeRbeIbeRaViaViaViaVibeRbeJbeUaVjbeLbeKbeKbeNbeObeNbeKbeKbeSaSubfaaSAbeTaSAbeWbeVbfeaSAbffaRwaRwaRwaRwbfgbfhbeXbeYbeXbfhbfgaRwaRwbeZbdDbdDbdDbdDbfbbfdbfnbfobfpbbEbfqbdBbfiaUQaUQaUQaUQaUQaUQaUQaUSaUSbdObfsbftbfkbfjbfmbflbfubfrbdTbfAbfvbfCbfwbfEbdTbfxbfybfHbfzbfHbfJbfKbfMbfBbfFbfDbfIbfGbfNbfLbebbfObfQbfPbfSbfRbelbfYbfZbeobfTbazbfVbfUbfXbfWbgfbczbczbazbazbcBbcCbcDbcnbggaYPbgabgibgbbgkbgcbgmbaTbaTbgdbaVaaaaaaaaaaaaaaaaYDbaWbgobeCbeCbeCbgpbaYaYHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabehaVSaVXaVSaVSaVYaVZaVSaVSaVXbejbgeaLdbghbeEaSdbgsbgsbgtbgsbgjaMsbgvbglaSfbgnbfcbgzbgzbgqbgrbgzbgubgzbgzbgzbgDbgzbgzbgwbgFbgAbgCbgBbgEbgCbgHbgCbgCbgCbgCbgIbgMbgJbgzbgzbgKbfcbgQbgxbgSbgLbgObgNbgTbgPbgPbgPbgPbgPbgPbgPbgVbgUbhabhbbhcbhdbhebgWbgYbgXbdDbdDbhfbgZbhgbgZbhgbhhbhjbhibhkbhpbhqaUSbhrbhlbhtbhmbhvbhvbhnbhxbhybhzbdTbhobhubhsbhsbhwbdTbhAbhCbhBbhEbhDbhDbhFbhHbhGbfMbhIbhJbhPbhQbhRbebbdXaTgbaubhKbhTbhTbhUbhVbhTbhLbazbhXbhNbazbhObhSbczbhWbazbhZbhYbiabcDaYPaYPaYPbibbigbihbiibigbigbigbigaYSafXajcaaaaaaaaaaaabicbikbilbeCbeCbimbinbeCbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbgyaSdaSdaSdaSdaSdaSdbgyaSdaUZaLdbidbieaSdbirbisbitbitbiuaMsbivbglbifbgGbfcbijbipbiobiqbiqbixbiwbiwbiwbizbiybiybiAbiCbiBbiqbiqbiDbiybiFbiEbiGbiGbiIbiHbiKbiJbiJbiJbiLbfcbgQbgxbgSbgSbgSbgSbiMbgSbgSbgSbgSbgSbgSbiNbiUbiVbiWbiXbiObiZbiQbiPbiRbiVbiVbiVbjdbjebjebjebiSbhqbhqbhqbiYbiTbhqaUSbjabjjbhvbhvbjkbhvbjbbjmbhybjcbdTbjobjfbjqbjhbjgbdTbjtbjibjvbjwbjxbjybebbebbjzbebbebbebbjBbjlbjBbebbdXaGYbaubjDbcpbcpbcpbjEbcpbjFbazbazbazbazbazbazbazbjnbazbcDbcDbcCbcDbjpbjIaYPbjrbjNbjLblwbgRbjubjsbjAbjRaaaaaaaaaaaaaYDbjCbjGbjCbjCbjCbjHbjCbjJbjCbjGbjCaYHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabbjQaLdaSdaOQaSdbjTbjSbjVbjUaSdaOQaSdaSdaLdbjWbeEaSdbjXbkcbitbitbiuaMsbkdbglaSfbgGbfcbgzbjZbjYbkgbkgbkabkibkbbkgbkebkgbkfbkgbkhbjPbkgbkgbkgbkgbkgbkjbkkbkgbklbkrbknbkmbgzbgzbkpbkobksbkqbkubktbkubkvbkwbkvbkvbkvbkvbkvbkvbkybkAbkzbkzbkzbkzbkBbkzbkCbkDbkzbkzbkEbkGbkFbkFbkFbkFbkFbkFbkFbkHbhqbhqaUSbkMbkNbkObkPbkPbkIbkJbjmbhybkKbdTbdTbdTbdTbdTbkLbdTbkQbkRbkWbkSbfHbkYbebbhMbkTbkUblcbkVbleblfblgbebbdXaQLbaublhblibcpbljblkbcpbllbllbaubkXblabkZaYPbldblnblmbcDbcDblpbloaYPblqaYPblrbjKbjLblxblsbltbjKblzbjRaaaaaaaaaaaabicbmXblubmYbmYblDbeCblCblDblAblvblCbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaMsaSdbgyaSdaToaSfaSfaTpaSdbgyaSdblyblEblBblFaSdblIblIbgtblIbgjaMsblJbglaSfaMsblKblKblGblMblMblMblMblMblMbkxblHblMblMblMblMblMblMblPblQblRblRblLblRblTblNblVblTblTblWblXblOblKblZblZblSblSblSbmbbmbbmbbmbbmbbmbbmbbmbbmcblUblUblYblUbmabmabmabmabmebmdbmabmcbmibmibmibmibmibmibmibmibmfbmfbmfaUSbmkbmlbmmbmmbmmbmmbmnbmobmpbmqbmrbmgbmjbmhbmtbmsbdTbdTbmubmybmzbmybmybebbmAbmvbmwbmwbmwbmwbmBbmxbebbmCbmHbaubmIbcpbljbljblkbljbcpbmDbaubmEbmGbmFaYPbcDbmJbmObmPbmPbmKbmRbmLbmTbmUbmMbmWboObmNbjMbjKbjKblzbjRbjRbjRbjRbjRbicbBTbDzbDzbDzbmQbeCblCbnbblAbeCbncbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbmSaSfbmVbndbnabnibnebnfbnibnhbngbnibnibnkbnjbnmbnlbnnbnnbnnbnobnnbnpbnuaMsbnvbnwbnqblMbnybnrbnAbnBbnCbnDbnsbnFbnGbnHbnIbnJblMbnKbnLblRbnxbntbnzblTbnEbnQbnMblTbnSbnTbnNbnSbnSbnSbnObgSbnPbmbaaaaaaaaaaaaaaaaaaaaabmcbnUbnRbnWbnVbnYbnXboaaQrbocaQsbohbmcaaaaaaaaaaaaaaaaaaaaabmibodbhqboeaUSbokbmlbmqbmqbmqbmqbmqbolbombmqbmqbmqbogbofbofboibonbojbopbooborboqbosbebboubotboBboAboAboBbowbovbebbdXaGYbauboEboFbcpbljblkbcpboGboGbaubauboybauaYPbozblnbloboJboJboCbloaYPaYPaYPboDbjKbEFboHbjMbjKbjKbmZbAMboIbrMbrMboIboKbDzbDzbGJbGJbnbbeCblCbnbblAbeCblCaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdboLboPboLboLboLboLboLboLboPboLboLboQaSfboRbgGboUaSfboSaSfboTboXboYboVboWaMsbnwbnwboZblMbpabnDbnDbnDbnDbnDbnsbpdbnDbnDbnDbpeblMbnKbpfblRbpbbphbpiblTbpjbpcbpgblTbplbpkbpmbppbpnbnTbnObgSbnPbmbaaaaaaaaaaaabmcbmcbmcbmcbprbpobptbpqbpubpsbpwaQtbpzbpxbpBbmcbmcbmcbmcaaaaaaaaaaaabmibodbhqbpAbpybpDbpCbpFbpEbpDbpGbpIbpHbpJbpMbpKbmqbpNbpLbofbpObpPbofbpRbpQbpTbpSbofbpWbpVbpUboBboAboAboBbpXbqabebbdXaTgbaubmIbcpbljbljblkbljbcpbcpbpYbqcbcpbqdaYPbpZbqbbqgboJboJbqebqgbqfaYPbqibqhbjKbjRbjRbqjbqkbjRbjRbjRbqnbjRbjRbjRbqpbjCbjCbjCbjCbqobeCblCbqoblAbeCblCbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLdaLdaSdaSdaSdaSdaSdaSdaSdaSdaSdaLdaMsbgGbqqbqrbqrbqrbqrbqrbqrbqsbqrbqrbqraMsbnwbnKbqtblMbqubnDbnDbqvbqwbqxbqybqvbnDbnDbnDbqzblMbnKbnLblRbqAbqBbqCblTbqDbqEbqFblTbqGbqHbqIbqJbqKbnTbqLbqMbnPbmbbmbbqNbmcbmcbmcbqObqQbqPbqRbqSbqSbqTbqUbqSbqVbqSbqWbqXbqYbqZbrbbrabmcbmcbmcbqNbmibmibodbhqbhqaUSbrdbrcbpMbrebmqbrfbrgbmqbrhbribpKbmqbogbofbofbrjbrlbrkbrnbrmbrpbrobofbrqbpVbrrboBboAboAbrsbrubrtbebbdXaGYbaubrvbrwbrxbljblkbrybcpbcpbrzbcpbrAbrBaYPbrCbrEbrDboJboJbrFbrDbrGaYPbrHbqhbjKbjObGIbjMbjKbjKbrIbrJboIbrLbrMboIbrKbeCbeCbeCbeCbeCbeCbeCbeCbeCbeCblCbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrNbrObrObrQbrObrObrObrRbrObrObrPaabaSdaUkaSgbrSbqrbrUbrVbrWbrXbrYbrTbsabrZbqrbscbsdbsbbseblMbsfbnDbnDbqvbqxbsgbshbqvbnDbnDbsjbskblMbnKbnLblRblRbslblRblTbsibsnbsoblTbsmbqJbsqbqJbsrbnTbnObssbnPbgPbgPbspbsubstbmcbsvbptbswbqSbqSbsybsxbsAbszbsAaQubsDbsCbsFbsEbsHbsGbmcbsIbsubsJbsLbsKbodbhqbhqbsNbmqbsObmqbmqbmqbsPbsQbmqbrhbsMbpKbmqbpNbofbofbsRbsTbsSbsVbsUbsWbrobsXbebbqabrrboBboAboAboBbrubsYbebbsZbtebaubtfbaubaubtablkbthbtibcpbtjbtbbtlbtcbmUbtdbtgbtpbtqbtqbtkbtsbtmbmUbtobtnbtrbtwbjKbjMdsfbjKbtxbjRbjRbjRbjRbqnbicbttbeCblCblDblAbeCblCblDblAbeCbtubicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaZaXsaXsaVXaXzaYZaXsaYZbbaaYZaXsaYZaXzaYVaYTaSdaTobaJaVcaVcbaKaUtbaLaUtaVcaTuaTuaTuaTubaSbaPbbhbbbaTubbjbbcbblaXQaXQbbmaXQbbebbdbbpaVjaaaaUEaUEbbqbbfbbqaUEaUEaaaaSuaSzaSAbbibbgbbkaZAbbnaSAaPiaRwaSBaSCbboaWDaULaSCaUIaSCaULaWGbbxaRwaRwaRwbbrbbzbbtbbsbbCbbDatGatGbbEbbFbbvbbuaUQbbwaVEaUQbbJaUQbbKaUQbbLaQrbbBbbAbbHbbGbbUbbIaQtbbNbbQbbPbbRbbQbbQbbSbbQbbIbbTbbIaXfbbUbbIbbVbbXbbWbbZbbYbcbbcabcdbccbcfbceaXibcmbcgbcobcpbchbcibcsbcjbaybcubckbazbcwbcxbclbczbaFbcAbcBbcCbcDbcnbcFaYPbcqbcHbcHbcIbaTbaTbaTbaTbaUbaVaaaaaaaaaaaaaaaaaaaYDbaWbcJbcKbcLbaYaYHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXpbcrbcNaYNaXzaYZaXsaYZaXsaYZaXsaYZaXzaYVaYTaSdaTobcvbctbcEbcybcSbcSaSfbcGbcMbcVbcWbcXbcPbcOaVebcQaTubdbbcRbddbdebcTbdgbdhbdibcUbdkaVjaaaaabaaabcYbcZbcYaaaaabaaaaSuaSzaSAbdcbdabdjbdfbdraSAaPiaRwbdmbdlaTCbdnbdoaTDbdpaTDbdsbdqbdzaRwbdubdtbdvbdDbdxbdwbdybdHaaaaaabbEbdIbdBbdAaUQbdCbdEaVEaVEbdNaVEaVEaVEbdOaUSbdFaUSbdQaUSaUSaQuaUSbdTbdUbdKbdJbdMbdLbdTbdPbeabebbecbebbebbebbebbdSbeebebbefbdVbdWbeibebbdXaGYbaubekbcpbelbembenbeobepbeqberbdYbazbetbeubevbewbdZbcAbcBbcCbcDbaEbedaYPbegbcHbcHbcIbaTbaTbaTbaTbaUbaVaaaaaaaaaaaaaaaaaaaYUbeAbeBbeCbeBbeDaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabehbejaVSaXmaXzaXsbeGbesaXsaXsbexbeGaXzaXpbeyaSdaTobeEbezbeMbeFbeMbeMbeMbeMbeMbeHaSfaTubePbeQbePaTuaTubeRbeIbeRaViaViaViaVibeRbeJbeUaVjbeLbeKbeKbeNbeObeNbeKbeKbeSaSubfaaSAbeTaSAbeWbeVbfeaSAbffaRwaRwaRwaRwbfgbfhbeXbeYbeXbfhbfgaRwaRwbeZbdDbdDbdDbdDbfbbfdbfnbfobfpbbEbfqbdBbfiaUQaUQaUQaUQaUQaUQaUQaUSaUSbdObfsbftbfkbfjaQvbflaSQbfrbdTbfAbfvbfCbfwbfEbdTbfxbfybfHbfzbfHbfJbfKbfMbfBbfFbfDbfIbfGbfNbfLbebbfObfQbfPbfSbfRbelbfYbfZbeobfTbazbfVbfUbfXbfWbgfbczbczbazbazbcBbcCbcDbcnbggaYPbgabgibgbbgkbgcbgmbaTbaTbgdbaVaaaaaaaaaaaaaaaaYDbaWbgobeCbeCbeCbgpbaYaYHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabehaVSaVXaVSaVSaVYaVZaVSaVSaVXbejbgeaLdbghbeEaSdbgsbgsbgtbgsbgjaMsbgvbglaSfbgnbfcbgzbgzbgqbgrbgzbgubgzbgzbgzbgDbgzbgzbgwbgFbgAbgCbgBbgEbgCbgHbgCbgCbgCbgCbgIbgMbgJbgzbgzbgKbfcbgQbgxbgSbgLbgObgNbgTbgPbgPbgPbgPbgPbgPbgPbgVbgUbhabhbbhcbhdbhebgWbgYbgXbdDbdDbhfbgZbhgbgZbhgbhhbhjbhibhkbhpbhqaUSbhrbhlbhtbhmbhvbhvaWMbhxaWNbhzbdTbhobhubhsbhsbhwbdTbhAbhCbhBbhEbhDbhDbhFbhHbhGbfMbhIbhJbhPbhQbhRbebbdXaTgbaubhKbhTbhTbhUbhVbhTbhLbazbhXbhNbazbhObhSbczbhWbazbhZbhYbiabcDaYPaYPaYPbibbigbihbiibigbigbigbigaYSafXajcaaaaaaaaaaaabicbikbilbeCbeCbimbinbeCbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbgyaSdaSdaSdaSdaSdaSdbgyaSdaUZaLdbidbieaSdbirbisbitbitbiuaMsbivbglbifbgGbfcbijbipbiobiqbiqbixbiwbiwbiwbizbiybiybiAbiCbiBbiqbiqbiDbiybiFbiEbiGbiGbiIbiHbiKbiJbiJbiJbiLbfcbgQbgxbgSbgSbgSbgSbiMbgSbgSbgSbgSbgSbgSbiNbiUbiVbiWbiXbiObiZbiQbiPbiRbiVbiVbiVbjdbjebjebjebiSbhqbhqbhqbiYbiTbhqaUSbjabjjbhvbhvbjkbhvaWTbjmaWNbjcbdTbjobjfbjqbjhbjgbdTbjtbjibjvbjwbjxbjybebbebbjzbebbebbebbjBbjlbjBbebbdXaGYbaubjDbcpbcpbcpbjEbcpbjFbazbazbazbazbazbazbazbjnbazbcDbcDbcCbcDbjpbjIaYPbjrbjNbjLblwbgRbjubjsbjAbjRaaaaaaaaaaaaaYDbjCbjGbjCbjCbjCbjHbjCbjJbjCbjGbjCaYHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabbjQaLdaSdaOQaSdbjTbjSbjVbjUaSdaOQaSdaSdaLdbjWbeEaSdbjXbkcbitbitbiuaMsbkdbglaSfbgGbfcbgzbjZbjYbkgbkgbkabkibkbbkgbkebkgbkfbkgbkhbjPbkgbkgbkgbkgbkgbkjbkkbkgbklbkrbknbkmbgzbgzbkpbkobksbkqbkubktbkubkvbkwbkvbkvbkvbkvbkvbkvbkybkAbkzbkzbkzbkzbkBbkzbkCbkDbkzbkzbkEbkGbkFbkFbkFbkFbkFbkFbkFbkHbhqbhqaUSbkMbkNbkObkPbkPbkIaYdbjmaWNbkKbdTbdTbdTbdTbdTbkLbdTbkQbkRbkWbkSbfHbkYbebbhMbkTbkUblcbkVbleblfblgbebbdXaQLbaublhblibcpbljblkbcpbllbllbaubkXblabkZaYPbldblnblmbcDbcDblpbloaYPblqaYPblrbjKbjLblxblsbltbjKblzbjRaaaaaaaaaaaabicbmXblubmYbmYblDbeCblCblDblAblvblCbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaMsaSdbgyaSdaToaSfaSfaTpaSdbgyaSdblyblEblBblFaSdblIblIbgtblIbgjaMsblJbglaSfaMsblKblKblGblMblMblMblMblMblMbkxblHblMblMblMblMblMblMblPblQblRblRblLblRblTblNblVblTblTblWblXblOblKblZblZblSblSblSbmbbmbbmbbmbbmbbmbbmbbmbbmcblUblUblYblUbmabmabmabmabmebmdbmabmcbmibmibmibmibmibmibmibmibmfbmfbmfaUSbmkbmlbmmbmmbmmbmmbmnbmoaYebmqbmrbmgbmjbmhbmtbmsbdTbdTbmubmybmzbmybmybebbmAbmvbmwbmwbmwbmwbmBbmxbebbmCbmHbaubmIbcpbljbljblkbljbcpbmDbaubmEbmGbmFaYPbcDbmJbmObmPbmPbmKbmRbmLbmTbmUbmMbmWboObmNbjMbjKbjKblzbjRbjRbjRbjRbjRbicbBTbDzbDzbDzbmQbeCblCbnbblAbeCbncbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbmSaSfbmVbndbnabnibnebnfbnibnhbngbnibnibnkbnjbnmbnlbnnbnnbnnbnobnnbnpbnuaMsbnvbnwbnqblMbnybnrbnAbnBbnCbnDbnsbnFbnGbnHbnIbnJblMbnKbnLblRbnxbntbnzblTbnEbnQbnMblTbnSbnTbnNbnSbnSbnSbnObgSbnPbmbaaaaaaaaaaaaaaaaaaaaabmcbnUbnRbnWbnVbnYbnXboaaYfbocaQsbohbmcaaaaaaaaaaaaaaaaaaaaabmibodbhqboeaUSbokbmlbmqbmqbmqbmqbmqbolbombmqbmqbmqbogbofbofboibonbojbopbooborboqbosbebboubotboBboAboAboBbowbovbebbdXaGYbauboEboFbcpbljblkbcpboGboGbaubauboybauaYPbozblnbloboJboJboCbloaYPaYPaYPboDbjKbEFboHbjMbjKbjKbmZbAMboIbrMbrMboIboKbDzbDzbGJbGJbnbbeCblCbnbblAbeCblCaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdboLboPboLboLboLboLboLboLboPboLboLboQaSfboRbgGboUaSfboSaSfboTboXboYboVboWaMsbnwbnwboZblMbpabnDbnDbnDbnDbnDbnsbpdbnDbnDbnDbpeblMbnKbpfblRbpbbphbpiblTbpjbpcbpgblTbplbpkbpmbppbpnbnTbnObgSbnPbmbaaaaaaaaaaaabmcbmcbmcbmcbprbpobptbpqbpubpsbpwaYgbpzbpxbpBbmcbmcbmcbmcaaaaaaaaaaaabmibodbhqbpAbpybpDbpCbpFbpEbpDbpGbpIbpHbpJbpMbpKbmqbpNbpLbofbpObpPbofbpRbpQbpTbpSbofbpWbpVbpUboBboAboAboBbpXbqabebbdXaTgbaubmIbcpbljbljblkbljbcpbcpbpYbqcbcpbqdaYPbpZbqbbqgboJboJbqebqgbqfaYPbqibqhbjKbjRbjRbqjbqkbjRbjRbjRbqnbjRbjRbjRbqpbjCbjCbjCbjCbqobeCblCbqoblAbeCblCbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLdaLdaSdaSdaSdaSdaSdaSdaSdaSdaSdaLdaMsbgGbqqbqrbqrbqrbqrbqrbqrbqsbqrbqrbqraMsbnwbnKbqtblMbqubnDbnDbqvbqwbqxbqybqvbnDbnDbnDbqzblMbnKbnLblRbqAbqBbqCblTbqDbqEbqFblTbqGbqHbqIbqJbqKbnTbqLbqMbnPbmbbmbbqNbmcbmcbmcbqObqQbqPbqRbqSbqSbqTbqUbqSbqVaYibqWbqXbqYbqZbrbbrabmcbmcbmcbqNbmibmibodbhqbhqaUSbrdbrcbpMbrebmqbrfbrgbmqbrhbribpKbmqbogbofbofbrjbrlbrkbrnbrmbrpbrobofbrqbpVbrrboBboAboAbrsbrubrtbebbdXaGYbaubrvbrwbrxbljblkbrybcpbcpbrzbcpbrAbrBaYPbrCbrEbrDboJboJbrFbrDbrGaYPbrHbqhbjKbjObGIbjMbjKbjKbrIbrJboIbrLbrMboIbrKbeCbeCbeCbeCbeCbeCbeCbeCbeCbeCblCbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrNbrObrObrQbrObrObrObrRbrObrObrPaabaSdaUkaSgbrSbqrbrUbrVbrWbrXbrYbrTbsabrZbqrbscbsdbsbbseblMbsfbnDbnDbqvbqxbsgbshbqvbnDbnDbsjbskblMbnKbnLblRblRbslblRblTbsibsnbsoblTbsmbqJbsqbqJbsrbnTbnObssbnPbgPbgPbspbsubstbmcbsvbptbswbqSbqSbsybsxbsAbszbsAaYjbsDbsCbsFbsEbsHbsGbmcbsIbsubsJbsLbsKbodbhqbhqbsNbmqbsObmqbmqbmqbsPbsQbmqbrhbsMbpKbmqbpNbofbofbsRbsTbsSbsVbsUbsWbrobsXbebbqabrrboBboAboAboBbrubsYbebbsZbtebaubtfbaubaubtablkbthbtibcpbtjbtbbtlbtcbmUbtdbtgbtpbtqbtqbtkbtsbtmbmUbtobtnbtrbtwbjKbjMdsfbjKbtxbjRbjRbjRbjRbqnbicbttbeCblCblDblAbeCblCblDblAbeCbtubicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrNbtvbtybtCbtDbtDbtzbtDbtDbtDbtzbrQaSdaSdaSdaToboRbqrbrUbtFbtGbrUbtBbtAbtHbtEbqrbtLbtMbtIblQblMbtObtPbtKbtJbtQbtNbtSbtRbtRbtRbtUbtTblMbnKbsdbtYbtZbtVbubblTblTblTblTblTbucbudbtWbufbugbnTbnObssbgSbgSbgSbtXbuebuabuibuhbujbqSbunbukbumbulbupbuoburbuqbutbusbuubuhbuwbuvbuybuxbuAbuzbuEbuEbuBbhqbuCaUSbmqbuDbuIbpKbmqbuFbuGbmqbuHbuMbpKbmqbogbofbofbofboibofbuJbofbsWbrobuKbebbuPbrrboBboAboAboBbrubuLbebbuNbuQbuObuSbuRbuUbuTbuWbuVbuVbuVbuVbuVbuVbuXbuZbuYboJboJboJboJboJboJbvdbvabvcbvbbjKbjKbjKbvebltbjKbvgbqnbwDbvhcUBbjRblDblAbeCblCbnbblAbeCblCbnbblAbeCblCblDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvibvjbvjbvjbvjbvjbvjbvjbvjbvjbvjbvfbvlaOQbvlaSfboRbqrbvmbrUbvnbvnbvnbvkbrUbvobqrbvqbvrbtIbvsbvsbvsbvsbvpbvsbvtbnDbvvbvubvwbvwbvybvxblMbvzbvBbvAbvDbvCbvFbvGbvHbvIbvHbvJbvJbvJbvJbvJbvKbvEbnObvLbvNbvMbvPbvObvRbvQbvTbvSbuobvUbvVbvXbvXbvXbvXbvWbvXbvZbwabwbbvYbvUbwdbwcbmcbwebwgbwfbwibwhbwjbhqbhqbsNbmqbwkbmqbmqbmqaZVbmqbmqbwmbwmbmqbmqbwlbofbofbwnbwobofbofbofbwqbwpbwrbebbqabrrboBboBboBboBbrubwsbebbwtbwvbwvbwwbwvbwubljbljbljbljbwybljbljbljbwzbvaboJboJboJboJboJboJboJbvdbvabvcbvbbjKboMboMboNboMbjKbwxbjRbwBbwAbwCbjRbnbblAbeCblCbnbblAbeCblCbnbblAbeCblCbnbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwFbwEbwGbwHbwIbwIbwJbwIbwIbwIbwJbrQaSdaSdaSdbwKblFbwLbrUbwMbvnbvnbvnbvkbwMbrUbqrbwNbwObtIbvsbwPbwQbwRbwSbvsbwUbwTbwVblMbwWbwXbwZbwYblMbnKbxabxbbxbbxcbxbbxbbxbbxbbxebxdbxdbxdbxfbxdbxgbxhbxibxjbxkbxlbxlbxlbxlbxlbxmbxmbxnbxmbvXbvXbxobxpbxqbxrbxtbxsbxobxubvXbxvbxwbxvbxvbxvbxvbxvbxvbxvbwjbhqbhqaUSbxxbmqbxybxzbmqbxAbmqbxBbxDbxCbmqbxEbdTbxFbxGbdTbdTbxHbxJbxIbxJbdTbdTbebblbbxLbxMbxMbxMbxMbxLbxNbebbxObwvbwvbwwbxPbaubxQbxRbxSbxTbxUbxVbxWbxXbxYaYPbxZbcDbyaboJboJbyabcDbybaYPbycbvbbjKbqlbqlbqmbqlbjKbvgbqnbwDbvhcUBbjRbqoblAbeCblCbqoblAbeCblCbqoblAbeCblCbqoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwFbrObrObrQbrObrObrObrRbrObrObydaabaSdbyebndbyfbqrbtFbtFbtFbrUbyhbygbyjbyibqrbykbylbtIbvsbymbvsbynbyobvsbyqbypbyrblMbwWbwXbwZbskblMbnKbxabxbbytbysbyubyvbywbxbbyybyxbyAbyzbyBbyBbyBbyCbyEbyDbyFbxlbyGbyHbyIbyJbyLbyKbyMbyNbvXbyObxqbxqbyPbyQbyPbxqbxqbyRbvXbySbyUbyTbyWbyVbyYbyXbyZbxvbzabzbbzbbzcaUSaUSaUSaUSbzdbsNbzdbzeaUSbdRaUSaUSbdTbdTbdTbdTbzgbzfbzfbzfbzfbzhbzibebbjBbzjbjBbzkbzkbjBbzjbjBbebbxObwvbwvbzlbxPbaubaubaubaubaubtfbaubaubaubauaYPaYOaYQaYQaYQaYQaYQaYQaYPaYPbznbzmbzobxKbjKbjMbjKbjKbzpbjRbjRbjRbjRbqnbicbzqbeCbeCbeCbeCbeCbeCbeCbeCbeCbeCbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwFbrObrObrQbrObrObrObrRbrObrObydaabaSdbyebndbyfbqrbtFbtFbtFbrUbyhbygbyjbyibqrbykbylbtIbvsbymbvsbynbyobvsbyqbypbyrblMbwWbwXbwZbskblMbnKbxabxbbytbysbyubyvbywbxbbyybyxbyAbyzbyBbyBbyBbyCbyEbyDbyFbxlbyGbyHbyIbyJbyLbyKbyMbyNbvXbyObxqbxqbyPbyQbyPbxqbxqbyRbvXbySbyUbyTbyWbyVbyYbyXaZObxvbzabzbbzbbzcaUSaUSaUSaUSbzdbsNbzdbzeaUSbdRaUSaUSbdTbdTbdTbdTbzgbzfbzfbzfbzfbzhbzibebbjBbzjbjBbzkbzkbjBbzjbjBbebbxObwvbwvbzlbxPbaubaubaubaubaubtfbaubaubaubauaYPaYOaYQaYQaYQaYQaYQaYQaYPaYPbznbzmbzobxKbjKbjMbjKbjKbzpbjRbjRbjRbjRbqnbicbzqbeCbeCbeCbeCbeCbeCbeCbeCbeCbeCbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjQaLdaSdaSdaSdaMsaMsaMsaMsaMsaMsbzrbzsbqrbqrbqrbqrbqrbqrbztbqrbqrbqrbnKbnKbzwbvsbzubzvbynbzxbvsbzzbzybzAblMbwWbwXbwZbnDblMbnKbxabxbbzDbzBbzCbyvbzCbxbbyybzGbzEbzFbzIbzHbzKbzJbzMbzLbyFbzRbzNbzObzPbzQbzQbzPbzUbzSbvXbzTbxqbxqbyPbzWbyPbxqbxqbzVbwbbzXbAbbzYbzZbAabAdbzYbAcbxvbAlbAebAfbAgbAhbAibAjbAkbAkbAkbAkbAkbAkbAmbAobAnbAkbAkbAqbAkbAkbAkbAkbAkbAkbAkbAkbApbAsbArbArbArbArbArbArbAtbAibAubAvbAvbAxbAwbAybAwbAzbAwbABbAAbACbAwbAFbADbAEbAHbAGbAGbAGbAGbAGbAGbAGbAIbALbAJbAJbAKbAJbBObjKbjKbrIbAMboIbANbrMboIbAObeCbeCbeCbeCbAPbeCbAPbeCbeCbeCbeCaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAQbARbARbARbARbASbASbARbARbATaaaaabaSdaUkaSgbAVbAUbAXbAWbAWbAWbAWbAYbAZbBablQbnwbBcbBbbvsbvsbvsbBdbyobvsblMblMblMblMbwWbBebBgbBfblMbBhbBibxbbBjbBkbyvbzCbBlbxbbyybBmbzEbzFbBnbBobBpbzJbBqbzLbyFbzRbBrbBsbBtbBubBvbBwbzUbBxbvXbBybyPbxqbBAbBzbBAbxqbyPbBBbxubBCbzYbzYbzZbBDbAdbzYbBEbxvbBFbAfbAfbAgbAhbAibAkbAkbAkbAkbAkbAkbAkbBGbAkbAkbAkbAkbAkbAkbBHbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBJbBKbBLbAGbAGbBMbwvbwvbwvbwvbwvbwwbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbBNbwvbDobBPbjKbjKbBQbjKbjKbjKbjKbBUbjRbqnbjRbjRbjRbqpbjCbBWbBVbjCbBXaYUbBXaYUbBYbBRbBSbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabCabCdbCcbBZbCebCbbCbbClbCibARbATaSdaSdaSdaTobCnbCfbCgbCfbCfbCfbCfbChbCtbCjblQblQbCkbCwbvsbwPbCmbCxbzxbvsbCobCpbCoblMblMblMblMbCqblMbCrbCsbxbbCybCubzCbCvbCzbxbbyybzJbCBbzFbBnbBnbCEbzJbCFbzLbyFbzRbCAbBsbBtbCGbCCbBwbzUbCDbvXbCHbCIbxqbCKbCJbCLbxqbCRbCNbCSbCMbCTbCObCPbCQbCUbzYbCVbxvbCYbCXbAfbAgbAhbAibAkbCZbAkbAkbAkbAkbCWbDbbDbbDbbDbbDcbAkbAkbAkbAkbDdbAkbCZbDabAkbDebDgbDfbAkbDhbDibDibDlbDjbDnbDmbwvbwvbwvbwvbwvbwvbwvbDkbDpbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbDrbDqbDqbDsbDubDtbDxbDvbDvbDybDAbEHbmZbAMboIbrMbrMboIbDBdsldsldsldsnbicaaabicbDDbDwbDwbDFbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabCabCdbDGbCbbCbbCbbCbbCbbCbbCbbDHbDCaOQbDCaSfbDIbCfbDEbDJbDLbDKbDMbChbDObDNbDQbDQbDWbDVbvsbvsbvsbynbDYbymblQblQblQblQbDPbnKbnKbCsbnKbCrbCsbxbbDZbDRbDSbDTbyvbxbbDUbzJbEbbzFbBnbBnbEfbDXbEjbzLbElbxlbEabEmbzPbzPbzPbzPbzUbEcbvXbEdbEebvXbvXbvXbvXbvXbvXbvXbxubxvbErbEgbEhbEibEsbEkbEvbxvbEwbEnbEnbEobEobEobEobEobEobEobEpbEpbEqbEybEzbEzbEybEqbEpbEpbEtbEtbEtbEtbEtbEtbEubEubEBbEubEubEubEubEubEubECbExbEEbwvbwvbEIbEIbEAbEAbEAbEAbEAbEJbDqbDqbDrbDqbwvbDqbDqbDqbDqbEMbEDbEDbEDbEDbENbEFbEFbEGbEGbEGbEGbEGbEGbEGbjRbjRbjRbjRaYUdsqdsldslbEObicaaabicbEPbDwbDwbEQbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabCabCdbEKbELbELbCbbELbELbELbARbERaSdaSdaSdaTobEVbCfbEYbEXbEXbEXbFcbChbnKbFfbESbETbEUbFgbvsbwPbEWbynbFhbymbFibEZbFabFbbFlbFdbFdbFebFdbFnbFobxbbFqbFpbFjbFkbFrbFmbFsbyBbFubFtbBnboxbFybFxbEjbzLbFzbxlbFAbFvbFwbFFbFIbFGbFMbxmbxmbFBbFCbFDbFEbFNbFEbFPbFCaaabFHbxvbFRbFJbFKbFLbEsbzYbFSbxvbFUbFObFWbEobFQbFXbFYbFTbFZbFVbGcbGbbGebGdbGabGabGdbGfbGhbGgbEtbGibGkbGjbGlbEtbGnbGmbGpbGobGtbGsbGsbGvbEubGxbGqbGrbGybGrbGzbGzbEAbGubGAbGwbEAbGBbGEbGBbEAbGFbDqbEMbEDbGKbGLbGKbEDbGCbGDbEDbGNbGMbGGbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabicdsudswdsvdsvbicaaabicbGObDwbGObDwbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGPbARbARbARbARbARbARbARbARbERaaaaaaaSdbGRbndbHabCfbHdbCfbHebEXbHfbGQbChbHgbGSbGTbGUbFgbvsbvsbvsbvsbvsbvsbGVbGWbGXbGYbGZbxbbxbbxbbxbbxbbxbbxbbHhbxbbxbbxbbHbbxbbHcbHibHjbBnbBnbBnbHnbDXbHobzLbHpbxlbHqbFvbxlbxlbxlbxmbHrbxmbHkbHlbHmbHubHBbHzbHDbHCbHsbHtbHFbxvbHvbzYbHwbHxbEsbHybzYbxvbHHbHAbHIbEobHLbHJbHEbHMbHGbHNbHObGabGabGabGabGabGabGabGabHPbHKbHRbHVbHTbHWbEtbHYbHQbHZbHSbIbbHUbHQbIbbEubIebGqbIfbHXbIgbIhbIhbIabIjbIcbIdbImbIlbIqbInbEAbIibIrbIkbEDbItbIwbIvbIobIpbIybEDbIzbGGbIsbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIAbjJbIubIubIubICaaabIEbIxbIxbIxbjJbIFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjQaLdaSdaSdaSdaSdaSdaSdaSdaSdaSdaToaSfbIGbCfbIHbIBbIIbIDbIDbIJbILbIKbIMbIMbIObINbDQbDQbDQbDQbDQbDQbIQbIPbIPbIRbITbxbbIVbIUbIYbIXbISbIZbJfbJbbxbbIWbJibyBbyCbDXbHjbBnbBnbJjbzJbzJbJmbJabJobJcbJdbJebJpbJgbJhbJsbJtbJkbJlbJubHsbJnbJvbJnbJvbJwbHsbHtbJqbJrbJybJxbJDbJzbJGbJEbJHbJrbJIbFObFObEobJAbJBbJCbJJbJKbEobHObGabGabGabGabGabGabGabJFbJLbJPbJNbJQbHRbJRbEtbJSbJMbJUbHSbIbbHUbJObJVbEubJWbJZbJXbJTbJTbKcbKabKgbKebJYbJYbJYbKhbJYbKkbKbbKnbKdbKobKfbKqbKrbKibKibKibKjbEDbKubGGbKlbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIAbKmbKmbKmbIFaaabIAbKmbKmbKmbIFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbKybKxbKpaQZaQZaQZbndaSfaSfbCfbKCbCfbKDbKsbKtbKEbCfblQbKvbKvbKwbKFbKwbKwbKwbKFbKwblQblQbxbbxbbxbbKGbxbbKzbKzbKzbKzbKzbKzbJfbKAbKBbKHbzFbKIbKKbKJbKMbKLbKObKNbKQbKPbKSbKRbKVbKUbKXbKXbLabKZbKTbLbbLfbKWbLgbKYbFCbLhbHDbLibHBbLkbFCaaabLcbLdbLebLnbLdbLdbLdbLdbLpbxvbLqbFObLrbLjbLsbLlbLmbLtbLobEobLvbLubLxbLwbLzbLybLBbLAbGabLDbEtbLFbJQbLGbLHbEtbLJbLCbHZbHSbIbbHUbHQbIbbEubIebGqbLNbLEbLPbLSbLQbLIbLTbLKbLLbLMbLUbLObLVbEAbLXbLRbLYbEDbLZbMfbMabIpbLWbMgbEDbKubGGbMhbGHaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbMjbMibKpaSeaSebMbbMcaSebMdbCfbMebIBbMlbMkbMnbMmbCfaaaaabaabbMpbMobMobMobMobMobMraaaaaabKBbMtbMsbMubMqbKzbKzbKzbKzbKzbKzbMwbMvbMzbMybMDbMBbMxbDXbzJbzJbMFbMAbzJbzJbMJbMCbMLbMEbMMbMGbMGbMHbMGbMIbMNbMGbMKbKYbFCbMObFEbFEbFEbMPbFCaaabLcbLdbMRbMQbMVbMTbMWbMSbNbbMUbNcbFObNdbEobMXbMYbMZbNabNfbNebNjbNgbNlbNkbNhbNibNnbNmbNqbNpbNrbNobJQbNsbNtbEtbNvbNubNxbNwbNAbNybNCbGvbEubNKbNzbNLbNBbNBbNMbNDbNEbNFbNGbNHbNIbNJbNObNNbEAbNQbLRbNRbEDbNSbNPbNTbIpbIpbNUbEDbIzbGGbNWbGHaaaaaaaaaaaaaabbNXbNZbNVbNZbNVbNZbOaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbKpbKpbObaSdaSdbjQaLdaSdaSdbCfbOdbIBbIBbIBbCfbCfbCfaaaaaaaaabOebOcbOcbOfbOcbOcbOeaaaaaabKBbOgbKzbOibOhbOhbOhbOhbOhbOkbOjbOhbOlbOnbOmbOpbOobOrbOqbzJbOtbBnbOvbOsbDXbOwbOubOxbMEbMEbMGbOAbOybOCbOBbODbMGbFBbKYbFCbOEbOHbOFbOObOMbFCaaabOGbLdbOPbOIbOJbOKbOLbOKbOSbONbOXbFObOYbEobOQbOQbORbPabOTbOUbOVbOWbPcbPbbOZbOZbPebPdbPhbPfbEtbNobPkbPjbEtbEtbEubPgbPlbPibEubEubEubEubPrbPmbGqbPvbLEbLPbPxbNBbNEbPnbPobPobPpbIdbPqbPybPsbPtbIrbPubEDbPzbPwbIpbPHbPBbPJbEDbKubPAbGHbGHaaaaaaaaaaaaaabbPKbPCbPDbPEbPFbPGbPKaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbPIbPIbPIbPIbPNbPMbPIbPIbPIbPIbPRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbOebPTbKBbKBbPUbPObPPbPQbPQbPQbPObKzbJfbKAbKzbKzbKBbPZbPSbQcbQdbPVbQebPXbBnbBnbPYbDXbOwbOubQhbQfbQbbQibQkbOzbQlbQgbQnbMGbQobQjbHmbQpbQqbQmbQsbQrbHsbHtbQtbLdbQvbQubQwbOKbQxbOKbQybONbQzbFObQAbEobQDbQBbQGbQEbQHbQCbQJbQIbQFbQFbQMbQKbQFbQFbQObQNbQPbQLbQRbQQbQTbQSbQWbQUbQZbQYbRdbQVbRebQXbRgbRfbGqbRabRbbRcbRjbRibIabRkbPobPobRlbRhbPqbRmbEAbRnbRnbRobEDbRpbRybRqbRzbIpbREbEDbKubRFbGHaaaaaaaaaaaaaaaaabbRrbRsbPDbPFbPDbRtbNVaabaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbRubRvbRwbRxbRGbRHbRAbRGbRBbRCbRDbPIbPIbPRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbRJbRIbRKbRIbRSbRRbRTbRRbRRbRRbRRbRUbJfbKAbRLbxbbxbbRMbBnbzFbQdbRNbDXbRObRPbRPbRQbNYbRYbRXbRZbRVbRWbSbbSdbScbSabQgbSebMGbMKbKYbFCbSfbShbSgbSlbSkbFCaaabOGbSibSjbSibSibSibSibSibSmbSibSpbFObQAbEobSqbSnbSnbSobSrbOUbStbSsbSvbSubSxbSwbSybSvbSAbSzbSDbSBbSFbSCbSGbSGbSEbSHbSJbSIbSLbSKbSNbSMbSPbSObSRbSQbSQbSSbSUbSTbIabSWbIdbIdbSXbSVbPqbSYbTabSZbTfbTcbTbbTgbTdbTebTjbTebEDbEDbTkbPtbThbTibTibTibTibTibThbPKbPFbPDbPFbPFbPGbPKaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabCabCdbCcbBZbCebCbbCbbClbCibARbATaSdaSdaSdaTobCnbCfbCgbCfbCfbCfbCfbChbCtbCjblQblQbCkbCwbvsbwPbCmbCxbzxbvsbCobCpbCoblMblMblMblMbCqblMbCrbCsbxbbCybCubzCbCvbCzbxbbyybzJbCBbzFbBnbBnbCEbzJbCFbzLbyFbzRbCAbBsbBtbCGbCCbBwbzUbCDbvXbCHbCIbxqbCKbCJbCLbxqbCRbCNbCSbCMbCTbCObCPbCQbCUbzYbCVbxvbCYbCXbAfbAgbAhbAibAkbCZbAkbAkbAkbAkbCWbDbbDbbDbbDbbDcbAkbAkbAkbAkbDdbAkbCZbDabAkbAkbDebDgbDfbDhbDibDibDlbDjbDnbDmbwvbwvbwvbwvbwvbwvbwvbDkbDpbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbDrbDqbDqbDsbDubDtbDxbDvbDvbDybDAbEHbmZbAMboIbrMbrMboIbDBdsldsldsldsnbicaaabicbDDbDwbDwbDFbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabCabCdbDGbCbbCbbCbbCbbCbbCbbCbbDHbDCaOQbDCaSfbDIbCfbDEbDJbDLbDKbDMbChbDObDNbDQbDQbDWbDVbvsbvsbvsbynbDYbymblQblQblQblQbDPbnKbnKbCsbnKbCrbCsbxbbDZbDRbDSbDTbyvbxbbDUbzJbEbbzFbBnbBnbEfbDXbEjbzLbElbxlbEabEmbzPbzPbzPbzPbzUbEcbvXbEdbEebvXbvXbvXbvXbvXbvXbvXbxubxvbErbEgbEhbEibEsbEkbEvbxvbEwbEnbEnbEobEobEobEobEobEobEobEpbEpbEqbEybEzbEzbEybEqbEpbEpbEtbEtbEtbEtbEtbEubEubEubEuaQwbEubEubPgbEubEubECbExbEEbwvbwvbEIbEIbEAbEAbEAbEAbEAbEJbDqbDqbDrbDqbwvbDqbDqbDqbDqbEMbEDbEDbEDbEDbENbEFbEFbEGbEGbEGbEGbEGbEGbEGbjRbjRbjRbjRaYUdsqdsldslbEObicaaabicbEPbDwbDwbEQbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabCabCdbEKbELbELbCbbELbELbELbARbERaSdaSdaSdaTobEVbCfbEYbEXbEXbEXbFcbChbnKbFfbESbETbEUbFgbvsbwPbEWbynbFhbymbFibEZbFabFbbFlbFdbFdbFebFdbFnbFobxbbFqbFpbFjbFkbFrbFmbFsbyBbFubFtbBnboxbFybFxbEjbzLbFzbxlbFAbFvbFwbFFbFIbFGbFMbxmbxmbFBbFCbFDbFEbFNbFEbFPbFCaaabFHbxvbFRbFJbFKbFLbEsbzYbFSbxvbFUbFObFWbEobFQbFXbFYbFTbFZbFVbGcbGbbGebGdbGabGabGdbGfbGhbGgbEtbGiaQyaQxbEtaQAaRuaQDaRyaRvaRBaRAaRCbGvbEubGxbGqbGrbGybGrbGzbGzbEAbGubGAbGwbEAbGBbGEbGBbEAbGFbDqbEMbEDbGKbGLbGKbEDbGCbGDbEDbGNbGMbGGbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabicdsudswdsvdsvbicaaabicbGObDwbGObDwbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGPbARbARbARbARbARbARbARbARbERaaaaaaaSdbGRbndbHabCfbHdbCfbHebEXbHfbGQbChbHgbGSbGTbGUbFgbvsbvsbvsbvsbvsbvsbGVbGWbGXbGYbGZbxbbxbbxbbxbbxbbxbbxbbHhbxbbxbbxbbHbbxbbHcbHibHjbBnbBnbBnbHnbDXbHobzLbHpbxlbHqbFvbxlbxlbxlbxmbHrbxmbHkbHlbHmbHubHBbHzbHDbHCbHsbHtbHFbxvbHvbzYbHwbHxbEsbHybzYbxvbHHbHAbHIbEobHLbHJbHEbHMbHGbHNbHObGabGabGabGabGabGabGabGabHPbHKbHRaRFaREbEtaRHaSFaROaSHaSGbIbbHUbHQbIbbEubIebGqbIfbHXbIgbIhbIhbIabIjbIcbIdbImbIlbIqbInbEAbIibIrbIkbEDbItbIwbIvbIobIpbIybEDbIzbGGbIsbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIAbjJbIubIubIubICaaabIEbIxbIxbIxbjJbIFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjQaLdaSdaSdaSdaSdaSdaSdaSdaSdaSdaToaSfbIGbCfbIHbIBbIIbIDbIDbIJbILbIKbIMbIMbIObINbDQbDQbDQbDQbDQbDQbIQbIPbIPbIRbITbxbbIVbIUbIYbIXbISbIZbJfbJbbxbbIWbJibyBbyCbDXbHjbBnbBnbJjbzJbzJbJmbJabJobJcbJdbJebJpbJgbJhbJsbJtbJkbJlbJubHsbJnbJvbJnbJvbJwbHsbHtbJqbJrbJybJxbJDbJzbJGbJEbJHbJrbJIbFObFObEobJAbJBbJCbJJbJKbEobHObGabGabGabGabGabGabGabJFbJLbJPbHRaSIbHRaSKbHQbHQaYkbHQaSVbIbbHUbHQbIbbEubJWbJZbJXbJTbJTbKcbKabKgbKebJYbJYbJYbKhbJYbKkbKbbKnbKdbKobKfbKqbKrbKibKibKibKjbEDbKubGGbKlbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIAbKmbKmbKmbIFaaabIAbKmbKmbKmbIFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbKybKxbKpaQZaQZaQZbndaSfaSfbCfbKCbCfbKDbKsbKtbKEbCfblQbKvbKvbKwbKFbKwbKwbKwbKFbKwblQblQbxbbxbbxbbKGbxbbKzbKzbKzbKzbKzbKzbJfbKAbKBbKHbzFbKIbKKbKJbKMbKLbKObKNbKQbKPbKSbKRbKVbKUbKXbKXbLabKZbKTbLbbLfbKWbLgbKYbFCbLhbHDbLibHBbLkbFCaaabLcbLdbLebLnbLdbLdbLdbLdbLpbxvbLqbFObLrbLjbLsbLlbLmbLtbLobEobLvbLubLxbLwbLzbLybLBbLAbGabLDbEtaTHaTLaTKaTNaTMbHQaTObHQaSVbIbbHUbHQbIbbEubIebGqbLNbLEbLPbLSbLQbLIbLTbLKbLLbLMbLUbLObLVbEAbLXbLRbLYbEDbLZbMfbMabIpbLWbMgbEDbKubGGbMhbGHaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbMjbMibKpaSeaSebMbbMcaSebMdbCfbMebIBbMlbMkbMnbMmbCfaaaaabaabbMpbMobMobMobMobMobMraaaaaabKBbMtbMsbMubMqbKzbKzbKzbKzbKzbKzbMwbMvbMzbMybMDbMBbMxbDXbzJbzJbMFbMAbzJbzJbMJbMCbMLbMEbMMbMGbMGbMHbMGbMIbMNbMGbMKbKYbFCbMObFEbFEbFEbMPbFCaaabLcbLdbMRbMQbMVbMTbMWbMSbNbbMUbNcbFObNdbEobMXbMYbMZbNabNfbNebNjbNgbNlbNkbNhbNibNnbNmbNqbNpbNrbLFaTQaTPbEtaTRaTTaTSaTUaSVbNAaTVaTWbGvbEubNKbNzbNLbNBbNBbNMbNDbNEbNFbNGbNHbNIbNJbNObNNbEAbNQbLRbNRbEDbNSbNPbNTbIpbIpbNUbEDbIzbGGbNWbGHaaaaaaaaaaaaaabbNXbNZbNVbNZbNVbNZbOaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbKpbKpbObaSdaSdbjQaLdaSdaSdbCfbOdbIBbIBbIBbCfbCfbCfaaaaaaaaabOebOcbOcbOfbOcbOcbOeaaaaaabKBbOgbKzbOibOhbOhbOhbOhbOhbOkbOjbOhbOlbOnbOmbOpbOobOrbOqbzJbOtbBnbOvbOsbDXbOwbOubOxbMEbMEbMGbOAbOybOCbOBbODbMGbFBbKYbFCbOEbOHbOFbOObOMbFCaaabOGbLdbOPbOIbOJbOKbOLbOKbOSbONbOXbFObOYbEobOQbOQbORbPabOTbOUbOVbOWbPcbPbbOZbOZbPebPdbPhbPfbEtbNoaUOaTYbEtbEubPgbEubEuaUPbEubEubEubEubPrbPmbGqbPvbLEbLPbPxbNBbNEbPnbPobPobPpbIdbPqbPybPsbPtbIrbPubEDbPzbPwbIpbPHbPBbPJbEDbKubPAbGHbGHaaaaaaaaaaaaaabbPKbPCbPDbPEbPFbPGbPKaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbPIbPIbPIbPIbPNbPMbPIbPIbPIbPIbPRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbOebPTbKBbKBbPUbPObPPbPQbPQbPQbPObKzbJfbKAbKzbKzbKBbPZbPSbQcbQdbPVbQebPXbBnbBnbPYbDXbOwbOubQhbQfbQbbQibQkbOzbQlbQgbQnbMGbQobQjbHmbQpbQqbQmbQsbQrbHsbHtbQtbLdbQvbQubQwbOKbQxbOKbQybONbQzbFObQAbEobQDbQBbQGbQEbQHbQCbQJbQIbQFbQFbQMbQKbQFbQFbQObQNbQPbQLaVyaVxbQTbQSaWIaHgaVIaYlaWObQVbRebQXbRgbRfbGqbRabRbbRcbRjbRibIabRkbPobPobRlbRhbPqbRmbEAbRnbRnbRobEDbRpbRybRqbRzbIpbREbEDbKubRFbGHaaaaaaaaaaaaaaaaabbRrbRsbPDbPFbPDbRtbNVaabaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbRubRvbRwbRxbRGbRHbRAbRGbRBbRCbRDbPIbPIbPRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbRJbRIbRKbRIbRSbRRbRTbRRbRRbRRbRRbRUbJfbKAbRLbxbbxbbRMbBnbzFbQdbRNbDXbRObRPbRPbRQbNYbRYbRXbRZbRVbRWbSbbSdbScbSabQgbSebMGbMKbKYbFCbSfbShbSgbSlbSkbFCaaabOGbSibSjbSibSibSibSibSibSmbSibSpbFObQAbEobSqbSnbSnbSobSrbOUbStbSsbSvbSubSxbSwbSybSvbSAbSzbSDbSBaWSaWRbSGbSGbSEbSHbSJbSIbSLbSKbSNbSMbSPbSObSRbSQbSQbSSbSUbSTbIabSWbIdbIdbSXbSVbPqbSYbTabSZbTfbTcbTbbTgbTdbTebTjbTebEDbEDbTkbPtbThbTibTibTibTibTibThbPKbPFbPDbPFbPFbPGbPKaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbPIbRAbRAbRAbTlbRGbTnbTnbRGbTobRAbRAbTpbWLbPIbPRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbTtbTrbTqbTrbTubKzbPPbPQbPQbPQbKzbKzbJfbKAbTsbTxbxbbTAbBnbTBbQdbTvbDXbTwbBnbBobBnbPWbOwbTybTzbRVbRWbTCbTEbTDbTKbTFbTLbTGbTHbTIbTJbTJbTNbTMbTPbFCbFCaaabOGbSibTQbTObTSbTRbTVbTTbTWbTUbTXbFObQAbNebTZbTYbUbbUabUcbOUbUebUdbUibUhbUfbUgbUkbUjbUmbUlbUobUnbUqbUpbUsbUrbUubUtbUybUvbUDbQVbUwbQXbUxbUGbGrbUzbUAbUBbUCbUCbIabUIbUEbUFbIabUJbPqbUHbIabUKbUMbULbUObUNbUQbUPbUSbURbUUbUTbUWbUVbUYbUXbUXbUZbVbbVabQabVcbNZbNVbVdbNVbNZbVjaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbPIbVebVfbVgbVhbVibRGbVkbRAbVlbRAbRAbRAbRAbRAbTlbRGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebVmbOcbOcbOcbVnbOebPTbKBbKBbVobKzbPPbKzbKzbKzbKzbKzbJfbKAbTsbVpbxbbVrbBnbVqbVsbBnbVwbzEbBnbBnbVtbDXbOwbTybTzbRVbRWbMGbVubVvbVybVxbVzbMHbVBbVAbVDbVCbHsbVEbVFbHsbHtbHtbVGbSibVIbVHbVKbVJbVLbVLbVNbVMbVObFObVPbEobOUbVQbOQbVSbVRbOUbUebVUbVTbVVbVXbVWbVYbVTbUebVZbWebWabWbbWabWcbWabWdbWdbWhbWfbWgbWgbWgbWmbWgbWgbWibWibWjbWkbWjbWjbIabIabIabIabIabWlbWnbLIbIabWobWrbWpbWqbWqbWvbWsbWtbWubWxbWwbWzbWybWBbWAbWAbWCbWEbWDbThbQabQabQabWFbThaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWObWGbRAbRAbWHbWHbWHbRGbRAbRAbRGbWIbWJbWKbRAbWMbWNbRGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbWPbTrbTqbTrbPUbWQbWRbKzbKzbKzbWQbKzbJfbKAbTsbWSbxbbWWbBnbzFbQdbBnbzJbWTbBnbBnbWUbDXbOwbTybWVbRVbWXbMGbXbbWYbWZbXabXdbMHbXcbXebXgbXfbXibXhbXjbFCaaaaaaaaabSibXpbXkbXlbXlbXmbXnbXobSibXrbXqbQAbXsbXubXtbXwbXvbXybXxbXAbUdbXzbXBbXDbXCbXEbXzbUebVZbXIbXFbXGbXHbXKbXJbWdbXMbXLbXObXNbXPbXRbXQbXTbXSbXVbXUbUUbXWbWqbWqbXYbXXbWqbXZbYbbYabYdbYcbWqbYebYgbYfbYibYhbYlbYjbYkbYjbYjbYjbTkbPtbThbTibTibThbYnbYmbYpbYobYrbYqbYsbQaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYubWGbRAbRAbRAbRAbRAbYtbRAbRAbRGbPIbPIbPIbPIbPIbPIbYvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbYxbYwbYybYwbYAbYzbYBbYBbYBbYBbYBbYCbYEbYDbTsbYFbxbbYGbYIbYHbYNbYJbYKbYLbYLbYLbYMbYMbYObTybYRbYQbRWbMGbYTbYSbYVbVvbYWbMHbYUbYXbZdbTJbZebQmbYYbFCaaaaaaaaabSibYZbZabZbbZcbXmbXnbXobSibZgbZfbZibZhbZkbZjbZmbZlbZobZnbZrbZqbVTbVTbZpbZvbVTbVTbUebVZbZwbZsbZtbZubZybZxbWdbZAbZBbZzbZDbZCbZFbZEbZEbZGbZIbZHbZKbZJbUNbUNbZLbUNbZMbUNbZNbUNbZPbZObZObZQbZSbZRbZUbZTbZXbZVbZYbZWcabbYjcacbZZaaaaaaaaabThcaabVbcadbYobQacajcalbThaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIcafcagcahcaibRAbRGbRAbRAbRGbRAcancakcaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbOebPTbKBbKBbxbbxbbKBbKBbKBbKBbKBbxbbxbbKBbKBbKBbxbcamcamcamcascambYMcaocapcaqcatbYMbOwbTycawbMEbMEbMGbMGbMGbMGbMGbMNbMHbTJbTIcaubTJcavcaxbFCbFCbFCbFCbFCbSibSjbSibSibSibSibSibSibSicaybFOcaBcazcaAcaCcaDcaAcaAcaEcaGcaFcaIcaHcaKcaJcaMcaLbXAcaNcaPcaOcaRcaQcaTcaScaVcaUcaXcaWcaZcaYcbbcbacbgcbcbWgbWicbdcbecbdcbfcbicbfcbfcbfcbhcblcbjcbjcbkcbmcbocbnbZUcbpcbrcbqcbtcbscbubYjcacbZZaaaaaaaaabThcbwcbvbThbQabThbThbQabThaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYubWGbRAbRAbRAbRAbRAbYtbRAbRAbRGbPIbPIbPIbPIbPIbPIbYvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbYxbYwbYybYwbYAbYzbYBbYBbYBbYBbYBbYCbYEbYDbTsbYFbxbbYGbYIbYHbYNbYJbYKbYLbYLbYLbYMbYMbYObTybYRbYQbRWbMGbYTbYSbYVbVvbYWbMHbYUbYXbZdbTJbZebQmbYYbFCaaaaaaaaabSibYZbZabZbbZcbXmbXnbXobSibZgbZfbZibZhbZkbZjbZmbZlbZobZnbZrbZqbVTbVTbZpbZvbVTbVTbUebVZbZwbZsbZtbZubZybZxbWdbZAbZBbZzbZDbZCbZFbZEbZEbZGbZIbZHbZKbZJbUNbUNbZLbUNbZMbUNbZNbUNbZPbZObZObZQbZSbZRbZUbZTbZXbZVbZYbZWaYpbYjcacbZZaaaaaaaaabThcaabVbcadbYobQacajcalbThaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIcafcagcahcaibRAbRGbRAbRAbRGbRAcancakcaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbOebPTbKBbKBbxbbxbbKBbKBbKBbKBbKBbxbbxbbKBbKBbKBbxbcamcamcamcascambYMcaocapcaqcatbYMbOwbTycawbMEbMEbMGbMGbMGbMGbMGbMNbMHbTJbTIcaubTJcavcaxbFCbFCbFCbFCbFCbSibSjbSibSibSibSibSibSibSicaybFOcaBcazcaAcaCcaDcaAcaAcaEcaGcaFcaIcaHcaKcaJcaMcaLbXAcaNcaPcaOcaRcaQcaTcaScaVcaUcaXcaWcaZcaYcbbcbabXQcbcbWgbWicbdcbecbdcbfcbicbfcbfcbfcbhcblcbjcbjcbkcbmcbocbnbZUcbpcbrcbqcbtcbscbubYjcacbZZaaaaaaaaabThcbwcbvbThbQabThbThbQabThaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPIbPIbPIbPIbPIbPIbRGbTobRAcbzbRAcbxcbycbAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbDcbBbOccbCbOccbEcbFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbGaabaaaaaaaaaaaacamcbIcbHcbKcbJbYMcbNcbLcbMcbRbYMbOwbTycbOcbPcbQcbScbVcbTcbUcbWcbYcbXccacbZcccccbccfccdcceccgccjcchccicckccqcclccmbEnccnbFOccoccpccrbFOccscaAccvcctccuccwccxbUecczccyccBccAccDccCccFccEccHccGccIbWaccKbZuccJccMccLccOccNccPbXNccQbXQbXQbXQccRbWgcbdccTccSccVccUccXccWcdbcbfccYccZcdacbjcbjcdccbocddcdfcdecdhcdgcdjcdicdkbYjcdnbGHaaaaaaaaabThbThbThbThaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbPIcdlcdmcdpcdlcdobRGbRAbRAbRGbRAcdrcdqcdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdvcdtcducducducdtcdwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacamcdycdxcdAcdzbYLcdBcdDcdCcdEbYMbOwcdGcdFbTybTycdHcdKcdIcdJcclcdOcdLcdOcdMcdNcdNcdQcdPcdRcdNcdNcdTcdNcdScdNcclccmbEncdVcdUcdXcdWcdZcdYbFOcaAcebcctceaccucedbUececceecegcefceicehcekcejbUecelcembWaceocencencercepceqcetcesbXNceucevbXQcexcewbWgcbdcezceyceBceAceDceCceGcbfceEccZceFceFcbjceHceJceIceLceKceNceMcePceOceSbYjcacbGHceQaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWObWGceRceRceRceRceRceTbRAbRAbRGbPIbPIbPIbPIbPIbPIbPRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceVceUceUceUceWaaaaaaaaaaaaaaaaaaaaaceXceZceYceZcfaaaaaaaaaacamcamcamcffcfbcdAcfcbYLcfdcbMcfecfgbYMbOwcfhcfjcficflcfkcfncfmcfpcfocfrcfqcfucfscftcftcfxcfvcfvcfvcfvcfvcfvcfwcfAcfycfzcfBcfDcfCcfFcfEcfHcfGcfIcaAcfJcctccucfKcedbUececceecfMcfLcfOcfNcfQcfPbUmcfRcfSbWabWacfUcfUbWacepbWdcfTcfVbWgcfXcfWcfZcfYcgabWgcbdcgccgbcgecgdcghcgfcggcbfcgiccZceFceFcbjcgjcgmcgkcglcgncgpcgocgrcgqcgvbYjcaccgscgtcgscgucgycgucgucguaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYubWGceRceRceRcgwcgxbRGbRAbRAbRGbRAbRAbRAcgzbRAcgAbRGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgFcgBcgCcgDcgFbYPbYPbYPcamcgHcgGcgJcgIcgLcgKcgNcgMcgOcgOcgPbYMcgRcgQcgTcgScgScgUcgXcgVcgScgWcgWcgYchbcgZcgWcgWchacclcclchechcchcchcchdchgchcchcchfchichhchhchjchhchlchkchhchnchmchpcaAchochqcecchschrchtchvchuchwchrbUecelchychxchAchzchCchBchFchDchEchGchLchHchIchJchKchNbWicbdcbdchMchQchOchPchOchRcbfchUchSchTchTcbjchVchXchWbYjbYjbYjbYjbYjbYjbYjbYjcaccgscifchYchZciaciacibcguaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcicciccicciccidcidcieciecieciecijaabaabaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIcigceRceRcihciibRGbRAbRAcikbRAbRAbRAciobRAcilbRGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceYcimcincimceYbYPcipciqcamcitcfbcircisciyciubYMcivciwcixcizbYMcgQcgQciCcgSciAciBciEciDciHcgWciFciGciJciIciKcgWciMciLciNchcciPciOciSciQciRciTciVciUciXciWciZciYcjbcjacjdcjccjgcjecjfcjhcjjcjicjkceecjocjlcjmcjncjqcjpbUmcjrcjtcjscjuchCcjvcjvcjxcjwbWgcjycjAcjzcjCcjBcjEaQvbWicjFcjHcjGcjIcjGcjGcjLcjJcjKcjPcjMcjNcjOcbjcjQcjRcbnbPtbGGcjTcjScjUcjUcjScjUcjYcgscjVcjWchZciackecjXcguaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciccjZckacjZcidciecieckbckcckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYubWGceRceRceRcgwcgxbRGbRAbRAbRGbRAbRAbRAcgzbRAcgAbRGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgFcgBcgCcgDcgFbYPbYPbYPcamcgHcgGcgJcgIcgLcgKcgNcgMcgOcgOcgPbYMcgRcgQcgTcgScgScgUcgXcgVcgScgWcgWcgYchbcgZcgWcgWchacclcclchechcchcchcchdchgchcchcchfchichhchhchjchhaCuchkchhchnchmchpcaAchochqcecchschrchtchvchuchwchrbUecelchychxchAchzchCchBchFchDchEchGchLchHchIchJchKchNbWicbdcbdchMchQchOchPchOchRcbfchUchSchTchTcbjchVchXchWbYjbYjbYjbYjbYjbYjbYjbYjcaccgscifchYchZciaciacibcguaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcicciccicciccidcidcieciecieciecijaabaabaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIcigceRceRcihciibRGbRAbRAcikbRAbRAbRAciobRAcilbRGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceYcimcincimceYbYPcipciqcamcitcfbcircisciyciubYMcivciwcixcizbYMcgQcgQciCcgSciAciBciEciDciHcgWciFciGciJciIciKcgWciMciLciNchcciPciOciSciQciRciTciVciUciXciWciZciYcjbcjacjdcjccjgcjecjfcjhcjjcjicjkceecjocjlcjmcjncjqcjpbUmcjrcjtcjscjuchCcjvcjvcjxcjwbWgcjycjAcjzcjCcjBcjEaYobWicjFcjHcjGcjIcjGcjGcjLcjJcjKcjPcjMcjNcjOcbjcjQcjRcbnbPtbGGcjTcjScjUcjUcjScjUcjYcgscjVcjWchZciackecjXcguaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciccjZckacjZcidciecieckbckcckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIckdceRceRckfbRGbRAbRAbRGckgbRAbRAckjckhbPIbYvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgFckicimcimckkcklcfbcfbckmckncfbcfbcisckqckobYMbYMbYMbYMbYMbYMckpcgQcksckrckxcktcktcktckucgWckvckwckwckwckzckyckBckAckDckCckFckEckHckGckJckIchcchfckKchhckMckLckOckNckPchhcebccuceaccuckRckQckUckSckTckVckXckWckYchrclackZclcclbclecldclgclfcljclhbWgbWgbWgbWgbWgclicllclkbWiclncjGcjGclmclocjGcltclpcbjclqccZclrclrcbjcbmclscbnbPtcgsclvcgscgscgscgscgscgscgscluclwcguclxclzclycguafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOclBcjZcjZclAciecieckbckbclHckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIclCclDclEbRGbRAclFbRGclGclIbRAbPIbPIbYvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceYcincincinceYbYPclJclMclKckncfbcfbclLclOclNclQclPclPclPclTcgQcgQcgQciCcgSclRcktclScktclVcgWckvckwclUckwclWcgWclYclXclZchccmccmacmbcmecmdcmhcmfcmgcmjcmicmlcmkcmocmmcmnchhcfJccuccucmpckRckQcmrcmqcmucjlcmscmtcmwcmvcmycmxcmAcmzcmCcmBcmEcmDcjvcmHchxcmFcmGcmJcmIcmKcmNcmLclpclncmMcjGcjGcjGcmQcmOclpcbjcmPccZclrclrcbjcmTcmRcbnbPtcmScmVcmUcgscmWcmYcmXcnbcmZcnacnfcgucnccndcnecgucgscgscgscgEcgEcgEcgEcgEaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaacnkcieclBciecieckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIbPIbPIbPIbPIbPIbPIbPIbPIbPIbYvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabafOcgQcngcngcgQcngcngcgQaaaaaacgFcnhcnicnjcgFbYPbYPbYPcamcnmcnlcnocnocnocamcamcgQcnncnpcnrcnqcgQcnscntcgSclRcktcktcktcnvcgWckvckwckwcnucnxcnwcnzcnycnAchcchcchcchcchccnBchcchccnCcnDchhchhcnEchhchkchhchhcaAcnGcnGcaAcnFcnHcnJcnIcnLcnKcnNcnMcnPcnObQVcnQcmAcmzcnScnRcnUcnTcnWcnVchxcnXcnZcnYcobcoacoecoccodcofcodcoicoicoicodcogcodcodcohcojclrclrcbjcokclscbncomcolcooconcorcopcoqcoqcotcoscovcoucoxcowcozcoycoCcoAcoBcoDcoEcoFcoHcoGcoIaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaacidciecoMcoJcoJckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIclCclDclEbRGbRAclFbRGclGclIbRAbPIbPIbYvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceYcincincinceYbYPclJclMclKckncfbcfbclLclOclNclQclPclPclPclTcgQcgQcgQciCcgSclRcktclScktclVcgWckvckwclUckwclWcgWclYclXclZchccmccmacmbcmecmdcmhcmfcmgcmjcmicmlcmkcmocmmcmnchhcfJccuccucmpckRckQcmrcmqcmucjlcmscmtaYqcmvcmycmxcmAcmzcmCcmBcmEcmDcjvcmHchxcmFcmGcmJcmIcmKcmNcmLclpclncmMcjGcjGcjGcmQcmOclpcbjcmPccZclrclrcbjcmTcmRcbnbPtcmScmVcmUcgscmWcmYcmXcnbcmZcnacnfcgucnccndcnecgucgscgscgscgEcgEcgEcgEcgEaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaacnkcieclBciecieckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIbPIbPIbPIbPIbPIbPIbPIbPIbPIbYvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabafOcgQcngcngcgQcngcngcgQaaaaaacgFcnhcnicnjcgFbYPbYPbYPcamcnmcnlcnocnocnocamcamcgQcnncnpcnrcnqcgQcnscntcgSclRcktcktcktcnvcgWckvckwckwcnucnxcnwcnzcnycnAchcchcchcchcchccnBchcchccnCcnDchhchhcnEchhchkchhchhcaAcnGcnGcaAcnFcnHcnJcnIcnLcnKaYrcnMcnPcnObQVcnQcmAcmzcnScnRcnUcnTcnWcnVchxcnXcnZcnYcobcoacoecoccodcofcodcoicoicoicodcogcodcodcohcojclrclrcbjcokclscbncomcolcooconcorcopcoqcoqcotcoscovcoucoxcowcozcoycoCcoAcoBcoDcoEcoFcoHcoGcoIaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaacidciecoMcoJcoJckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaacgQcoKcoLcgQcoKcoLcgQaaaaaacoOceZcoNceZcoQaaaaabaaacamcamcamcamcamcamcamcoPcgQcoScoRcoUcoTclPcoVcoWcgScoYcoXcpfcktcoZcpacpbcpccpdcpecpgcgWcpicphcpkcpjcplcplcplcplcpncpmcppcpocpocpqcpqcptcprcpschfcaAcpvcpucpxcpwcpyckQcpzcnIcpBcpAcpDcpCcekcpEcpGcpFcpJcpHcpHcpIcpHcpHcpHcpKchxcpLcpScpMcpNcpOcpPcpQcpRcpTcpRcpUcpWcpVcpRcpXcpYcodcqacpZcdacbjcbjcqccqbcqfcqdcqecqicqgcqhcqlcqjcqkcqncqmcqpcqocqtcqqcqrcqqcqscqrcqrcqucqwcqvcqycqxcqCaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaacieciecqDckbckbckbckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafOaaaafOcgQcqzcoLcgQcqzcoLcgQaaaaaaaabaabaabaabaabaabaabaabaabcgQcoLcqAcqBcgQcqEcqGcgQcqHcgQcgQcqFcgQcgQcqPcgScqRcqIcqJcqKcqLcqMcqNcqOcqScqQcqTcpacqXcqUcqYcqVcqWcqWcqWcqWcrgcrdcqZcracrbcracrccrhcrecrfcrjcricrmcrlcrkcrncrpcrocrrcrqcrtcrscrvcrucrxcrwcrzcrycrAbXwbXwcrBcrEcrCcrucrGcrDcrDcrHcrDcrFcrIcrKcrJcpRcrNcrQcrLcrMcrLcrTcrOcrPcodcbjcrUcbjcbjcrRcrSclsbLRbPtcgscrVcgscgscrWcrYcrXcsacrZcsdcsbcsfcsecsgcsecsgcshcsgcsicgEcsncvdcsqcsraabaabaabaabaabaabaabaabaaaaaaaaaaaaaaacieckbckbckbckbckbckbcssckbcstckbckbckbckbckbciecieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcsjafOaabaMraMrafOcgQcgQcqFcgQcgQcqFcgQcgQcgQcngcngcngcgQcgQcgQcgQcgQcgQcgQcoLcskcslcgQcsmcgQcgQcsucgQcsocspcoLcgQcsvcgScsycsxcszclRcsBcsAcswckvcsEcsCcsFcsAcsIcsHcsMcsDcsDcsNcsOcsGcsTcsQcsJcsKcsLcsUchfcsWcsLcsLcsXcsPcsYcsRcsScrnctacsZcsVctbctdctcctfctectgctcctccthctictictictictictjctlctkctmctmctoctnctqctpctsctrcpRcttctxctwctyctwctActzcrLctuctvctBbLRctCbLRcrSclsbLRbIictFctHctGcgscgscgscgscgsctIcqkctKctDcsccqkctEcqkclucqkctLcgEctOctQctPcgEaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaciectJctJctJctJctJctJctSckbctTctJcstckbckbckbckbcieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9159,9 +9159,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaaaabaaaaabaabcSQaabaabaabcSQaabaaaaabcSQaabaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcSRcTacSTcRAcTbcTccNRcRCcRCcSScTdcKbcKbcMvcSUcSUcSUcSUcSVcSWcSXcSWcSWcSWcRRcRRcSYcSZcTfcTicTgcRXcTjcTecRXcRXcRXcRXcTkcPTcTlcThcQVcSdcQPcSdcPZcSfcSlcTncTmcTqcTpcTucTraabcTocTvcSwcTwcQZcRecBQcRicRhcTxcTscSAcTtcQkcTycTAcTzcQkcTCcTDcSAcTFcTEcQkcBYcsLcTBcBPaaacBRcKPcKQcKRcTJcPlcNocTKcTNcTMcTGcTGcTHcTIcTPcTOcBRaabaabaabaaaaaaaaaaaaaaaaaabGHcTLcFcbGHbGHbGHbGHbGHaabaabaabcTQcTQcTQcTQcTQcTQaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaabcTRcTScTScTUcTTcTVcTVcTVcTTcTVcTVcTVcTTcTVcTVcTVcTWcTScTScTScTScTScTXcTZcTYcUbcUacUecUdcUgcUfcNBcLwcUccRCcKbcKbcKbcUhcMvcSUcUkcUjcUmcUlcUicUncUpcUocUrcUqcUucUscUxcUwcUycUqcUtcUzcTecUvcRXcRXcRXcUAcPTcUCcUCcSdcUEcUDcUGcUFcUIcUHcUKcUJcUPcUNcUScSqcUVcSncUWcSwcSwcQZcRecBQcPdcQkcULcUMcVacQncQkcUOcVbcQncQkcUQcURcVccUTcUTcQkcBYcsLcUUcBPaaacBRcJKcMgcJKcVecMjcEHcVfcUXcUYcEHcUZcVgcxNcxNcxNcBRaaaaaaaabaabaaaaaaaaaaaaaaabGHcJQcFcbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaaaabaaaaabaabcVkaabaaaaabcVkaabaaaaabcVkaabaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcVlcVdcVmcRAcVncNBcNNcTccTccTccTccVocTccUfcSUcVhcVicVjcVpcVrcVqcVtcVscVvcVucVycVwcVAcVzcVCcVBcUtcTjcTecVxcVDcRXcRXcVFcPTcVGcVHcSdcVIcQPcVJcVEcVLcVKcVOcVMcVQcVPcVQcVRaabcQZcQZcQZcQZcQZcRecBPcPdcQkcVScVNcVUcVTcVWcVVcVYcVXcWbcWacWccSAcWecWdcQkcBYcsLcVZcBPaaacBRcJKcJKcJKcWicWhcWpcWjcWqcWfcEHcEHcEHcEHcWgcWrcWwaaaaaaaaaaabaabaaaaaaaaaaaabGHbGHcFcbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwalwalvalwaabcNFcWxcNMaaacNFcWxcNMaaacNFcWxcNMaabaaaaaaaaaaaaaaaaaaaaaaaaaabaabcRzcRAcRAcRAcRAcWkcWlcWmcNBcWncNBcNBcMvcWocNBcSUcWzcWycVjcWAcUicWscWtcWucWucWvcWDcWCcWFcWEcWGcWvcWBcWHcWJcWIcWLcWKcWPcWMcWScWQcUGcWTcWUcWNcWOcWVcWWcWRcWYcWXcXbcXacXdcXccQpcSncXecWZcWZcQZcRecBPcPdcQkcQkcQkcQkcQkcXgcXfcXicXhcXncXkcXpcXocXqcXjcQkcBYcXrcXlcXlcXlcXmcXmcXmcXmcXmcXscXvcXtcXzcXxcNocXAcNocXAcNocXBcWwaaaaaaaaaaaaaabaabaaaaaaaaaaaabGHcFcbGHaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacNFcWxcNMaabcNFcWxcNMaaacNFcWxcNMaaaaaaaaaaaaaabaaaaaaaaaaaaaabaabaabaaaaaaaabaabcXucXucXucXucXucXucXucXCcXucXucSUcXwcXDcVjcWAcUicXycUicUicXEcRRcXGcXFcUwcXHcXIcRRcXLcRXcTecXMcXOcXNcWPcXPcXJcXKcXRcXQcXVcXScXRcXWcXYcXXcYacSdcXTcXUcYccYbaabcTocYfcYdcXZcQZcRecBQcYhcYgcYgcYgcYlcQkcYmcUMcYecYncURcYocUTcUTcURcYpcQkcBYcYichfcsLcYjcYkcBPaaaaaacBRcYqcYscYrcYvcYqcYscYwcYxcYqcYscYycBRaabaabaabaabaabaabaabaabaabaabbGHcFcbGHbGHbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacYzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaabcNFcWxcNMaaacNFcWxcNMaaacNFcWxcNMaabaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaabaabaabcXucYtcYtcYucYAcYBcYBcYDcYCcYCcYEcYGcYFcVjcWAcVjcYHcVjcVjcVjcRRcYLcYKcYOcYNcYPcYIcYJcYQcYRcYMcYMcYMcYXcYUcYZcYYcZacYScVIcQPcYTcZbcYVcYWcZccSdcXTcZdcZgcZecZhcSncZicWZcWZcQZcRecBQcPdchfchfchfckKcQkcZkcZjcZfcZlcURcZmcZncUTcZpcZocQkcBYcYichfcsLcJGcsLcBPaaaaaacBRcZqcZscZrcxNcZtcZycZvcxNcZzcZBcZAcBRaabaabaaaaaaaaaaaaaaaaaaaaaaaabGHcFcbGGbGGbGHaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwalwalvalwaabcNFcWxcNMaaacNFcWxcNMaaacNFcWxcNMaabaaaaaaaaaaaaaaaaaaaaaaaaaabaabcRzcRAcRAcRAcRAcWkcWlcWmcNBcWncNBcNBcMvcWocNBcSUcWzcWycVjcWAcUicWscWtcWucWucWvcWDcWCcWFaYtaZBcWvcWBcWHcWJcWIcWLcWKcWPcWMcWScWQcUGcWTcWUcWNcWOcWVcWWcWRcWYcWXcXbcXacXdcXccQpcSncXecWZcWZcQZcRecBPcPdcQkcQkcQkcQkcQkcXgcXfcXicXhcXncXkcXpcXocXqcXjcQkcBYcXrcXlcXlcXlcXmcXmcXmcXmcXmcXscXvcXtcXzcXxcNocXAcNocXAcNocXBcWwaaaaaaaaaaaaaabaabaaaaaaaaaaaabGHcFcbGHaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacNFcWxcNMaabcNFcWxcNMaaacNFcWxcNMaaaaaaaaaaaaaabaaaaaaaaaaaaaabaabaabaaaaaaaabaabcXucXucXucXucXucXucXucXCcXucXucSUcXwcXDcVjcWAcUicXycUicUicXEcRRcXGcXFcUwcXHcXIcRRcXLcRXcTecXMcXOcXNcWPcXPcXJaZCcXRcXQcXVcXScXRcXWcXYcXXcYacSdcXTcXUcYccYbaabcTocYfcYdcXZcQZcRecBQcYhcYgcYgcYgcYlcQkcYmcUMcYecYncURcYocUTcUTcURcYpcQkcBYcYichfcsLcYjcYkcBPaaaaaacBRcYqcYscYrcYvcYqcYscYwcYxcYqcYscYycBRaabaabaabaabaabaabaabaabaabaabbGHcFcbGHbGHbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacYzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaabcNFcWxcNMaaacNFcWxcNMaaacNFcWxcNMaabaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaabaabaabcXucYtcYtcYucYAcYBcYBcYDcYCcYCcYEcYGcYFcVjcWAcVjcYHcVjcVjcVjcRRcYLcYKcYOcYNcYPcYIcYJcYQcYRcYMcYMcYMcYXcYUcYZaZHcZacYScVIcQPcYTcZbcYVcYWcZccSdcXTcZdcZgcZecZhcSncZicWZcWZcQZcRecBQcPdchfchfchfckKcQkcZkcZjcZfcZlcURcZmcZncUTcZpcZocQkcBYcYichfcsLcJGcsLcBPaaaaaacBRcZqcZscZrcxNcZtcZycZvcxNcZzcZBcZAcBRaabaabaaaaaaaaaaaaaaaaaaaaaaaabGHcFcbGGbGGbGHaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaabcNFcWxcNMaaacNFcWxcNMaabcNFcWxcNMaabaabaabaabaaaaabaaaaaaaabaabaaaaaaaaaaabaaaaaacXucYtcYtcYucZucZucZucZCcZwcZxcSUcZEcZDcZHcZGcZJcZIcZKcZFcZFcZLcZOcZNcVjcVjcVjcZPcZRcZQcZMcZTdaacZVdacdabcSUcZScZSdafcVIcQPcZUdagcZWcZXcZYcSdcZZdahdajdaidadcQZcQZcQZcQZcQZcRecBQcPddaecsLcsLckKcQkdakcSAcSAdaldandamdaqcUTdatdascQkcBYcYicMfcsLcuccTBcBPaaaaaacBRcMkcJKcJKcxNcMkcJKcJKcxNcMkcJKcJKcBRaaaaabaabaaaaaaaaaaaaaaacuQcuQbGHdaucuQbGGbGHbGHbGHcTQcTQaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamhaabcNFdavcNMaaacNFdavcNMaaacNFdavcNMaabalvaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaabcXudaodapcZucZucZudaxdardardardardardardardazdaDdaCdaEdawdawdawdaFdaydaJdaAdaBdawdaydaKdaRdaQdaadaSdacdabdaGdaHdaIdaTdaUdaLdaMdaNcZcdaOdaPdaVdaYdaWdaZcXcdbacSndbcdbbdbbcQZcRecBPcPdchfcBNdaXckKcQkdbdcSAdbkdbecURdbmdbncUTdbpdbocQkcBYcYichfcsLchfchfcBPaabaabcBRdbfcKZcJKcxNdbfcKZcJKcxNdbfcKZcJKcBRaaaaaaaabaabaaaaaaaaaaaacuQdbgbGGcFccuQdbhcuQdbibGHaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaaaaabaaaaaaaaaaabaabaabaaaaaaaabaabaaaalvaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaabcXudbjcZucZucZucZucZudardbtdbldbudbwdbvdardbxdbqdbrcXDcVjcVjdbsdbBdbydbEdbCdbGdbFdbzcSUdbAdaQdaadbHdacdbJcSUdbDcZSdbKdbLcSddaMdaNdbNcSddaPdaVcXTcXUdbOcYbdbIcTodbSdbQdbWcQZcRecBPcPdchfdbMdbMckKcQkcQkdbXdbYcQkdbPcQkcQkcQkcQkcQkcQkcBYcYichfcsLcsLdbZcBPaaaaaacBRdbRcJKcJKcxNdbRcJKcJKcxNdbRcJKcJKcBRaaaaaaaaaaabaabaaaaaadcacuQbGGbGGcFccuQbGGbGGbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9239,4 +9239,3 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} - diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index 401f5cd6e22..fdaf1531777 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -116,7 +116,7 @@ "cl" = (/obj/docking_port/stationary/transit{dir = 4; dwidth = 11; height = 13; id = "emergency_transit"; name = "emergency in transit"; width = 24},/turf/space/transit,/area/space) "cm" = (/obj/docking_port/stationary/transit{dir = 8; dwidth = 5; height = 7; id = "supply_transit"; name = "supply in transit"; width = 12},/turf/space/transit,/area/space) "cn" = (/obj/machinery/door/airlock/external{aiControlDisabled = 1; frequency = 1379; hackProof = 1; icon_state = "door_locked"; id_tag = "emergency_away"; locked = 1; name = "Arrival Airlock"; req_access = null; req_access_txt = "0"},/turf/unsimulated/floor{name = "plating"},/area/centcom/evac) -"co" = (/turf/unsimulated/wall,/area/prison/solitary) +"co" = (/obj/machinery/computer/cryopod{pixel_y = 32},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "cp" = (/turf/unsimulated/floor{name = "plating"},/area/centcom/ferry) "cq" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 1},/area/centcom/ferry) "cr" = (/turf/unsimulated/floor{name = "plating"},/area/space) @@ -145,20 +145,20 @@ "cO" = (/obj/docking_port/stationary/transit{dir = 8; dwidth = 2; height = 12; id = "ferry_transit"; name = "ferry in transit"; turf_type = /turf/space/transit/horizontal; width = 5},/turf/space/transit/horizontal,/area/space) "cP" = (/obj/docking_port/stationary/transit{dir = 2; dwidth = 3; height = 5; id = "engineering_transit"; name = "engineering in transit"; turf_type = /turf/space/transit/horizontal; width = 7},/turf/space/transit/horizontal,/area/space) "cQ" = (/obj/structure/rack,/obj/item/clothing/glasses/sunglasses{pixel_x = -3; pixel_y = 3},/obj/item/clothing/glasses/hud/health/health_advanced,/obj/item/clothing/glasses/hud/security/sunglasses,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"cR" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/wall,/area/prison/solitary) -"cS" = (/obj/structure/stool/bed,/turf/unsimulated/floor{name = "plating"},/area/prison/solitary) -"cT" = (/turf/unsimulated/floor{icon_state = "platingdmg3"},/area/prison/solitary) -"cU" = (/turf/unsimulated/floor{name = "plating"},/area/prison/solitary) -"cV" = (/obj/effect/decal/cleanable/cobweb2,/turf/unsimulated/floor{name = "plating"},/area/prison/solitary) -"cW" = (/obj/structure/stool/bed,/turf/unsimulated/floor{icon_state = "floorscorched2"},/area/prison/solitary) -"cX" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{name = "plating"},/area/prison/solitary) -"cY" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/weapon/storage/box/buck,/obj/item/weapon/storage/box/buck,/obj/item/weapon/storage/box/buck,/obj/item/weapon/gun/projectile/shotgun/automatic/combat,/obj/item/weapon/gun/projectile/shotgun/automatic/combat,/obj/item/weapon/gun/projectile/shotgun/automatic/combat,/turf/simulated/floor/engine,/area/shuttle/gamma/space) +"cR" = (/obj/structure/flora/ausbushes/lavendergrass,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/specops) +"cS" = (/obj/structure/flora/ausbushes/stalkybush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/specops) +"cT" = (/obj/structure/flora/ausbushes/pointybush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/specops) +"cU" = (/obj/structure/flora/ausbushes/ywflowers,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/specops) +"cV" = (/obj/structure/flora/ausbushes/brflowers,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/specops) +"cW" = (/obj/structure/flora/ausbushes/sparsegrass,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/specops) +"cX" = (/obj/structure/flora/ausbushes/reedbush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/specops) +"cY" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/shuttle/gamma/space) "cZ" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/box/trackimp,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) "da" = (/obj/structure/table/reinforced,/obj/item/weapon/scalpel,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) "db" = (/turf/simulated/floor/holofloor{tag = "icon-carpet2-0 (EAST)"; icon_state = "carpet2-0"; dir = 4},/area/holodeck/source_theatre) "dc" = (/obj/structure/rack,/obj/item/weapon/kitchen/knife/ritual,/turf/unsimulated/floor{dir = 8; icon_state = "chapel"},/area/wizard_station) "dd" = (/obj/structure/rack,/obj/item/weapon/kitchen/knife/ritual,/turf/unsimulated/floor{icon_state = "chapel"},/area/wizard_station) -"de" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/gun/energy/gun/nuclear,/obj/machinery/light{dir = 1},/turf/simulated/floor/engine,/area/shuttle/gamma/space) +"de" = (/obj/structure/flora/ausbushes/fernybush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/control) "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/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) @@ -168,9 +168,9 @@ "dl" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/holodeck/source_knightarena) "dm" = (/obj/structure/holowindow,/turf/simulated/floor/holofloor,/area/holodeck/source_knightarena) "dn" = (/obj/structure/holowindow,/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/holodeck/source_knightarena) -"do" = (/obj/effect/landmark{name = "prisonwarp"},/turf/unsimulated/floor{name = "plating"},/area/prison/solitary) -"dp" = (/turf/unsimulated/floor{icon_state = "floorgrime"},/area/prison/solitary) -"dq" = (/turf/unsimulated/floor{icon_state = "panelscorched"},/area/prison/solitary) +"do" = (/obj/structure/flora/ausbushes/ywflowers,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/control) +"dp" = (/obj/structure/flora/ausbushes/stalkybush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/control) +"dq" = (/obj/structure/flora/ausbushes/sparsegrass,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/control) "dr" = (/obj/structure/holowindow,/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/holodeck/source_knightarena) "ds" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/holofloor{tag = "icon-wood_siding1"; icon_state = "wood_siding1"; dir = 2},/area/holodeck/source_picnicarea) "dt" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/holofloor{tag = "icon-wood_siding1"; icon_state = "wood_siding1"; dir = 2},/area/holodeck/source_picnicarea) @@ -190,8 +190,8 @@ "dH" = (/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) "dI" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/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) "dJ" = (/obj/structure/rack,/obj/item/toy/sword,/obj/item/weapon/gun/projectile/revolver/capgun,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/ninja/holding) -"dK" = (/obj/structure/stool/bed,/turf/unsimulated/floor{icon_state = "panelscorched"},/area/prison/solitary) -"dL" = (/obj/structure/stool/bed,/obj/effect/decal/cleanable/cobweb,/turf/unsimulated/floor{name = "plating"},/area/prison/solitary) +"dK" = (/obj/structure/flora/ausbushes/lavendergrass,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/control) +"dL" = (/obj/structure/flora/ausbushes/fullgrass,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/control) "dM" = (/obj/machinery/prize_counter,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/ninja/holding) "dN" = (/turf/simulated/floor/holofloor{tag = "icon-asteroid3 (EAST)"; icon_state = "asteroid3"; dir = 4},/area/holodeck/source_desert) "dO" = (/turf/simulated/floor/holofloor{tag = "icon-carpet1-0 (EAST)"; icon_state = "carpet1-0"; dir = 4},/area/holodeck/source_theatre) @@ -209,8 +209,8 @@ "ea" = (/obj/machinery/computer/bsa_control/admin,/turf/unsimulated/floor{dir = 5; icon_state = "carpetside"},/area/centcom/control) "eb" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/unsimulated/floor{dir = 8; icon_state = "carpet15-14"; tag = "icon-carpet (WEST)"},/area/centcom/control) "ec" = (/turf/unsimulated/floor{tag = "icon-warnplate (NORTHWEST)"; icon_state = "warnplate"; dir = 9},/area/centcom/control) -"ed" = (/turf/unsimulated/floor{icon_state = "platingdmg1"},/area/prison/solitary) -"ee" = (/turf/unsimulated/floor{icon_state = "floorscorched2"},/area/prison/solitary) +"ed" = (/obj/machinery/door/airlock/centcom{name = "Living Quarters"; opacity = 1; req_access_txt = "102"},/turf/unsimulated/floor{dir = 2; icon_state = "carpetsymbol"},/area/centcom/control) +"ee" = (/obj/structure/table,/obj/item/weapon/card/id/centcom,/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/obj/item/weapon/door_remote/centcomm,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/control) "ef" = (/turf/unsimulated/floor{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/centcom/control) "eg" = (/obj/machinery/bsa/full/admin/east,/turf/unsimulated/floor{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/centcom/control) "eh" = (/turf/unsimulated/floor{tag = "icon-warnplate (NORTHEAST)"; icon_state = "warnplate"; dir = 5},/area/centcom/control) @@ -253,30 +253,30 @@ "eS" = (/turf/unsimulated/floor{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area/centcom/control) "eT" = (/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/centcom/specops) "eU" = (/obj/structure/table/woodentable,/obj/item/stack/spacecash,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"eV" = (/obj/structure/rack,/obj/item/weapon/implanter/adrenalin{pixel_x = 12; pixel_y = -12},/obj/item/weapon/implanter/emp{pixel_x = 9; pixel_y = -9},/obj/item/weapon/implanter/explosive{pixel_x = 6; pixel_y = -6},/obj/item/weapon/implanter/explosive_macro{pixel_x = 3; pixel_y = -3},/obj/item/weapon/implanter/freedom,/obj/item/weapon/implanter/krav_maga{pixel_x = -9; pixel_y = 9},/obj/item/weapon/implanter/mindshield{pixel_x = -6; pixel_y = 6},/obj/item/weapon/implanter/storage{pixel_x = -3; pixel_y = 3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"eW" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/weapon/gun/projectile/automatic/pistol{name = "pistol"},/obj/item/weapon/gun/projectile/automatic/pistol{name = "pistol"},/obj/item/weapon/gun/projectile/automatic/pistol{name = "pistol"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/engine,/area/shuttle/gamma/space) +"eV" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (EAST)"; icon_state = "fakewindows"; dir = 4},/area/centcom/control) +"eW" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (WEST)"; icon_state = "fakewindows"; dir = 8},/area/centcom/control) "eX" = (/obj/structure/flora/tree/pine,/turf/simulated/floor/holofloor{tag = "icon-snow"; icon_state = "snow"},/area/holodeck/source_snowfield) "eY" = (/obj/structure/table/woodentable,/turf/simulated/floor/holofloor{tag = "icon-grimy"; icon_state = "grimy"; dir = 2},/area/holodeck/source_meetinghall) "eZ" = (/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/holodeck/source_basketball) "fa" = (/turf/unsimulated/floor{dir = 2; icon_state = "carpet15-5"},/area/centcom/control) "fb" = (/obj/structure/table/woodentable,/obj/machinery/photocopier{icon_state = "fax"; name = "fax machine"},/obj/item/weapon/photo{name = "butts"},/turf/unsimulated/floor{dir = 10; icon_state = "carpetside"},/area/centcom/control) "fc" = (/obj/machinery/computer/communications,/turf/unsimulated/floor{dir = 6; icon_state = "carpetside"},/area/centcom/control) -"fd" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/ammo_casing/rocket,/obj/item/ammo_casing/rocket,/obj/item/ammo_casing/rocket,/obj/item/weapon/gun/rocketlauncher,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/engine,/area/shuttle/gamma/space) -"fe" = (/obj/structure/table/reinforced,/obj/item/weapon/grenade/clusterbuster,/turf/simulated/floor/engine,/area/shuttle/gamma/space) +"fd" = (/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "CCGAMMA"; name = "Gamma Security"; p_open = 0},/obj/machinery/door/airlock/centcom{name = "Gamma Armory"; opacity = 1; req_access_txt = "114"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/centcom/gamma) +"fe" = (/obj/machinery/cryopod/right,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "ff" = (/turf/unsimulated/wall,/area/ninja/outpost) "fg" = (/turf/unsimulated/wall,/area/ninja/holding) "fh" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (WEST)"; icon_state = "fakewindows"; dir = 8},/area/ninja/holding) "fi" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows2 (WEST)"; icon_state = "fakewindows2"; dir = 8},/area/ninja/holding) "fj" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (EAST)"; icon_state = "fakewindows"; dir = 4},/area/ninja/holding) "fk" = (/turf/unsimulated/wall{desc = "The door appears to be locked tightly."; icon = 'icons/obj/doors/Doorhatchele.dmi'; icon_state = "door_closed"; name = "Locked Door"},/area/ninja/holding) -"fl" = (/obj/machinery/power/apc{dir = 8; name = "Gamma Armory APC"; pixel_x = -27; pixel_y = 2},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/engine,/area/shuttle/gamma/space) -"fm" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/engine,/area/shuttle/gamma/space) -"fn" = (/obj/structure/sign/securearea,/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space) -"fo" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space) -"fp" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space) -"fq" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space) -"fr" = (/obj/structure/cable,/obj/machinery/mech_bay_recharge_port/upgraded,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space) -"fs" = (/obj/machinery/computer/mech_bay_power_console,/obj/structure/cable,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space) +"fl" = (/obj/machinery/cryopod,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"fm" = (/turf/unsimulated/wall,/area/centcom/gamma) +"fn" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/centcom/gamma) +"fo" = (/obj/machinery/porta_turret/centcom/pulse,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/centcom/gamma) +"fp" = (/obj/machinery/camera{c_tag = "CentComm Special Ops. Bathroom"; dir = 2; network = list("ERT","CentComm")},/obj/structure/table/reinforced,/obj/item/weapon/paper,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/centcom/gamma) +"fq" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/centcom/gamma) +"fr" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/centcom/gamma) +"fs" = (/obj/structure/table/reinforced,/obj/machinery/turretid/lethal{ailock = 1; check_synth = 1; name = "Gamma Turret Control Panel"; pixel_x = 0; req_access = list(114)},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/centcom/gamma) "ft" = (/turf/unsimulated/wall{desc = "The door appears to be locked tightly."; icon = 'icons/obj/doors/Doorhatchele.dmi'; icon_state = "door_closed"; name = "Locked Door"},/area/ninja/outpost) "fu" = (/turf/unsimulated/floor{icon_state = "dark"},/area/ninja/outpost) "fv" = (/obj/structure/ninjatele{pixel_y = 25},/turf/unsimulated/floor{icon_state = "dark"},/area/ninja/outpost) @@ -288,8 +288,8 @@ "fB" = (/obj/machinery/vending/boozeomat,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/ninja/holding) "fC" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/ninja/holding) "fD" = (/obj/structure/rack,/obj/item/device/camera,/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/ninja/holding) -"fE" = (/obj/mecha/combat/durand/loaded{operation_req_access = list(1)},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space) -"fF" = (/obj/structure/table/reinforced,/obj/item/weapon/kitchen/knife/combat,/obj/item/weapon/kitchen/knife/combat,/obj/item/weapon/kitchen/knife/combat,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space) +"fE" = (/obj/machinery/porta_turret/centcom/pulse,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/centcom/gamma) +"fF" = (/obj/effect/spawner/window/reinforced,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/gamma) "fG" = (/obj/machinery/computer/arcade,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/ninja/holding) "fH" = (/turf/unsimulated/beach/sand,/area/ninja/holding) "fI" = (/obj/effect/overlay/palmtree_r,/obj/effect/overlay/coconut,/turf/unsimulated/beach/sand,/area/ninja/holding) @@ -499,7 +499,7 @@ "jE" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/marisa,/obj/item/clothing/shoes/sandal/marisa,/obj/item/clothing/head/wizard/marisa,/obj/item/weapon/twohanded/staff/broom,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) "jF" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/magusblue,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/twohanded/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) "jG" = (/obj/structure/rack,/obj/item/weapon/storage/backpack/holding{pixel_x = -3; pixel_y = 3},/obj/item/weapon/storage/backpack/satchel,/obj/item/weapon/storage/backpack/holding{pixel_x = -6; pixel_y = 6},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"jH" = (/obj/structure/table/reinforced,/obj/item/weapon/grenade/chem_grenade/incendiary{name = "Incendiary Grenade"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space) +"jH" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/centcom/gamma) "jI" = (/turf/space,/area/adminconstruction) "jJ" = (/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plating/airless,/area/syndicate_mothership) "jK" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/light,/turf/simulated/floor/plating/airless,/area/syndicate_mothership) @@ -521,6 +521,7 @@ "ka" = (/turf/unsimulated/wall/abductor{icon_state = "alien18"},/area/abductor_ship) "kb" = (/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "kc" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/mugwort,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"kd" = (/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/gamma) "ke" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/red,/obj/item/clothing/shoes/sandal,/obj/item/clothing/head/wizard/red,/obj/item/weapon/twohanded/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) "kf" = (/obj/machinery/light/spot,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) "kg" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/magusred,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/twohanded/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) @@ -620,9 +621,11 @@ "lW" = (/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_source) "lX" = (/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_source) "lY" = (/obj/effect/landmark/abductor/agent{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"lZ" = (/obj/effect/spawner/window/reinforced,/turf/unsimulated/floor{tag = "icon-red (EAST)"; icon_state = "red"; dir = 4},/area/centcom/gamma) "ma" = (/obj/effect/decal/cleanable/molten_object,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) "mb" = (/turf/unsimulated/wall/fakeglass,/area/wizard_station) "mc" = (/obj/item/trash/chips,/obj/machinery/light/spot,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"md" = (/obj/structure/extinguisher_cabinet,/turf/unsimulated/wall,/area/centcom/gamma) "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) @@ -631,7 +634,7 @@ "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) +"mm" = (/obj/structure/stool,/obj/structure/sign/poster/random{pixel_y = 32},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/centcom/control) "mn" = (/obj/structure/stool,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/centcom/control) "mo" = (/obj/structure/stool,/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/unsimulated/floor{tag = "icon-redyellowfull"; icon_state = "redyellowfull"},/area/centcom/control) "mp" = (/obj/structure/stool,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/control) @@ -753,18 +756,48 @@ "oB" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (WEST)"; icon_state = "fakewindows"; dir = 8},/area/syndicate_mothership) "oC" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (EAST)"; icon_state = "fakewindows"; dir = 4},/area/syndicate_mothership) "oD" = (/turf/unsimulated/floor/snow,/obj/structure/flora/bush,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (WEST)"; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership) +"oE" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/shuttle/gamma/space) +"oF" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/shuttle/gamma/space) +"oG" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/shuttle/gamma/space) "oH" = (/obj/structure/table,/obj/item/weapon/storage/fancy/crayons,/obj/item/weapon/storage/fancy/crayons,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) "oI" = (/obj/machinery/washing_machine,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) +"oJ" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/weapon/gun/projectile/automatic/pistol{name = "pistol"},/obj/item/weapon/gun/projectile/automatic/pistol{name = "pistol"},/obj/item/weapon/gun/projectile/automatic/pistol{name = "pistol"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) +"oK" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/centcom/gamma) +"oL" = (/turf/unsimulated/floor{tag = "icon-red (EAST)"; icon_state = "red"; dir = 4},/area/centcom/gamma) +"oM" = (/obj/machinery/door/airlock/centcom{name = "Team Storage"; opacity = 1; req_access_txt = "109"},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/specops) +"oN" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/ammo_box/shotgun/buck,/obj/item/ammo_box/shotgun/buck,/obj/item/ammo_box/shotgun/buck,/obj/item/weapon/gun/projectile/shotgun/automatic/combat,/obj/item/weapon/gun/projectile/shotgun/automatic/combat,/obj/item/weapon/gun/projectile/shotgun/automatic/combat,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) "oO" = (/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) +"oP" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/weapon/gun/energy/sniperrifle,/obj/item/weapon/gun/energy/sniperrifle,/obj/item/weapon/gun/energy/sniperrifle,/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/obj/machinery/ai_status_display{pixel_y = 32},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) "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) +"oS" = (/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_x = 6; pixel_y = 6; 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_x = -6; pixel_y = 6; 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_x = 6; pixel_y = -6; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "CCGAMMA"; name = "Gamma Lockdown"; pixel_x = -6; pixel_y = -6; req_access_txt = "114"},/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/centcom/specops) +"oT" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/centcom/gamma) +"oU" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/centcom/gamma) +"oV" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/centcom/gamma) +"oW" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/gun/energy/gun/nuclear,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) +"oX" = (/obj/machinery/door/airlock/centcom{name = "Prison"; opacity = 1; req_access_txt = "104"},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops) +"oY" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/flora/ausbushes,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/specops) +"oZ" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/flora/ausbushes/fernybush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/specops) "pa" = (/obj/structure/noticeboard{pixel_x = -32},/obj/item/weapon/paper/syndimemo,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) +"pb" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/flora/ausbushes/leafybush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/specops) "pc" = (/mob/living/simple_animal/pet/fox/Syndifox,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "pd" = (/obj/effect/decal/warning_stripes/southeastcorner,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "pe" = (/obj/effect/decal/warning_stripes/south,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) +"pf" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) +"pg" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "16"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) +"ph" = (/obj/machinery/recharger/wallcharger{pixel_x = 32},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) +"pi" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "15"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) +"pj" = (/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) +"pk" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/ammo_casing/rocket,/obj/item/ammo_casing/rocket,/obj/item/ammo_casing/rocket,/obj/item/weapon/gun/rocketlauncher,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) "pl" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "pm" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/cans/beer{pixel_x = -2; pixel_y = 5},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) +"pn" = (/obj/machinery/door/airlock/shuttle,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) +"po" = (/obj/structure/table/reinforced,/obj/item/weapon/grenade/clusterbuster,/obj/item/weapon/grenade/chem_grenade/incendiary{name = "Incendiary Grenade"},/obj/item/weapon/kitchen/knife/combat,/obj/item/weapon/kitchen/knife/combat,/obj/item/weapon/kitchen/knife/combat,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) "pp" = (/obj/machinery/computer/telecrystals/uplinker,/turf/unsimulated/floor{icon_state = "floor4"},/area/syndicate_mothership) +"pq" = (/obj/machinery/camera{c_tag = "CentComm Special Ops. Bathroom"; dir = 2; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) +"pr" = (/obj/machinery/door/airlock/centcom{name = "Bathroom"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"ps" = (/obj/machinery/telecomms/server/presets/centcomm,/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/control) +"pt" = (/obj/machinery/door/airlock/shuttle{req_access_txt = "0"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) "pu" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (NORTHWEST)"; icon_state = "fakewindows"; dir = 9},/area/syndicate_mothership) "pv" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows2 (WEST)"; icon_state = "fakewindows2"; dir = 8},/area/syndicate_mothership) "pw" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice{pixel_x = -5; pixel_y = 5},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) @@ -772,8 +805,22 @@ "py" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows2 (NORTH)"; icon_state = "fakewindows2"; dir = 1},/area/syndicate_mothership) "pz" = (/turf/unsimulated/floor{icon_state = "floor"},/area/syndicate_mothership) "pA" = (/obj/machinery/light,/turf/unsimulated/floor{icon_state = "floor"},/area/syndicate_mothership) +"pB" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{dir = 4; pixel_x = 32; pixel_y = 0},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) "pC" = (/obj/machinery/door/poddoor{id_tag = "nukeop_ready"; name = "Shuttle Dock Door"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) +"pD" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/shuttle/gamma/space) +"pE" = (/obj/structure/stool/bed,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "pF" = (/turf/unsimulated/wall/fakeglass,/area/syndicate_mothership) +"pG" = (/obj/structure/toilet{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) +"pH" = (/obj/machinery/door/airlock/centcom{name = "Prison Cell"; opacity = 1; req_access_txt = "104"},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/specops) +"pI" = (/obj/structure/flora/ausbushes/lavendergrass,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac) +"pJ" = (/obj/structure/flora/ausbushes/stalkybush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac) +"pK" = (/obj/structure/flora/ausbushes/pointybush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac) +"pL" = (/obj/structure/flora/ausbushes/ywflowers,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac) +"pM" = (/obj/structure/flora/ausbushes/brflowers,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac) +"pN" = (/obj/structure/flora/ausbushes/sparsegrass,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac) +"pO" = (/obj/structure/flora/ausbushes,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac) +"pP" = (/obj/structure/flora/ausbushes/leafybush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac) +"pQ" = (/obj/structure/closet/secure_closet/brig,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "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) @@ -781,36 +828,79 @@ "pV" = (/obj/effect/decal/warning_stripes/north,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "pW" = (/obj/machinery/door/airlock/centcom{name = "Restroom"; opacity = 1; req_access_txt = "150"},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "pX" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) +"pY" = (/obj/structure/closet/secure_closet/brig,/obj/machinery/camera{c_tag = "CentComm Special Ops. Ready Room East"; dir = 8; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"pZ" = (/obj/structure/flora/ausbushes/grassybush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac) +"qa" = (/obj/structure/flora/ausbushes/fullgrass,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac) +"qb" = (/obj/structure/flora/ausbushes/fernybush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac) +"qc" = (/obj/effect/spawner/window/reinforced,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac) +"qd" = (/obj/machinery/door/airlock/centcom{name = "Medical Treatment Post"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac) +"qe" = (/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/centcom/evac) "qf" = (/obj/effect/decal/warning_stripes/southeastcorner,/obj/item/device/radio/intercom/syndicate{pixel_x = -28},/turf/unsimulated/floor{dir = 2; icon_state = "wood"},/area/syndicate_mothership) "qg" = (/obj/effect/landmark{name = "Syndicate-Spawn"},/obj/effect/decal/warning_stripes/south,/turf/unsimulated/floor{dir = 2; icon_state = "wood"},/area/syndicate_mothership) "qh" = (/obj/effect/decal/warning_stripes/south,/turf/unsimulated/floor{dir = 2; icon_state = "wood"},/area/syndicate_mothership) "qi" = (/obj/effect/decal/warning_stripes/southwestcorner,/turf/unsimulated/floor{dir = 2; icon_state = "wood"},/area/syndicate_mothership) "qj" = (/obj/machinery/door/window{dir = 4; name = "Uplink Management Control"; req_access_txt = "151"},/turf/unsimulated/floor{dir = 2; icon_state = "wood"},/area/syndicate_mothership) +"qk" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/centcom/evac) +"ql" = (/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/centcom/evac) +"qm" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/centcom/evac) +"qn" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/centcom/evac) +"qo" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/centcom/evac) +"qp" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/centcom/evac) +"qq" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/centcom/evac) "qr" = (/obj/structure/sign/double/map/left{pixel_y = -32},/obj/effect/decal/warning_stripes/west,/obj/machinery/light,/obj/structure/rack/skeletal_bar/left,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka,/turf/unsimulated/floor{dir = 2; icon_state = "wood"},/area/syndicate_mothership) +"qs" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/centcom/evac) "qt" = (/obj/machinery/computer/telecrystals/boss,/turf/unsimulated/floor{icon_state = "floor4"},/area/syndicate_mothership) "qu" = (/obj/structure/sign/double/map/right{pixel_y = -32},/obj/structure/rack/skeletal_bar/right,/obj/item/weapon/reagent_containers/food/drinks/bottle/gin,/turf/unsimulated/floor{dir = 2; icon_state = "wood"},/area/syndicate_mothership) +"qv" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/centcom/evac) "qw" = (/obj/machinery/door/airlock/multi_tile/glass{name = "Equipment Room"; opacity = 0; req_access_txt = "150"},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) +"qx" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; initialize_directions = 10},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/centcom/evac) +"qy" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1; name = "Connector Port (Air Supply)"},/obj/machinery/portable_atmospherics/canister/oxygen{name = "Canister: \[O2] (CRYO)"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHWEST)"; icon_state = "whiteblue"; dir = 10},/area/centcom/evac) +"qz" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 0; pixel_y = 0},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/centcom/evac) +"qA" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1; name = "Connector Port (Air Supply)"},/obj/machinery/portable_atmospherics/canister/oxygen{name = "Canister: \[O2] (CRYO)"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/centcom/evac) +"qB" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHEAST)"; icon_state = "whiteblue"; dir = 6},/area/centcom/evac) +"qC" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/adv,/obj/item/weapon/storage/firstaid/brute,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/centcom/evac) "qD" = (/turf/unsimulated/floor{dir = 2; icon_state = "stage_stairs"},/area/syndicate_mothership) "qE" = (/obj/machinery/mech_bay_recharge_port/upgraded,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/unsimulated/floor,/area/syndicate_mothership) "qF" = (/turf/simulated/floor/mech_bay_recharge_floor,/area/syndicate_mothership) "qG" = (/obj/machinery/computer/mech_bay_power_console,/turf/unsimulated/floor,/area/syndicate_mothership) "qH" = (/obj/machinery/vending/tool,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/syndicate_mothership) +"qI" = (/turf/unsimulated/wall,/area/centcom/suppy) +"qJ" = (/obj/structure/stool/bed,/turf/unsimulated/floor{name = "plating"},/area/centcom) +"qK" = (/obj/structure/toilet{dir = 8},/turf/unsimulated/floor{icon_state = "platingdmg3"},/area/centcom) "qL" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/syndicate_mothership) "qM" = (/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/syndicate_mothership) +"qN" = (/obj/structure/toilet{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/centcom) +"qO" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/toilet{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/centcom) +"qP" = (/obj/effect/decal/cleanable/blood,/obj/structure/toilet{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/centcom) +"qQ" = (/obj/structure/stool/bed,/turf/unsimulated/floor{icon_state = "floorscorched2"},/area/centcom) +"qR" = (/obj/effect/landmark{name = "prisonwarp"},/turf/unsimulated/floor{name = "plating"},/area/centcom) +"qS" = (/turf/unsimulated/floor{icon_state = "floorgrime"},/area/centcom) +"qT" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{name = "plating"},/area/centcom) +"qU" = (/turf/unsimulated/floor{icon_state = "panelscorched"},/area/centcom) +"qV" = (/turf/unsimulated/floor{name = "plating"},/area/centcom) +"qW" = (/turf/unsimulated/floor{icon_state = "platingdmg3"},/area/centcom) "qX" = (/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows3"; tag = "icon-fakewindows (WEST)"},/area/syndicate_mothership) +"qY" = (/turf/unsimulated/wall{desc = "The door appears to be locked tightly."; icon = 'icons/obj/doors/Doorhatchele.dmi'; icon_state = "door_closed"; name = "Locked Door"},/area/centcom) +"qZ" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows3"; tag = "icon-fakewindows (WEST)"},/area/centcom) +"ra" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom) +"rb" = (/obj/machinery/camera{c_tag = "CentComm Special Ops. Bathroom"; dir = 2; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom) +"rc" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom) +"rd" = (/obj/effect/landmark{name = "prisonwarp"},/turf/unsimulated/floor{icon_state = "panelscorched"},/area/centcom) "re" = (/obj/structure/closet/syndicate/personal,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/syndicate_mothership) "rf" = (/obj/structure/table,/obj/item/weapon/gun/energy/ionrifle,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/syndicate_mothership) +"rg" = (/obj/effect/decal/cleanable/cobweb,/obj/effect/landmark{name = "prisonwarp"},/turf/unsimulated/floor{name = "plating"},/area/centcom) +"rh" = (/obj/structure/toilet{dir = 8},/turf/unsimulated/floor{icon_state = "platingdmg1"},/area/centcom) +"ri" = (/obj/structure/toilet{dir = 8},/turf/unsimulated/floor{icon_state = "floorscorched2"},/area/centcom) +"rj" = (/obj/structure/rack,/obj/item/weapon/implanter/adrenalin{pixel_x = 12; pixel_y = -12},/obj/item/weapon/implanter/emp{pixel_x = 9; pixel_y = -9},/obj/item/weapon/implanter/explosive{pixel_x = 6; pixel_y = -6},/obj/item/weapon/implanter/explosive_macro{pixel_x = 3; pixel_y = -3},/obj/item/weapon/implanter/freedom,/obj/item/weapon/implanter/krav_maga{pixel_x = -9; pixel_y = 9},/obj/item/weapon/implanter/mindshield{pixel_x = -6; pixel_y = 6},/obj/item/weapon/implanter/storage{pixel_x = -3; pixel_y = 3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"rk" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/shuttle/gamma/space) +"rl" = (/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) +"rm" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/mech_bay_recharge_port/upgraded,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) +"rn" = (/obj/machinery/power/apc{dir = 2; name = "Gamma Armory APC"; pixel_y = -24},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) +"ro" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/computer/mech_bay_power_console,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) +"rp" = (/obj/mecha/combat/durand/loaded{operation_req_access = list(1)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/mech_bay_recharge_floor,/area/shuttle/gamma/space) "rE" = (/turf/unsimulated/wall,/area/start) "rH" = (/obj/effect/landmark/start,/turf/unsimulated/floor,/area/start) "rK" = (/turf/unsimulated/wall/splashscreen,/area/start) -"rV" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/weapon/gun/energy/sniperrifle,/obj/item/weapon/gun/energy/sniperrifle,/obj/item/weapon/gun/energy/sniperrifle,/turf/simulated/floor/engine,/area/shuttle/gamma/space) -"rX" = (/turf/simulated/floor/engine,/area/shuttle/gamma/space) -"sa" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space) -"sb" = (/turf/simulated/floor/plasteel{tag = "icon-stage_stairs"; icon_state = "stage_stairs"},/area/shuttle/gamma/space) -"se" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-stage_stairs"; icon_state = "stage_stairs"},/area/shuttle/gamma/space) -"sf" = (/obj/machinery/door/airlock/hatch/gamma{locked = 1; req_access_txt = "1"; use_power = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/space) -"sg" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space) -"sm" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/table/reinforced,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space) "sq" = (/turf/unsimulated/wall,/area/centcom/control) "sr" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "ss" = (/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) @@ -857,7 +947,7 @@ "tl" = (/obj/machinery/mass_driver{dir = 8; drive_range = 50; id_tag = "ASSAULT3"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops) "tm" = (/turf/unsimulated/floor{icon_state = "loadingarea"; dir = 8},/area/centcom/specops) "tn" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"to" = (/obj/structure/sign/poster/legit{pixel_x = -32},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/centcom/control) +"to" = (/obj/structure/sign/poster/random{pixel_x = -32},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/centcom/control) "tp" = (/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -6},/obj/structure/table,/turf/unsimulated/floor{tag = "icon-redyellowfull"; icon_state = "redyellowfull"},/area/centcom/control) "tq" = (/obj/machinery/vending/dinnerware{req_access_txt = "102"},/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/control) "tr" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/food/condiment/enzyme,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/control) @@ -868,7 +958,6 @@ "tw" = (/obj/machinery/mass_driver{dir = 8; drive_range = 50; id_tag = "ASSAULT2"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops) "tx" = (/obj/machinery/door/airlock/centcom{name = "Commander Quarters"; opacity = 1; req_access_txt = "114"},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/centcom/control) "ty" = (/obj/machinery/vending/cigarette,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/centcom/control) -"tz" = (/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/control) "tA" = (/obj/machinery/computer/pod/deathsquad,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "tB" = (/obj/structure/table,/turf/unsimulated/floor{dir = 9; icon_state = "carpetside"},/area/centcom/control) "tC" = (/turf/unsimulated/floor{dir = 1; icon_state = "carpetside"},/area/centcom/control) @@ -882,8 +971,6 @@ "tK" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/unsimulated/floor{dir = 10; icon_state = "carpetside"},/area/centcom/control) "tL" = (/turf/unsimulated/floor{dir = 2; icon_state = "carpetside"},/area/centcom/control) "tM" = (/turf/unsimulated/floor{dir = 6; icon_state = "carpetside"},/area/centcom/control) -"tN" = (/turf/unsimulated/floor{dir = 2; icon_state = "carpetsymbol"},/area/centcom/control) -"tO" = (/obj/structure/table,/obj/item/weapon/card/id/centcom,/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/control) "tQ" = (/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/control) "tR" = (/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "tS" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 4},/area/centcom/control) @@ -908,8 +995,6 @@ "ul" = (/obj/effect/landmark{name = "Response Team"},/obj/effect/landmark{name = "Commando"},/obj/machinery/camera{c_tag = "CentComm Special Ops. Starting Room"; dir = 2; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "um" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/obj/item/device/radio/intercom/specops{pixel_y = 25},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "un" = (/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows3"; tag = "icon-fakewindows (WEST)"},/area/centcom/specops) -"uo" = (/turf/unsimulated/floor{icon_state = "asteroid6"; name = "sand"},/area/centcom/specops) -"up" = (/obj/structure/extinguisher_cabinet,/turf/unsimulated/wall,/area/centcom/specops) "uq" = (/obj/machinery/door/airlock/centcom{name = "Special Operations"; opacity = 1; req_access_txt = "109"},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) "ur" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) "us" = (/obj/structure/stool/bed/chair{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) @@ -923,7 +1008,6 @@ "uA" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (WEST)"; icon_state = "fakewindows"; dir = 8},/area/centcom/specops) "uB" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows2 (WEST)"; icon_state = "fakewindows2"; dir = 8},/area/centcom/specops) "uC" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (EAST)"; icon_state = "fakewindows"; dir = 4},/area/centcom/specops) -"uD" = (/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "uE" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 1},/area/centcom/control) "uF" = (/obj/structure/table/reinforced,/obj/item/device/radio/intercom/specops,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "uG" = (/obj/item/device/radio/intercom/specops{pixel_y = 25},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) @@ -941,7 +1025,6 @@ "uS" = (/obj/machinery/camera{c_tag = "CentComm Special Ops. Ready Room East"; dir = 8; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "uT" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows3"; tag = "icon-fakewindows (WEST)"},/area/centcom/specops) "uU" = (/obj/machinery/door/airlock/centcom{name = "Special Operations Command"; opacity = 1; req_access_txt = "114"},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) -"uV" = (/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "uW" = (/obj/structure/urinal,/turf/unsimulated/wall,/area/centcom/specops) "uX" = (/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "va" = (/obj/structure/table/reinforced,/obj/effect/landmark{name = "Commando_Manual"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) @@ -953,9 +1036,7 @@ "vg" = (/obj/structure/stool/bed/chair/office/dark,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "vh" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "vi" = (/obj/machinery/computer/med_data,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) -"vj" = (/obj/structure/toilet{dir = 4},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) "vk" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) -"vl" = (/obj/effect/decal/cleanable/vomit{name = "urine"},/obj/machinery/camera{c_tag = "CentComm Special Ops. Bathroom"; dir = 2; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) "vm" = (/obj/structure/table/reinforced,/obj/item/ashtray/glass{icon_state = "ashtray_half_gl"},/obj/item/weapon/cigbutt/cigarbutt{pixel_x = 3; pixel_y = 3},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "vn" = (/obj/machinery/door/poddoor/shutters{dir = 8; id_tag = "specopsoffice"; name = "Privacy Shutters"},/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows2 (NORTH)"; icon_state = "fakewindows2"; dir = 1},/area/centcom/specops) "vo" = (/turf/unsimulated/floor{dir = 9; icon_state = "carpetside"},/area/centcom/specops) @@ -973,14 +1054,10 @@ "vA" = (/obj/structure/table/woodentable{dir = 9},/obj/item/ashtray/glass{icon_state = "ashtray_half_gl"},/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/centcom/specops) "vB" = (/obj/machinery/computer/security/telescreen{name = "Special Ops. Monitor"; desc = "Used for watching the Special Ops."; network = list("ERT")},/obj/structure/table/woodentable{dir = 5},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/specops) "vC" = (/obj/structure/table/woodentable{dir = 5},/obj/item/device/radio/intercom/specops,/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/centcom/specops) -"vE" = (/obj/machinery/telecomms/server/presets/centcomm,/turf/unsimulated/floor{icon_state = "green"; dir = 9},/area/centcom/control) "vF" = (/obj/machinery/door/airlock/centcom{name = "Telecommunications"; opacity = 1; req_access_txt = "107"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) -"vG" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 4; pixel_x = -32; pixel_y = 0},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) -"vH" = (/obj/item/device/radio/intercom/specops{pixel_y = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) "vI" = (/obj/machinery/camera{c_tag = "CentComm Special Ops. Ready Room South"; dir = 1; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "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) "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) "vS" = (/obj/machinery/newscaster/security_unit{pixel_x = -32},/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/specops) @@ -1034,8 +1111,6 @@ "xI" = (/obj/machinery/door/airlock/centcom{name = "Unit 2"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom) "xJ" = (/obj/machinery/door/poddoor{id_tag = "CentComPort"; name = "Security Doors"},/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/evac) "xK" = (/obj/structure/table,/obj/machinery/door/window/southleft{name = "security checkpoint"; req_access_txt = "104"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac) -"xL" = (/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac) -"xM" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac) "xR" = (/obj/machinery/door/airlock/centcom{name = "Bathroom"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/evac) "xS" = (/turf/unsimulated/floor{icon_state = "green"; dir = 1},/area/centcom/evac) "xW" = (/obj/machinery/door/airlock/centcom{name = "Unit 1"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom) @@ -1417,13 +1492,13 @@ ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapap ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdkdjdjdjdlbsbqbObqbqbqbsbPbQbPbQbPbsbIbIbIbIbIbsbxbxbxbxbxbsbybybybybybsbzbzbzbzbzbsbLbMbMbMbNbD ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdkdjdjdjdlbsbqbqbRbSbqbsbTbTbTbTbTbsbUbUbUbUbVbsbxbxbxbxbxbsbybybybybybsbzbzbzbzbzbsbLbMbMbMbNbD ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdndmdmdmdrbscabqbqbqbqbscbcccdcccebscfcgchcicfbsbxbxbJbxbxbsbybybybybybsbzbzbzbzbzbsbLbMbMbMbNbD -ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNcocococococococococococococococoaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdxdvdvdvdybsbqcabqbqctbscucccdcccvbscfcwcxcycfbsbxbxbJbxbxbsbybybybybybsbzbzbzbzbzbsczbMbMbMcAbD -ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNcRcScTcocScUcocScVcocWcXcocScUcoaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdzdjdjdjdAbsbqbEcabqbRbsbTbTbTbTbTbsdbcwcxcydbbsbxbxbxbxbxbsbybybybybybsbzbzbzbzbzbsczbMbMbMcAbD -ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNcododpcodocXcododqcodocUcodocTcoaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdzdjdjdjdAbsbqbqbqcabqbsdsdtdsdtdsbsducwcxcydubsbxbxbxbxbxbsbybybybybybsbzbzbzbzbzbsczbMbMbMcAbD -ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapaparapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNcocococococococococococococococoaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdzdjdjdjdAbsbqdGbqbqcabsbGbHbGbHbGbsducwcxcydubsbxbJbxbJbxbsbybybybybybsbzbKbzbKbzbsczbMbMbMcAbD -ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNcocSdpcodKcTcocScTcodLcUcocScXcoaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdCdBdBdBdDbsbRbqdNbqbEbsbtbubtbubtbsdOdPdQdRdObsbxbxbxbxbxbsbybybybybybsbzbzbzbzbzbsdSdTdTdTdUbD -ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNcodocTcodocUcodocUcodoedcodoeecoaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNhyhzhzhzhzhzbZejejejejejbZejejejejejbZejejejejejbZekekekekekbZekekekekekbZekekekekekbZekekekekekel -ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNcocococococococococococococococoaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpeneoepeneobseqeqeqeqeqbserererererbseseseteueubsevevevevevbsewexexexeybsezeAeAeAeBbD +ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdxdvdvdvdybsbqcabqbqctbscucccdcccvbscfcwcxcycfbsbxbxbJbxbxbsbybybybybybsbzbzbzbzbzbsczbMbMbMcAbD +ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdzdjdjdjdAbsbqbEcabqbRbsbTbTbTbTbTbsdbcwcxcydbbsbxbxbxbxbxbsbybybybybybsbzbzbzbzbzbsczbMbMbMcAbD +ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdzdjdjdjdAbsbqbqbqcabqbsdsdtdsdtdsbsducwcxcydubsbxbxbxbxbxbsbybybybybybsbzbzbzbzbzbsczbMbMbMcAbD +ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapaparapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdzdjdjdjdAbsbqdGbqbqcabsbGbHbGbHbGbsducwcxcydubsbxbJbxbJbxbsbybybybybybsbzbKbzbKbzbsczbMbMbMcAbD +ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdCdBdBdBdDbsbRbqdNbqbEbsbtbubtbubtbsdOdPdQdRdObsbxbxbxbxbxbsbybybybybybsbzbzbzbzbzbsdSdTdTdTdUbD +ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNhyhzhzhzhzhzbZejejejejejbZejejejejejbZejejejejejbZekekekekekbZekekekekekbZekekekekekbZekekekekekel +ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpeneoepeneobseqeqeqeqeqbserererererbseseseteueubsevevevevevbsewexexexeybsezeAeAeAeBbD ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckbockckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpeoepeneoepbseqeDeqeqeqbsereEeFeGerbseHeHeIeJeJbseveKeveLevbseMeNeNeNeObsePeQeQeQeRbD ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapavapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpepeneoepenbseqeqeqeXeqbsereYeYeYerbseHeZeZeZeJbsevevevevevbseMeNeNeNeObsePeQeQeQeRbD ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNfffffffffffgfgfhfififjfgfgfgfgfgfgfgfgfgfkfgfgfgaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpeneoepeneobseqeqeqeqeqbserererererbseHeIeIeIeJbsevevevevevbseMeNeNeNeObsePeQeQeQeRbD @@ -1507,13 +1582,13 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaq aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNoDaeababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNalabababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaNaNaNaNaNabaNaNaNaNaNabaNaNaNaNaNalabababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNbZbZbZbZbZbZbZbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaNaNaNaNaNabaiaNaNaNaiabaNaNaNaNaNalabababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNbZcYeWderVfdfebZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaiaNaNaNaiabababababababaiaNaNaNaiababaeabnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNbZflfmrXrXrXrXbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababababababababababababababababababababababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNbZsasesbsbsafnbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNsffofqfpsgsgsgbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNbZfrfEfssmfFjHbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNbZbZbZbZbZbZbZbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaNaNaNaNaNabaiaNaNaNaiabaNaNaNaNaNalabababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaiaNaNaNaiabababababababaiaNaNaNaiababaeabnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababababababababababababababababababababababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN @@ -1537,77 +1612,77 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsqsqsqsqsqsysEmnsMsNmnsEsEsOmosqsQsQsQsQsqsRsSsTsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsvsEsEsEsEsEsEsEsEsysysqsQsUsVsVsqsqsWsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsqaNaNaNsvsEsEsEsEsEsEsEsEsEsEsusQmpmpsQsQsQsQsZsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXtatbtctdtdtesqsqsqsqsqsEsEmnsMsCmnsEsEsEsEsEsQsQsQsQtfsQsQtgsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititititjtktitititjtltmtntdtdtdsqsrssstsqtosEmnsMtpmnsEsEsEsEsutqsQsQsQtrsQsQtssqsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXtatttutdtdtdsqswsssssxsEsEsEsEsEsEsEsEsEsEsqsusususususususqsqdWdXsqsqsqsqsqsqsqsqsqsqsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititititvtktitititvtwtmtntdtdtdsqsqsqsqsqsqsqtxsqsqsqsqsEsEtysqtztztztztztztzsudZdYebeasuecefefefefefegefefefeheiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXtatttutdtdtAsqtBtCtDsqtEtFtFtFtFtGsqsEsEtHsqtztztztztztztzsufbfatLfcsuemeCeCeCeCeCeCeCeCeCeSeiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititititItktitititItJtmtntdtdtdsqtKtLtMtNtFtFtFtFtFtOsqsusxsusqsusususususususqsqfLsqsqsqsqsqsqsqsqsqsqsqsqsqsqfXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXtatttutdtdtdsqsqsususqsqsqsususususqtQtRtStTtTtTtTtTtTtTtTtTuEtRtZsqfXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititititVtktitititVtWtXtYtdtdtdsqtztztztztztztztztztzsqtQtRtRtRtRtRtRtRtRtRtRtRtRtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXuaubsXsqsqsqsqsqsqsqsXsXsXsXsqtQtRucudududududududududuetRtZsqaNaNoeodododododododofaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXufuguguhuiujujujsXukukukukulukumunuououosqtQtRtZsususususususususutQtRtZsqaNaNohogojoioioioiokohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNupujujujujujujujujuqururururururussXsXsXsXsqtQtRtZsuutuuuvuwuxuyuzsutQtRtZsqaNaNohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNupujujujujujujujujsXuAuBuBuBuBuBuCsXuDuDuDsquEtRtSsuuFtRuGuHtRtRtRsuuEtRtZsqsqsqohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXujujujuIuIujujujuJuKuKuKuKuKuKuKuLuKuKuKuMtRtRtRuNtRtRtRtRtRtRtRuNtRtRtZoltRolomogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXujujuOuPuQuRujuSsXsXuTuUuTsXsXunsXuVuVuVsquetRucsutRtRtRtRtRtRtRsuuetRtZsqsqsqohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXuWsXsXujuXuRooonvavbujvcvdvdvdvdvesXuosXsXsXsXsqtQtRtZsuvfuuvgvgvgvhvisutQtRtZsqaNaNohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvjvkvlsXujujvauRvmuRujujvnvdvovpvqvdsXsXsXvrtTtUsqtQtRtZsqsqvsvtvuvvvwsqsqtQtRtZsqaNaNohogogogopogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvkvkvkvxujujujvyvyujujujvzvdvAvBvCbesXvEtTuEtRtRvFtRtRtZsqsqsusususususqsqtQtRtZsqaNaNoqodododododododoraNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXvGvHsXvIvJujujujujvLujsXvdvMmjeTvPsXvQtRtRtRtZsutQtRtStTtTtTtTtTtTtTtTtTuEtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXbfbfsXsXsXvSvTvUvVvdsXvWtRtRtRvXsutQtRtRtRtRtRtRtRtRtRtRtRtRtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwbwcwdwbwesXiDwgwhwiwjsXwkudududwlsuwmudududududuetRucudududududwnsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwrwswtwrwesXsXsXsXsXsXsXsqsqsqsqsqsqsqsqsqsqsqsqsqwusqsqsqsqsqsqsqsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwCwDwEwFwGwCwHwIwJwKwLwMwNwOwPwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwCwCwCwIwIwIwIwIwIwKxcxdxexdxfwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbgsXaNaNaNaNaNwCwDxlwIwIwIwIwIwIwKxmxnwNxoxfwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwCwCwCwIxxwCwHwIwJwKxyxzxAxzxzwKwKwKwKwKwKwKwKwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbYbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwCwDxIwIxxwCwCwCwKwKxJxzxKxzwLwPxzxLxLxMxLxLxMwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwCwCwCwIwIwIwIwIxRwLxSxSxSxSwMxfxdxLwKxzxzxzxzxzxzxzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwCwDxWwIwIwIwIwIxRxmxXxYwNxXxYxfxdxLwKxZxZxZwNcnytcnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyaybycydyeaNazaNaNaNaAaNyaybycydyeaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwCwCwCyfyfyfyfyfwKxmxXxYwNxXxYxfxzxLwKwNwNwNygxzxzxzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyiyjyjyjykylaBylylylaBylyoyjyjyjyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxdxmxXxYwNxXxYxfypxdwKyqwNwNyrcnytcncDaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyiyvyvywyxyyyNyAyByCyNyyyEyFyvyvyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxdxmxXxYwNxXxYxfyGytyGwNwNwNyHxzxzxzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyiyvyvyKyLyMyNyMyOyMyNyMyPyKyvyvyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKxyyQyQyQyRwNxfypxdwKyqwNwNwNwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNySyFyvyTyMyNyNyNyNyNyNyNyMyTyvywyUaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKwKwKwKxdxdwKwKxmwNxfxdxLwKwNwNwNwNwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNySylyoyWyXyYyZyNzazbyNzcykylyUaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXtatbtctdtdtesqsqsqsqsqsEsEmnsMsCmnsEsEsEsEsEsQsQsQsQtfsQsQtgsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititjtktitititjtltmtntdtdtdsqsrssstsqtosEmnsMtpmnsEsEsEsEsutqsQsQsQtrsQsQtssqsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXtatttutdtdtdsqswsssssxsEsEsEsEsEsEsEsEsEsEsqsusususususususqsqdWdXsqsqsqsqsqsqsqsqsqsqsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititvtktitititvtwtmtntdtdtdsqsqsqsqsqsqsqtxsqsqsqsqsEsEtysqcScRcUcTcWcVcXsudZdYebeasuecefefefefefegefefefeheiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXtatttutdtdtAsqtBtCtDsqtEtFtFtFtFtGsqsEsEtHsqdodedqdpdLdKdesufbfatLfcsuemeCeCeCeCeCeCeCeCeCeSeiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititItktitititItJtmtntdtdtdsqtKtLtMedtFtFtFtFtFeesqsusxsusqsusususususususqsqfLsqsqsqsqsqsqsqsqsqsqsqsqsqsqfXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXtatttutdtdtdsqsqeWeVsqeWeVsqsqsqsqsqtQtRtStTtTtTtTtTtTtTtTtTuEtRtZsqfXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititVtktitititVtWtXtYtdtdtdsXaNaNaNaNaNaNsXfecoflsqtQtRtRtRtRtRtRtRtRtRtRtRtRtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmsXsXsXsXsXsXuaubsXsXsXsXsXsXsXsXsXfeujflsqtQtRucudududududududududuetRtZsqaNaNoeodododododododofaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmcYoEoEoEoEoFfmfofnfqfpfsfrfnfEfmufuguguhuiujujujsXukukukukulukumunfeujflsqtQtRtZsususususususususutQtRtZsqaNaNohogojoioioioiokohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmoGoNoJoWoPoGfmjHfFkdkdkdkdfFlZmdujujujujujujujujuqururururururussXfeujflsqtQtRtZsuutuuuvuwuxuyuzsutQtRtZsqaNaNohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpgpfpfpfphoGfmoKkdkdkdkdkdkdoLmdujujujujujujujujsXuAuBuBuBuBuBuCsXsXoMsXsquEtRtSsuuFtRuGuHtRtRtRsuuEtRtZsqsqsqohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpipfpkpopfptfdoUoToToToToToToVfdujujujuIuIujujujuJuKuKuKuKuKuKuKuLuKuKuKuMtRtRtRuNtRtRtRtRtRtRtRuNtRtRtZoltRolomogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmoGpjpfpfrloGfmfmfmfmfmfmfmfmfmfmujujuOuPuQuRujuSsXsXuTuUuTsXsXoXsXoZoYpbsquetRucsutRtRtRtRtRtRtRsuuetRtZsqsqsqohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpnrnrmrprooGfmaNaNaNaNaNaNaNaNsXujuXuRooonvavbujvcvdvdvdvdvesXuKsXsXsXsXsqtQtRtZsuvfuuvgvgvgvhvisutQtRtZsqaNaNohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpDoEoEoEoErkfmaNaNaNaNsXuWuWsXsXujujvauRvmuRujujvnvdvovpvqvdsXuKsXvrtTtUsqtQtRtZsqsqvsvtvuvvvwsqsqtQtRtZsqaNaNohogogogopogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmfmfmfmfmfmfmfmaNaNaNaNsXvkvkpqprujujujvyvyujujujvzvdvAvBvCbesXuKsqpstRtRvFtRtRtZsqsqsusususususqsqtQtRtZsqaNaNoqodododododododoraNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvkvkvksXvIvJujujujujvLujsXvdoSmjeTvPsXuKsqvQtRtZsutQtRtStTtTtTtTtTtTtTtTtTuEtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvkpBsXsXsXsXsXsXbfbfsXsXsXvSvTvUvVvdsXuKsqvWtRvXsutQtRtRtRtRtRtRtRtRtRtRtRtRtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvkpBsXaNaNaNaNwbwcwdwbwesXiDwgwhwiwjsXuKsqwkudwlsuwmudududududuetRucudududududwnsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvxsXsXaNaNaNaNwrwswtwrwesXsXsXsXsXsXsXoXsqsqsqsqsqsqsqsqsqsqsqsqwusqsqsqsqsqsqsqsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvkvksXaNaNaNaNaNaNaNaNaNaNaNsXpEujuTujujwCwDwEwFwGwCwHwIwJwKwLwMwNwOwPwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvkpGsXaNaNaNaNaNaNaNaNaNaNaNsXujujpHujujwCwCwCwIwIwIwIwIwIwKxcxdxexdxfwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXaNaNaNaNaNaNaNaNaNaNbgsXsXsXsXujuSwCwDxlwIwIwIwIwIwIwKxmxnwNxoxfwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXaNaNaNaNaNaNaNaNaNaNaNsXpEujuTujujwCwCwCwIxxwCwHwIwJwKxyxzxAxzxzwKwKwKwKwKwKwKwKwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbYbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXaNaNaNaNaNaNaNaNaNaNaNsXujujpHujujwCwDxIwIxxwCwCwCwKwKxJxzxKxzwLwPxzpJpIpLpKpNpMwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXujujwCwCwCwIwIwIwIwIxRwLxSxSxSxSwMxfxdpOwKxzxzxzxzxzxzxzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXpEujuTujujwCwDxWwIwIwIwIwIxRxmxXxYwNxXxYxfxdpPxzxZxZxZwNcnytcnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyaybycydyeaNazaNaNaNaAaNyaybycydyeaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXujujpHujujwCwCwCyfyfyfyfyfwKxmxXxYwNxXxYxfxzpJxzwNwNwNygxzxzxzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyiyjyjyjykylaBylylylaBylyoyjyjyjyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXujujpQsXaNaNaNaNaNaNxdxmxXxYwNxXxYxfypxdwKyqwNwNyrcnytcncDaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyiyvyvywyxyyyNyAyByCyNyyyEyFyvyvyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXpEujuTujujpYsXaNaNaNaNaNaNxdxmxXxYwNxXxYxfyGytyGwNwNwNyHxzxzxzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyiyvyvyKyLyMyNyMyOyMyNyMyPyKyvyvyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXujujpHujujpQsXaNaNaNaNaNaNwKxyyQyQyQyRwNxfypxdwKyqwNwNwNwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNySyFyvyTyMyNyNyNyNyNyNyNyMyTyvywyUaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXaNaNaNwKwKwKwKxdxdwKwKxmwNxfxdpZwKwNwNwNwNwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNySylyoyWyXyYyZyNzazbyNzcykylyUaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKzdzezfmqzezewKxmwNxfypxdwKyqwNwNwNwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyizhzizjzkyNzazbyNyyyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKzlzezmmqzezeznxmwNxfyGytyGwNwNwNygxzxzxzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyizqzrzryZyNzazbyNyMyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKztzezumqzezewKxyyQzvwKwKwKyqwNwNyrcnytcnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyizxzrzrzyyNyMyMyNyNaBaCaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKztzezezezezewKwKzBwKwKxLwKwNwNwNyHxzxzxzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNykylylylyoyNzazbyNzHyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjcjcjcjcjcjcjcjcjcjcjcjcjcjcjytytytwKxLwKxZxZxZwNcnytcnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyizOzOzPzQyNzazbyNzRyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjcpcpcpcpcpcpcpcpcpcpcpcpcpcqytytytwKxLwKxzxzxzxzxzxzxzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNzVzWzWzWzXyNzazbyNyMyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjcpcraNaNaNaNaNaNaNaNaNcrcpcsytytytwKxLxLxLxLxLxLwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyinozWzWAlyNyNyNyNyNaBaDaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjcraNaNaNaNaNaNaNaNaNaNaNcCcBytytytwKwKwKwKwKwKwKAwaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyiADzWzWzQyNyMyMyMyPyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjaNaNaNaNaNaNaNaNaNaNaNcEcGcFytytytcHwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyinozWzWzXyNAMANAOyyyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjcraNaNaNaNaNaNaNaNaNaNaNcCcIytytytytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNySAXAXylylAYylylAXAXyUaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjcpcraNaNaNaNaNaNaNaNaNcrcpcsytytytytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNySyoBbzayNzbBcykyUaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjcpcpcpcpcpcpcpcpcpcpcpcpcpcJytytytcKwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyiAMyMBeyMBfyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbZwKwKwKwKwKwKwKwKwKwKwKwKwKwKwKcLcLwKwKwKwKwKwKwKwKwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyiBhBiBjBkBlyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNAwAwAwAwAwAwAwAwAwwKytytytcraNaNaNaNaNcMaNaNaNaNcrytytytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNySBqBrBrBrBsyUaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNAwaNaNaNaNaNaNaNAwwKytytcraNaNaNaNaNaNaNaNaNaNaNaNaNcrytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNAwaNaNaNaNaNaNaNAwwKytcraNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcrwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNAwaNaNaNaNaNaNaNAwwKcraNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWcNbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNAwaNaNaNaNaNaNaNAwwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNAwaNaNaNaNaNaNaNAwwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcrwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNAwaNaNaNaNaNaNaNAwwKcraNaNaNaNaNaNaNaNaNaNaNaNaNaNytytytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNAwaNaNaNaNaNaNdwAwwKytaNaNaNaNaNaNaNaNaNaNaNaNaNaNytytytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNAwaNaNaNaNaNaNaNAwwKcraNaNaNaNaNaNaNaNaNaNaNaNaNaNytytytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNAwaNaNaNaNaNaNaNAwwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcrwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNAwaNaNaNaNaNaNaNAwwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNAwaNaNaNaNaNaNaNAwwKcraNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNAwaNaNaNaNaNaNaNAwwKytcraNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcrwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNAwAwAwAwAwAwAwAwAwwKytytcraNaNaNaNaNaNaNaNaNaNaNaNaNcrytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKztzezezezezewKwKzBwKwKqaxzwNwNwNyHxzxzxzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNykylylylyoyNzazbyNzHyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjcjcjcjcjcjcjcjcjcjcjcjcjcjcjytytytwKpIxzxZwNxZwNcnytcnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyizOzOzPzQyNzazbyNzRyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjcpcpcpcpcpcpcpcpcpcpcpcpcpcqytytytwKpMwKxzwNxzxzxzxzxzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNzVzWzWzWzXyNzazbyNyMyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNHjHjHjHjHjHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjcpcraNaNaNaNaNaNaNaNaNcrcpcsytytytwKpLqbqcwNqcpIwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyinozWzWAlyNyNyNyNyNaBaDaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNHjHxHyHyHyHyHzHjHjHjHjHjHjHjHjHkHkHjHjHjHjHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNcjcraNaNaNaNaNaNaNaNaNaNaNcCcBytytytwKwKwKwKqdwKwKwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyiADzWzWzQyNyMyMyMyPyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNHjHxHyHyHyHyHzHjHEHFHGHFHHHIHJHJHJHIHHHJHHHJHKHjaNaNaNaNaNaNaNaNaNaNaNaNcjaNaNaNaNaNaNaNaNaNaNaNcEcGcFytytytcHwKqeqlqkqkqmwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyinozWzWzXyNAMANAOyyyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNHjHRHyHyHyHyHSHjHJHTHTHTHTHTHJHJHJHTHTHTHTHTHUHjaNaNaNaNaNaNaNaNaNaNaNaNcjcraNaNaNaNaNaNaNaNaNaNaNcCcIytytytytwKqnqpqoqoqqwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNySAXAXylylAYylylAXAXyUaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNHjHRHXHYHYHyHyHZHJHJHJIaHJHJHJHJHJHJHJIaHJHJHJHjaNaNaNaNaNaNaNaNaNaNaNaNcjcpcraNaNaNaNaNaNaNaNaNcrcpcsytytytytwKqnqvqsqsqxwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNySyoBbzayNzbBcykyUaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNHjHjHjHjHjHjHjHjHJHTHTHTHTHTHJHJHJHTHTHTHTHTHJHjHjHjHjHjHjHjaNaNaNaNaNaNcjcpcpcpcpcpcpcpcpcpcpcpcpcpcJytytytcKwKqyqAqzqCqBwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyiAMyMBeyMBfyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNHjdHdHdHdHdHHjIdIeIeIeIeIeIeIeIeIeIeIeIeIeIfHjdIdIdIdIdIHjaNaNaNaNaNaNcjcjcjcjcjcjcjcjcjcjcjcjcjcjcjwKcLcLwKwKwKwKwKwKwKwKwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyiBhBiBjBkBlyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNHjHjHjIhIhIhIhIhjajbjcjcjcjcjcjcjcjcjcjcjcjcjcjbjaIhIhIhIhIhHjHjHjaNaNqIqIqIqIqIqIqIqIqIwKytytytcraNaNaNaNaNcMaNaNaNaNcrytytytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNySBqBrBrBrBsyUaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNHjIiIjIkIkIkIkIkIlImjcjcjcjcjcjcjcjcjcjcjcjcjcInIlIoIoIoIoIoIjIpHjaNaNqIaNaNaNaNaNaNaNqIwKytytcraNaNaNaNaNaNaNaNaNaNaNaNaNcrytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNHjIiIjIkIrIkIrIkIlImjcjcjcjcjcjcjcjcjcjcjcjcjcInIlIoIsIoIsIoIjIpHjaNaNqIaNaNaNaNaNaNaNqIwKytcraNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcrwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNHjIiIjIkIkIvIkIkIlImjcjcjcjcjcIwIxIwjcjcjcjcjcInIlIoIoIyIoIoIjIpHjaNaNqIaNaNaNaNaNaNaNqIwKcraNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWcNbWbWbWbWbWbWbWbWbWbWbWaNaNaNHjIiIjIkIrIkIrIkIlImjcjcjcjcjcIwIzIwjcjcjcjcjcInIlIoIsIoIsIoIjIpHjaNaNqIaNaNaNaNaNaNaNqIwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNHjIiIjIkIkIkIkIkIlImjcjcjcjcjcjcjcjcjcjcjcjcjcInIlIoIoIoIoIoIjIpHjaNaNqIaNaNaNaNaNaNaNqIwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcrwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNHjHjHjIEIEIEIEIEjajbjcjcjcjcjcjcjcjcjcjcjcjcjcjbjaIEIEIEIEIEHjHjHjaNaNqIaNaNaNaNaNaNaNqIwKcraNaNaNaNaNaNaNaNaNaNaNaNaNaNytytytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNHjIKIKIKIKIKHjIdIeIeIeIeIeIeIeIeIeIeIeIeIeIfHjILILILILILHjaNaNaNaNqIaNaNaNaNaNaNdwqIwKytaNaNaNaNaNaNaNaNaNaNaNaNaNaNytytytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNHjHjHjHjHjHjHjIMINININININIOIPIQINININININIMHjHjHjHjHjHjHjaNaNaNaNqIaNaNaNaNaNaNaNqIwKcraNaNaNaNaNaNaNaNaNaNaNaNaNaNytytytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNHjIMIMIMIRIMISISISISISIMIRIMIMIMHjaNaNaNaNaNaNaNaNaNaNqIaNaNaNaNaNaNaNqIwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcrwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNHjHjHkHjHjHjHjITIUIVHjHjHjHjHkHjHjaNaNaNaNaNaNaNaNaNaNqIaNaNaNaNaNaNaNqIwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNHjHjHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNqIaNaNaNaNaNaNaNqIwKcraNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNqIaNaNaNaNaNaNaNqIwKytcraNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcrwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNqIqIqIqIqIqIqIqIqIwKytytcraNaNaNaNaNaNaNaNaNaNaNaNaNcrytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKytytytcraNaNaNaNaNaNaNaNaNaNcrytytytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWcObWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKwKwKwKwKwKwKwKwKwKwKwKwKwKwKwKwKwKwKwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWcObWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKwKwKwKwKwKwKwKwKwKwKwKwKwKwKwKwKwKwKwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNAwqJqKAwqJqNAwqJqOAwqQqPAwqJqNAwaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNAwqRqSAwqRqTAwqRqUAwqRqVAwqRqWAwaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNAwqYqZAwqYqZAwqYqZAwqYqZAwqYqZAwaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNAwrarararararbrararbrararararaAwaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNAwrararcrararararararararararaAwaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNAwqYqZAwqYqZAwqYqZAwqYqZAwqYqZAwaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNAwqRqSAwrdqWAwqRqWAwrgqVAwqRqTAwaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNAwqJqKAwqJqNAwqJqNAwqJrhAwqJriAwaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtaNaNaNaNaNDuaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN @@ -1618,7 +1693,7 @@ aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbW aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDNDZDKDKDKDKDKEdDADTDKDUDKDVDWDXDYDADvaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfEgDKEaEbEcDKEiDADKDKDKDKDKDKDKEeDIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNiQDAiRDKDKDKDKDKjfDAEjDKEkDKElDWDXDYEfaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDAjGEhDKDKDKEheVDADKDKDKDKDKDKDKEmDADvaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDAjGEhDKDKDKEhrjDADKDKDKDKDKDKDKEmDADvaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDuaNDADwDwDMEoDMDwDwDwDwDwDMEpDMDwDwDwEnaNDtDwEqErErEsDwDuaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDADwDwEtDKDKDKDKDKDKDKDKDKDKDKDKEuDAEnaNDvDwEvEwExEyEwEzDwjIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEBDKECDKDKDKDKDKDKDKDKDKDKDKDKDKDKDAaNaNaNEDEEEFEwEwEwEGEDaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN @@ -1644,25 +1719,25 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDwDwDuaNEMDxDyDyDzEIDKDKDAaNDAGVFvFvFvFvFvGWDAEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNjQjPjSjRjTaNaNaNjQjPjSjRjTaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtaNaNDtDAGXGYGZDuaNaNaNaNaNDIDKDKDAaNEMDwHaHbHcHbHdDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNjUjWjVjYjXkajZaNjUjWktkvkukajZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDwDwDwDwDAHeHfDADwDwDwDwDuaNEfDKDKDAaNaNEMDwHgHhHiDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNHjHjHjHjHkHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkwkykxkxkxkAkzaNkwkDkxkxkxkAkzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDAHlHmHnDAHoFvFvHpDAHqHrHsHpDwGaDKDKDAaNaNaNHtHuHvHwHtaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNHjHxHyHyHyHyHzHjHjHjHjHjHjHjHjHkHjHjHjHjHjHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkEkGkFkIkHkNkMaNkEkGkOkIkPkNkMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNHAFvFvFvHBFvFvFvFvHCFvFvFvFvHCDKDKDKDAaNaNEMDwDwHDDwDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNHjHxHyHyHyHyHzHjHEHFHGHFHHHIHJHJHJHIHHHJHHHJHKHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkQkRkxkxkxkAkSaNkQkRkxkxkxkAkSaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDAHLdacZDAGVFvFvGWDAHOHPHQGWDwEIDKDKDAaNaNaNEMaNaNaNEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNHjHRHyHyHyHyHSHjHJHTHTHTHTHTHJHJHJHTHTHTHTHTHUHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkUlikVlkljlmllaNkUlikVlkljlmllaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwDwDwGZHVHWDADwDwDwDwEnaNDIDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNHjHRHXHYHYHyHyHZHJHJHJIaHJHJHJHJHJHJHJIaHJHJHJHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNlylnlAlzlFaNaNaNlylnlAlzlFaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMaNaNEMDAGXIbDAEnaNaNaNaNaNEfDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNHjHjHjHjHjHjHjHjHJHTHTHTHTHTHJHJHJHTHTHTHTHTHJHjHjHjHjHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwEnaNDtDxDyDyDzGaDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNHjdHdHdHdHdHHjIdIeIeIeIeIeIeIeIeIeIeIeIeIeIfHjdIdIdIdIdIHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNjQjPjSjRjTaNaNaNjQjPjSjRjTaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIDKDKDKDKDKDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNHjHjHjIhIhIhIhIhjajbjcjcjcjcjcjcjcjcjcjcjcjcjcjbjaIhIhIhIhIhHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNjUjWlLlNlMkajZaNjUjWlOlQlPkajZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfDKDKDKDKDKDKFkDAEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNHjIiIjIkIkIkIkIkIlImjcjcjcjcjcjcjcjcjcjcjcjcjcInIlIoIoIoIoIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkwlRkxkxkxkAkzaNkwlSkxkxkxkAkzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwDMIqDMDwDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNHjIiIjIkIrIkIrIkIlImjcjcjcjcjcjcjcjcjcjcjcjcjcInIlIoIsIoIsIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkEkGlTkIlUkNkMaNkEkGlVkIlYkNkMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDAItDKDKDKIuDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNHjIiIjIkIkIvIkIkIlImjcjcjcjcjcIwIxIwjcjcjcjcjcInIlIoIoIyIoIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkQkRkxkxkxkAkSaNkQkRkxkxkxkAkSaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIDKDKDKDKlKDIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNHjIiIjIkIrIkIrIkIlImjcjcjcjcjcIwIzIwjcjcjcjcjcInIlIoIsIoIsIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkUlikVlkljlmllaNkUlikVlkljlmllaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDNIADKDKDKIBDNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNHjIiIjIkIkIkIkIkIlImjcjcjcjcjcjcjcjcjcjcjcjcjcInIlIoIoIoIoIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNlylnlAlzlFaNaNaNlylnlAlzlFaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfICDKDKDKIDEfaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNHjHjHjIEIEIEIEIEjajbjcjcjcjcjcjcjcjcjcjcjcjcjcjbjaIEIEIEIEIEHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwIFIGIHmsIJDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNHjIKIKIKIKIKHjIdIeIeIeIeIeIeIeIeIeIeIeIeIeIfHjILILILILILHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDxDyDzDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNHjHjHjHjHjHjHjIMINININININIOIPIQINININININIMHjHjHjHjHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMaNaNaNEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNHjIMIMIMIRIMISISISISISIMIRIMIMIMHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNHjHjHkHjHjHjHjITIUIVHjHjHjHjHkHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNHjHjHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkwkykxkxkxkAkzaNkwkDkxkxkxkAkzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDAHlHmHnDAHoFvFvHpDAHqHrHsHpDwGaDKDKDAaNaNaNHtHuHvHwHtaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkEkGkFkIkHkNkMaNkEkGkOkIkPkNkMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNHAFvFvFvHBFvFvFvFvHCFvFvFvFvHCDKDKDKDAaNaNEMDwDwHDDwDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkQkRkxkxkxkAkSaNkQkRkxkxkxkAkSaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDAHLdacZDAGVFvFvGWDAHOHPHQGWDwEIDKDKDAaNaNaNEMaNaNaNEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkUlikVlkljlmllaNkUlikVlkljlmllaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwDwDwGZHVHWDADwDwDwDwEnaNDIDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNlylnlAlzlFaNaNaNlylnlAlzlFaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMaNaNEMDAGXIbDAEnaNaNaNaNaNEfDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwEnaNDtDxDyDyDzGaDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNjQjPjSjRjTaNaNaNjQjPjSjRjTaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIDKDKDKDKDKDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNjUjWlLlNlMkajZaNjUjWlOlQlPkajZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfDKDKDKDKDKDKFkDAEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkwlRkxkxkxkAkzaNkwlSkxkxkxkAkzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwDMIqDMDwDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkEkGlTkIlUkNkMaNkEkGlVkIlYkNkMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDAItDKDKDKIuDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkQkRkxkxkxkAkSaNkQkRkxkxkxkAkSaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIDKDKDKDKlKDIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkUlikVlkljlmllaNkUlikVlkljlmllaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDNIADKDKDKIBDNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNlylnlAlzlFaNaNaNlylnlAlzlFaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfICDKDKDKIDEfaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwIFIGIHmsIJDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDxDyDzDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMaNaNaNEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN diff --git a/_maps/map_files/cyberiad/z4.dmm b/_maps/map_files/cyberiad/z4.dmm index 49a33f2eace..a70b3a16126 100644 --- a/_maps/map_files/cyberiad/z4.dmm +++ b/_maps/map_files/cyberiad/z4.dmm @@ -213,7 +213,7 @@ "ee" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engiestation) "ef" = (/obj/structure/mirror,/turf/simulated/wall,/area/engiestation) "eg" = (/obj/machinery/computer/station_alert,/turf/simulated/floor/plasteel,/area/engiestation) -"eh" = (/obj/structure/table/woodentable,/obj/item/ashtray/plastic,/obj/structure/sign/poster/legit{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/engiestation) +"eh" = (/obj/structure/table/woodentable,/obj/item/ashtray/plastic,/obj/structure/sign/poster/random{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/engiestation) "ei" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/engiestation) "ej" = (/obj/machinery/light,/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/engiestation) "ek" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk5"; icon_state = "catwalk5"},/area/space) @@ -222,7 +222,7 @@ "en" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/engiestation) "eo" = (/obj/machinery/light,/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engiestation) "ep" = (/obj/structure/table/reinforced,/obj/item/weapon/lipstick/random,/obj/item/weapon/lipstick/random,/obj/item/weapon/storage/fancy/cigarettes/cigpack_carp,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engiestation) -"eq" = (/obj/effect/decal/cleanable/dirt,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka,/turf/simulated/floor/plasteel,/area/engiestation) +"eq" = (/obj/effect/decal/cleanable/dirt,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka,/turf/simulated/floor/plasteel,/area/engiestation) "er" = (/obj/structure/sign/nosmoking_2{pixel_x = -32},/turf/simulated/floor/plasteel{tag = "icon-stage_stairs"; icon_state = "stage_stairs"},/area/engiestation) "es" = (/turf/simulated/floor/plasteel{tag = "icon-stage_stairs"; icon_state = "stage_stairs"},/area/engiestation) "et" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/paint/remover,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plasteel,/area/engiestation) @@ -233,7 +233,7 @@ "ey" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/space,/area/space) "ez" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_x = -28; pixel_y = 0},/turf/simulated/floor/plasteel,/area/engiestation) "eA" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/engiestation) -"eB" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/sign/poster/legit{pixel_x = 32},/turf/simulated/floor/plasteel,/area/engiestation) +"eB" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/sign/poster/random{pixel_x = 32},/turf/simulated/floor/plasteel,/area/engiestation) "eC" = (/obj/machinery/computer/shuttle/engineering,/turf/simulated/floor/plasteel,/area/engiestation) "eD" = (/obj/structure/closet/wardrobe/atmospherics_yellow,/obj/machinery/light_switch{pixel_y = -28},/turf/simulated/floor/plasteel,/area/engiestation) "eE" = (/obj/structure/reagent_dispensers/fueltank,/obj/effect/decal/cleanable/dirt,/obj/machinery/light,/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel,/area/engiestation) diff --git a/_maps/map_files/cyberiad/z5.dmm b/_maps/map_files/cyberiad/z5.dmm index 86b225e0d1b..71a73a26301 100644 --- a/_maps/map_files/cyberiad/z5.dmm +++ b/_maps/map_files/cyberiad/z5.dmm @@ -880,8 +880,8 @@ "qV" = (/turf/simulated/wall,/area/mine/laborcamp) "qW" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) "qX" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) -"qY" = (/obj/structure/sign/poster/legit{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) -"qZ" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/sign/poster/legit{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/mine/laborcamp) +"qY" = (/obj/structure/sign/poster/random{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) +"qZ" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/sign/poster/random{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/mine/laborcamp) "ra" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/mine/laborcamp) "rb" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=1-Storage"; location = "7-Sleeper"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/mine/laborcamp) "rc" = (/obj/machinery/light/small{dir = 4},/obj/structure/stool/bed/roller,/obj/machinery/light_switch{pixel_x = 27; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/mine/laborcamp) @@ -907,7 +907,7 @@ "rw" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) "rx" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/item/device/radio/intercom/locked/prison{pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) "ry" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) -"rz" = (/obj/structure/sign/poster/legit{pixel_x = -32},/turf/simulated/floor/plasteel{icon_state = "asteroidfloor"},/area/mine/laborcamp) +"rz" = (/obj/structure/sign/poster/random{pixel_x = -32},/turf/simulated/floor/plasteel{icon_state = "asteroidfloor"},/area/mine/laborcamp) "rA" = (/turf/simulated/floor/plasteel{icon_state = "asteroidfloor"},/area/mine/laborcamp) "rB" = (/obj/item/device/radio/intercom/locked/prison{pixel_y = 25},/turf/simulated/floor/plating{icon_plating = "asteroidplating"; icon_state = "asteroidplating"},/area/mine/laborcamp) "rC" = (/turf/simulated/floor/plasteel/airless{tag = "icon-asteroidwarning (SOUTHWEST)"; icon_state = "asteroidwarning"; dir = 10},/area/mine/dangerous/explored) @@ -920,7 +920,7 @@ "rJ" = (/obj/machinery/door/poddoor/preopen{id_tag = "Labor"; name = "labor camp blast door"},/obj/machinery/door/airlock{name = "Labor Camp External Access"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) "rK" = (/turf/simulated/floor/plasteel/airless{tag = "icon-asteroidwarning (SOUTHEAST)"; icon_state = "asteroidwarning"; dir = 6},/area/mine/dangerous/explored) "rL" = (/obj/machinery/vending/sustenance,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) -"rM" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/obj/structure/sign/poster/legit{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) +"rM" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/obj/structure/sign/poster/random{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) "rN" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/wall,/area/mine/laborcamp) "rO" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) "rP" = (/obj/machinery/flasher{id = "Labor"; pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/turf/simulated/wall,/area/mine/laborcamp) @@ -955,7 +955,7 @@ "ss" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/mine/laborcamp) "st" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/mine/laborcamp) "su" = (/obj/machinery/computer/shuttle/labor/one_way,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) -"sv" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=6-Vending"; location = "5-Central"},/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) +"sv" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=6-Vending"; location = "5-Central"},/obj/structure/sign/poster/random{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) "sw" = (/obj/machinery/conveyor{dir = 8; id = "gulag"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) "sx" = (/obj/machinery/mineral/stacking_machine{dir = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) "sy" = (/obj/machinery/conveyor{dir = 10; icon_state = "conveyor0"; id = "gulag"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) diff --git a/_maps/map_files/shuttles/emergency_dept.dmm b/_maps/map_files/shuttles/emergency_dept.dmm new file mode 100644 index 00000000000..0a17d3d7095 --- /dev/null +++ b/_maps/map_files/shuttles/emergency_dept.dmm @@ -0,0 +1,126 @@ +"aa" = (/turf/space,/area/space) +"ab" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/escape) +"ac" = (/obj/structure/grille,/obj/structure/window/full/shuttle,/turf/simulated/floor/plating,/area/shuttle/escape) +"ad" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/escape) +"ae" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/escape) +"af" = (/turf/simulated/shuttle/wall{icon_state = "swallc4"},/area/shuttle/escape) +"ag" = (/obj/machinery/computer/emergency_shuttle,/turf/simulated/shuttle/floor,/area/shuttle/escape) +"ah" = (/turf/simulated/shuttle/wall{icon_state = "swallc3"},/area/shuttle/escape) +"ai" = (/obj/machinery/computer/station_alert,/turf/simulated/shuttle/floor,/area/shuttle/escape) +"aj" = (/obj/machinery/computer/communications,/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape) +"ak" = (/obj/machinery/computer/security{network = list("SS13","Telecomms","Research Outpost","Mining Outpost")},/turf/simulated/shuttle/floor,/area/shuttle/escape) +"al" = (/obj/structure/stool/bed/chair/comfy/blue{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape) +"am" = (/obj/structure/table,/turf/simulated/shuttle/floor,/area/shuttle/escape) +"an" = (/obj/machinery/computer/crew,/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape) +"ao" = (/obj/machinery/computer/robotics,/turf/simulated/shuttle/floor,/area/shuttle/escape) +"ap" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/escape) +"aq" = (/turf/simulated/shuttle/floor,/area/shuttle/escape) +"ar" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape) +"as" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape) +"at" = (/obj/structure/stool/bed/chair/comfy/red{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape) +"au" = (/obj/structure/stool/bed/chair/comfy/teal{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape) +"av" = (/obj/structure/stool/bed/chair/comfy/purp{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape) +"aw" = (/turf/simulated/shuttle/wall{icon_state = "swall13"; dir = 2},/area/shuttle/escape) +"ax" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/shuttle/escape) +"ay" = (/obj/machinery/door/airlock/glass_command{name = "Escape Shuttle Cockpit"; req_access_txt = "19"},/turf/simulated/shuttle/floor,/area/shuttle/escape) +"az" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor4,/area/shuttle/escape) +"aA" = (/obj/machinery/status_display{pixel_y = 30},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor4,/area/shuttle/escape) +"aB" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "16"},/turf/simulated/floor/plating,/area/shuttle/escape) +"aC" = (/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape) +"aD" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape) +"aE" = (/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape) +"aF" = (/obj/machinery/status_display{pixel_y = 30},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape) +"aG" = (/obj/item/weapon/storage/box/drinkingglasses,/obj/item/weapon/reagent_containers/food/drinks/shaker,/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape) +"aH" = (/obj/structure/closet/walllocker/emerglocker{pixel_x = -28},/turf/simulated/shuttle/floor4,/area/shuttle/escape) +"aI" = (/turf/simulated/shuttle/floor4,/area/shuttle/escape) +"aJ" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "15"},/turf/simulated/floor/plating,/area/shuttle/escape) +"aK" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape) +"aL" = (/obj/machinery/chem_dispenser/beer,/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape) +"aM" = (/obj/machinery/door/airlock/glass_security{name = "Escape Shuttle Cell"; req_access_txt = "2"},/turf/simulated/floor/plating,/area/shuttle/escape) +"aN" = (/obj/item/weapon/storage/box/drinkingglasses,/obj/item/weapon/reagent_containers/food/drinks/shaker,/obj/item/clothing/mask/cigarette/cigar,/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape) +"aO" = (/obj/machinery/chem_dispenser/soda,/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape) +"aP" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/floor/plating,/area/shuttle/escape) +"aQ" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor4,/area/shuttle/escape) +"aR" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape) +"aS" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"; dir = 2},/area/shuttle/escape) +"aT" = (/obj/docking_port/mobile/emergency{dir = 4; dwidth = 11; height = 13; timid = 1; width = 24},/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/shuttle/floor,/area/shuttle/escape) +"aU" = (/turf/simulated/floor/plasteel,/area/shuttle/escape) +"aV" = (/obj/machinery/door/window/southright{autoclose = 1; name = "engineering door"; req_access_txt = "32"},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape) +"aW" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor4,/area/shuttle/escape) +"aX" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape) +"aY" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel,/area/shuttle/escape) +"aZ" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel,/area/shuttle/escape) +"ba" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor5"},/area/shuttle/escape) +"bb" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor4,/area/shuttle/escape) +"bc" = (/obj/machinery/door/window/southright{autoclose = 1; name = "science door"; req_access_txt = "47"},/turf/simulated/shuttle/floor{icon_state = "floor5"},/area/shuttle/escape) +"bd" = (/obj/machinery/door/window/northleft{autoclose = 1; name = "security door"; req_access_txt = "2"},/turf/simulated/shuttle/floor4,/area/shuttle/escape) +"be" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape) +"bf" = (/obj/structure/stool/bed/chair{dir = 4},/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor4,/area/shuttle/escape) +"bg" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "8"},/turf/simulated/floor/plating,/area/shuttle/escape) +"bh" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel,/area/shuttle/escape) +"bi" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel,/area/shuttle/escape) +"bj" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape) +"bk" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor4,/area/shuttle/escape) +"bl" = (/obj/machinery/door/window/northleft{autoclose = 1; name = "medical door"; req_access_txt = "5"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape) +"bm" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/window/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape) +"bn" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor5"},/area/shuttle/escape) +"bo" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/window/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape) +"bp" = (/obj/structure/window/reinforced,/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel,/area/shuttle/escape) +"bq" = (/obj/structure/window/reinforced,/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel,/area/shuttle/escape) +"br" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/window/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor5"},/area/shuttle/escape) +"bs" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/closet/walllocker/emerglocker{pixel_x = 28},/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape) +"bt" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/window/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor5"},/area/shuttle/escape) +"bu" = (/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel,/area/shuttle/escape) +"bv" = (/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel,/area/shuttle/escape) +"bw" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/shuttle/floor,/area/shuttle/escape) +"bx" = (/obj/structure/noticeboard,/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/escape) +"by" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = null; name = "Shuttle Cargo Hatch"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape) +"bz" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape) +"bA" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor5"},/area/shuttle/escape) +"bC" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Escape Shuttle Infirmary"; req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/shuttle/escape) +"bD" = (/turf/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/shuttle/escape) +"bE" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape) +"bF" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape) +"bG" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape) +"bH" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape) +"bI" = (/obj/machinery/vending/wallmed1{layer = 3.3; name = "Emergency NanoMed"; pixel_x = 28; pixel_y = 0; req_access_txt = "0"},/obj/machinery/sleeper,/turf/simulated/floor/plasteel,/area/shuttle/escape) +"bJ" = (/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/obj/item/weapon/extinguisher,/turf/simulated/floor/plasteel,/area/shuttle/escape) +"bK" = (/obj/structure/closet/cardboard,/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel,/area/shuttle/escape) +"bL" = (/obj/machinery/recharge_station,/turf/simulated/floor/plasteel,/area/shuttle/escape) +"bM" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/turf/simulated/floor/plasteel,/area/shuttle/escape) +"bN" = (/obj/structure/stool/bed/roller,/turf/simulated/floor/plasteel,/area/shuttle/escape) +"bO" = (/obj/machinery/sleeper,/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel,/area/shuttle/escape) +"bP" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/escape) +"bQ" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/simulated/floor/plating/airless,/area/shuttle/escape) +"bR" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/shuttle/escape) +"bS" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/escape) +"bT" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/shuttle/escape) +"bU" = (/turf/space,/area/shuttle/escape) + +(1,1,1) = {" +aaaaaaaaaaabacadaaaaaaaaaa +aaaaabaeaeafagahaeaeadaaaa +aaabafaiajakalamanaoahadaa +aaapaqarasataqaqauavaqapaa +aaapaqaqaqaqaqaqaqaqaqapaa +abawaeaeaeaxayaeaeaeaeawad +apazaAazazaBaCaDaEaCaFaGap +apaHaIaIaIaJaCaDaEaCaKaLap +apaIaIaIaIaMaCaDaEaCaNaOap +aPaIaIaQaQaBaCaDaEaCaRaRac +aSaeaeaeaeaJaCaDaEaCaCaCap +aTaUaUaUaUaUaUaUaUaUaUaUap +apbfbdbkaBaYaUaZaBbzblbsap +aBaWaIbbbgbhaUbibgbFbGbHaB +bgbjbeaXbgbhaUbibgbabnbAbg +aJbmaVboaJbpaUbqaJbrbcbtaJ +apbuaUaUaUaUaUaUaUaUaUbvap +bwaUaUaUaUaUaUaUaUaUaUaUac +aSaebxbyaBaYaUaZaBbCacaebD +bEaUaUaUbgbhaUbibgaUaUbIap +acaUaUaUbgbhaUbibgaUaUbJap +apbKbLbLaJbhaUbiaJbNbMbOap +bPaxbQbQawaeaeaeawbRbRaxbS +aabPbTbTbSbUbUbUbPbTbTbSaa +"} + diff --git a/_maps/map_files/templates/shelter_2.dmm b/_maps/map_files/templates/shelter_2.dmm new file mode 100644 index 00000000000..4ba11cef609 --- /dev/null +++ b/_maps/map_files/templates/shelter_2.dmm @@ -0,0 +1,41 @@ +"a" = (/turf/simulated/wall/survival,/area/survivalpod) +"b" = (/obj/structure/sign/mining/survival{dir = 8},/turf/simulated/wall/survival,/area/survivalpod) +"c" = (/obj/machinery/smartfridge/survival_pod/loaded,/turf/simulated/floor/pod,/area/survivalpod) +"d" = (/turf/simulated/floor/pod,/area/survivalpod) +"e" = (/obj/machinery/door/window/survival_pod{dir = 1},/turf/simulated/floor/carpet/black,/area/survivalpod) +"f" = (/obj/machinery/light,/turf/simulated/floor/carpet/black,/area/survivalpod) +"g" = (/obj/structure/sign/mining/survival{tag = "icon-survival (NORTH)"; icon_state = "survival"; dir = 1},/turf/simulated/wall/survival,/area/survivalpod) +"h" = (/obj/structure/fans,/turf/simulated/floor/pod,/area/survivalpod) +"i" = (/obj/machinery/sleeper/survival_pod,/turf/simulated/floor/pod,/area/survivalpod) +"j" = (/obj/structure/table/survival_pod,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/brute{pixel_x = 4; pixel_y = -2},/turf/simulated/floor/pod,/area/survivalpod) +"k" = (/obj/structure/table/wood/fancy/black{pixel_y = -9},/obj/structure/window/reinforced/survival_pod{dir = 1},/obj/machinery/microwave,/turf/simulated/floor/carpet/black,/area/survivalpod) +"l" = (/obj/structure/sink/kitchen{dir = 4; pixel_x = -11},/turf/simulated/floor/carpet/black,/area/survivalpod) +"m" = (/obj/structure/sign/mining/survival,/turf/simulated/wall/survival,/area/survivalpod) +"n" = (/obj/structure/curtain/black,/obj/machinery/shower{pixel_y = 20},/turf/simulated/floor/pod{pixel_y = 0},/area/survivalpod) +"o" = (/obj/structure/window/reinforced/survival_pod{dir = 8},/obj/machinery/door/window/survival_pod{dir = 1},/turf/simulated/floor/carpet/black,/area/survivalpod) +"p" = (/obj/structure/window/reinforced/survival_pod{dir = 8},/turf/simulated/floor/carpet/black,/area/survivalpod) +"q" = (/obj/structure/window/reinforced/survival_pod{dir = 9},/turf/simulated/floor/carpet/black,/area/survivalpod) +"r" = (/turf/simulated/floor/carpet/black,/area/survivalpod) +"s" = (/obj/item/device/gps/computer,/turf/simulated/floor/pod,/area/survivalpod) +"t" = (/obj/structure/stool/bed/pod,/obj/item/weapon/bedsheet/brown,/turf/simulated/floor/pod,/area/survivalpod) +"u" = (/obj/structure/tubes,/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/pod,/area/survivalpod) +"v" = (/obj/structure/window/reinforced/survival_pod{dir = 1},/obj/structure/displaycase{desc = "A display case containing an expensive forgery, probably."; locked = 1; pixel_y = -4; req_access_txt = "48"; start_showpiece_type = /obj/item/fakeartefact},/turf/simulated/floor/carpet/black{dir = 1},/area/survivalpod) +"w" = (/obj/structure/fans/tiny,/obj/machinery/door/airlock/survival_pod,/turf/simulated/floor/pod,/area/survivalpod) +"x" = (/obj/structure/sign/mining/survival{tag = "icon-survival (EAST)"; icon_state = "survival"; dir = 4},/turf/simulated/wall/survival,/area/survivalpod) +"y" = (/obj/structure/toilet/secret{pixel_y = 12},/turf/simulated/floor/pod,/area/survivalpod) +"z" = (/obj/structure/window/reinforced/survival_pod{dir = 1},/obj/item/cardboard_cutout{desc = "A cardboard cutout of a xenomorph maid."; icon_state = "cutout_lusty"; name = "lusty xenomorph maid"}, /turf/simulated/floor/carpet/black,/area/survivalpod) +"A" = (/obj/structure/table/wood/fancy/black,/obj/machinery/light{dir = 4},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 6; pixel_y = 3},/obj/item/weapon/reagent_containers/food/drinks/bottle/wine,/turf/simulated/floor/carpet/black,/area/survivalpod) +"B" = (/obj/structure/table/wood/fancy/black,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = -4; pixel_y = 1},/obj/effect/spawner/lootdrop/three_course_meal,/turf/simulated/floor/carpet/black,/area/survivalpod) +"C" = (/obj/structure/stool/bed/chair/comfy/black{dir = 1},/turf/simulated/floor/carpet/black,/area/survivalpod) +"D" = (/obj/structure/sign/mining,/turf/simulated/wall/survival,/area/survivalpod) + +(1,1,1) = {" +agagaga +bhcsnyx +aidtoza +bjdupAx +akevqBa +blfrrCx +amawaDa +"} + diff --git a/_maps/map_files/templates/spacehotel/n_01.dmm b/_maps/map_files/templates/spacehotel/n_01.dmm index 4480512c668..ebf6ffb1a79 100644 --- a/_maps/map_files/templates/spacehotel/n_01.dmm +++ b/_maps/map_files/templates/spacehotel/n_01.dmm @@ -1,5 +1,5 @@ "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) +"b" = (/obj/structure/sign/poster/random{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) diff --git a/_maps/map_files/templates/spacehotel/n_02.dmm b/_maps/map_files/templates/spacehotel/n_02.dmm index cda6eb42b4e..b802e285219 100644 --- a/_maps/map_files/templates/spacehotel/n_02.dmm +++ b/_maps/map_files/templates/spacehotel/n_02.dmm @@ -1,7 +1,7 @@ "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/grown/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) +"d" = (/obj/structure/sign/poster/random{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) diff --git a/_maps/map_files/templates/spacehotel/n_03.dmm b/_maps/map_files/templates/spacehotel/n_03.dmm index e4aa24d6899..15915ff9c0a 100644 --- a/_maps/map_files/templates/spacehotel/n_03.dmm +++ b/_maps/map_files/templates/spacehotel/n_03.dmm @@ -1,5 +1,5 @@ "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) +"b" = (/obj/structure/sign/poster/official/random{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) diff --git a/_maps/map_files/templates/spacehotel/n_04.dmm b/_maps/map_files/templates/spacehotel/n_04.dmm index 74a6e875b4a..2788bb3307c 100644 --- a/_maps/map_files/templates/spacehotel/n_04.dmm +++ b/_maps/map_files/templates/spacehotel/n_04.dmm @@ -1,5 +1,5 @@ "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) +"b" = (/obj/structure/sign/poster/ripped{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/clothing/head/xenos,/turf/unsimulated/floor/carpet,/area/template_noop) "e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop) @@ -14,7 +14,7 @@ "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) +"q" = (/obj/structure/toilet{dir = 1},/obj/structure/alien/weeds{icon_state = "weeds2"},/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) diff --git a/_maps/map_files/templates/spacehotel/n_05.dmm b/_maps/map_files/templates/spacehotel/n_05.dmm index cf60cf65327..bf746e2fc45 100644 --- a/_maps/map_files/templates/spacehotel/n_05.dmm +++ b/_maps/map_files/templates/spacehotel/n_05.dmm @@ -1,5 +1,5 @@ "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) +"b" = (/obj/structure/sign/poster/official/random{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) diff --git a/_maps/map_files/templates/spacehotel/n_06.dmm b/_maps/map_files/templates/spacehotel/n_06.dmm index 046119cf016..a2fc80149cb 100644 --- a/_maps/map_files/templates/spacehotel/n_06.dmm +++ b/_maps/map_files/templates/spacehotel/n_06.dmm @@ -1,5 +1,5 @@ "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) +"b" = (/obj/effect/decal/cleanable/blood/gibs/old,/obj/structure/sign/poster/random{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) diff --git a/_maps/map_files/templates/spacehotel/n_07.dmm b/_maps/map_files/templates/spacehotel/n_07.dmm index fc00baa9a45..70ab9fba765 100644 --- a/_maps/map_files/templates/spacehotel/n_07.dmm +++ b/_maps/map_files/templates/spacehotel/n_07.dmm @@ -1,5 +1,5 @@ "a" = (/turf/template_noop,/area/template_noop) -"b" = (/obj/structure/sign/poster{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"b" = (/obj/structure/sign/poster/random{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) diff --git a/_maps/map_files/templates/spacehotel/n_08.dmm b/_maps/map_files/templates/spacehotel/n_08.dmm index 81c8881c5e7..fcab7886628 100644 --- a/_maps/map_files/templates/spacehotel/n_08.dmm +++ b/_maps/map_files/templates/spacehotel/n_08.dmm @@ -1,11 +1,11 @@ "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) +"b" = (/obj/structure/sign/poster/official/random{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"c" = (/obj/structure/sign/poster/random{dir = 1; 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) +"e" = (/obj/structure/dresser,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/poster/random_contraband,/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) +"h" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/obj/structure/sign/poster/random{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) diff --git a/_maps/map_files/templates/spacehotel/n_09.dmm b/_maps/map_files/templates/spacehotel/n_09.dmm index ecf873f1913..77dac3089be 100644 --- a/_maps/map_files/templates/spacehotel/n_09.dmm +++ b/_maps/map_files/templates/spacehotel/n_09.dmm @@ -1,5 +1,5 @@ "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) +"b" = (/obj/structure/sign/poster/official/random{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) diff --git a/_maps/map_files/templates/spacehotel/n_10.dmm b/_maps/map_files/templates/spacehotel/n_10.dmm index 9038bbbce3d..1c0cf0d88b5 100644 --- a/_maps/map_files/templates/spacehotel/n_10.dmm +++ b/_maps/map_files/templates/spacehotel/n_10.dmm @@ -1,5 +1,5 @@ "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) +"b" = (/obj/structure/sign/poster/official/random{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) diff --git a/_maps/map_files/templates/spacehotel/n_11.dmm b/_maps/map_files/templates/spacehotel/n_11.dmm index 415d3f1f7c5..bed2ba84b3f 100644 --- a/_maps/map_files/templates/spacehotel/n_11.dmm +++ b/_maps/map_files/templates/spacehotel/n_11.dmm @@ -1,11 +1,11 @@ "a" = (/turf/template_noop,/area/template_noop) -"b" = (/obj/structure/sign/poster{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"b" = (/obj/structure/sign/poster/random{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) +"h" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/obj/structure/sign/poster/random{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) diff --git a/_maps/map_files/templates/spacehotel/n_12.dmm b/_maps/map_files/templates/spacehotel/n_12.dmm index 24d3321f4f7..05319b91d2e 100644 --- a/_maps/map_files/templates/spacehotel/n_12.dmm +++ b/_maps/map_files/templates/spacehotel/n_12.dmm @@ -1,5 +1,5 @@ "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) +"b" = (/obj/structure/sign/poster/official/random{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) diff --git a/_maps/map_files/templates/spacehotel/n_13.dmm b/_maps/map_files/templates/spacehotel/n_13.dmm index 0d10f62eba5..8ecdca3b868 100644 --- a/_maps/map_files/templates/spacehotel/n_13.dmm +++ b/_maps/map_files/templates/spacehotel/n_13.dmm @@ -1,17 +1,17 @@ "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) +"b" = (/obj/structure/sign/poster/official/random{dir = 8; pixel_x = -32},/obj/structure/sign/poster/official/random{dir = 1; pixel_y = 32},/obj/random/plushie,/turf/unsimulated/floor/carpet,/area/template_noop) +"c" = (/obj/structure/sign/poster/official/random{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) +"e" = (/obj/structure/sign/poster/official/random{dir = 1; pixel_y = 32},/obj/random/plushie,/turf/unsimulated/floor/carpet,/area/template_noop) +"f" = (/obj/structure/dresser,/obj/structure/sign/poster/official/random{dir = 1; pixel_y = 32},/obj/structure/sign/poster/official/random{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) +"h" = (/obj/structure/stool/bed,/obj/structure/sign/poster/official/random{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) +"j" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/obj/structure/sign/poster/official/random{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) +"n" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/obj/structure/sign/poster/official/random{dir = 4; pixel_x = 32},/obj/structure/sign/poster/official/random{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) diff --git a/_maps/map_files/templates/spacehotel/n_14.dmm b/_maps/map_files/templates/spacehotel/n_14.dmm index 7fe5a48cafd..95cf97442fd 100644 --- a/_maps/map_files/templates/spacehotel/n_14.dmm +++ b/_maps/map_files/templates/spacehotel/n_14.dmm @@ -1,5 +1,5 @@ "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) +"b" = (/obj/structure/sign/poster/official/random{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) diff --git a/_maps/map_files/templates/spacehotel/n_17.dmm b/_maps/map_files/templates/spacehotel/n_17.dmm index 964a75ba8ba..88b1486e2fe 100644 --- a/_maps/map_files/templates/spacehotel/n_17.dmm +++ b/_maps/map_files/templates/spacehotel/n_17.dmm @@ -1,5 +1,5 @@ "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) +"b" = (/obj/structure/sign/poster/official/random{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) diff --git a/_maps/map_files/templates/spacehotel/n_18.dmm b/_maps/map_files/templates/spacehotel/n_18.dmm index 28145e1b4fb..ca75b4f384f 100644 --- a/_maps/map_files/templates/spacehotel/n_18.dmm +++ b/_maps/map_files/templates/spacehotel/n_18.dmm @@ -1,5 +1,5 @@ "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) +"b" = (/obj/structure/sign/poster/official/random{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) diff --git a/_maps/map_files/templates/spacehotel/s_04.dmm b/_maps/map_files/templates/spacehotel/s_04.dmm index 2764d377626..fbd9385c3f5 100644 --- a/_maps/map_files/templates/spacehotel/s_04.dmm +++ b/_maps/map_files/templates/spacehotel/s_04.dmm @@ -4,19 +4,19 @@ "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/hardsuit/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) +"g" = (/obj/structure/rack,/obj/structure/sign/poster/random{dir = 1; pixel_y = 32},/obj/item/clothing/suit/space/hardsuit/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/random{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/random{dir = 1; pixel_y = 32},/obj/structure/sign/poster/random{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) +"k" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/syndie,/obj/structure/sign/poster/random{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) +"r" = (/obj/structure/sign/poster/random{pixel_y = -32},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop) +"s" = (/obj/structure/sign/poster/random{dir = 4; pixel_x = 32},/obj/structure/sign/poster/random{pixel_y = -32},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop) (1,1,1) = {" aaaaaaaaaaa diff --git a/code/__DEFINES/callbacks.dm b/code/__DEFINES/callbacks.dm new file mode 100644 index 00000000000..c0d8ac15ace --- /dev/null +++ b/code/__DEFINES/callbacks.dm @@ -0,0 +1,2 @@ +#define CALLBACK new /datum/callback +#define INVOKE_ASYNC ImmediateInvokeAsync \ No newline at end of file diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 0bd2b82b42a..40f27d0d84f 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -63,10 +63,21 @@ #define THROWN_PROJECTILE_ATTACK 4 #define LEAP_ATTACK 5 +//Embedded objects +#define EMBEDDED_PAIN_CHANCE 15 //Chance for embedded objects to cause pain (damage user) +#define EMBEDDED_ITEM_FALLOUT 5 //Chance for embedded object to fall out (causing pain but removing the object) +#define EMBED_CHANCE 45 //Chance for an object to embed into somebody when thrown (if it's sharp) +#define EMBEDDED_PAIN_MULTIPLIER 2 //Coefficient of multiplication for the damage the item does while embedded (this*item.w_class) +#define EMBEDDED_FALL_PAIN_MULTIPLIER 5 //Coefficient of multiplication for the damage the item does when it falls out (this*item.w_class) +#define EMBEDDED_IMPACT_PAIN_MULTIPLIER 4 //Coefficient of multiplication for the damage the item does when it first embeds (this*item.w_class) +#define EMBED_THROWSPEED_THRESHOLD 4 //The minimum value of an item's throw_speed for it to embed (Unless it has embedded_ignore_throwspeed_threshold set to 1) +#define EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER 8 //Coefficient of multiplication for the damage the item does when removed without a surgery (this*item.w_class) +#define EMBEDDED_UNSAFE_REMOVAL_TIME 30 //A Time in ticks, total removal time = (this*item.w_class) + //Gun Stuff #define SAWN_INTACT 0 #define SAWN_OFF 1 #define WEAPON_LIGHT 0 #define WEAPON_MEDIUM 1 - #define WEAPON_HEAVY 2 + #define WEAPON_HEAVY 2 \ No newline at end of file diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 1cba02075a7..05133d226f1 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -77,11 +77,12 @@ #define SAFE 16 //flags for pass_flags -#define PASSTABLE 1 -#define PASSGLASS 2 -#define PASSGRILLE 4 -#define PASSBLOB 8 -#define PASSMOB 16 +#define PASSTABLE 1 +#define PASSGLASS 2 +#define PASSGRILLE 4 +#define PASSBLOB 8 +#define PASSMOB 16 +#define LETPASSTHROW 32 //turf-only flags #define NOJAUNT 1 diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm index 8e7be007d12..be243c66386 100644 --- a/code/__DEFINES/genetics.dm +++ b/code/__DEFINES/genetics.dm @@ -96,8 +96,10 @@ #define NUTRITION_LEVEL_FED 350 #define NUTRITION_LEVEL_HUNGRY 250 #define NUTRITION_LEVEL_STARVING 150 +#define NUTRITION_LEVEL_CURSED 0 //Blood levels +#define BLOOD_VOLUME_MAXIMUM 2000 #define BLOOD_VOLUME_NORMAL 560 #define BLOOD_VOLUME_SAFE 501 #define BLOOD_VOLUME_OKAY 336 diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index a27e3f8e96a..393247c5a1f 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -2,9 +2,21 @@ #define isatom(A) istype(A, /atom) #define ismovableatom(A) istype(A, /atom/movable) -// Mobs +// Mobs #define ismegafauna(A) istype(A, /mob/living/simple_animal/hostile/megafauna) +//Objects + +#define is_cleanable(A) (istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/rune)) //if something is cleanable + +var/list/static/global/pointed_types = typecacheof(list( + /obj/item/weapon/pen, + /obj/item/weapon/screwdriver, + /obj/item/weapon/reagent_containers/syringe, + /obj/item/weapon/kitchen/utensil/fork)) + +#define is_pointed(W) (is_type_in_typecache(W, pointed_types)) + //Turfs #define issimulatedturf(A) istype(A, /turf/simulated) diff --git a/code/__DEFINES/language.dm b/code/__DEFINES/language.dm index b1781de3314..2af0fd6ade8 100644 --- a/code/__DEFINES/language.dm +++ b/code/__DEFINES/language.dm @@ -17,4 +17,10 @@ #define NONGLOBAL 32 // Do not add to general languages list #define INNATE 64 // All mobs can be assumed to speak and understand this language (audible emotes) #define NO_TALK_MSG 128 // Do not show the "\The [speaker] talks into \the [radio]" message -#define NO_STUTTER 256 // No stuttering, slurring, or other speech problems \ No newline at end of file +#define NO_STUTTER 256 // No stuttering, slurring, or other speech problems + +//Auto-accent level defines. +#define AUTOHISS_OFF 0 +#define AUTOHISS_BASIC 1 +#define AUTOHISS_FULL 2 +#define AUTOHISS_NUM 3 //Number of auto-accent options. diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index 23b44679a9d..b46427979fb 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -71,3 +71,10 @@ #define PROGRAM_STATE_KILLED 0 #define PROGRAM_STATE_BACKGROUND 1 #define PROGRAM_STATE_ACTIVE 2 + +// Demotion Console (card/minor/*) departments +#define TARGET_DEPT_GENERIC 1 +#define TARGET_DEPT_SEC 2 +#define TARGET_DEPT_MED 3 +#define TARGET_DEPT_SCI 4 +#define TARGET_DEPT_ENG 5 \ No newline at end of file diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index b3263a93425..61e5e5069b4 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -329,4 +329,21 @@ #define TENDRIL_CLEAR_SCORE "Tendrils Killed" // The number of station goals generated each round. -#define STATION_GOAL_BUDGET 1 \ No newline at end of file +#define STATION_GOAL_BUDGET 1 + +#define FIRST_DIAG_STEP 1 +#define SECOND_DIAG_STEP 2 + +#define ARBITRARY_VIEWRANGE_NOHUD 2 +#define SECOND_DIAG_STEP 2 + +//Bloody shoes/footprints +#define MAX_SHOE_BLOODINESS 100 +#define BLOODY_FOOTPRINT_BASE_ALPHA 150 +#define BLOOD_GAIN_PER_STEP 100 +#define BLOOD_LOSS_PER_STEP 5 + +//Bloody shoe blood states +#define BLOOD_STATE_HUMAN "blood" +#define BLOOD_STATE_XENO "xeno" +#define BLOOD_STATE_NOT_BLOODY "no blood whatsoever" diff --git a/code/__DEFINES/mob.dm b/code/__DEFINES/mob.dm index 829d3940eff..afac37b8543 100644 --- a/code/__DEFINES/mob.dm +++ b/code/__DEFINES/mob.dm @@ -14,7 +14,7 @@ #define ORGAN_MUTATED 2048 #define ORGAN_ASSISTED 4096 -#define DROPLIMB_EDGE 0 +#define DROPLIMB_SHARP 0 #define DROPLIMB_BLUNT 1 #define DROPLIMB_BURN 2 @@ -47,7 +47,7 @@ #define HUMAN_STRIP_DELAY 40 //takes 40ds = 4s to strip someone. #define ALIEN_SELECT_AFK_BUFFER 1 // How many minutes that a person can be AFK before not being allowed to be an alien. -#define SHOES_SLOWDOWN -1.0 // How much shoes slow you down by default. Negative values speed you up +#define SHOES_SLOWDOWN 0 // How much shoes slow you down by default. Negative values speed you up //Mob attribute defaults. @@ -98,10 +98,14 @@ #define APPEARANCE_ALL 32767 // Intents -#define I_HELP "help" -#define I_DISARM "disarm" -#define I_GRAB "grab" -#define I_HARM "harm" +#define INTENT_HELP "help" +#define INTENT_DISARM "disarm" +#define INTENT_GRAB "grab" +#define INTENT_HARM "harm" + +// Movement Intents +#define MOVE_INTENT_WALK "walk" +#define MOVE_INTENT_RUN "run" // AI wire/radio settings #define AI_CHECK_WIRELESS 1 diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 1b848686bc3..257e12f4093 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -39,7 +39,7 @@ #define ROLE_ERT "emergency response team" #define ROLE_NYMPH "Dionaea" #define ROLE_GSPIDER "giant spider" - +#define ROLE_DRONE "drone" //Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR. //The gamemode specific ones are just so the gamemodes can query whether a player is old enough diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 5edccb012e3..2d2acdbbba5 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -454,7 +454,7 @@ proc/pollCandidates(Question, be_special_type, antag_age_check = 0, poll_time = if(roletext) if(jobban_isbanned(G, roletext) || jobban_isbanned(G, "Syndicate")) continue - if(min_hours) + if(config.use_exp_restrictions && min_hours) if(G.client.get_exp_living_num() < min_hours * 60) continue if(G.has_enabled_antagHUD) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 0abf2ac1af3..f20be8c1c0b 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -464,3 +464,7 @@ proc/add_logs(mob/user, mob/target, what_done, var/object=null, var/addition=nul set hidden = 1 set name = ".mouse" LogMouseMacro(".mouse", params) + +/proc/update_all_mob_security_hud() + for(var/mob/living/carbon/human/H in mob_list) + H.sec_hud_set_security_status() \ No newline at end of file diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 89755d7acf0..f9bae78c35b 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -448,32 +448,32 @@ proc/checkhtml(var/t) // Pencode -/proc/pencode_to_html(text, mob/user, obj/item/weapon/pen/P = null, sign = 1, fields = 1, deffont = PEN_FONT, signfont = SIGNFONT, crayonfont = CRAYON_FONT) - text = replacetext(text, "\n", "
") - text = replacetext(text, "\[center\]", "
") - text = replacetext(text, "\[/center\]", "
") - text = replacetext(text, "\[br\]", "
") +/proc/pencode_to_html(text, mob/user, obj/item/weapon/pen/P = null, format = 1, sign = 1, fields = 1, deffont = PEN_FONT, signfont = SIGNFONT, crayonfont = CRAYON_FONT) text = replacetext(text, "\[b\]", "") text = replacetext(text, "\[/b\]", "") text = replacetext(text, "\[i\]", "") text = replacetext(text, "\[/i\]", "") text = replacetext(text, "\[u\]", "") text = replacetext(text, "\[/u\]", "") - text = replacetext(text, "\[large\]", "") - text = replacetext(text, "\[/large\]", "") if(sign) text = replacetext(text, "\[sign\]", "[user ? user.real_name : "Anonymous"]") if(fields) text = replacetext(text, "\[field\]", "") + if(format) + text = replacetext(text, "\[h1\]", "

") + text = replacetext(text, "\[/h1\]", "

") + text = replacetext(text, "\[h2\]", "

") + text = replacetext(text, "\[/h2\]", "

") + text = replacetext(text, "\[h3\]", "

") + text = replacetext(text, "\[/h3\]", "

") + text = replacetext(text, "\n", "
") + text = replacetext(text, "\[center\]", "
") + text = replacetext(text, "\[/center\]", "
") + text = replacetext(text, "\[br\]", "
") + text = replacetext(text, "\[large\]", "") + text = replacetext(text, "\[/large\]", "") - text = replacetext(text, "\[h1\]", "

") - text = replacetext(text, "\[/h1\]", "

") - text = replacetext(text, "\[h2\]", "

") - text = replacetext(text, "\[/h2\]", "

") - text = replacetext(text, "\[h3\]", "

") - text = replacetext(text, "\[/h3\]", "

") - - if(istype(P, /obj/item/toy/crayon)) // If it is a crayon, and he still tries to use these, make them empty! + if(istype(P, /obj/item/toy/crayon) || !format) // If it is a crayon, and he still tries to use these, make them empty! text = replacetext(text, "\[*\]", "") text = replacetext(text, "\[hr\]", "") text = replacetext(text, "\[small\]", "") @@ -485,7 +485,7 @@ proc/checkhtml(var/t) text = replacetext(text, "\[row\]", "") text = replacetext(text, "\[cell\]", "") text = replacetext(text, "\[logo\]", "") - + if(istype(P, /obj/item/toy/crayon)) text = "[text]" else // They are using "not a crayon" - formatting is OK and such text = replacetext(text, "\[*\]", "
  • ") @@ -501,9 +501,10 @@ proc/checkhtml(var/t) text = replacetext(text, "\[row\]", "") text = replacetext(text, "\[cell\]", "") text = replacetext(text, "\[logo\]", "") - + if(P) text = "[text]" - + else + text = "[text]" text = copytext(text, 1, MAX_PAPER_MESSAGE_LEN) return text diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 82b2ea8b419..ccfeb287170 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1081,6 +1081,21 @@ proc/get_mob_with_client_list() return get_turf(location) +//For objects that should embed, but make no sense being is_sharp or is_pointed() +//e.g: rods +var/list/can_embed_types = typecacheof(list( + /obj/item/stack/rods, + /obj/item/pipe)) + +/proc/can_embed(obj/item/W) + if(is_sharp(W)) + return 1 + if(is_pointed(W)) + return 1 + + if(is_type_in_typecache(W, can_embed_types)) + return 1 + //Quick type checks for some tools var/global/list/common_tools = list( /obj/item/stack/cable_coil, @@ -1187,34 +1202,13 @@ var/global/list/common_tools = list( return 0 //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 +/proc/is_sharp(obj/O) + if(!O) + return 0 + if(O.sharp) + 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 - return 0 - -//Returns 1 if the given item is capable of popping things like balloons, inflatable barriers, or cutting police tape. -/proc/can_puncture(obj/item/W as obj) // For the record, WHAT THE HELL IS THIS METHOD OF DOING IT? - if(!istype(W)) return 0 - if(!W) return 0 - if(W.sharp) return 1 - return ( \ - W.sharp || \ - istype(W, /obj/item/weapon/screwdriver) || \ - istype(W, /obj/item/weapon/pen) || \ - istype(W, /obj/item/weapon/weldingtool) || \ - istype(W, /obj/item/weapon/lighter/zippo) || \ - istype(W, /obj/item/weapon/match) || \ - istype(W, /obj/item/clothing/mask/cigarette) || \ - istype(W, /obj/item/weapon/shovel) \ - ) - /proc/is_surgery_tool(obj/item/W as obj) return ( \ istype(W, /obj/item/weapon/scalpel) || \ @@ -1255,46 +1249,42 @@ var/global/list/common_tools = list( /* Checks if that loc and dir has a item on the wall */ -var/list/WALLITEMS = list( - "/obj/machinery/power/apc", "/obj/machinery/alarm", "/obj/item/device/radio/intercom", - "/obj/structure/extinguisher_cabinet", "/obj/structure/reagent_dispensers/peppertank", - "/obj/machinery/status_display", "/obj/machinery/requests_console", "/obj/machinery/light_switch", "/obj/effect/sign", - "/obj/machinery/newscaster", "/obj/machinery/firealarm", "/obj/structure/noticeboard", "/obj/machinery/door_control", - "/obj/machinery/computer/security/telescreen", "/obj/machinery/embedded_controller/radio/simple_vent_controller", - "/obj/item/weapon/storage/secure/safe", "/obj/machinery/door_timer", "/obj/machinery/flasher", "/obj/machinery/keycard_auth", - "/obj/structure/mirror", "/obj/structure/closet/fireaxecabinet", "/obj/machinery/computer/security/telescreen/entertainment", - "/obj/structure/sign" - ) +var/list/static/global/wall_items = typecacheof(list(/obj/machinery/power/apc, /obj/machinery/alarm, + /obj/item/device/radio/intercom, /obj/structure/extinguisher_cabinet, /obj/structure/reagent_dispensers/peppertank, + /obj/machinery/status_display, /obj/machinery/requests_console, /obj/machinery/light_switch, /obj/structure/sign, + /obj/machinery/newscaster, /obj/machinery/firealarm, /obj/structure/noticeboard, /obj/machinery/door_control, + /obj/machinery/computer/security/telescreen, /obj/machinery/embedded_controller/radio/airlock, + /obj/item/weapon/storage/secure/safe, /obj/machinery/door_timer, /obj/machinery/flasher, /obj/machinery/keycard_auth, + /obj/structure/mirror, /obj/structure/closet/fireaxecabinet, /obj/machinery/computer/security/telescreen/entertainment, + /obj/structure/sign)) + /proc/gotwallitem(loc, dir) for(var/obj/O in loc) - for(var/item in WALLITEMS) - if(istype(O, text2path(item))) - //Direction works sometimes - if(O.dir == dir) - return 1 - - //Some stuff doesn't use dir properly, so we need to check pixel instead - switch(dir) - if(SOUTH) - if(O.pixel_y > 10) - return 1 - if(NORTH) - if(O.pixel_y < -10) - return 1 - if(WEST) - if(O.pixel_x > 10) - return 1 - if(EAST) - if(O.pixel_x < -10) - return 1 + if(is_type_in_typecache(O, wall_items)) + //Direction works sometimes + if(O.dir == dir) + return 1 + //Some stuff doesn't use dir properly, so we need to check pixel instead + switch(dir) + if(SOUTH) + if(O.pixel_y > 10) + return 1 + if(NORTH) + if(O.pixel_y < -10) + return 1 + if(WEST) + if(O.pixel_x > 10) + return 1 + if(EAST) + if(O.pixel_x < -10) + return 1 //Some stuff is placed directly on the wallturf (signs) for(var/obj/O in get_step(loc, dir)) - for(var/item in WALLITEMS) - if(istype(O, text2path(item))) - if(abs(O.pixel_x) <= 10 && abs(O.pixel_y) <= 10) - return 1 + if(is_type_in_typecache(O, wall_items)) + if(abs(O.pixel_x) <= 10 && abs(O.pixel_y) <= 10) + return 1 return 0 @@ -1891,4 +1881,4 @@ var/global/list/g_fancy_list_of_types = null var/num = pick(num_sample) num_sample -= num result += (1 << num) - return result + return result diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index f4fad058068..0cc712799c7 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -12,6 +12,8 @@ var/global/list/airlocks = list() //list of all airlocks var/global/list/singularities = list() //list of all singularities var/global/list/janitorial_equipment = list() //list of janitorial equipment var/global/list/crafting_recipes = list() //list of all crafting recipes +var/global/list/prisoncomputer_list = list() +var/global/list/cell_logs = list() var/global/list/all_areas = list() var/global/list/machines = list() @@ -40,4 +42,6 @@ var/global/list/global_radios = list() //list of all radios, across all z-lev var/global/list/meteor_list = list() //list of all meteors var/global/list/poi_list = list() //list of points of interest for observe/follow +var/global/list/active_jammers = list() // List of active radio jammers +var/global/list/active_diseases = list() //List of Active disease in all mobs; purely for quick referencing. \ No newline at end of file diff --git a/code/_onclick/adjacent.dm b/code/_onclick/adjacent.dm index 5a84463c8f1..038174388ff 100644 --- a/code/_onclick/adjacent.dm +++ b/code/_onclick/adjacent.dm @@ -23,7 +23,7 @@ * If you are in the same turf, always true * If you are vertically/horizontally adjacent, ensure there are no border objects * If you are diagonally adjacent, ensure you can pass through at least one of the mutually adjacent square. - * Passing through in this case ignores anything with the throwpass flag, such as tables, racks, and morgue trays. + * Passing through in this case ignores anything with the LETPASSTHROW flag, such as tables, racks, and morgue trays. */ /turf/Adjacent(var/atom/neighbor, var/atom/target = null) var/turf/T0 = get_turf(neighbor) @@ -82,26 +82,18 @@ /* This checks if you there is uninterrupted airspace between that turf and this one. - This is defined as any dense ON_BORDER object, or any dense object without throwpass. + This is defined as any dense ON_BORDER object, or any dense object without LETPASSTHROW. The border_only flag allows you to not objects (for source and destination squares) */ /turf/proc/ClickCross(var/target_dir, var/border_only, var/target_atom = null) for(var/obj/O in src) - if( !O.density || O == target_atom || O.throwpass) continue // throwpass is used for anything you can click through + if( !O.density || O == target_atom || (O.pass_flags & LETPASSTHROW)) + continue // LETPASSTHROW is used for anything you can click through - if( O.flags&ON_BORDER) // windows have throwpass but are on border, check them first + if( O.flags&ON_BORDER) // windows are on border, check them first if( O.dir & target_dir || O.dir&(O.dir-1) ) // full tile windows are just diagonals mechanically return 0 else if( !border_only ) // dense, not on border, cannot pass over return 0 - return 1 -/* - Aside: throwpass does not do what I thought it did originally, and is only used for checking whether or not - a thrown object should stop after already successfully entering a square. Currently the throw code involved - only seems to affect hitting mobs, because the checks performed against objects are already performed when - entering or leaving the square. Since throwpass isn't used on mobs, but only on objects, it is effectively - useless. Throwpass may later need to be removed and replaced with a passcheck (bitfield on movable atom passflags). - - Since I don't want to complicate the click code rework by messing with unrelated systems it won't be changed here. -*/ \ No newline at end of file + return 1 \ No newline at end of file diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index e969751e1dd..51afe833ea3 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -199,6 +199,11 @@ Topic(src, list("src" = UID(), "command"="lights", "activate" = "0"), 1) return +/obj/machinery/ai_slipper/AICtrlClick() //Turns liquid dispenser on or off + ToggleOn() + +/obj/machinery/ai_slipper/AIAltClick() //Dispenses liquid if on + Activate() // // Override AdjacentQuick for AltClicking diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 58928da83e0..b4bb8292ca2 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -169,7 +169,7 @@ /mob/proc/RangedAttack(var/atom/A, var/params) if(!mutations.len) return - if((LASER in mutations) && a_intent == I_HARM) + if((LASER in mutations) && a_intent == INTENT_HARM) LaserEyes(A) // moved into a proc below return else diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index a15176af87c..a8de6127c41 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -169,6 +169,12 @@ /obj/machinery/turretid/BorgAltClick() //turret lethal on/off. Forwards to AI code. AIAltClick() +/obj/machinery/ai_slipper/BorgCtrlClick() //Turns liquid dispenser on or off + ToggleOn() + +/obj/machinery/ai_slipper/BorgAltClick() //Dispenses liquid if on + Activate() + /* As with AI, these are not used in click code, because the code for robots is specific, not generic. diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 68a24f87a3e..1d5d419ba82 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -235,6 +235,12 @@ or something covering your eyes." desc = "All that alcohol you've been drinking is impairing your speech, motor skills, and mental cognition. Make sure to act like it." icon_state = "drunk" +/obj/screen/alert/embeddedobject + name = "Embedded Object" + desc = "Something got lodged into your flesh and is causing major bleeding. It might fall out with time, but surgery is the safest way. \ + If you're feeling frisky, click yourself in help intent to pull the object out." + icon_state = "embeddedobject" + /obj/screen/alert/embeddedobject/Click() if(isliving(usr)) var/mob/living/carbon/human/M = usr @@ -405,6 +411,27 @@ so as to remain in compliance with the most up-to-date laws." if(NOTIFY_FOLLOW) G.ManualFollow(target) +/obj/screen/alert/notify_soulstone + name = "Soul Stone" + desc = "Someone is trying to capture your soul in a soul stone. Click to allow it." + icon_state = "template" + timeout = 10 SECONDS + var/obj/item/device/soulstone/stone = null + var/stoner = null + +/obj/screen/alert/notify_soulstone/Click() + if(!usr || !usr.client) + return + if(stone) + if(alert(usr, "Do you want to be captured by [stoner]'s soul stone? This will destroy your corpse and make it \ + impossible for you to get back into the game as your regular character.",, "No", "Yes") == "Yes") + stone.opt_in = TRUE + +/obj/screen/alert/notify_soulstone/Destroy() + stone = null + return ..() + + //OBJECT-BASED /obj/screen/alert/restrained/buckled diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm index 79d109c0c57..ff8b856e797 100644 --- a/code/_onclick/hud/alien.dm +++ b/code/_onclick/hud/alien.dm @@ -41,14 +41,14 @@ static_inventory += using using = new /obj/screen/act_intent/alien() - using.icon_state = (mymob.a_intent == "hurt" ? "harm" : mymob.a_intent) + using.icon_state = (mymob.a_intent == "hurt" ? INTENT_HARM : mymob.a_intent) using.screen_loc = ui_acti static_inventory += using action_intent = using using = new /obj/screen/mov_intent() using.icon = 'icons/mob/screen_alien.dmi' - using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") + using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking") using.screen_loc = ui_movi static_inventory += using move_intent = using diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm index c4f453077ef..9e57fd9429b 100644 --- a/code/_onclick/hud/alien_larva.dm +++ b/code/_onclick/hud/alien_larva.dm @@ -14,7 +14,7 @@ using = new /obj/screen/mov_intent() using.icon = 'icons/mob/screen_alien.dmi' - using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") + using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking") static_inventory += using move_intent = using @@ -36,4 +36,4 @@ mymob.zone_sel = new /obj/screen/zone_sel/alien() mymob.zone_sel.update_icon(mymob) - static_inventory += mymob.zone_sel \ No newline at end of file + static_inventory += mymob.zone_sel diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 2e1d87f605e..f4b43516cd0 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -100,6 +100,15 @@ if(display_hud_version > HUD_VERSIONS) //If the requested version number is greater than the available versions, reset back to the first version display_hud_version = 1 + if(mymob.client.view < world.view) + if(mymob.client.view < ARBITRARY_VIEWRANGE_NOHUD) + to_chat(mymob, "HUD is unavailable with this view range.") + display_hud_version = HUD_STYLE_NOHUD + else + if(display_hud_version == HUD_STYLE_STANDARD) + to_chat(mymob, "Standard HUD mode is unavailable with a smaller-than-normal view range.") + display_hud_version = HUD_STYLE_REDUCED + switch(display_hud_version) if(HUD_STYLE_STANDARD) //Default HUD hud_shown = 1 //Governs behavior of other procs diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index d543ce9c416..fbba17c7b6b 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -43,9 +43,7 @@ /mob/living/carbon/human/proc/remake_hud() //used for preference changes mid-round; can't change hud icons without remaking the hud. - if(hud_used) - qdel(hud_used) - hud_used = null + QDEL_NULL(hud_used) create_mob_hud() if(hud_used) hud_used.show_hud(hud_used.hud_version) @@ -81,7 +79,7 @@ using = new /obj/screen/mov_intent() using.icon = ui_style - using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") + using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking") using.screen_loc = ui_movi using.color = ui_color using.alpha = ui_alpha diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm index e5d1e15512a..ae0fb3e1263 100644 --- a/code/_onclick/hud/monkey.dm +++ b/code/_onclick/hud/monkey.dm @@ -17,7 +17,7 @@ using = new /obj/screen/mov_intent() using.icon = ui_style - using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") + using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking") using.screen_loc = ui_movi using.color = ui_color using.alpha = ui_alpha diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index cf0247e847a..d184f765eac 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -70,14 +70,14 @@ var/_y = text2num(params2list(params)["icon-y"]) if(_x<=16 && _y<=16) - usr.a_intent_change(I_HARM) + usr.a_intent_change(INTENT_HARM) else if(_x<=16 && _y>=17) - usr.a_intent_change(I_HELP) + usr.a_intent_change(INTENT_HELP) else if(_x>=17 && _y<=16) - usr.a_intent_change(I_GRAB) + usr.a_intent_change(INTENT_GRAB) else if(_x>=17 && _y>=17) - usr.a_intent_change(I_DISARM) + usr.a_intent_change(INTENT_DISARM) else usr.a_intent_change("right") @@ -108,11 +108,12 @@ icon_state = "internal0" else var/no_mask = FALSE - if(!C.wear_mask || !(C.wear_mask.flags & AIRTIGHT)) - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if(!H.head || !(H.head.flags & AIRTIGHT)) - no_mask = TRUE + if(!C.get_organ_slot("breathing_tube")) + if(!C.wear_mask || !(C.wear_mask.flags & AIRTIGHT)) + if(ishuman(C)) + var/mob/living/carbon/human/H = C + if(!H.head || !(H.head.flags & AIRTIGHT)) + no_mask = TRUE if(no_mask) to_chat(C, "You are not wearing a suitable mask or helmet.") @@ -199,15 +200,15 @@ var/mob/living/carbon/C = usr if(C.legcuffed) to_chat(C, "You are legcuffed! You cannot run until you get [C.legcuffed] removed!") - C.m_intent = "walk" //Just incase + C.m_intent = MOVE_INTENT_WALK //Just incase C.hud_used.move_intent.icon_state = "walking" return 1 switch(usr.m_intent) - if("run") - usr.m_intent = "walk" + if(MOVE_INTENT_RUN) + usr.m_intent = MOVE_INTENT_WALK usr.hud_used.move_intent.icon_state = "walking" - if("walk") - usr.m_intent = "run" + if(MOVE_INTENT_WALK) + usr.m_intent = MOVE_INTENT_RUN usr.hud_used.move_intent.icon_state = "running" if(istype(usr,/mob/living/carbon/alien/humanoid)) usr.update_icons() diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 59cbf9c6219..8d132ed2586 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -183,9 +183,7 @@ M.take_organ_damage(power) if(prob(33)) // Added blood for whacking non-humans too - var/turf/simulated/location = M.loc - if(istype(location, /turf/simulated)) - location.add_blood_floor(M) + M.add_splatter_floor() if("fire") M.take_organ_damage(0, power) to_chat(M, "Aargh it burns!") diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index ea9de45f295..87b78259593 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -30,7 +30,7 @@ /mob/living/carbon/human/RangedAttack(var/atom/A) if(!gloves && !mutations.len) return var/obj/item/clothing/gloves/G = gloves - if((LASER in mutations) && a_intent == I_HARM) + if((LASER in mutations) && a_intent == INTENT_HARM) LaserEyes(A) // moved into a proc below else if(istype(G) && G.Touch(A,0)) // for magic gloves diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index f32161b92a2..eba4da0fe65 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -11,7 +11,8 @@ var/const/tk_maxrange = 15 By default, emulate the user's unarmed attack */ /atom/proc/attack_tk(mob/user) - if(user.stat) return + if(user.stat) + return user.UnarmedAttack(src,0) // attack_hand, attack_paw, etc return @@ -26,27 +27,23 @@ var/const/tk_maxrange = 15 return /obj/attack_tk(mob/user) - if(user.stat) return + if(user.stat) + return if(anchored) ..() return var/obj/item/tk_grab/O = new(src) - user.put_in_active_hand(O) - O.host = user - O.focus_object(src) - return + O.form_grab(user, src) /obj/item/attack_tk(mob/user) - if(user.stat || !isturf(loc)) return + if(user.stat || !isturf(loc)) + return if((TK in user.mutations) && !user.get_active_hand()) // both should already be true to get here var/obj/item/tk_grab/O = new(src) - user.put_in_active_hand(O) - O.host = user - O.focus_object(src) + O.form_grab(user, src) else warning("Strange attack_tk(): TK([TK in user.mutations]) empty hand([!user.get_active_hand()])") - return /mob/attack_tk(mob/user) @@ -75,104 +72,137 @@ var/const/tk_maxrange = 15 var/atom/movable/focus = null var/mob/living/host = null +/obj/item/tk_grab/Destroy() + if(focus) + release_object() + // Focus is null now + host = null + return ..() - dropped(mob/user as mob) - if(focus && user && loc != user && loc != user.loc) // drop_item() gets called when you tk-attack a table/closet with an item - if(focus.Adjacent(loc)) - focus.loc = loc +/obj/item/tk_grab/dropped(mob/user) + if(focus && user && loc != user && loc != user.loc) // drop_item() gets called when you tk-attack a table/closet with an item + if(focus.Adjacent(loc)) + focus.loc = loc - qdel(src) - return + qdel(src) //stops TK grabs being equipped anywhere but into hands - equipped(var/mob/user, var/slot) - if( (slot == slot_l_hand) || (slot== slot_r_hand) ) return +/obj/item/tk_grab/equipped(mob/user, var/slot) + if( (slot == slot_l_hand) || (slot== slot_r_hand) ) + return + qdel(src) + + +/obj/item/tk_grab/attack_self(mob/user) + if(focus) + focus.attack_self_tk(user) + +/obj/item/tk_grab/override_throw(mob/user, atom/target) + afterattack(target, user) + return TRUE + +/obj/item/tk_grab/afterattack(atom/target , mob/living/user, proximity, params)//TODO: go over this + if(!target || !user) + return + if(last_throw+3 > world.time) + return + if(!host || host != user) qdel(src) return - - - attack_self(mob/user as mob) - if(focus) - focus.attack_self_tk(user) - - afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, proximity, params)//TODO: go over this - if(!target || !user) return - if(last_throw+3 > world.time) return - if(!host || host != user) - qdel(src) - return - if(!(TK in host.mutations)) - qdel(src) - return - if(isobj(target) && !isturf(target.loc)) - return - - var/d = get_dist(user, target) - if(focus) - d = max(d,get_dist(user,focus)) // whichever is further - if(d > tk_maxrange) - to_chat(user, "Your mind won't reach that far.") - return - - if(!focus) - focus_object(target, user) - return - - if(target == focus) - target.attack_self_tk(user) - return // todo: something like attack_self not laden with assumptions inherent to attack_self - - - if(!istype(target, /turf) && istype(focus,/obj/item) && target.Adjacent(focus)) - var/obj/item/I = focus - var/resolved = target.attackby(I, user, params) - if(!resolved && target && I) - I.afterattack(target,user,1) // for splashing with beakers - - - else - apply_focus_overlay() - focus.throw_at(target, 10, 1, user) - last_throw = world.time + if(!(TK in host.mutations)) + qdel(src) + return + if(isobj(target) && !isturf(target.loc)) return - attack(mob/living/M as mob, mob/living/user as mob, def_zone) + var/d = get_dist(user, target) + if(focus) + d = max(d,get_dist(user,focus)) // whichever is further + if(d > tk_maxrange) + to_chat(user, "Your mind won't reach that far.") return + if(!focus) + focus_object(target, user) + return - proc/focus_object(var/obj/target, var/mob/living/user) - if(!istype(target,/obj)) return//Cant throw non objects atm might let it do mobs later - if(target.anchored || !isturf(target.loc)) - qdel(src) - return - focus = target - update_icon() + if(target == focus) + target.attack_self_tk(user) + return // todo: something like attack_self not laden with assumptions inherent to attack_self + + + if(istype(focus,/obj/item) && target.Adjacent(focus) && !user.in_throw_mode) + var/obj/item/I = focus + var/resolved = target.attackby(I, user, params) + if(!resolved && target && I) + I.afterattack(target,user,1) // for splashing with beakers + + + else apply_focus_overlay() + focus.throw_at(target, 10, 1, user) + last_throw = world.time + +/obj/item/tk_grab/attack(mob/living/M, mob/living/user, def_zone) + return + +/obj/item/tk_grab/is_equivalent(obj/item/I) + . = ..() + if(!.) + return I == focus + +/obj/item/tk_grab/proc/focus_object(var/obj/target, var/mob/user) + if(!istype(target,/obj)) + return//Cant throw non objects atm might let it do mobs later + if(target.anchored || !isturf(target.loc)) + qdel(src) return - - - proc/apply_focus_overlay() - if(!focus) return - var/obj/effect/overlay/O = new /obj/effect/overlay(locate(focus.x,focus.y,focus.z)) - O.name = "sparkles" - O.anchored = 1 - O.density = 0 - O.layer = FLY_LAYER - O.dir = pick(cardinal) - O.icon = 'icons/effects/effects.dmi' - O.icon_state = "nothing" - flick("empdisable",O) - spawn(5) - qdel(O) - return - - + focus = target update_icon() - overlays.Cut() - if(focus && focus.icon && focus.icon_state) - overlays += icon(focus.icon,focus.icon_state) + apply_focus_overlay() + // Make it behave like other equipment + if(istype(target, /obj/item)) + if(target in user.tkgrabbed_objects) + // Release the old grab first + user.unEquip(user.tkgrabbed_objects[target]) + user.tkgrabbed_objects[target] = src + +/obj/item/tk_grab/proc/release_object() + if(!focus) return + if(istype(focus, /obj/item)) + // Delete the key/value pair of item to TK grab + host.tkgrabbed_objects -= focus + focus = null + update_icon() + +/obj/item/tk_grab/proc/apply_focus_overlay() + if(!focus) + return + // Oh jeez ow + var/obj/effect/overlay/O = new /obj/effect/overlay(locate(focus.x,focus.y,focus.z)) + O.name = "sparkles" + O.anchored = 1 + O.density = 0 + O.layer = FLY_LAYER + O.dir = pick(cardinal) + O.icon = 'icons/effects/effects.dmi' + O.icon_state = "nothing" + flick("empdisable",O) + spawn(5) + qdel(O) + +/obj/item/tk_grab/proc/form_grab(mob/user, obj/target) + user.put_in_active_hand(src) + host = user + focus_object(target, user) + + +/obj/item/tk_grab/update_icon() + overlays.Cut() + if(focus && focus.icon && focus.icon_state) + overlays += icon(focus.icon,focus.icon_state) /*Not quite done likely needs to use something thats not get_step_to proc/check_path() @@ -197,4 +227,3 @@ var/const/tk_maxrange = 15 var/Z = source:z */ - diff --git a/code/controllers/Processes/diseases.dm b/code/controllers/Processes/diseases.dm deleted file mode 100644 index d0bec749ac8..00000000000 --- a/code/controllers/Processes/diseases.dm +++ /dev/null @@ -1,43 +0,0 @@ -var/datum/controller/process/diseases/disease_master - -/datum/controller/process/diseases - var/list/currentrun = list() - var/list/processing_diseases = list() - -/datum/controller/process/diseases/setup() - name = "disease" - schedule_interval = 20 // every 2 seconds - start_delay = 7 - log_startup_progress("Disease controller starting.") - - register_diseases() //register all pre-round diseases created - -/datum/controller/process/diseases/statProcess() - ..() - stat(null, "[processing_diseases.len] diseases") - - -/datum/controller/process/diseases/doWork() - src.currentrun = processing_diseases.Copy() - //cache for sanic speed (lists are references anyways) - var/list/currentrun = src.currentrun - - while(currentrun.len) - var/datum/disease/thing = currentrun[1] - currentrun.Cut(1, 2) - if(thing) - try - thing.process() - catch(var/exception/e) - catchException(e, thing) - SCHECK - else - catchBadType(thing) - processing_diseases.Remove(thing) - -DECLARE_GLOBAL_CONTROLLER(diseases, disease_master) - -/datum/controller/process/diseases/proc/register_diseases() - for(var/datum/disease/D in world) - if(!processing_diseases.Find(D)) - D.register() diff --git a/code/controllers/Processes/shuttles.dm b/code/controllers/Processes/shuttles.dm index 21f2e8c390e..4f47bda014c 100644 --- a/code/controllers/Processes/shuttles.dm +++ b/code/controllers/Processes/shuttles.dm @@ -25,7 +25,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12 var/points_per_crate = 5 //points gained per crate returned var/points_per_intel = 250 //points gained per intel returned var/points_per_plasma = 5 //points gained per plasma returned - var/points_per_design = 25 //points gained per max reliability research design returned (only for initilally unreliable designs) + var/points_per_design = 25 //points gained per research design returned var/centcom_message = "" //Remarks from Centcom on how well you checked the last order. var/list/discoveredPlants = list() //Typepaths for unusual plants we've already sent CentComm, associated with their potencies var/list/techLevels = list() diff --git a/code/controllers/Processes/spacedrift.dm b/code/controllers/Processes/spacedrift.dm new file mode 100644 index 00000000000..d799aeb99d9 --- /dev/null +++ b/code/controllers/Processes/spacedrift.dm @@ -0,0 +1,53 @@ +var/global/datum/controller/process/spacedrift/drift_master + +/datum/controller/process/spacedrift + var/list/processing_list = list() + +/datum/controller/process/spacedrift/setup() + name = "spacedrift" + schedule_interval = 5 + start_delay = 20 + log_startup_progress("Spacedrift starting up.") + +/datum/controller/process/spacedrift/statProcess() + ..() + stat(null, "P:[processing_list.len]") + +/datum/controller/process/spacedrift/doWork() + var/list/currentrun = processing_list.Copy() + + while(currentrun.len) + var/atom/movable/AM = currentrun[currentrun.len] + currentrun.len-- + if(!AM) + processing_list -= AM + SCHECK + continue + + if(AM.inertia_next_move > world.time) + SCHECK + continue + + if(!AM.loc || AM.loc != AM.inertia_last_loc || AM.Process_Spacemove(0)) + AM.inertia_dir = 0 + + if(!AM.inertia_dir) + AM.inertia_last_loc = null + processing_list -= AM + SCHECK + continue + + var/old_dir = AM.dir + var/old_loc = AM.loc + AM.inertia_moving = TRUE + step(AM, AM.inertia_dir) + AM.inertia_moving = FALSE + AM.inertia_next_move = world.time + AM.inertia_move_delay + if(AM.loc == old_loc) + AM.inertia_dir = 0 + + AM.setDir(old_dir) + AM.inertia_last_loc = AM.loc + SCHECK + +DECLARE_GLOBAL_CONTROLLER(spacedrift, drift_master) \ No newline at end of file diff --git a/code/controllers/Processes/throwing.dm b/code/controllers/Processes/throwing.dm new file mode 100644 index 00000000000..a11c1252d35 --- /dev/null +++ b/code/controllers/Processes/throwing.dm @@ -0,0 +1,138 @@ +#define MAX_THROWING_DIST 512 // 2 z-levels on default width +#define MAX_TICKS_TO_MAKE_UP 3 //how many missed ticks will we attempt to make up for this run. + +var/global/datum/controller/process/throwing/throw_master + +/datum/controller/process/throwing + var/list/processing_list + +/datum/controller/process/throwing/setup() + name = "throwing" + schedule_interval = 1 + start_delay = 20 + log_startup_progress("Throw ticker starting up.") + +/datum/controller/process/throwing/statProcess() + ..() + stat(null, "P:[processing_list.len]") + +/datum/controller/process/throwing/started() + ..() + if(!processing_list) + processing_list = list() + +/datum/controller/process/throwing/doWork() + for(last_object in processing_list) + var/atom/movable/AM = last_object + if(istype(AM) && isnull(AM.gcDestroyed)) + var/datum/thrownthing/TT = processing_list[AM] + if(istype(TT) && isnull(TT.gcDestroyed)) + TT.tick() + SCHECK + else + catchBadType(TT) + processing_list -= AM + AM.throwing = null + else + catchBadType(AM) + processing_list -= AM + SCHECK + +DECLARE_GLOBAL_CONTROLLER(throwing, throw_master) + +/datum/thrownthing + var/atom/movable/thrownthing + var/atom/target + var/turf/target_turf + var/init_dir + var/maxrange + var/speed + var/mob/thrower + var/diagonals_first + var/dist_travelled = 0 + var/start_time + var/dist_x + var/dist_y + var/dx + var/dy + var/pure_diagonal + var/diagonal_error + var/datum/callback/callback + +/datum/thrownthing/proc/tick() + var/atom/movable/AM = thrownthing + if(!isturf(AM.loc) || !AM.throwing) + finalize() + return + + if(dist_travelled && hitcheck()) //to catch sneaky things moving on our tile while we slept + finalize() + return + + var/atom/step + + // calculate how many tiles to move, making up for any missed ticks. + if((dist_travelled >= maxrange || AM.loc == target_turf) && has_gravity(AM, AM.loc)) + finalize() + return + + if(dist_travelled <= max(dist_x, dist_y)) //if we haven't reached the target yet we home in on it, otherwise we use the initial direction + step = get_step(AM, get_dir(AM, target_turf)) + else + step = get_step(AM, init_dir) + + if(!pure_diagonal && !diagonals_first) // not a purely diagonal trajectory and we don't want all diagonal moves to be done first + if(diagonal_error >= 0 && max(dist_x, dist_y) - dist_travelled != 1) // we do a step forward unless we're right before the target + step = get_step(AM, dx) + diagonal_error += (diagonal_error < 0) ? dist_x / 2 : -dist_y + + if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge + finalize() + return + + AM.Move(step, get_dir(AM, step)) + + if(!AM.throwing) // we hit something during our move + finalize(hit = TRUE) + return + + dist_travelled++ + + if(dist_travelled > MAX_THROWING_DIST) + finalize() + return + +/datum/thrownthing/proc/finalize(hit = FALSE) + set waitfor = 0 + throw_master.processing_list -= thrownthing + // done throwning, either because it hit something or it finished moving + thrownthing.throwing = null + if(!hit) + for(var/thing in get_turf(thrownthing)) //looking for our target on the turf we land on. + var/atom/A = thing + if(A == target) + hit = 1 + thrownthing.throw_impact(A, src) + break + if(!hit) + thrownthing.throw_impact(get_turf(thrownthing), src) // we haven't hit something yet and we still must, let's hit the ground. + thrownthing.newtonian_move(init_dir) + else + thrownthing.newtonian_move(init_dir) + if(callback) + callback.Invoke() + +/datum/thrownthing/proc/hit_atom(atom/A) + thrownthing.throw_impact(A, src) + thrownthing.newtonian_move(init_dir) + finalize(TRUE) + +/datum/thrownthing/proc/hitcheck() + for(var/thing in get_turf(thrownthing)) + var/atom/movable/AM = thing + if(AM == thrownthing) + continue + if(AM.density && !(AM.pass_flags & LETPASSTHROW) && !(AM.flags & ON_BORDER)) + thrownthing.throwing = null + thrownthing.throw_impact(AM, src) + return TRUE \ No newline at end of file diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 6cccb48e492..2ab267ce5a8 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -39,7 +39,6 @@ var/allow_Metadata = 0 // Metadata is supported. var/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1. var/Ticklag = 0.5 - var/Tickcomp = 0 var/socket_talk = 0 // use socket_talk to communicate with other processes var/list/resource_urls = null var/antag_hud_allowed = 0 // Ghosts can turn on Antagovision to see a HUD of who is the bad guys this round. @@ -445,9 +444,6 @@ if("socket_talk") socket_talk = text2num(value) - if("tickcomp") - Tickcomp = 1 - if("allow_antag_hud") config.antag_hud_allowed = 1 diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index fe8d1cbb133..1cc9787420d 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -72,9 +72,6 @@ if("Vote") debug_variables(vote) feedback_add_details("admin_verb","DVote") - if("Diseases") - debug_variables(disease_master) - feedback_add_details("admin_verb","DDiseases") if("Fires") debug_variables(fire_master) feedback_add_details("admin_verb","DFires") diff --git a/code/datums/action.dm b/code/datums/action.dm index 0bec4e37d35..499570be291 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -145,7 +145,7 @@ name = "Pull The Starting Cord" /datum/action/item_action/print_report - name = "Print Forensic Report" + name = "Print Report" /datum/action/item_action/toggle_gunlight name = "Toggle Gunlight" diff --git a/code/datums/beam.dm b/code/datums/beam.dm index 7a8c802b42d..bb1cef167d6 100644 --- a/code/datums/beam.dm +++ b/code/datums/beam.dm @@ -15,12 +15,13 @@ var/static_beam = 0 var/beam_type = /obj/effect/ebeam //must be subtype -/datum/beam/New(beam_origin,beam_target,beam_icon='icons/effects/beam.dmi',beam_icon_state="b_beam",time=50,maxdistance=10,btype = /obj/effect/ebeam) +/datum/beam/New(beam_origin,beam_target,beam_icon='icons/effects/beam.dmi',beam_icon_state="b_beam",time=50,maxdistance=10,btype = /obj/effect/ebeam,beam_sleep_time=3) endtime = world.time+time origin = beam_origin origin_oldloc = get_turf(origin) target = beam_target target_oldloc = get_turf(target) + sleep_time = beam_sleep_time if(origin_oldloc == origin && target_oldloc == target) static_beam = 1 max_distance = maxdistance @@ -117,13 +118,13 @@ /obj/effect/ebeam/Destroy() owner = null return ..() - + /obj/effect/ebeam/deadly/Crossed(atom/A) ..() A.ex_act(1) -/atom/proc/Beam(atom/BeamTarget,icon_state="b_beam",icon='icons/effects/beam.dmi',time=50, maxdistance=10,beam_type=/obj/effect/ebeam) - var/datum/beam/newbeam = new(src,BeamTarget,icon,icon_state,time,maxdistance,beam_type) +/atom/proc/Beam(atom/BeamTarget,icon_state="b_beam",icon='icons/effects/beam.dmi',time=50, maxdistance=10,beam_type=/obj/effect/ebeam,beam_sleep_time=3) + var/datum/beam/newbeam = new(src,BeamTarget,icon,icon_state,time,maxdistance,beam_type,beam_sleep_time) spawn(0) newbeam.Start() return newbeam \ No newline at end of file diff --git a/code/datums/cache/air_alarm.dm b/code/datums/cache/air_alarm.dm index b507c096081..5f34997c95f 100644 --- a/code/datums/cache/air_alarm.dm +++ b/code/datums/cache/air_alarm.dm @@ -11,14 +11,17 @@ var/global/datum/repository/air_alarm/air_alarm_repository = new() if(!refresh) return cache_entry.data - if(ticker && ticker.current_state < GAME_STATE_PLAYING && istype(passed_alarm)) // Generating the list for the first time as the game hasn't started - no need to run through the machines list everything every time - alarms[++alarms.len] = passed_alarm.get_nano_data_console() + if(ticker && ticker.current_state < GAME_STATE_PLAYING && istype(passed_alarm)) // Generating the list for the first time as the game hasn't started - no need to run through the machines list everything every time + alarms = cache_entry.data // Don't deleate the list + if(is_station_contact(passed_alarm.z)) // Still need sanity checks + alarms[++alarms.len] = passed_alarm.get_nano_data_console() else - for(var/obj/machinery/alarm/alarm in (monitored_alarms ? monitored_alarms : air_alarms)) - if(!monitored_alarms && !is_station_contact(alarm.z)) + for(var/obj/machinery/alarm/alarm in (monitored_alarms ? monitored_alarms : air_alarms)) // Generating the whole list again is a bad habit but I can't be bothered to fix it right now + if(!monitored_alarms && !is_station_contact(alarm.z)) continue alarms[++alarms.len] = alarm.get_nano_data_console() + cache_entry.timestamp = world.time //+ 10 SECONDS cache_entry.data = alarms return alarms diff --git a/code/datums/callback.dm b/code/datums/callback.dm new file mode 100644 index 00000000000..02909c1a196 --- /dev/null +++ b/code/datums/callback.dm @@ -0,0 +1,98 @@ +/* + USAGE: + + var/datum/callback/C = new(object|null, /proc/type/path|"procstring", arg1, arg2, ... argn) + var/timerid = addtimer(C, time, timertype) + OR + var/timerid = addtimer(CALLBACK(object|null, /proc/type/path|procstring, arg1, arg2, ... argn), time, timertype) + + Note: proc strings can only be given for datum proc calls, global procs must be proc paths + Also proc strings are strongly advised against because they don't compile error if the proc stops existing + See the note on proc typepath shortcuts + + INVOKING THE CALLBACK: + var/result = C.Invoke(args, to, add) //additional args are added after the ones given when the callback was created + OR + var/result = C.InvokeAsync(args, to, add) //Sleeps will not block, returns . on the first sleep (then continues on in the "background" after the sleep/block ends), otherwise operates normally. + OR + INVOKE_ASYNC() to immediately create and call InvokeAsync + + PROC TYPEPATH SHORTCUTS (these operate on paths, not types, so to these shortcuts, datum is NOT a parent of atom, etc...) + + global proc while in another global proc: + .procname + Example: + CALLBACK(GLOBAL_PROC, .some_proc_here) + + proc defined on current(src) object (when in a /proc/ and not an override) OR overridden at src or any of it's parents: + .procname + Example: + CALLBACK(src, .some_proc_here) + + + when the above doesn't apply: + .proc/procname + Example: + CALLBACK(src, .proc/some_proc_here) + + proc defined on a parent of a some type: + /some/type/.proc/some_proc_here + + + + Other wise you will have to do the full typepath of the proc (/type/of/thing/proc/procname) + +*/ + +/datum/callback + var/datum/object = GLOBAL_PROC + var/delegate + var/list/arguments + +/datum/callback/New(thingtocall, proctocall, ...) + if(thingtocall) + object = thingtocall + delegate = proctocall + if(length(args) > 2) + arguments = args.Copy(3) + +/proc/ImmediateInvokeAsync(thingtocall, proctocall, ...) + set waitfor = FALSE + + if(!thingtocall) + return + + var/list/calling_arguments = length(args) > 2 ? args.Copy(3) : null + + if(thingtocall == GLOBAL_PROC) + call(proctocall)(arglist(calling_arguments)) + else + call(thingtocall, proctocall)(arglist(calling_arguments)) + +/datum/callback/proc/Invoke(...) + if(!object) + return + var/list/calling_arguments = arguments + if(length(args)) + if(length(arguments)) + calling_arguments = calling_arguments + args //not += so that it creates a new list so the arguments list stays clean + else + calling_arguments = args + if(object == GLOBAL_PROC) + return call(delegate)(arglist(calling_arguments)) + return call(object, delegate)(arglist(calling_arguments)) + +//copy and pasted because fuck proc overhead +/datum/callback/proc/InvokeAsync(...) + set waitfor = FALSE + if(!object) + return + var/list/calling_arguments = arguments + if(length(args)) + if(length(arguments)) + calling_arguments = calling_arguments + args //not += so that it creates a new list so the arguments list stays clean + else + calling_arguments = args + if(object == GLOBAL_PROC) + return call(delegate)(arglist(calling_arguments)) + return call(object, delegate)(arglist(calling_arguments)) diff --git a/code/datums/cargoprofile.dm b/code/datums/cargoprofile.dm index 233490f73b0..a6e53c61eac 100644 --- a/code/datums/cargoprofile.dm +++ b/code/datums/cargoprofile.dm @@ -246,9 +246,9 @@ //Note that this filters out blueprints because they are a paper item. Do NOT throw out the station blueprints unless you be trollin'. blacklist = null whitelist = list(/obj/item/trash,/obj/item/toy,/obj/item/weapon/reagent_containers/food/snacks/ectoplasm,/obj/item/weapon/grown/bananapeel,/obj/item/weapon/broken_bottle,/obj/item/weapon/bikehorn, - /obj/item/weapon/cigbutt,/obj/item/weapon/contraband,/obj/item/weapon/grown/corncob,/obj/item/weapon/paper,/obj/item/weapon/shard, + /obj/item/weapon/cigbutt,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/grown/corncob,/obj/item/weapon/paper,/obj/item/weapon/shard, /obj/item/weapon/sord,/obj/item/weapon/photo,/obj/item/weapon/folder, - /obj/item/areaeditor/blueprints,/obj/item/weapon/contraband,/obj/item/weapon/kitchen,/obj/item/weapon/book,/obj/item/clothing/mask/facehugger) + /obj/item/areaeditor/blueprints,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/kitchen,/obj/item/weapon/book,/obj/item/clothing/mask/facehugger) /datum/cargoprofile/weapons name = "Weapons & Illegals" diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index 0252977dcf4..48e4366c825 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -1,6 +1,7 @@ /mob/proc/HasDisease(datum/disease/D) - for(var/datum/disease/DD in viruses) + for(var/thing in viruses) + var/datum/disease/DD = thing if(D.IsSame(DD)) return 1 return 0 @@ -35,7 +36,7 @@ var/datum/disease/DD = new D.type(1, D, 0) viruses += DD DD.affected_mob = src - DD.holder = src + active_diseases += DD //Add it to the active diseases list, now that it's actually in a mob and being processed. //Copy properties over. This is so edited diseases persist. var/list/skipped = list("affected_mob","holder","carrier","stage","type","parent_type","vars","transformed") @@ -133,8 +134,11 @@ /mob/living/carbon/human/CanContractDisease(datum/disease/D) - if(species.virus_immune) + if(species.virus_immune && !D.bypasses_immunity) return 0 + for(var/thing in D.required_organs) + if(!((locate(thing) in bodyparts) || (locate(thing) in internal_organs))) + return 0 return ..() /mob/living/carbon/human/monkey/CanContractDisease(datum/disease/D) diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index 908cded34e2..571a0d7aa7b 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -50,21 +50,23 @@ var/list/diseases = subtypesof(/datum/disease) var/stage_prob = 4 //Other - var/longevity = 150 //Time in ticks disease stays in objects, Syringes and such are infinite. var/list/viable_mobtypes = list() //typepaths of viable mobs var/mob/living/carbon/affected_mob = null - var/atom/movable/holder = null var/list/cures = list() //list of cures if the disease has the CURABLE flag, these are reagent ids var/infectivity = 65 var/cure_chance = 8 - var/carrier = 0 //If our host is only a carrier + var/carrier = FALSE //If our host is only a carrier + var/bypasses_immunity = FALSE //Does it skip species virus immunity check? Some things may diseases and not viruses var/permeability_mod = 1 var/severity = NONTHREAT var/list/required_organs = list() var/needs_all_cures = TRUE var/list/strain_data = list() //dna_spread special bullshit - +/datum/disease/Destroy() + affected_mob = null + active_diseases.Remove(src) + return ..() /datum/disease/proc/stage_act() var/cure = has_cure() @@ -97,13 +99,15 @@ var/list/diseases = subtypesof(/datum/disease) if(!. || (needs_all_cures && . < cures.len)) return 0 -/datum/disease/proc/spread(atom/source, force_spread = 0) +/datum/disease/proc/spread(force_spread = 0) + if(!affected_mob) + return + if((spread_flags & SPECIAL || spread_flags & NON_CONTAGIOUS || spread_flags & BLOOD) && !force_spread) return - if(affected_mob) - if(affected_mob.reagents.has_reagent("spaceacillin") || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10))) - return + if(affected_mob.reagents.has_reagent("spaceacillin") || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10))) + return var/spread_range = 1 @@ -113,41 +117,19 @@ var/list/diseases = subtypesof(/datum/disease) if(spread_flags & AIRBORNE) spread_range++ - if(!source) - if(affected_mob) - source = affected_mob - else - return - - if(isturf(source.loc)) - for(var/mob/living/carbon/C in oview(spread_range, source)) - if(isturf(C.loc)) - if(AStar(source, C.loc, /turf/proc/Distance, spread_range, adjacent = (spread_flags & AIRBORNE) ? /turf/proc/reachableAdjacentAtmosTurfs : /turf/proc/reachableAdjacentTurfs)) - C.ContractDisease(src) - - -/datum/disease/proc/process() - if(!holder) - disease_master.processing_diseases -= src - return - - if(prob(infectivity)) - spread(holder) - - if(affected_mob) - for(var/datum/disease/D in affected_mob.viruses) - if(D != src) - if(IsSame(D)) - qdel(D) - - if(holder == affected_mob) - if(affected_mob.stat != DEAD) - stage_act() - - if(!affected_mob) - if(prob(70)) - if(--longevity<=0) - cure() + var/turf/T = affected_mob.loc + if(istype(T)) + for(var/mob/living/carbon/C in oview(spread_range, affected_mob)) + var/turf/V = get_turf(C) + if(V) + while(TRUE) + if(V == T) + C.ContractDisease(src) + break + var/turf/Temp = get_step_towards(V, T) + if(!V.CanAtmosPass(Temp)) + break + V = Temp /datum/disease/proc/cure() @@ -158,24 +140,6 @@ var/list/diseases = subtypesof(/datum/disease) remove_virus() qdel(src) - -/datum/disease/New() - if(required_organs && required_organs.len) - if(ishuman(affected_mob)) - var/mob/living/carbon/human/H = affected_mob - for(var/obj/item/organ/O in required_organs) - if(!locate(O) in H.bodyparts) - if(!locate(O) in H.internal_organs) - cure() - return - - if(disease_master) - register() - -/datum/disease/proc/register() - disease_master.processing_diseases += src - - /datum/disease/proc/IsSame(datum/disease/D) if(istype(src, D.type)) return 1 @@ -191,13 +155,6 @@ var/list/diseases = subtypesof(/datum/disease) /datum/disease/proc/GetDiseaseID() return type - -/datum/disease/Destroy() - if(disease_master && disease_master.processing_diseases.Find(src)) - disease_master.processing_diseases.Remove(src) - return ..() - - /datum/disease/proc/IsSpreadByTouch() if(spread_flags & CONTACT_FEET || spread_flags & CONTACT_HANDS || spread_flags & CONTACT_GENERAL) return 1 diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index ba180af970e..71c1bd74a28 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -46,13 +46,6 @@ var/list/advance_cures = list( */ /datum/disease/advance/New(var/process = 1, var/datum/disease/advance/D) - - // Setup our dictionary if it hasn't already. - if(!dictionary_symptoms.len) - for(var/symp in list_symptoms) - var/datum/symptom/S = new symp - dictionary_symptoms[S.id] = symp - if(!istype(D)) D = null // Generate symptoms if we weren't given any. @@ -96,7 +89,7 @@ var/list/advance_cures = list( if(!(istype(D, /datum/disease/advance))) return 0 - if(src.GetDiseaseID() != D.GetDiseaseID()) + if(GetDiseaseID() != D.GetDiseaseID()) return 0 return 1 @@ -121,7 +114,7 @@ var/list/advance_cures = list( // Mix the symptoms of two diseases (the src and the argument) /datum/disease/advance/proc/Mix(datum/disease/advance/D) - if(!(src.IsSame(D))) + if(!(IsSame(D))) var/list/possible_symptoms = shuffle(D.symptoms) for(var/datum/symptom/S in possible_symptoms) AddSymptom(new S.type) @@ -161,7 +154,6 @@ var/list/advance_cures = list( return generated /datum/disease/advance/proc/Refresh(new_name = 0) -// to_chat(world, "[src.name] \ref[src] - REFRESH!") var/list/properties = GenerateProperties() AssignProperties(properties) id = null @@ -402,7 +394,7 @@ var/list/advance_cures = list( D.AssignName(new_name) D.Refresh() - for(var/datum/disease/advance/AD in disease_master.processing) + for(var/datum/disease/advance/AD in active_diseases) AD.Refresh() for(var/mob/living/carbon/human/H in shuffle(living_mob_list)) @@ -417,12 +409,6 @@ var/list/advance_cures = list( name_symptoms += S.name message_admins("[key_name_admin(user)] has triggered a custom virus outbreak of [D.name]! It has these symptoms: [english_list(name_symptoms)]") -/* -/mob/verb/test() - - for(var/datum/disease/D in disease_master.processing) - to_chat(src, "[D.name] - [D.holder]") -*/ /datum/disease/advance/proc/totalStageSpeed() diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index 007bbc92f0b..56be430f85d 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -67,7 +67,8 @@ Bonus /datum/symptom/heal/metabolism/Heal(mob/living/M, datum/disease/advance/A) var/cured = 0 - for(var/datum/disease/D in M.viruses) + for(var/thing in M.viruses) + var/datum/disease/D = thing if(D != A) cured = 1 cured_diseases += D.GetDiseaseID() diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/advance/symptoms/sneeze.dm index 9413eea5db5..0a31a4acae6 100644 --- a/code/datums/diseases/advance/symptoms/sneeze.dm +++ b/code/datums/diseases/advance/symptoms/sneeze.dm @@ -35,5 +35,5 @@ Bonus M.emote("sniff") else M.emote("sneeze") - A.spread(A.holder, 5) + A.spread(5) return \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/symptoms.dm b/code/datums/diseases/advance/symptoms/symptoms.dm index 1246b68fd0f..74da571836b 100644 --- a/code/datums/diseases/advance/symptoms/symptoms.dm +++ b/code/datums/diseases/advance/symptoms/symptoms.dm @@ -1,7 +1,6 @@ // Symptoms are the effects that engineered advanced diseases do. var/list/list_symptoms = subtypesof(/datum/symptom) -var/list/dictionary_symptoms = list() var/global/const/SYMPTOM_ACTIVATION_PROB = 3 @@ -22,7 +21,7 @@ var/global/const/SYMPTOM_ACTIVATION_PROB = 3 /datum/symptom/New() var/list/S = list_symptoms for(var/i = 1; i <= S.len; i++) - if(src.type == S[i]) + if(type == S[i]) id = "[i]" return CRASH("We couldn't assign an ID!") diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/advance/symptoms/vision.dm index 2d7fb9467df..b5249e11740 100644 --- a/code/datums/diseases/advance/symptoms/vision.dm +++ b/code/datums/diseases/advance/symptoms/vision.dm @@ -28,22 +28,25 @@ Bonus /datum/symptom/visionloss/Activate(datum/disease/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB)) - var/mob/living/M = A.affected_mob + var/mob/living/carbon/M = A.affected_mob + var/obj/item/organ/internal/eyes/eyes = M.get_int_organ(/obj/item/organ/internal/eyes) + if(!eyes) //NO EYES, NO PROBLEM! Rip out your eyes today to prevent future blindness! + return switch(A.stage) if(1, 2) to_chat(M, "Your eyes itch.") if(3, 4) to_chat(M, "Your eyes burn!") - M.blur_eyes(10) - M.adjust_eye_damage(1) + M.EyeBlurry(20) + eyes.take_damage(1) else to_chat(M, "Your eyes burn horrificly!") - M.blur_eyes(20) - M.adjust_eye_damage(5) - if(M.eye_damage >= 10) - M.become_nearsighted() - if(prob(M.eye_damage - 10 + 1)) - if(M.become_blind()) + M.EyeBlurry(30) + eyes.take_damage(5) + if(eyes.damage >= 10) + M.BecomeNearsighted() + if(prob(eyes.damage - 10 + 1)) + if(M.BecomeBlind()) to_chat(M, "You go blind!") diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm index 3c94ad8f801..d06c49de9c8 100644 --- a/code/datums/diseases/appendicitis.dm +++ b/code/datums/diseases/appendicitis.dm @@ -8,11 +8,11 @@ permeability_mod = 1 desc = "If left untreated the subject will become very weak, and may vomit often." severity = "Dangerous!" - longevity = 1000 disease_flags = CAN_CARRY|CAN_RESIST spread_flags = NON_CONTAGIOUS visibility_flags = HIDDEN_PANDEMIC required_organs = list(/obj/item/organ/internal/appendix) + bypasses_immunity = TRUE /datum/disease/appendicitis/stage_act() ..() diff --git a/code/datums/diseases/brainrot.dm b/code/datums/diseases/brainrot.dm index 38907524200..bb95e4aa733 100644 --- a/code/datums/diseases/brainrot.dm +++ b/code/datums/diseases/brainrot.dm @@ -9,7 +9,7 @@ viable_mobtypes = list(/mob/living/carbon/human) cure_chance = 15//higher chance to cure, since two reagents are required desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication." - required_organs = list(/obj/item/organ/external/head) + required_organs = list(/obj/item/organ/internal/brain) severity = DANGEROUS /datum/disease/brainrot/stage_act() //Removed toxloss because damaging diseases are pretty horrible. Last round it killed the entire station because the cure didn't work -- Urist -ACTUALLY Removed rather than commented out, I don't see it returning - RR diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm index f73154a0e20..7c5cde5b330 100644 --- a/code/datums/diseases/dna_spread.dm +++ b/code/datums/diseases/dna_spread.dm @@ -23,8 +23,8 @@ //Absorbs the target DNA. strain_data["dna"] = new affected_mob.dna.type affected_mob.dna.copy_dna(strain_data["dna"]) - src.carrier = 1 - src.stage = 4 + carrier = TRUE + stage = 4 return switch(stage) diff --git a/code/datums/diseases/kuru.dm b/code/datums/diseases/kuru.dm index bfd5af91a29..55fd4490d8e 100644 --- a/code/datums/diseases/kuru.dm +++ b/code/datums/diseases/kuru.dm @@ -1,4 +1,5 @@ /datum/disease/kuru + form = "Disease" name = "Space Kuru" max_stages = 4 stage_prob = 5 @@ -10,6 +11,7 @@ desc = "Uncontrollable laughing." severity = BIOHAZARD spread_flags = NON_CONTAGIOUS + bypasses_immunity = TRUE //Kuru is a prion disorder, not a virus /datum/disease/kuru/stage_act() ..() diff --git a/code/datums/diseases/pierrot_throat.dm b/code/datums/diseases/pierrot_throat.dm index 677bbbb2967..2bf0ca308a8 100644 --- a/code/datums/diseases/pierrot_throat.dm +++ b/code/datums/diseases/pierrot_throat.dm @@ -10,7 +10,6 @@ permeability_mod = 0.75 desc = "If left untreated the subject will probably drive others to insanity." severity = MEDIUM - longevity = 400 /datum/disease/pierrot_throat/stage_act() ..() diff --git a/code/datums/diseases/rhumba_beat.dm b/code/datums/diseases/rhumba_beat.dm index ec58f4f6034..fc26f005340 100644 --- a/code/datums/diseases/rhumba_beat.dm +++ b/code/datums/diseases/rhumba_beat.dm @@ -12,21 +12,17 @@ /datum/disease/rhumba_beat/stage_act() ..() + if(affected_mob.ckey == "rosham") + cure() + return switch(stage) - if(1) - if(affected_mob.ckey == "rosham") - src.cure() if(2) - if(affected_mob.ckey == "rosham") - src.cure() if(prob(45)) affected_mob.adjustToxLoss(5) affected_mob.updatehealth() if(prob(1)) to_chat(affected_mob, "You feel strange...") if(3) - if(affected_mob.ckey == "rosham") - src.cure() if(prob(5)) to_chat(affected_mob, "You feel the urge to dance...") else if(prob(5)) @@ -34,8 +30,6 @@ else if(prob(10)) to_chat(affected_mob, "You feel the need to chick chicky boom...") if(4) - if(affected_mob.ckey == "rosham") - src.cure() if(prob(10)) affected_mob.emote("gasp") to_chat(affected_mob, "You feel a burning beat inside...") @@ -43,10 +37,6 @@ affected_mob.adjustToxLoss(5) affected_mob.updatehealth() if(5) - if(affected_mob.ckey == "rosham") - src.cure() to_chat(affected_mob, "Your body is unable to contain the Rhumba Beat...") if(prob(50)) - affected_mob.gib() - else - return \ No newline at end of file + affected_mob.gib() \ No newline at end of file diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index e3482955865..7b4b0a27393 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -78,7 +78,6 @@ permeability_mod = 1 cure_chance = 1 disease_flags = CAN_CARRY|CAN_RESIST - longevity = 30 desc = "Monkeys with this disease will bite humans, causing humans to mutate into a monkey." severity = BIOHAZARD stage_prob = 4 diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm index 4cd027a7d7d..9aad7ff6d17 100644 --- a/code/datums/diseases/tuberculosis.dm +++ b/code/datums/diseases/tuberculosis.dm @@ -1,4 +1,5 @@ /datum/disease/tuberculosis + form = "Disease" name = "Fungal tuberculosis" max_stages = 5 spread_text = "Airborne" @@ -8,8 +9,9 @@ viable_mobtypes = list(/mob/living/carbon/human) cure_chance = 5//like hell are you getting out of hell desc = "A rare highly transmittable virulent virus. Few samples exist, rumoured to be carefully grown and cultured by clandestine bio-weapon specialists. Causes fever, blood vomiting, lung damage, weight loss, and fatigue." - required_organs = list(/obj/item/organ/external/head) + required_organs = list(/obj/item/organ/internal/lungs) severity = DANGEROUS + bypasses_immunity = TRUE //Fungal and bacterial in nature; also infects the lungs /datum/disease/tuberculosis/stage_act() //it begins ..() diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm index 5c11c42930a..d70fc1ca4ac 100644 --- a/code/datums/outfits/outfit_admin.dm +++ b/code/datums/outfits/outfit_admin.dm @@ -587,6 +587,8 @@ apply_to_card(I, H, list(access_maint_tunnels), "Legit Xenomorph") /datum/outfit/admin/soviet + + gloves = /obj/item/clothing/gloves/combat uniform = /obj/item/clothing/under/soviet back = /obj/item/weapon/storage/backpack/satchel head = /obj/item/clothing/head/ushanka @@ -721,6 +723,38 @@ /obj/item/weapon/melee/classic_baton/telescopic = 1, /obj/item/ammo_box/magazine/m50 = 2) +/datum/outfit/admin/paranormal_ert + name = "Paranormal ERT member" + + uniform = /obj/item/clothing/under/syndicate + suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal + back = /obj/item/weapon/storage/backpack/ert/security + belt = /obj/item/weapon/gun/energy/gun/nuclear + gloves = /obj/item/clothing/gloves/color/black + shoes = /obj/item/clothing/shoes/combat + head = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal + l_ear = /obj/item/device/radio/headset/ert/alt + glasses = /obj/item/clothing/glasses/hud/security/sunglasses + id = /obj/item/weapon/card/id/centcom + pda = /obj/item/device/pda/centcom + backpack_contents = list( + /obj/item/weapon/storage/box/survival = 1, + /obj/item/clothing/mask/gas/sechailer/swat = 1, + /obj/item/weapon/storage/box/zipties = 1, + /obj/item/device/flashlight = 1) + +/datum/outfit/admin/paranormal_ert/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + . = ..() + if(visualsOnly) + return + + var/obj/item/weapon/card/id/I = H.wear_id + if(istype(I)) + apply_to_card(I, H, get_centcom_access("Emergency Response Team Member"), "Emergency Response Team Member") + + var/obj/item/weapon/implant/L = new /obj/item/weapon/implant/mindshield(H) + L.implant(H) + /datum/outfit/admin/janitorial_ert name = "Janitorial ERT member" @@ -731,16 +765,18 @@ gloves = /obj/item/clothing/gloves/color/yellow shoes = /obj/item/clothing/shoes/galoshes head = /obj/item/clothing/head/helmet/space/hardsuit/ert/janitor - l_ear = /obj/item/device/radio/headset/centcom + l_ear = /obj/item/device/radio/headset/ert/alt glasses = /obj/item/clothing/glasses/sunglasses id = /obj/item/weapon/card/id/centcom pda = /obj/item/device/pda/centcom backpack_contents = list( /obj/item/weapon/caution = 2, + /obj/item/weapon/storage/box/survival = 1, /obj/item/weapon/reagent_containers/spray/cleaner = 1, /obj/item/weapon/storage/bag/trash = 1, /obj/item/weapon/storage/box/lights/mixed = 1, - /obj/item/weapon/holosign_creator = 1) + /obj/item/weapon/holosign_creator = 1, + /obj/item/device/flashlight = 1) /datum/outfit/admin/janitorial_ert/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) . = ..() @@ -936,7 +972,7 @@ for(var/obj/item/I in H.contents) if(!istype(I, /obj/item/weapon/implant)) - I.add_blood(H) + I.add_mob_blood(H) if(visualsOnly) return @@ -971,7 +1007,7 @@ for(var/obj/item/I in H.contents) if(!istype(I, /obj/item/weapon/implant)) - I.add_blood(H) + I.add_mob_blood(H) if(visualsOnly) return @@ -1173,3 +1209,39 @@ suit = /obj/item/clothing/suit/wizrobe/marisa shoes = /obj/item/clothing/shoes/sandal/marisa head = /obj/item/clothing/head/wizard/marisa + + +/datum/outfit/admin/dark_priest + name = "Dark Priest" + + uniform = /obj/item/clothing/under/color/black + suit = /obj/item/clothing/suit/hooded/chaplain_hoodie + back = /obj/item/weapon/storage/backpack + head = /obj/item/clothing/head/chaplain_hood + gloves = /obj/item/clothing/gloves/color/black + shoes = /obj/item/clothing/shoes/black + l_ear = /obj/item/device/radio/headset/syndicate + id = /obj/item/weapon/card/id/syndicate + r_hand = /obj/item/weapon/nullrod/armblade + backpack_contents = list( + /obj/item/weapon/storage/box/survival = 1, + /obj/item/device/flashlight = 1, + ) + +/datum/outfit/admin/dark_priest/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + . = ..() + if(visualsOnly) + return + var/obj/item/weapon/card/id/I = H.wear_id + if(istype(I)) + apply_to_card(I, H, get_all_accesses(), "Dark Priest", "syndie") + var/obj/item/weapon/nullrod/armblade/B = H.r_hand + if(istype(B)) + B.force = 20 + B.name = "blessing of the reaper" + B.desc = "Sometimes, someone's just gotta die." + var/obj/item/device/radio/headset/R = H.l_ear + if(istype(R)) + R.flags |= NODROP + var/obj/item/weapon/implant/dust/D = new /obj/item/weapon/implant/dust(H) + D.implant(H) \ No newline at end of file diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index 24007dbafee..3d0f877a3aa 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -39,6 +39,12 @@ suffix = "cyb" name = "emergency shuttle (Cyberiad)" +/datum/map_template/shuttle/emergency/dept + suffix = "dept" + name = "emergency shuttle (department)" + description = "Features include: areas for each department, and a small bar." + admin_notes = "Designed to reduce chaos. Each dept requires dept access." + /datum/map_template/shuttle/emergency/clown suffix = "clown" name = "Snappop(tm)!" diff --git a/code/datums/soullink.dm b/code/datums/soullink.dm new file mode 100644 index 00000000000..1f17c635e84 --- /dev/null +++ b/code/datums/soullink.dm @@ -0,0 +1,214 @@ +/mob/living + var/list/ownedSoullinks //soullinks we are the owner of + var/list/sharedSoullinks //soullinks we are a/the sharer of + +/mob/living/Destroy() + for(var/s in ownedSoullinks) + var/datum/soullink/S = s + S.ownerDies(FALSE) + qdel(s) //If the owner is destroy()'d, the soullink is destroy()'d + ownedSoullinks = null + for(var/s in sharedSoullinks) + var/datum/soullink/S = s + S.sharerDies(FALSE) + S.removeSoulsharer(src) //If a sharer is destroy()'d, they are simply removed + sharedSoullinks = null + return ..() + +//Keeps track of a Mob->Mob (potentially Player->Player) connection +//Can be used to trigger actions on one party when events happen to another +//Eg: shared deaths +//Can be used to form a linked list of mob-hopping +//Does NOT transfer with minds +/datum/soullink + var/mob/living/soulowner + var/mob/living/soulsharer + var/id //Optional ID, for tagging and finding specific instances + +/datum/soullink/Destroy() + if(soulowner) + LAZYREMOVE(soulowner.ownedSoullinks, src) + soulowner = null + if(soulsharer) + LAZYREMOVE(soulsharer.sharedSoullinks, src) + soulsharer = null + return ..() + +/datum/soullink/proc/removeSoulsharer(mob/living/sharer) + if(soulsharer == sharer) + soulsharer = null + LAZYREMOVE(sharer.sharedSoullinks, src) + +//Used to assign variables, called primarily by soullink() +//Override this to create more unique soullinks (Eg: 1->Many relationships) +//Return TRUE/FALSE to return the soullink/null in soullink() +/datum/soullink/proc/parseArgs(mob/living/owner, mob/living/sharer) + if(!owner || !sharer) + return FALSE + soulowner = owner + soulsharer = sharer + LAZYADD(owner.ownedSoullinks, src) + LAZYADD(sharer.sharedSoullinks, src) + return TRUE + +//Runs after /living death() +//Override this for content +/datum/soullink/proc/ownerDies(gibbed, mob/living/owner) + +//Runs after /living death() +//Override this for content +/datum/soullink/proc/sharerDies(gibbed, mob/living/owner) + +//Runs after /living update_revive() +//Override this for content +/datum/soullink/proc/ownerRevives(mob/living/owner) + +//Runs after /living update_revive() +//Override this for content +/datum/soullink/proc/sharerRevives(mob/living/owner) + +//Quick-use helper +/proc/soullink(typepath, ...) + var/datum/soullink/S = new typepath() + if(S.parseArgs(arglist(args.Copy(2, 0)))) + return S + + + +///////////////// +// MULTISHARER // +///////////////// +//Abstract soullink for use with 1 Owner -> Many Sharer setups +/datum/soullink/multisharer + var/list/soulsharers + +/datum/soullink/multisharer/parseArgs(mob/living/owner, list/sharers) + if(!owner || !LAZYLEN(sharers)) + return FALSE + soulowner = owner + soulsharers = sharers + LAZYADD(owner.ownedSoullinks, src) + for(var/l in sharers) + var/mob/living/L = l + LAZYADD(L.sharedSoullinks, src) + return TRUE + +/datum/soullink/multisharer/removeSoulsharer(mob/living/sharer) + LAZYREMOVE(soulsharers, sharer) + + + +///////////////// +// SHARED FATE // +///////////////// +//When the soulowner dies, the soulsharer dies, and vice versa +//This is intended for two players(or AI) and two mobs + +/datum/soullink/sharedfate/ownerDies(gibbed, mob/living/owner) + if(soulsharer) + soulsharer.death(gibbed) + +/datum/soullink/sharedfate/sharerDies(gibbed, mob/living/sharer) + if(soulowner) + soulowner.death(gibbed) + +///////////////// +// Demon Bind // +///////////////// +//When the soulowner dies, the soulsharer dies, but NOT vice versa +//This is intended for two players(or AI) and two mobs + +/datum/soullink/oneway/ownerDies(gibbed, mob/living/owner) + if(soulsharer) + soulsharer.dust(FALSE) + + +///////////////// +// SHARED BODY // +///////////////// +//When the soulsharer dies, they're placed in the soulowner, who remains alive +//If the soulowner dies, the soulsharer is killed and placed into the soulowner (who is still dying) +//This one is intended for one player moving between many mobs + +/datum/soullink/sharedbody/ownerDies(gibbed, mob/living/owner) + if(soulowner && soulsharer) + if(soulsharer.mind) + soulsharer.mind.transfer_to(soulowner) + soulsharer.death(gibbed) + +/datum/soullink/sharedbody/sharerDies(gibbed, mob/living/sharer) + if(soulowner && soulsharer && soulsharer.mind) + soulsharer.mind.transfer_to(soulowner) + + + +////////////////////// +// REPLACEMENT POOL // +////////////////////// +//When the owner dies, one of the sharers is placed in the owner's body, fully healed +//Sort of a "winner-stays-on" soullink +//Gibbing ends it immediately + +/datum/soullink/multisharer/replacementpool/ownerDies(gibbed, mob/living/owner) + if(LAZYLEN(soulsharers) && !gibbed) //let's not put them in some gibs + var/list/souls = shuffle(soulsharers.Copy()) + for(var/l in souls) + var/mob/living/L = l + if(L.stat != DEAD && L.mind) + L.mind.transfer_to(soulowner) + soulowner.revive(TRUE, TRUE) + L.death(FALSE) + +//Lose your claim to the throne! +/datum/soullink/multisharer/replacementpool/sharerDies(gibbed, mob/living/sharer) + removeSoulsharer(sharer) + + +//////////////// +// SOUL HOOK // +//////////////// +// When the owner transitions from dead to alive or vice versa, +// the linked atom is notified + +// Atoms that actually utilize this system are responsible for handling the GC cleanup themselves +// Splashing the GC handling onto every atom would be a big old waste + +/datum/soullink/soulhook + var/atom/movable/otherend + +/datum/soullink/soulhook/Destroy() + if(otherend) + LAZYREMOVE(otherend.sharedSoulhooks, src) + otherend = null + return ..() + +/datum/soullink/soulhook/parseArgs(mob/living/owner, atom/movable/other) + if(!owner || !other) + return FALSE + soulowner = owner + otherend = other + LAZYADD(owner.ownedSoullinks, src) + LAZYADD(other.sharedSoulhooks, src) + return TRUE + +/datum/soullink/soulhook/ownerDies(gibbed, mob/living/owner) + if(otherend) + otherend.onSoullinkDeath(gibbed, owner) + +/datum/soullink/soulhook/ownerRevives(mob/living/owner) + if(otherend) + otherend.onSoullinkRevive(owner) + +// oops I'm butchering the application of this +/datum/soullink/soulhook/removeSoulsharer(atom/movable/other) + if(otherend == other) + otherend = null + LAZYREMOVE(other.sharedSoulhooks, src) + qdel(src) // not much point in a soul link with one end out of the picture for good + +/atom/movable + var/list/sharedSoulhooks = null + +/atom/movable/proc/onSoullinkDeath(gibbed, mob/living/owner) + +/atom/movable/proc/onSoullinkRevive(mob/living/owner) diff --git a/code/datums/spells/rathens.dm b/code/datums/spells/rathens.dm index 75ff2525c4d..b5cc7b63f51 100644 --- a/code/datums/spells/rathens.dm +++ b/code/datums/spells/rathens.dm @@ -42,4 +42,4 @@ continue if(prob(7)) to_chat(H, "Your [E] was severed by the explosion!") - E.droplimb(1, DROPLIMB_EDGE, 0, 1) + E.droplimb(1, DROPLIMB_SHARP, 0, 1) diff --git a/code/datums/spells/summonitem.dm b/code/datums/spells/summonitem.dm index 32472fe1ec0..7524e7f31d6 100644 --- a/code/datums/spells/summonitem.dm +++ b/code/datums/spells/summonitem.dm @@ -79,6 +79,14 @@ add_logs(target, C, "magically debrained", addition="INTENT: [uppertext(target.a_intent)]")*/ if(C.stomach_contents && item_to_retrive in C.stomach_contents) C.stomach_contents -= item_to_retrive + for(var/X in C.bodyparts) + var/obj/item/organ/external/part = X + if(item_to_retrive in part.embedded_objects) + part.embedded_objects -= item_to_retrive + to_chat(C, "The [item_to_retrive] that was embedded in your [part] has mysteriously vanished. How fortunate!") + if(!C.has_embedded_objects()) + C.clear_alert("embeddedobject") + break else if(istype(item_to_retrive.loc,/obj/machinery/portable_atmospherics/)) //Edge cases for moved machinery diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 10f6c242d34..674f5bb8106 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -250,6 +250,17 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine cost = 10 containername = "disabler crate" +/datum/supply_packs/security/forensics + name = "Forensics Crate" + contains = list(/obj/item/device/detective_scanner, + /obj/item/weapon/storage/box/evidence, + /obj/item/device/camera, + /obj/item/device/taperecorder, + /obj/item/toy/crayon/white, + /obj/item/clothing/head/det_hat) + cost = 20 + containername = "forensics crate" + ///// Armory stuff /datum/supply_packs/security/armory @@ -895,6 +906,13 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine containername = "tank transfer valves crate" access = access_rd +/datum/supply_packs/science/prototype + name = "Machine Prototype Crate" + contains = list(/obj/item/device/machineprototype) + cost = 80 + containertype = /obj/structure/closet/crate/secure/scisec + containername = "machine prototype crate" + access = access_research ////////////////////////////////////////////////////////////////////////////// //////////////////////////// Organic ///////////////////////////////////////// @@ -914,6 +932,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /obj/item/weapon/reagent_containers/food/condiment/soymilk, /obj/item/weapon/reagent_containers/food/condiment/saltshaker, /obj/item/weapon/reagent_containers/food/condiment/peppermill, + /obj/item/weapon/kitchen/rollingpin, /obj/item/weapon/storage/fancy/egg_box, /obj/item/weapon/reagent_containers/food/condiment/enzyme, /obj/item/weapon/reagent_containers/food/condiment/sugar, @@ -1320,7 +1339,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /obj/item/weapon/reagent_containers/glass/paint/black, /obj/item/weapon/reagent_containers/glass/paint/white, /obj/item/weapon/reagent_containers/glass/paint/remover, - /obj/item/weapon/contraband/poster/legit, + /obj/item/weapon/poster/random_official, /obj/item/stack/wrapping_paper, /obj/item/stack/wrapping_paper, /obj/item/stack/wrapping_paper) @@ -1329,11 +1348,11 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /datum/supply_packs/misc/posters name = "Corporate Posters Crate" - contains = list(/obj/item/weapon/contraband/poster/legit, - /obj/item/weapon/contraband/poster/legit, - /obj/item/weapon/contraband/poster/legit, - /obj/item/weapon/contraband/poster/legit, - /obj/item/weapon/contraband/poster/legit) + contains = list(/obj/item/weapon/poster/random_official, + /obj/item/weapon/poster/random_official, + /obj/item/weapon/poster/random_official, + /obj/item/weapon/poster/random_official, + /obj/item/weapon/poster/random_official) cost = 8 containername = "corporate posters crate" @@ -1495,7 +1514,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /datum/supply_packs/misc/randomised/contraband num_contained = 5 contains = list(/obj/item/weapon/storage/pill_bottle/random_drug_bottle, - /obj/item/weapon/contraband/poster, + /obj/item/weapon/poster/random_contraband, /obj/item/weapon/storage/fancy/cigarettes/dromedaryco, /obj/item/weapon/storage/fancy/cigarettes/cigpack_shadyjims) name = "Contraband Crate" @@ -1704,4 +1723,4 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /obj/item/weapon/vending_refill/cigarette, /obj/item/weapon/vending_refill/cigarette) cost = 15 - containername = "cigarette supply crate" \ No newline at end of file + containername = "cigarette supply crate" diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 1cf08abebd0..14732318aab 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -54,7 +54,7 @@ var/list/uplink_items = list() var/list/excludefrom = list() //Empty list does nothing. Place the name of gamemode you don't want this item to be available in here. This is so you dont have to list EVERY mode to exclude something. var/list/job = null var/surplus = 100 //Chance of being included in the surplus crate (when pick() selects it) - var/hijack_only = 0 //can this item be purchased only during hijackings? + var/hijack_only = FALSE //can this item be purchased only during hijackings? /datum/uplink_item/proc/spawn_item(var/turf/loc, var/obj/item/device/uplink/U) if(hijack_only) @@ -129,7 +129,7 @@ var/list/uplink_items = list() job = list("Clown") //mime -/datum/uplink_item/job_specific/caneshotgun +/datum/uplink_item/jobspecific/caneshotgun name = "Cane Shotgun + Assassination Darts" desc = "A specialized, one shell shotgun with a built-in cloaking device to mimic a cane. The shotgun is capable of hiding it's contents and the pin alongside being supressed. Comes with 6 special darts and a preloaded shrapnel round." reference = "MCS" @@ -137,14 +137,6 @@ var/list/uplink_items = list() cost = 15 job = list("Mime") -/datum/uplink_item/dangerous/cat_grenade - name = "Feral Cat Delivery Grenade" - desc = "The feral cat delivery grenade contains 8 dehydrated feral cats in a similar manner to dehydrated monkeys, which, upon detonation, will be rehydrated by a small reservoir of water contained within the grenade. These cats will then attack anything in sight." - item = /obj/item/weapon/grenade/spawnergrenade/feral_cats - reference = "CCLG" - cost = 5 - job = list("Psychiatrist")//why? Becuase its funny that a person in charge of your mental wellbeing has a cat granade.. - //Chef /datum/uplink_item/jobspecific/specialsauce name = "Chef Excellence's Special Sauce" @@ -195,8 +187,8 @@ var/list/uplink_items = list() item = /obj/item/weapon/storage/toolbox/green/memetic cost = 20 job = list("Chaplain") - surplus = 0 //No lucky chances from the crate; if you get this, this is ALL you're getting - hijack_only = 1 //This is a murderbone weapon, as such, it should only be available in those scenarios. + surplus = 0 //No lucky chances from the crate; if you get this, this is ALL you're getting + hijack_only = TRUE //This is a murderbone weapon, as such, it should only be available in those scenarios. //Janitor @@ -211,23 +203,21 @@ var/list/uplink_items = list() //Medical - /datum/uplink_item/jobspecific/rad_laser name = "Radiation Laser" - desc = "A radiation laser concealed inside of a Health Analyser. After a moderate delay, causes temporary collapse and radiation. Has adjustable controls, but will not function as a regular health analyser, only appears like one. May not function correctly on radiation resistant humanoids!" + desc = "A radiation laser concealed inside of a Health Analyser. After a moderate delay, causes temporary collapse and radiation. Has adjustable controls, but will not function as a regular health analyser, only appears like one. May not function correctly on radiation resistant humanoids!" reference = "RL" item = /obj/item/device/rad_laser cost = 5 - job = list( - "Chief Medical Officer", - "Medical Doctor", - "Geneticist", - "Psychiatrist", - "Chemist", - "Paramedic", - "Virologist", - "Brig Physician" - ) + job = list("Chief Medical Officer", "Medical Doctor", "Geneticist", "Psychiatrist", "Chemist", "Paramedic", "Coroner", "Virologist") + +/datum/uplink_item/dangerous/cat_grenade + name = "Feral Cat Delivery Grenade" + desc = "The feral cat delivery grenade contains 8 dehydrated feral cats in a similar manner to dehydrated monkeys, which, upon detonation, will be rehydrated by a small reservoir of water contained within the grenade. These cats will then attack anything in sight." + item = /obj/item/weapon/grenade/spawnergrenade/feral_cats + reference = "CCLG" + cost = 5 + job = list("Psychiatrist")//why? Becuase its funny that a person in charge of your mental wellbeing has a cat granade.. //Assistant @@ -249,10 +239,9 @@ var/list/uplink_items = list() cost = 6 job = list("Bartender") - //Barber -/datum/uplink_item/jobspecific/safety_scissors //Hue +/datum/uplink_item/jobspecific/safety_scissors //Hue name = "Safety Scissors" desc = "A pair of scissors that are anything but what their name implies; can easily cut right into someone's throat." reference = "CTS" @@ -278,7 +267,7 @@ var/list/uplink_items = list() reference = "PG" item = /obj/item/clothing/gloves/color/yellow/power cost = 10 - job = list("Station Engineer","Chief Engineer") + job = list("Station Engineer", "Chief Engineer") //RD @@ -299,7 +288,6 @@ var/list/uplink_items = list() cost = 3 job = list("Librarian") - //Botanist /datum/uplink_item/jobspecific/ambrosiacruciatus name = "Ambrosia Cruciatus Seeds" @@ -309,7 +297,6 @@ var/list/uplink_items = list() cost = 2 job = list("Botanist") - //Atmos Tech /datum/uplink_item/jobspecific/contortionist name = "Contortionist's Jumpsuit" @@ -335,7 +322,7 @@ var/list/uplink_items = list() reference = "ST" item = /obj/item/weapon/reagent_containers/hypospray/autoinjector/stimulants cost = 7 - job = list("Scientist","Research Director","Geneticist","Chief Medical Officer","Medical Doctor","Psychiatrist","Chemist","Paramedic","Virologist","Brig Physician") + job = list("Scientist", "Research Director", "Geneticist", "Chief Medical Officer", "Medical Doctor", "Psychiatrist", "Chemist", "Paramedic", "Coroner", "Virologist") //Tator Poison Bottles @@ -345,7 +332,7 @@ var/list/uplink_items = list() reference = "TPB" item = /obj/item/weapon/reagent_containers/glass/bottle/traitor cost = 2 - job = list("Research Director","Chief Medical Officer","Medical Doctor","Psychiatrist","Paramedic","Virologist","Bartender") + job = list("Research Director", "Chief Medical Officer", "Medical Doctor", "Psychiatrist", "Chemist", "Paramedic", "Virologist", "Bartender", "Chef") // Paper contact poison pen @@ -400,7 +387,7 @@ var/list/uplink_items = list() /datum/uplink_item/dangerous/machinegun name = "L6 Squad Automatic Weapon" - desc = "A fully-loaded Aussec Armoury belt-fed machine gun. This deadly weapon has a massive 50-round magazine of devastating 7.62x51mm ammunition." + desc = "A fully-loaded Aussec Armory belt-fed machine gun. This deadly weapon has a massive 50-round magazine of devastating 7.62x51mm ammunition." reference = "LMG" item = /obj/item/weapon/gun/projectile/automatic/l6_saw cost = 40 @@ -750,6 +737,14 @@ var/list/uplink_items = list() cost = 17 excludefrom = list(/datum/game_mode/nuclear) +/datum/uplink_item/stealthy_weapons/throwingweapons + name = "Box of Throwing Weapons" + desc = "A box of shurikens and reinforced bolas from ancient Earth martial arts. They are highly effective \ + throwing weapons. The bolas can knock a target down and the shurikens will embed into limbs." + reference = "STK" + item = /obj/item/weapon/storage/box/syndie_kit/throwing_weapons + cost = 3 + /datum/uplink_item/stealthy_weapons/edagger name = "Energy Dagger" desc = "A dagger made of energy that looks and functions as a pen when off." @@ -922,6 +917,15 @@ var/list/uplink_items = list() cost = 2 surplus = 30 +/datum/uplink_item/stealthy_tools/cutouts + name = "Adaptive Cardboard Cutouts" + desc = "These cardboard cutouts are coated with a thin material that prevents discoloration and makes the images on them appear more lifelike. This pack contains three as well as a \ + spraycan for changing their appearances." + reference = "ADCC" + item = /obj/item/weapon/storage/box/syndie_kit/cutouts + cost = 1 + surplus = 20 + // DEVICE AND TOOLS /datum/uplink_item/device_tools @@ -1079,6 +1083,7 @@ var/list/uplink_items = list() reference = "SNGB" item = /obj/item/device/radio/beacon/syndicate cost = 14 + surplus = 0 /datum/uplink_item/device_tools/syndicate_bomb name = "Syndicate Bomb" @@ -1119,6 +1124,13 @@ var/list/uplink_items = list() cost = 1 surplus = 0 +/datum/uplink_item/device_tools/jammer + name = "Radio Jammer" + desc = "This device will disrupt any nearby outgoing radio communication when activated." + reference = "RJ" + item = /obj/item/device/jammer + cost = 5 + /datum/uplink_item/device_tools/teleporter name = "Teleporter Circuit Board" desc = "A printed circuit board that completes the teleporter onboard the mothership. Advise you test fire the teleporter before entering it, as malfunctions can occur." diff --git a/code/datums/wires/syndicatebomb.dm b/code/datums/wires/syndicatebomb.dm index d1fe6217058..616429b8cd8 100644 --- a/code/datums/wires/syndicatebomb.dm +++ b/code/datums/wires/syndicatebomb.dm @@ -1,5 +1,5 @@ /datum/wires/syndicatebomb - random = 1 + random = TRUE holder_type = /obj/machinery/syndicatebomb wire_count = 5 @@ -13,83 +13,90 @@ var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if switch(index) if(WIRE_BOOM) return "Explode" - + if(WIRE_UNBOLT) return "Unbolt" - + if(WIRE_DELAY) return "Delay" - + if(WIRE_PROCEED) return "Proceed" - + if(WIRE_ACTIVATE) return "Activate" /datum/wires/syndicatebomb/CanUse(mob/living/L) var/obj/machinery/syndicatebomb/P = holder if(P.open_panel) - return 1 - return 0 + return TRUE + return FALSE /datum/wires/syndicatebomb/UpdatePulsed(index) - var/obj/machinery/syndicatebomb/P = holder + var/obj/machinery/syndicatebomb/B = holder switch(index) if(WIRE_BOOM) - if(P.active) - P.loc.visible_message("[bicon(holder)] An alarm sounds! It's go-") - P.timer = 0 + if(B.active) + holder.visible_message("[bicon(B)] An alarm sounds! It's go-") + B.explode_now = TRUE if(WIRE_UNBOLT) - P.loc.visible_message("[bicon(holder)] The bolts spin in place for a moment.") + holder.visible_message("[bicon(holder)] The bolts spin in place for a moment.") if(WIRE_DELAY) - playsound(P.loc, 'sound/machines/chime.ogg', 30, 1) - P.loc.visible_message("[bicon(holder)] The bomb chirps.") - P.timer += 10 - if(WIRE_PROCEED) - playsound(P.loc, 'sound/machines/buzz-sigh.ogg', 30, 1) - P.loc.visible_message("[bicon(holder)] The bomb buzzes ominously!") - if(P.timer >= 61) //Long fuse bombs can suddenly become more dangerous if you tinker with them - P.timer = 60 - if(P.timer >= 21) - P.timer -= 10 - else if(P.timer >= 11) //both to prevent negative timers and to have a little mercy - P.timer = 10 - if(WIRE_ACTIVATE) - if(!P.active && !P.defused) - playsound(P.loc, 'sound/machines/click.ogg', 30, 1) - P.loc.visible_message("[bicon(holder)] You hear the bomb start ticking!") - P.active = 1 - P.icon_state = "[initial(P.icon_state)]-active[P.open_panel ? "-wires" : ""]" + if(B.delayedbig) + holder.visible_message("[bicon(B)] The bomb has already been delayed.") else - P.loc.visible_message("[bicon(holder)] The bomb seems to hesitate for a moment.") - P.timer += 5 + holder.visible_message("[bicon(B)] The bomb chirps.") + playsound(B, 'sound/machines/chime.ogg', 30, 1) + B.detonation_timer += 300 + B.delayedbig = TRUE + if(WIRE_PROCEED) + holder.visible_message("[bicon(B)] The bomb buzzes ominously!") + playsound(B, 'sound/machines/buzz-sigh.ogg', 30, 1) + var/seconds = B.seconds_remaining() + if(seconds >= 61) // Long fuse bombs can suddenly become more dangerous if you tinker with them. + B.detonation_timer = world.time + 600 + else if(seconds >= 21) + B.detonation_timer -= 100 + else if(seconds >= 11) // Both to prevent negative timers and to have a little mercy. + B.detonation_timer = world.time + 100 + if(WIRE_ACTIVATE) + if(!B.active && !B.defused) + holder.visible_message("[bicon(B)] You hear the bomb start ticking!") + B.activate() + B.update_icon() + else if(B.delayedlittle) + holder.visible_message("[bicon(B)] Nothing happens.") + else + holder.visible_message("[bicon(B)] The bomb seems to hesitate for a moment.") + B.detonation_timer += 100 + B.delayedlittle = TRUE ..() /datum/wires/syndicatebomb/UpdateCut(index, mended) - var/obj/machinery/syndicatebomb/P = holder + var/obj/machinery/syndicatebomb/B = holder switch(index) if(WIRE_EXPLODE) - if(!mended) - if(P.active) - P.loc.visible_message("[bicon(holder)] An alarm sounds! It's go-") - P.timer = 0 - else - P.defused = 1 + if(mended) + B.defused = FALSE // Cutting and mending all the wires of an inactive bomb will thus cure any sabotage. else - P.defused = 0 //cutting and mending all the wires of an inactive bomb will thus cure any sabotage + if(B.active) + holder.visible_message("[bicon(B)] An alarm sounds! It's go-") + B.explode_now = TRUE + else + B.defused = TRUE if(WIRE_UNBOLT) - if(!mended && P.anchored) - playsound(P.loc, 'sound/effects/stealthoff.ogg', 30, 1) - P.loc.visible_message("[bicon(holder)] The bolts lift out of the ground!") - P.anchored = 0 + if(!mended && B.anchored) + holder.visible_message("[bicon(B)] The bolts lift out of the ground!") + playsound(B, 'sound/effects/stealthoff.ogg', 30, 1) + B.anchored = FALSE if(WIRE_PROCEED) - if(!mended && P.active) - P.loc.visible_message("[bicon(holder)] An alarm sounds! It's go-") - P.timer = 0 + if(!mended && B.active) + holder.visible_message("[bicon(B)] An alarm sounds! It's go-") + B.explode_now = TRUE if(WIRE_ACTIVATE) - if(!mended && P.active) - P.loc.visible_message("[bicon(holder)] The timer stops! The bomb has been defused!") - P.icon_state = "[initial(P.icon_state)]-inactive[P.open_panel ? "-wires" : ""]" - P.active = 0 - P.defused = 1 + if(!mended && B.active) + holder.visible_message("[bicon(B)] The timer stops! The bomb has been defused!") + B.active = FALSE + B.defused = TRUE + B.update_icon() ..() \ No newline at end of file diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index e814bc9081f..7b7952b5f88 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -486,15 +486,19 @@ var/list/ghostteleportlocs = list() /area/centcom/control name = "\improper Centcom Control" + icon_state = "centcom_ctrl" /area/centcom/evac name = "\improper Centcom Emergency Shuttle" + icon_state = "centcom_evac" /area/centcom/suppy name = "\improper Centcom Supply Shuttle" + icon_state = "centcom_supply" /area/centcom/ferry name = "\improper Centcom Transport Shuttle" + icon_state = "centcom_ferry" /area/centcom/shuttle name = "\improper Centcom Administration Shuttle" @@ -507,9 +511,11 @@ var/list/ghostteleportlocs = list() /area/centcom/specops name = "\improper Centcom Special Ops" + icon_state = "centcom_specops" -/area/centcom/creed - name = "Creed's Office" +/area/centcom/gamma + name = "\improper Centcom Gamma Armory" + icon_state = "centcom_gamma" /area/centcom/holding name = "\improper Holding Facility" diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index eb743afad62..140b6116cd6 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -307,7 +307,7 @@ var/mob/living/L = A if(!L.ckey) return - if((oldarea.has_gravity == 0) && (newarea.has_gravity == 1) && (L.m_intent == "run")) // Being ready when you change areas gives you a chance to avoid falling all together. + if((oldarea.has_gravity == 0) && (newarea.has_gravity == 1) && (L.m_intent == MOVE_INTENT_RUN)) // Being ready when you change areas gives you a chance to avoid falling all together. thunk(L) // Ambience goes down here -- make sure to list each area seperately for ease of adding things in later, thanks! Note: areas adjacent to each other should have the same sounds to prevent cutoff when possible.- LastyScratch @@ -344,7 +344,7 @@ if(istype(get_turf(M), /turf/space)) // Can't fall onto nothing. return - if((istype(M,/mob/living/carbon/human/)) && (M.m_intent == "run")). + if((istype(M,/mob/living/carbon/human/)) && (M.m_intent == MOVE_INTENT_RUN)). M.Stun(5) M.Weaken(5) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index b5d25c7f5a1..8c12e452d1d 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -9,7 +9,6 @@ var/blood_color var/last_bumped = 0 var/pass_flags = 0 - var/throwpass = 0 var/germ_level = GERM_LEVEL_AMBIENT // The higher the germ level, the more germ on the atom. var/simulated = 1 //filter for actions - used by lighting overlays var/atom_say_verb = "says" @@ -35,6 +34,9 @@ //Detective Work, used for the duplicate data points kept in the scanners var/list/original_atom + //Detective Work, used for allowing a given atom to leave its fibers on stuff. Allowed by default + var/can_leave_fibers = TRUE + var/allow_spin = 1 //Set this to 1 for a _target_ that is being thrown at; if an atom has this set to 1 then atoms thrown AT it will not spin; currently used for the singularity. -Fox var/admin_spawned = 0 //was this spawned by an admin? used for stat tracking stuff. @@ -236,10 +238,13 @@ /atom/proc/emag_act() return -/atom/proc/hitby(atom/movable/AM as mob|obj) - if(density) - AM.throwing = 0 - return +/atom/proc/hitby(atom/movable/AM, skipcatch, hitpush, blocked) + if(density && !has_gravity(AM)) //thrown stuff bounces off dense stuff in no grav, unless the thrown stuff ends up inside what it hit(embedding, bola, etc...). + addtimer(src, "hitby_react", 2, TRUE, AM) + +/atom/proc/hitby_react(atom/movable/AM) + if(AM && isturf(AM.loc)) + step(AM, turn(AM.dir, 180)) /atom/proc/add_hiddenprint(mob/living/M as mob) if(isnull(M)) return @@ -360,47 +365,194 @@ A.fingerprintshidden |= fingerprintshidden.Copy() //admin A.fingerprintslast = fingerprintslast +var/list/blood_splatter_icons = list() -//returns 1 if made bloody, returns 0 otherwise -/atom/proc/add_blood(mob/living/carbon/human/M as mob) +/atom/proc/blood_splatter_index() + return "\ref[initial(icon)]-[initial(icon_state)]" - if(!blood_DNA || !istype(blood_DNA, /list)) //if our list of DNA doesn't exist yet (or isn't a list) initialise it. +//returns the mob's dna info as a list, to be inserted in an object's blood_DNA list +/mob/living/proc/get_blood_dna_list() + if(get_blood_id() != "blood") + return + return list("ANIMAL DNA" = "Y-") + +/mob/living/carbon/get_blood_dna_list() + if(get_blood_id() != "blood") + return + var/list/blood_dna = list() + if(dna) + var/mob/living/carbon/human/H = src + blood_dna[dna.unique_enzymes] = H.b_type + else + blood_dna["UNKNOWN DNA"] = "X*" + return blood_dna + +/mob/living/carbon/alien/get_blood_dna_list() + return list("UNKNOWN DNA" = "X*") + +//to add a mob's dna info into an object's blood_DNA list. +/atom/proc/transfer_mob_blood_dna(mob/living/L) + var/new_blood_dna = L.get_blood_dna_list() + if(!new_blood_dna) + return 0 + return transfer_blood_dna(new_blood_dna) + +/obj/effect/decal/cleanable/blood/splatter/transfer_mob_blood_dna(mob/living/L) + ..(L) + var/list/b_data = L.get_blood_data(L.get_blood_id()) + if(b_data) + basecolor = b_data["blood_color"] + else + basecolor = "#A10808" + update_icon() + +/obj/effect/decal/cleanable/blood/footprints/transfer_mob_blood_dna(mob/living/L) + ..(L) + var/list/b_data = L.get_blood_data(L.get_blood_id()) + if(b_data) + basecolor = b_data["blood_color"] + else + basecolor = "#A10808" + update_icon() + +//to add blood dna info to the object's blood_DNA list +/atom/proc/transfer_blood_dna(list/blood_dna) + if(!blood_DNA) blood_DNA = list() + var/old_length = blood_DNA.len + blood_DNA |= blood_dna + if(blood_DNA.len > old_length) + return 1//some new blood DNA was added - blood_color = "#A10808" - if(istype(M)) - if(M.species.flags & NO_BLOOD) - return 0 - M.check_dna() - blood_color = M.species.blood_color - . = 1 +//to add blood from a mob onto something, and transfer their dna info +/atom/proc/add_mob_blood(mob/living/M) + var/list/blood_dna = M.get_blood_dna_list() + if(!blood_dna) + return 0 + var/bloodcolor = "#A10808" + var/list/b_data = M.get_blood_data(M.get_blood_id()) + if(b_data) + bloodcolor = b_data["blood_color"] + + return add_blood(blood_dna, bloodcolor) + +//to add blood onto something, with blood dna info to include. +/atom/proc/add_blood(list/blood_dna, color) + return 0 + +/obj/add_blood(list/blood_dna, color) + return transfer_blood_dna(blood_dna) + +/obj/item/add_blood(list/blood_dna, color) + var/blood_count = !blood_DNA ? 0 : blood_DNA.len + if(!..()) + return 0 + if(!blood_count)//apply the blood-splatter overlay if it isn't already in there + add_blood_overlay(color) + return 1 //we applied blood to the item + +/obj/item/clothing/gloves/add_blood(list/blood_dna, color) + . = ..() + transfer_blood = rand(2, 4) + +/turf/add_blood(list/blood_dna, color) + var/obj/effect/decal/cleanable/blood/splatter/B = locate() in src + if(!B) + B = new /obj/effect/decal/cleanable/blood/splatter(src) + B.transfer_blood_dna(blood_dna) //give blood info to the blood decal. + B.basecolor = color + return 1 //we bloodied the floor + +/mob/living/carbon/human/add_blood(list/blood_dna, color) + if(wear_suit) + wear_suit.add_blood(blood_dna, color) + wear_suit.blood_color = color + update_inv_wear_suit(1) + else if(w_uniform) + w_uniform.add_blood(blood_dna, color) + w_uniform.blood_color = color + update_inv_w_uniform(1) + if(head) + head.add_blood(blood_dna, color) + head.blood_color = color + update_inv_head(0,0) + if(glasses) + glasses.add_blood(blood_dna, color) + glasses.blood_color = color + update_inv_glasses(0) + if(gloves) + var/obj/item/clothing/gloves/G = gloves + G.add_blood(blood_dna, color) + G.blood_color = color + verbs += /mob/living/carbon/human/proc/bloody_doodle + else + hand_blood_color = color + bloody_hands = rand(2, 4) + transfer_blood_dna(blood_dna) + verbs += /mob/living/carbon/human/proc/bloody_doodle + + update_inv_gloves(1) //handles bloody hands overlays and updating return 1 -/atom/proc/add_blood_list(mob/living/carbon/M) - // Returns 0 if we have that blood already - if(!istype(blood_DNA, /list)) //if our list of DNA doesn't exist yet (or isn't a list) initialise it. - blood_DNA = list() - //if this blood isn't already in the list, add it - if(blood_DNA[M.dna.unique_enzymes]) - return 0 //already bloodied with this blood. Cannot add more. - var/blood_type = "X*" - if(ishuman(M)) - var/mob/living/carbon/human/H = M - blood_type = H.b_type - blood_DNA[M.dna.unique_enzymes] = blood_type - return 1 +/obj/item/proc/add_blood_overlay(color) + if(initial(icon) && initial(icon_state)) + //try to find a pre-processed blood-splatter. otherwise, make a new one + var/index = blood_splatter_index() + var/icon/blood_splatter_icon = blood_splatter_icons[index] + if(!blood_splatter_icon) + blood_splatter_icon = icon(initial(icon), initial(icon_state), , 1) //we only want to apply blood-splatters to the initial icon_state for each object + blood_splatter_icon.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent) + blood_splatter_icon.Blend(icon('icons/effects/blood.dmi', "itemblood"), ICON_MULTIPLY) //adds blood and the remaining white areas become transparant + blood_splatter_icon = fcopy_rsc(blood_splatter_icon) + blood_splatter_icons[index] = blood_splatter_icon -// Only adds blood on the floor -- Skie -/atom/proc/add_blood_floor(mob/living/carbon/M) - return //why the fuck this is at an atom level but only works on simulated turfs I don't know + blood_overlay = image(blood_splatter_icon) + blood_overlay.color = color + overlays += blood_overlay /atom/proc/clean_blood() - src.germ_level = 0 - if(istype(blood_DNA, /list)) - qdel(blood_DNA) + germ_level = 0 + if(islist(blood_DNA)) + blood_DNA = null return 1 + +/obj/item/clean_blood() + . = ..() + if(.) + if(blood_overlay) + overlays -= blood_overlay + +/obj/item/clothing/gloves/clean_blood() + . = ..() + if(.) + transfer_blood = 0 + + +/obj/item/clothing/shoes/clean_blood() + ..() + bloody_shoes = list(BLOOD_STATE_HUMAN = 0, BLOOD_STATE_XENO = 0, BLOOD_STATE_NOT_BLOODY = 0) + blood_state = BLOOD_STATE_NOT_BLOODY + if(ismob(loc)) + var/mob/M = loc + M.update_inv_shoes() + + +/mob/living/carbon/human/clean_blood() + if(gloves) + if(gloves.clean_blood()) + clean_blood() + update_inv_gloves() + gloves.germ_level = 0 + else + ..() // Clear the Blood_DNA list + if(bloody_hands) + bloody_hands = 0 + update_inv_gloves() + update_icons() //apply the now updated overlays to the mob + + /atom/proc/add_vomit_floor(mob/living/carbon/M as mob, var/toxvomit = 0) if( istype(src, /turf/simulated) ) var/obj/effect/decal/cleanable/vomit/this = new /obj/effect/decal/cleanable/vomit(src) @@ -467,4 +619,4 @@ /atom/on_varedit(modified_var) if(!Debug2) admin_spawned = TRUE - ..() \ No newline at end of file + ..() diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 7dd8d0c5be8..906706de62e 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -6,15 +6,21 @@ // var/elevation = 2 - not used anywhere var/move_speed = 10 var/l_move_time = 1 - var/throwing = 0 - var/thrower - var/turf/throw_source = null - var/throw_speed = 2 + var/datum/thrownthing/throwing = null + var/throw_speed = 2 //How many tiles to move per ds when being thrown. Float values are fully supported var/throw_range = 7 - var/no_spin_thrown = 0 //set this to 1 if you don't want an item that you throw to spin, no matter what. -Fox + var/no_spin = 0 + var/no_spin_thrown = 0 var/moved_recently = 0 var/mob/pulledby = null + var/inertia_dir = 0 + var/atom/inertia_last_loc + var/inertia_moving = 0 + var/inertia_next_move = 0 + var/inertia_move_delay = 5 + + var/moving_diagonally = 0 //0: not doing a diagonal move. 1 and 2: doing the first/second step of the diagonal move var/area/areaMaster @@ -71,61 +77,74 @@ if(!(direct & (direct - 1))) //Cardinal move . = ..() else //Diagonal move, split it into cardinal moves + moving_diagonally = FIRST_DIAG_STEP if(direct & 1) if(direct & 4) if(step(src, NORTH)) + moving_diagonally = SECOND_DIAG_STEP . = step(src, EAST) else if(step(src, EAST)) + moving_diagonally = SECOND_DIAG_STEP . = step(src, NORTH) else if(direct & 8) if(step(src, NORTH)) + moving_diagonally = SECOND_DIAG_STEP . = step(src, WEST) else if(step(src, WEST)) + moving_diagonally = SECOND_DIAG_STEP . = step(src, NORTH) else if(direct & 2) if(direct & 4) if(step(src, SOUTH)) + moving_diagonally = SECOND_DIAG_STEP . = step(src, EAST) else if(step(src, EAST)) + moving_diagonally = SECOND_DIAG_STEP . = step(src, SOUTH) else if(direct & 8) if(step(src, SOUTH)) + moving_diagonally = SECOND_DIAG_STEP . = step(src, WEST) else if(step(src, WEST)) + moving_diagonally = SECOND_DIAG_STEP . = step(src, SOUTH) - + moving_diagonally = 0 + return if(!loc || (loc == oldloc && oldloc != newloc)) last_move = 0 return + if(.) + Moved(oldloc, direct) + last_move = direct src.move_speed = world.time - src.l_move_time src.l_move_time = world.time - spawn(5) // Causes space drifting. /tg/station has no concept of speed, we just use 5 - if(loc && direct && last_move == direct) - if(loc == newloc) //Remove this check and people can accelerate. Not opening that can of worms just yet. - newtonian_move(last_move) - if(. && buckled_mob && !handle_buckled_mob_movement(loc, direct)) //movement failed due to buckled mob . = 0 +// Called after a successful Move(). By this point, we've already moved +/atom/movable/proc/Moved(atom/OldLoc, Dir) + if(!inertia_moving) + inertia_next_move = world.time + inertia_move_delay + newtonian_move(Dir) + return 1 -// Previously known as Crossed() +// Previously known as HasEntered() // This is automatically called when something enters your square /atom/movable/Crossed(atom/movable/AM) return -/atom/movable/Bump(var/atom/A as mob|obj|turf|area, sendBump) - if(src.throwing) - src.throw_impact(A) - - if(A && sendBump) - A.last_bumped = world.time +/atom/movable/Bump(atom/A, yes) //the "yes" arg is to differentiate our Bump proc from byond's, without it every Bump() call would become a double Bump(). + if(A && yes) + if(throwing) + throwing.hit_atom(A) + . = 1 + if(!A || qdeleted(A)) + return A.Bumped(src) - else - ..() /atom/movable/proc/forceMove(atom/destination) var/turf/old_loc = loc @@ -166,29 +185,6 @@ update_canmove() //if the mob was asleep inside a container and then got forceMoved out we need to make them fall. -//called when src is thrown into hit_atom -/atom/movable/proc/throw_impact(atom/hit_atom, var/speed) - if(istype(hit_atom,/mob/living)) - var/mob/living/M = hit_atom - M.hitby(src,speed) - - else if(isobj(hit_atom)) - var/obj/O = hit_atom - if(!O.anchored) - step(O, src.dir) - O.hitby(src,speed) - - else if(isturf(hit_atom)) - src.throwing = 0 - var/turf/T = hit_atom - if(T.density) - spawn(2) - step(src, turn(src.dir, 180)) - if(istype(src,/mob/living)) - var/mob/living/M = src - M.turf_collision(T, speed) - - //Called whenever an object moves and by mobs when they attempt to move themselves through space //And when an object or action applies a force on src, see newtonian_move() below //Return 0 to have src start/keep drifting in a no-grav area and 1 to stop/not start drifting @@ -201,13 +197,15 @@ if(pulledby && !pulledby.pulling) return 1 + if(throwing) + return 1 + if(locate(/obj/structure/lattice) in range(1, get_turf(src))) //Not realistic but makes pushing things in space easier return 1 return 0 /atom/movable/proc/newtonian_move(direction) //Only moves the object if it's under no gravity - if(!loc || Process_Spacemove(0)) inertia_dir = 0 return 0 @@ -216,119 +214,93 @@ if(!direction) return 1 - var/old_dir = dir - . = step(src, direction) - dir = old_dir + inertia_last_loc = loc + drift_master.processing_list[src] = src + return 1 -//decided whether a movable atom being thrown can pass through the turf it is in. -/atom/movable/proc/hit_check(var/speed) - if(src.throwing) - for(var/atom/A in get_turf(src)) - if(A == src) continue - if(istype(A,/mob/living)) - if(A:lying) continue - src.throw_impact(A,speed) - if(isobj(A)) - if(A.density && !A.throwpass) // **TODO: Better behaviour for windows which are dense, but shouldn't always stop movement - src.throw_impact(A,speed) -/atom/movable/proc/throw_at_fast(atom/target, range, speed, thrower, no_spin) +//called when src is thrown into hit_atom +/atom/movable/proc/throw_impact(atom/hit_atom, throwingdatum) set waitfor = 0 - throw_at(target, range, speed, thrower, no_spin) + return hit_atom.hitby(src) -/atom/movable/proc/throw_at(atom/target, range, speed, thrower, no_spin) - if(!target || !src || (flags & NODROP)) +/atom/movable/hitby(atom/movable/AM, skipcatch, hitpush = 1, blocked) + if(!anchored && hitpush) + step(src, AM.dir) + ..() + +/atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, var/datum/callback/callback) + if(!target || (flags & NODROP) || speed <= 0) return 0 - //use a modified version of Bresenham's algorithm to get from the atom's current position to that of the target - src.throwing = 1 - src.thrower = thrower - src.throw_source = get_turf(src) //store the origin turf - if(target.allow_spin) // turns out 1000+ spinning objects being thrown at the singularity creates lag - Iamgoofball - if(!no_spin_thrown && !no_spin) - SpinAnimation(5, 1) + if(pulledby) + pulledby.stop_pulling() + + // They are moving! Wouldn't it be cool if we calculated their momentum and added it to the throw? + if(thrower && thrower.last_move && thrower.client && thrower.client.move_delay >= world.time + world.tick_lag * 2) + var/user_momentum = thrower.movement_delay() + if(!user_momentum) // no movement_delay, this means they move once per byond tick, let's calculate from that instead + user_momentum = world.tick_lag + + user_momentum = 1 / user_momentum // convert from ds to the tiles per ds that throw_at uses + + if(get_dir(thrower, target) & last_move) + user_momentum = user_momentum // basically a noop, but needed + else if(get_dir(target, thrower) & last_move) + user_momentum = -user_momentum // we are moving away from the target, lets slowdown the throw accordingly + else + user_momentum = 0 + + if(user_momentum) + // first lets add that momentum to range + range *= (user_momentum / speed) + 1 + //then lets add it to speed + speed += user_momentum + if(speed <= 0) + return //no throw speed, the user was moving too fast. + + var/datum/thrownthing/TT = new() + TT.thrownthing = src + TT.target = target + TT.target_turf = get_turf(target) + TT.init_dir = get_dir(src, target) + TT.maxrange = range + TT.speed = speed + TT.thrower = thrower + TT.diagonals_first = diagonals_first + TT.callback = callback + var/dist_x = abs(target.x - src.x) var/dist_y = abs(target.y - src.y) + var/dx = (target.x > src.x) ? EAST : WEST + var/dy = (target.y > src.y) ? NORTH : SOUTH - var/dx - if(target.x > src.x) - dx = EAST - else - dx = WEST + if(dist_x == dist_y) + TT.pure_diagonal = 1 - var/dy - if(target.y > src.y) - dy = NORTH - else - dy = SOUTH - var/dist_travelled = 0 - var/dist_since_sleep = 0 - var/area/a = get_area(src.loc) - if(dist_x > dist_y) - var/error = dist_x/2 - dist_y - while(src && target &&((((src.x < target.x && dx == EAST) || (src.x > target.x && dx == WEST)) && dist_travelled < range) || (a && a.has_gravity == 0) || istype(src.loc, /turf/space)) && src.throwing && istype(src.loc, /turf)) - // only stop when we've gone the whole distance (or max throw range) and are on a non-space tile, or hit something, or hit the end of the map, or someone picks it up - if(error < 0) - var/atom/step = get_step(src, dy) - if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge - break - src.Move(step, get_dir(loc, step)) - hit_check(speed) - error += dist_x - dist_travelled++ - dist_since_sleep++ - if(dist_since_sleep >= speed) - dist_since_sleep = 0 - sleep(1) - else - var/atom/step = get_step(src, dx) - if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge - break - src.Move(step) - hit_check(speed) - error -= dist_y - dist_travelled++ - dist_since_sleep++ - if(dist_since_sleep >= speed) - dist_since_sleep = 0 - sleep(1) - a = get_area(src.loc) - else - var/error = dist_y/2 - dist_x - while(src && target &&((((src.y < target.y && dy == NORTH) || (src.y > target.y && dy == SOUTH)) && dist_travelled < range) || (a && a.has_gravity == 0) || istype(src.loc, /turf/space)) && src.throwing && istype(src.loc, /turf)) - // only stop when we've gone the whole distance (or max throw range) and are on a non-space tile, or hit something, or hit the end of the map, or someone picks it up - if(error < 0) - var/atom/step = get_step(src, dx) - if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge - break - src.Move(step) - hit_check(speed) - error += dist_y - dist_travelled++ - dist_since_sleep++ - if(dist_since_sleep >= speed) - dist_since_sleep = 0 - sleep(1) - else - var/atom/step = get_step(src, dy) - if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge - break - src.Move(step) - hit_check(speed) - error -= dist_x - dist_travelled++ - dist_since_sleep++ - if(dist_since_sleep >= speed) - dist_since_sleep = 0 - sleep(1) + else if(dist_x <= dist_y) + var/olddist_x = dist_x + var/olddx = dx + dist_x = dist_y + dist_y = olddist_x + dx = dy + dy = olddx + TT.dist_x = dist_x + TT.dist_y = dist_y + TT.dx = dx + TT.dy = dy + TT.diagonal_error = dist_x / 2 - dist_y + TT.start_time = world.time - a = get_area(src.loc) + if(pulledby) + pulledby.stop_pulling() - //done throwing, either because it hit something or it finished moving - if(isobj(src)) src.throw_impact(get_turf(src),speed) - src.throwing = 0 - src.thrower = null - src.throw_source = null + throwing = TT + if(spin && !no_spin && !no_spin_thrown) + SpinAnimation(5, 1) + + throw_master.processing_list[src] = TT + TT.tick() //Overlays diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 2a6aa2b3a39..7052b62e97f 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -63,7 +63,8 @@ //called when a carbon changes virus /mob/living/carbon/proc/check_virus() - for(var/datum/disease/D in viruses) + for(var/thing in viruses) + var/datum/disease/D = thing if((!(D.visibility_flags & HIDDEN_SCANNER)) && (D.severity != NONTHREAT)) return 1 return 0 @@ -190,7 +191,7 @@ /mob/living/carbon/human/proc/sec_hud_set_security_status() var/image/holder = hud_list[WANTED_HUD] - var/perpname = get_face_name(get_id_name("")) + var/perpname = get_visible_name(TRUE) //gets the name of the perp, works if they have an id or if their face is uncovered if(!ticker) return //wait till the game starts or the monkeys runtime.... if(perpname) var/datum/data/record/R = find_record("name", perpname, data_core.security) diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm index 0c56c3330cd..d3625deab58 100644 --- a/code/game/dna/genes/goon_powers.dm +++ b/code/game/dna/genes/goon_powers.dm @@ -278,6 +278,10 @@ var/list/targets = new /list() var/list/possible_targets = new /list() + if(!check_mouth(user)) + revert_cast(user) + return + for(var/atom/movable/O in view_or_range(range, user, selection_type)) if((O in user) && is_type_in_list(O,own_blacklist)) continue @@ -294,8 +298,21 @@ revert_cast(user) return + if(!check_mouth(user)) + revert_cast(user) + return + perform(targets, user = user) +/obj/effect/proc_holder/spell/targeted/eat/proc/check_mouth(mob/user = usr) + var/can_eat = 1 + if(iscarbon(user)) + var/mob/living/carbon/C = user + if((C.head && (C.head.flags_cover & HEADCOVERSMOUTH)) || (C.wear_mask && (C.wear_mask.flags_cover & MASKCOVERSMOUTH) && !C.wear_mask.mask_adjusted)) + to_chat(C, "Your mouth is covered, preventing you from eating!") + can_eat = 0 + return can_eat + /obj/effect/proc_holder/spell/targeted/eat/cast(list/targets, mob/user = usr) if(!targets.len) to_chat(user, "No target found in range.") @@ -339,7 +356,7 @@ return user.visible_message("[user] [pick("chomps","bites")] off [the_item]'s [limb]!") playsound(user.loc, 'sound/items/eatfood.ogg', 50, 0) - limb.droplimb(0, DROPLIMB_EDGE) + limb.droplimb(0, DROPLIMB_SHARP) doHeal(user) else user.visible_message("[user] eats \the [the_item].") @@ -397,9 +414,6 @@ else M.stop_pulling() - if(user.pinned.len) - failure = 1 - user.visible_message("[user.name] takes a huge leap!") playsound(user.loc, 'sound/weapons/thudswoosh.ogg', 50, 1) if(failure) @@ -554,7 +568,8 @@ return to_chat(user, "Mind Reading of [M.name]:") - var/pain_condition = M.health + + var/pain_condition = M.health / M.maxHealth // lower health means more pain var/list/randomthoughts = list("what to have for lunch","the future","the past","money", "their hair","what to do next","their job","space","amusing things","sad things", @@ -562,33 +577,33 @@ var/thoughts = "thinking about [pick(randomthoughts)]" if(M.fire_stacks) - pain_condition -= 50 + pain_condition -= 0.5 thoughts = "preoccupied with the fire" if(M.radiation) - pain_condition -= 25 + pain_condition -= 0.25 switch(pain_condition) - if(81 to INFINITY) + if(0.81 to INFINITY) to_chat(user, "Condition: [M.name] feels good.") - if(61 to 80) + if(0.61 to 0.8) to_chat(user, "Condition: [M.name] is suffering mild pain.") - if(41 to 60) + if(0.41 to 0.6) to_chat(user, "Condition: [M.name] is suffering significant pain.") - if(21 to 40) + if(0.21 to 0.4) to_chat(user, "Condition: [M.name] is suffering severe pain.") else to_chat(user, "Condition: [M.name] is suffering excruciating pain.") thoughts = "haunted by their own mortality" switch(M.a_intent) - if(I_HELP) + if(INTENT_HELP) to_chat(user, "Mood: You sense benevolent thoughts from [M.name].") - if(I_DISARM) + if(INTENT_DISARM) to_chat(user, "Mood: You sense cautious thoughts from [M.name].") - if(I_GRAB) + if(INTENT_GRAB) to_chat(user, "Mood: You sense hostile thoughts from [M.name].") - if(I_HARM) + if(INTENT_HARM) to_chat(user, "Mood: You sense cruel thoughts from [M.name].") for(var/mob/living/L in view(7,M)) if(L == M) @@ -642,20 +657,20 @@ action_icon_state = "superfart" /obj/effect/proc_holder/spell/aoe_turf/superfart/invocation(mob/user = usr) - invocation = "[user] hunches down and grits their teeth!" - invocation_emote_self = invocation + invocation = "[user] hunches down and grits their teeth!" + invocation_emote_self = "You hunch down and grit your teeth!" ..(user) -/obj/effect/proc_holder/spell/aoe_turf/superfart/cast(list/targets) - var/UT = get_turf(usr) - - if(do_after(usr, 30, target = usr)) +/obj/effect/proc_holder/spell/aoe_turf/superfart/cast(list/targets, mob/user) + var/UT = get_turf(user) + if(do_after(user, 30, target = user)) + var/fartsize = pick("tremendous","gigantic","colossal") playsound(UT, 'sound/goonstation/effects/superfart.ogg', 50, 0) - usr.visible_message("[usr] unleashes a [pick("tremendous","gigantic","colossal")] fart!", "You hear a [pick("tremendous","gigantic","colossal")] fart.") + user.visible_message("[user] unleashes a [fartsize] fart!", "You hear a [fartsize] fart.") for(var/T in targets) for(var/mob/living/M in T) shake_camera(M, 10, 5) - if(M == usr) + if(M == user) continue to_chat(M, "You are sent flying!") M.Weaken(5) @@ -663,4 +678,4 @@ step_away(M, UT, 15) step_away(M, UT, 15) else - to_chat(usr, "You were interrupted and couldn't fart! Rude!") + to_chat(user, "You were interrupted and couldn't fart! Rude!") diff --git a/code/game/dna/genes/monkey.dm b/code/game/dna/genes/monkey.dm index 4f023d8021f..52cd4226327 100644 --- a/code/game/dna/genes/monkey.dm +++ b/code/game/dna/genes/monkey.dm @@ -42,9 +42,7 @@ H.set_species(H.species.primitive_form) - if(H.hud_used) - qdel(H.hud_used) - H.hud_used = null + QDEL_NULL(H.hud_used) if(H.client) H.hud_used = new /datum/hud/monkey(H, ui_style2icon(H.client.prefs.UI_style), H.client.prefs.UI_style_color, H.client.prefs.UI_style_alpha) @@ -89,13 +87,11 @@ H.real_name = H.dna.real_name H.name = H.real_name - if(H.hud_used) - qdel(H.hud_used) - H.hud_used = null + QDEL_NULL(H.hud_used) if(H.client) H.hud_used = new /datum/hud/human(H, ui_style2icon(H.client.prefs.UI_style), H.client.prefs.UI_style_color, H.client.prefs.UI_style_alpha) to_chat(H, "You are now a [H.species.name].") - return H \ No newline at end of file + return H diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm index e159aa44247..32a6a58cbb3 100644 --- a/code/game/dna/genes/vg_powers.dm +++ b/code/game/dna/genes/vg_powers.dm @@ -211,11 +211,11 @@ /obj/effect/proc_holder/spell/targeted/remotetalk/choose_targets(mob/user = usr) var/list/targets = new /list() var/list/validtargets = new /list() - for(var/mob/M in view(user.client.view, user)) + var/turf/T = get_turf(user) + for(var/mob/M in range(14, T)) if(M && M.mind) if(M == user) continue - validtargets += M if(!validtargets.len) @@ -237,14 +237,15 @@ if(!say) return say = strip_html(say) + say = pencode_to_html(say, usr, format = 0, fields = 0) for(var/mob/living/target in targets) log_say("Project Mind: [key_name(user)]->[key_name(target)]: [say]") if(REMOTE_TALK in target.mutations) - target.show_message("You hear [user.real_name]'s voice: [say]") + target.show_message("You hear [user.real_name]'s voice: [say]") else - target.show_message("You hear a voice that seems to echo around the room: [say]") - user.show_message("You project your mind into [target.real_name]: [say]") + target.show_message("You hear a voice that seems to echo around the room: [say]") + user.show_message("You project your mind into [target.name]: [say]") for(var/mob/dead/observer/G in player_list) G.show_message("Telepathic message from [user] ([ghost_follow_link(user, ghost=G)]) to [target] ([ghost_follow_link(target, ghost=G)]): [say]") diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm index e0187e940e4..d85b3c91258 100644 --- a/code/game/gamemodes/antag_spawner.dm +++ b/code/game/gamemodes/antag_spawner.dm @@ -1,7 +1,7 @@ /obj/item/weapon/antag_spawner throw_speed = 1 throw_range = 5 - w_class = 1 + w_class = WEIGHT_CLASS_TINY var/used = 0 /obj/item/weapon/antag_spawner/proc/spawn_antag(var/client/C, var/turf/T, var/type = "") diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index b7558d0c9cf..1f45794ac14 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -202,7 +202,7 @@ /obj/structure/blob/examine(mob/user) ..(user) - to_chat(user, "It looks like it's of a [get_chem_name()] kind.") + to_chat(user, "It looks like it's made of [get_chem_name()].") /obj/structure/blob/proc/get_chem_name() diff --git a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm index a9899b33462..bf16d90d55e 100644 --- a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm +++ b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm @@ -38,7 +38,6 @@ icon_state = "ling_eyeshield" eye_colour = null implant_overlay = null - origin_tech = "biotech=4" slot = "eye_ling" status = 0 aug_message = "We feel a minute twitch in our eyes, our eyes feel more durable." @@ -61,7 +60,6 @@ icon_state = "ling_thermal" eye_colour = null implant_overlay = null - origin_tech = "biotech=5;magnets=5" slot = "eye_ling" status = 0 aug_message = "We feel a minute twitch in our eyes, and darkness creeps away." @@ -82,4 +80,4 @@ var/mob/living/carbon/human/H = owner H.weakeyes = 0 H.vision_type = null - ..() \ No newline at end of file + ..() diff --git a/code/game/gamemodes/changeling/powers/fleshmend.dm b/code/game/gamemodes/changeling/powers/fleshmend.dm index cd09cc8d764..e6ccafcffa0 100644 --- a/code/game/gamemodes/changeling/powers/fleshmend.dm +++ b/code/game/gamemodes/changeling/powers/fleshmend.dm @@ -13,8 +13,6 @@ var/mob/living/carbon/human/H = user H.restore_blood() H.shock_stage = 0 - spawn(1) - H.fixblood() spawn(0) for(var/i = 0, i<10,i++) user.heal_overall_damage(10, 10) diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm index 9a6438853c0..943b15a6172 100644 --- a/code/game/gamemodes/changeling/powers/mutations.dm +++ b/code/game/gamemodes/changeling/powers/mutations.dm @@ -17,18 +17,21 @@ dna_cost = -1 genetic_damage = 1000 + var/silent = FALSE var/weapon_type var/weapon_name_simple /obj/effect/proc_holder/changeling/weapon/try_to_sting(var/mob/user, var/mob/target) if(istype(user.l_hand, weapon_type)) //Not the nicest way to do it, but eh qdel(user.l_hand) - user.visible_message("With a sickening crunch, [user] reforms his [weapon_name_simple] into an arm!", "We assimilate the [weapon_name_simple] back into our body.", "With a sickening crunch, [user] reforms his [weapon_name_simple] into an arm!", "We assimilate the [weapon_name_simple] back into our body.", "With a sickening crunch, [user] reforms his [weapon_name_simple] into an arm!", "We assimilate the [weapon_name_simple] back into our body.", "With a sickening crunch, [user] reforms his [weapon_name_simple] into an arm!", "We assimilate the [weapon_name_simple] back into our body.", "[user] forces the airlock to open with \his [src]!", "We force the airlock to open.", "You hear a metal screeching sound.") A.open(2) +/***************************************\ +|***********COMBAT TENTACLES*************| +\***************************************/ + +/obj/effect/proc_holder/changeling/weapon/tentacle + name = "Tentacle" + desc = "We ready a tentacle to grab items or victims with." + helptext = "We can use it once to retrieve a distant item. If used on living creatures, the effect depends on the intent: \ + Help will simply drag them closer, Disarm will grab whatever they are holding instead of them, Grab will put the victim in our hold after catching it, \ + and Harm will stun it, and stab it if we are also holding a sharp weapon. Cannot be used while in lesser form." + chemical_cost = 10 + dna_cost = 2 + genetic_damage = 5 + req_human = 1 + max_genetic_damage = 10 + weapon_type = /obj/item/weapon/gun/magic/tentacle + weapon_name_simple = "tentacle" + silent = TRUE + +/obj/item/weapon/gun/magic/tentacle + name = "tentacle" + desc = "A fleshy tentacle that can stretch out and grab things or people." + icon = 'icons/obj/weapons.dmi' + icon_state = "tentacle" + item_state = "tentacle" + flags = ABSTRACT | NODROP | NOBLUDGEON + w_class = WEIGHT_CLASS_HUGE + ammo_type = /obj/item/ammo_casing/magic/tentacle + fire_sound = 'sound/effects/splat.ogg' + force = 0 + max_charges = 1 + throwforce = 0 //Just to be on the safe side + throw_range = 0 + throw_speed = 0 + +/obj/item/weapon/gun/magic/tentacle/New(location,silent) + ..() + if(ismob(loc)) + if(!silent) + loc.visible_message("[loc.name]\'s arm starts stretching inhumanly!", "Our arm twists and mutates, transforming it into a tentacle.", "You hear organic matter ripping and tearing!") + else + to_chat(loc, "You prepare to extend a tentacle.") + +/obj/item/weapon/gun/magic/tentacle/dropped() + . = ..() + qdel(src) + +/obj/item/weapon/gun/magic/tentacle/shoot_with_empty_chamber(mob/living/user as mob|obj) + to_chat(user, "The [name] is not ready yet.") + +/obj/item/weapon/gun/magic/tentacle/suicide_act(mob/user) + user.visible_message("[user] coils [src] tightly around \his neck! It looks like \he's trying to commit suicide.") + return (OXYLOSS) + +/obj/item/ammo_casing/magic/tentacle + name = "tentacle" + desc = "a tentacle." + projectile_type = /obj/item/projectile/tentacle + caliber = "tentacle" + icon_state = "tentacle_end" + var/obj/item/weapon/gun/magic/tentacle/gun //the item that shot it + +/obj/item/ammo_casing/magic/tentacle/New(obj/item/weapon/gun/magic/tentacle/tentacle_gun) + gun = tentacle_gun + ..() + +/obj/item/ammo_casing/magic/tentacle/Destroy() + gun = null + return ..() + +/obj/item/projectile/tentacle + name = "tentacle" + icon_state = "tentacle_end" + pass_flags = PASSTABLE + damage = 0 + damage_type = BRUTE + range = 8 + hitsound = 'sound/weapons/thudswoosh.ogg' + var/chain + var/obj/item/ammo_casing/magic/tentacle/source //the item that shot it + +/obj/item/projectile/tentacle/New(obj/item/ammo_casing/magic/tentacle/tentacle_casing) + source = tentacle_casing + ..() + +/obj/item/projectile/tentacle/fire(setAngle) + if(firer) + chain = firer.Beam(src, icon_state = "tentacle", time = INFINITY, maxdistance = INFINITY, beam_sleep_time = 1) + ..() + +/obj/item/projectile/tentacle/proc/reset_throw(mob/living/carbon/human/H) + if(H.in_throw_mode) + H.throw_mode_off() //Don't annoy the changeling if he doesn't catch the item + +/mob/proc/tentacle_grab(mob/living/carbon/C) + if(Adjacent(C)) + var/obj/item/weapon/grab/G = C.grabbedby(src,1) + if(istype(G)) + G.state = GRAB_AGGRESSIVE //Instant aggressive grab + +/mob/proc/tentacle_stab(mob/living/carbon/C) + if(Adjacent(C)) + var/obj/item/I = r_hand + if(!is_sharp(I)) + I = l_hand + if(!is_sharp(I)) + return + + C.visible_message("[src] impales [C] with [I]!", "[src] impales you with [I]!") + C.apply_damage(I.force, BRUTE, "chest") + do_attack_animation(C) + add_blood(C) + playsound(get_turf(src), I.hitsound, 75, 1) + + +/obj/item/projectile/tentacle/on_hit(atom/target, blocked = 0) + qdel(source.gun) //one tentacle only unless you miss + if(blocked >= 100) + return 0 + var/mob/living/carbon/human/H = firer + if(istype(target, /obj/item)) + var/obj/item/I = target + if(!I.anchored) + to_chat(firer, "You pull [I] towards yourself.") + H.throw_mode_on() + I.throw_at(H, 10, 2) + . = 1 + + else if(isliving(target)) + var/mob/living/L = target + if(!L.anchored && !L.throwing)//avoid double hits + if(iscarbon(L)) + var/mob/living/carbon/C = L + switch(firer.a_intent) + if(INTENT_HELP) + C.visible_message("[L] is pulled by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") + C.throw_at(get_step_towards(H,C), 8, 2) + return 1 + + if(INTENT_DISARM) + var/obj/item/I = C.get_active_hand() + if(I) + if(C.drop_item()) + C.visible_message("[I] is yanked out of [C]'s hand by [src]!","A tentacle pulls [I] away from you!") + on_hit(I) //grab the item as if you had hit it directly with the tentacle + return 1 + else + to_chat(firer, "You can't seem to pry [I] out of [C]'s hands!") + return 0 + else + to_chat(firer, "[C] has nothing in hand to disarm!") + return 0 + + if(INTENT_GRAB) + C.visible_message("[L] is grabbed by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") + C.throw_at(get_step_towards(H,C), 8, 2, callback=CALLBACK(H, /mob/proc/tentacle_grab, C)) + return 1 + + if(INTENT_HARM) + C.visible_message("[L] is thrown towards [H] by a tentacle!","A tentacle grabs you and throws you towards [H]!") + C.throw_at(get_step_towards(H,C), 8, 2, callback=CALLBACK(H, /mob/proc/tentacle_stab, C)) + return 1 + else + L.visible_message("[L] is pulled by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") + L.throw_at(get_step_towards(H,L), 8, 2) + . = 1 + +/obj/item/projectile/tentacle/Destroy() + qdel(chain) + source = null + return ..() + /***************************************\ |****************SHIELD*****************| diff --git a/code/game/gamemodes/changeling/powers/panacea.dm b/code/game/gamemodes/changeling/powers/panacea.dm index 8ae82a0e788..5b11d2ba656 100644 --- a/code/game/gamemodes/changeling/powers/panacea.dm +++ b/code/game/gamemodes/changeling/powers/panacea.dm @@ -33,7 +33,10 @@ user.reagents.add_reagent("potass_iodide", 10) user.reagents.add_reagent("charcoal", 20) - for(var/datum/disease/D in user.viruses) + for(var/thing in user.viruses) + var/datum/disease/D = thing + if(D.severity == NONTHREAT) + continue D.cure() feedback_add_details("changeling_powers","AP") diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm index 5fd98986332..376e6d5a148 100644 --- a/code/game/gamemodes/changeling/powers/revive.dm +++ b/code/game/gamemodes/changeling/powers/revive.dm @@ -30,8 +30,6 @@ var/mob/living/carbon/human/H = user H.restore_blood() H.shock_stage = 0 - spawn(1) - H.fixblood() H.species.create_organs(H) // Now that recreating all organs is necessary, the rest of this organ stuff probably // isn't, but I don't want to remove it, just in case. @@ -39,10 +37,6 @@ var/obj/item/organ/external/O = H.bodyparts_by_name[organ_name] if(!O) continue - for(var/obj/item/weapon/shard/shrapnel/s in O.implants) - O.implants -= s - H.contents -= s - qdel(s) O.brute_dam = 0 O.burn_dam = 0 O.damage_state = "00" @@ -58,6 +52,7 @@ for(var/obj/item/organ/internal/IO in H.internal_organs) IO.damage = 0 IO.trace_chemicals.Cut() + H.remove_all_embedded_objects() H.updatehealth() to_chat(user, "We have regenerated.") diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 6ab24e1d8b4..289ae7e4656 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -3,11 +3,10 @@ desc = "An arcane weapon wielded by the followers of a cult." icon_state = "cultblade" item_state = "cultblade" - w_class = 4 + w_class = WEIGHT_CLASS_BULKY force = 30 throwforce = 10 sharp = 1 - edge = 1 hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") @@ -38,9 +37,10 @@ desc = "A strange dagger said to be used by sinister groups for \"preparing\" a corpse before sacrificing it to their dark gods." icon = 'icons/obj/wizard.dmi' icon_state = "render" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL force = 15 throwforce = 25 + embed_chance = 75 var/cooldown = 0 /obj/item/weapon/melee/cultblade/dagger/afterattack(mob/living/target as mob, mob/living/carbon/human/user as mob) @@ -48,7 +48,7 @@ var/mob/living/carbon/human/bleeder = target if(!(cooldown > world.time) && ((bleeder.stat != DEAD) && !(bleeder.species.flags & NO_BLOOD))) user.visible_message("The runes on the blade absorb the blood of [target]!") - bleeder.drip(5000) + bleeder.bleed(5000) cooldown = world.time + 2400 /obj/item/weapon/restraints/legcuffs/bola/cult @@ -123,7 +123,7 @@ icon_state = "cult_armour" item_state = "cult_armour" desc = "A bulky suit of armour, bristling with spikes. It looks space proof." - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank) slowdown = 1 armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30) @@ -133,7 +133,7 @@ desc = "Empowered garb which creates a powerful shield around the user." icon_state = "cult_armour" item_state = "cult_armour" - w_class = 4 + w_class = WEIGHT_CLASS_BULKY armor = list(melee = 50, bullet = 40, laser = 50, energy = 30, bomb = 50, bio = 30, rad = 30) body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade) diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index 1f35890373c..60b9fcb2c85 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -261,7 +261,7 @@ var/list/blacklisted_pylon_turfs = typecacheof(list( /obj/item/weapon/storage/box/cult name = "Dark Forge Cache" can_hold = list("/obj/item/clothing/suit/space/cult", "/obj/item/clothing/head/helmet/space/cult") - max_w_class = 3 + max_w_class = WEIGHT_CLASS_NORMAL /obj/item/weapon/storage/box/cult/New() ..() diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 3a48f472603..1553ec0aa94 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -24,7 +24,7 @@ icon_state ="tome" throw_speed = 2 throw_range = 5 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL var/scribereduct = 0 var/canbypass = 0 //ADMINBUS diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 006c0642202..fb4ba668bef 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -327,9 +327,7 @@ var/round_start_time = 0 //If its actually the end of the round, wait for it to end. //Otherwise if its a verb it will continue on afterwards. spawn(300) - if(cinematic) - qdel(cinematic) //end the cinematic - cinematic = null + QDEL_NULL(cinematic) //end the cinematic if(temp_buckle) qdel(temp_buckle) //release everybody @@ -406,18 +404,6 @@ var/round_start_time = 0 if(F.name == name) return F -/datum/controller/gameticker/proc/karmareminder() - for(var/mob/living/player in player_list) - - if(player.client) - if(player.client.karma_spent == 0) - if(!player.get_preference(DISABLE_KARMA_REMINDER)) - var/dat - dat += {"Karma Reminder

    Karma Reminder


    - You have not yet spent your karma for the round, surely there is a player who was worthy of receiving
    - your reward? Look under 'OOC' for the 'Award Karma' button, and use it once a round for best results!"} - player << browse(dat, "window=karmareminder;size=400x300") - /datum/controller/gameticker/proc/declare_completion() nologevent = 1 //end of round murder and shenanigans are legal; there's no need to jam up attack logs past this point. @@ -472,7 +458,6 @@ var/round_start_time = 0 call(mode, handler)() scoreboard() - karmareminder() // Declare the completion of the station goals mode.declare_station_goal_completion() diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index 2a72c4a9b9b..1408e0a87fc 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -588,6 +588,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} icon = 'icons/obj/abductor.dmi' icon_state = "bed" no_icon_updates = 1 //no icon updates for this; it's static. + injected_reagents = list("corazone") /obj/structure/closet/abductor name = "alien locker" @@ -595,4 +596,4 @@ Congratulations! You are now trained for invasive xenobiology research!"} icon_state = "abductor" icon_closed = "abductor" icon_opened = "abductoropen" - material_drop = /obj/item/stack/sheet/mineral/abductor \ No newline at end of file + material_drop = /obj/item/stack/sheet/mineral/abductor diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm index 1c481e7c333..e98dd1de388 100644 --- a/code/game/gamemodes/miniantags/abduction/gland.dm +++ b/code/game/gamemodes/miniantags/abduction/gland.dm @@ -113,7 +113,7 @@ owner.set_species(species) /obj/item/organ/internal/heart/gland/ventcrawling - origin_tech = "materials=4;biotech=5;bluespace=3;abductor=3" + origin_tech = "materials=4;biotech=5;bluespace=4;abductor=3" cooldown_low = 1800 cooldown_high = 2400 uses = 1 @@ -134,10 +134,9 @@ to_chat(owner, "You feel sick.") var/virus_type = pick(/datum/disease/beesease, /datum/disease/brainrot, /datum/disease/magnitis) var/datum/disease/D = new virus_type() - D.carrier = 1 + D.carrier = TRUE owner.viruses += D D.affected_mob = owner - D.holder = owner owner.med_hud_set_status() @@ -181,21 +180,14 @@ uses = -1 /obj/item/organ/internal/heart/gland/bloody/activate() - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.drip(200) + owner.blood_volume -= 20 owner.visible_message("[owner]'s skin erupts with blood!",\ "Blood pours from your skin!") for(var/turf/T in oview(3,owner)) //Make this respect walls and such - T.add_blood_floor(owner) + owner.add_splatter_floor(T) for(var/mob/living/carbon/human/H in oview(3,owner)) //Blood decals for simple animals would be neat. aka Carp with blood on it. - if(H.wear_suit) - H.wear_suit.add_blood(owner) - H.update_inv_wear_suit(0) - else if(H.w_uniform) - H.w_uniform.add_blood(owner) - H.update_inv_w_uniform(0) + H.add_mob_blood(owner) /obj/item/organ/internal/heart/gland/bodysnatch cooldown_low = 600 @@ -211,8 +203,7 @@ C.Copy(owner) C.Start() owner.adjustBruteLoss(40) - var/turf/T = get_turf(owner) - T.add_blood_floor(src) + owner.add_splatter_floor() /obj/effect/cocoon/abductor name = "slimy cocoon" diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm index ea92b93f473..a98090d186a 100644 --- a/code/game/gamemodes/miniantags/borer/borer.dm +++ b/code/game/gamemodes/miniantags/borer/borer.dm @@ -68,7 +68,7 @@ icon_living = "brainslug" icon_dead = "brainslug_dead" speed = 5 - a_intent = I_HARM + a_intent = INTENT_HARM stop_automated_movement = 1 status_flags = CANPUSH attacktext = "nips" @@ -361,11 +361,6 @@ host = M forceMove(M) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - var/obj/item/organ/external/head = H.get_organ("head") - head.implants += src - host.status_flags |= PASSEMOTES RemoveBorerActions() @@ -746,11 +741,6 @@ controlling = FALSE - if(ishuman(host)) - var/mob/living/carbon/human/H = host - var/obj/item/organ/external/head = H.get_organ("head") - head.implants -= src - reset_perspective(null) machine = null diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index c6ea23c4bbc..680cb183e86 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -4,6 +4,7 @@ desc = "A currently unactivated swarmer. Swarmers can self activate at any time, it would be wise to immediately dispose of this." icon = 'icons/mob/swarmer.dmi' icon_state = "swarmer_unactivated" + origin_tech = "bluespace=4;materials=4;programming=7" /obj/item/unactivated_swarmer/New() notify_ghosts("An unactivated swarmer has been created in [get_area(src)]!", enter_link = "(Click to enter)", source = src, action = NOTIFY_ATTACK) diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm index 39acdabacc5..4825dea6ebb 100644 --- a/code/game/gamemodes/miniantags/guardian/guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/guardian.dm @@ -11,7 +11,7 @@ icon_living = "magicOrange" icon_dead = "magicOrange" speed = 0 - a_intent = I_HARM + a_intent = INTENT_HARM stop_automated_movement = 1 floating = 1 attack_sound = 'sound/weapons/punch1.ogg' @@ -218,7 +218,7 @@ //Fire. Low damage, low resistance, sets mobs on fire when bumping /mob/living/simple_animal/hostile/guardian/fire - a_intent = I_HELP + a_intent = INTENT_HELP melee_damage_lower = 10 melee_damage_upper = 10 attack_sound = 'sound/items/Welder.ogg' @@ -340,7 +340,7 @@ //Healer /mob/living/simple_animal/hostile/guardian/healer - a_intent = I_HARM + a_intent = INTENT_HARM friendly = "heals" speed = 0 melee_damage_lower = 15 @@ -362,7 +362,7 @@ icon_state = "seal" attacktext = "slaps" speak_emote = list("barks") - a_intent = I_HARM + a_intent = INTENT_HARM friendly = "heals" speed = 0 melee_damage_lower = 0 @@ -398,7 +398,7 @@ /mob/living/simple_animal/hostile/guardian/healer/ToggleMode() if(src.loc == summoner) if(toggle) - a_intent = I_HARM + a_intent = INTENT_HARM speed = 0 damage_transfer = 0.7 if(src.adminseal) @@ -408,7 +408,7 @@ to_chat(src, "You switch to combat mode.") toggle = FALSE else - a_intent = I_HELP + a_intent = INTENT_HELP speed = 1 damage_transfer = 1 if(src.adminseal) @@ -490,7 +490,7 @@ armour_penetration = 100 /mob/living/simple_animal/hostile/guardian/ranged - a_intent = I_HELP + a_intent = INTENT_HELP friendly = "quietly assesses" melee_damage_lower = 10 melee_damage_upper = 10 diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm index be21008d5f2..28ca711946a 100644 --- a/code/game/gamemodes/miniantags/morph/morph.dm +++ b/code/game/gamemodes/miniantags/morph/morph.dm @@ -11,7 +11,7 @@ icon_living = "morph" icon_dead = "morph_dead" speed = 2 - a_intent = "harm" + a_intent = INTENT_HARM stop_automated_movement = 1 status_flags = CANPUSH pass_flags = PASSTABLE @@ -168,4 +168,3 @@ eat(I) return target.attack_animal(src) - diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index 4a2a629c1d2..338484a5ebc 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -35,6 +35,7 @@ anchored = 1 mob_size = MOB_SIZE_TINY pass_flags = PASSTABLE | PASSGRILLE | PASSMOB + speed = 1 atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) var/essence = 75 //The resource of revenants. Max health is equal to three times this amount @@ -317,7 +318,7 @@ desc = "A pile of fine blue dust. Small tendrils of violet mist swirl around it." icon = 'icons/effects/effects.dmi' icon_state = "revenantEctoplasm" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL var/reforming = 1 var/essence = 75 //the maximum essence of the reforming revenant var/inert = 0 diff --git a/code/game/gamemodes/miniantags/slaughter/bloodcrawl.dm b/code/game/gamemodes/miniantags/slaughter/bloodcrawl.dm index 73165079b6e..a6b083d5b72 100644 --- a/code/game/gamemodes/miniantags/slaughter/bloodcrawl.dm +++ b/code/game/gamemodes/miniantags/slaughter/bloodcrawl.dm @@ -132,8 +132,7 @@ playsound(get_turf(src), 'sound/misc/exit_blood.ogg', 100, 1, -1) flick("jauntup",animation) - qdel(holder) - holder = null + QDEL_NULL(holder) if(iscarbon(src)) var/mob/living/carbon/C = src @@ -171,4 +170,4 @@ return /obj/effect/dummy/slaughter/singularity_act() - return \ No newline at end of file + return diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm index 62c3a9a00b0..25ebd7bc379 100644 --- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm +++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm @@ -14,7 +14,7 @@ icon_state = "daemon" icon_living = "daemon" speed = 1 - a_intent = I_HARM + a_intent = INTENT_HARM stop_automated_movement = 1 status_flags = CANPUSH attack_sound = 'sound/misc/demon_attack1.ogg' @@ -83,7 +83,7 @@ /mob/living/simple_animal/slaughter/Life() ..() if(boostThey've got no blood left to give.
    ") break if(H.stat < DEAD) - blood = min(20, H.vessel.get_reagent_amount("blood")) // if they have less than 20 blood, give them the remnant else they get 20 blood + blood = min(20, H.blood_volume) // if they have less than 20 blood, give them the remnant else they get 20 blood bloodtotal += blood / 2 //divide by 2 to counted the double suction since removing cloneloss -Melandor0 bloodusable += blood / 2 else - blood = min(5, H.vessel.get_reagent_amount("blood")) // The dead only give 5 bloods + blood = min(5, H.blood_volume) // The dead only give 5 bloods bloodtotal += blood if(old_bloodtotal != bloodtotal) to_chat(owner, "You have accumulated [bloodtotal] [bloodtotal > 1 ? "units" : "unit"] of blood[bloodusable != old_bloodusable ? ", and have [bloodusable] left to use" : ""].") check_vampire_upgrade() - H.vessel.remove_reagent("blood", 25) + H.blood_volume -= 25 if(ishuman(owner)) var/mob/living/carbon/human/V = owner V.nutrition = min(NUTRITION_LEVEL_WELL_FED, V.nutrition + (blood / 2)) @@ -338,8 +338,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha vampire_mind.current.create_attack_log("De-vampired") if(vampire_mind.vampire) vampire_mind.vampire.remove_vampire_powers() - qdel(vampire_mind.vampire) - vampire_mind.vampire = null + QDEL_NULL(vampire_mind.vampire) if(issilicon(vampire_mind.current)) to_chat(vampire_mind.current, "You have been turned into a robot! You can feel your powers fading away...") else @@ -455,6 +454,5 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha return static_inventory -= vampire_blood_display - qdel(vampire_blood_display) - vampire_blood_display = null + QDEL_NULL(vampire_blood_display) show_hud(hud_version) diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index 13f05048393..c66a0304316 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -215,7 +215,7 @@ stat_allowed = 1 /obj/effect/proc_holder/spell/vampire/mob_aoe/glare/cast(list/targets, mob/user = usr) - user.visible_message("[user]'s eyes emit a blinding flash!") + user.visible_message("[user]'s eyes emit a blinding flash!") if(istype(user:glasses, /obj/item/clothing/glasses/sunglasses/blindfold)) to_chat(user, "You're blindfolded!") return @@ -242,9 +242,9 @@ user.regenerate_icons() /obj/effect/proc_holder/spell/vampire/self/screech - name = "Chiroptean Screech (30)" + name = "Chiropteran Screech (30)" desc = "An extremely loud shriek that stuns nearby humans and breaks windows as well." - gain_desc = "You have gained the Chriopteran Screech ability which stuns anything with ears in a large radius and shatters glass in the process." + gain_desc = "You have gained the Chiropteran Screech ability which stuns anything with ears in a large radius and shatters glass in the process." action_icon_state = "vampire_screech" required_blood = 30 diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index d47610140ae..88251dcdd36 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -7,7 +7,7 @@ icon_state ="scroll2" throw_speed = 1 throw_range = 5 - w_class = 1 + w_class = WEIGHT_CLASS_TINY var/used = 0 @@ -119,7 +119,7 @@ item_state = "render" force = 15 throwforce = 10 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL hitsound = 'sound/weapons/bladeslice.ogg' var/charged = 1 var/spawn_type = /obj/singularity/narsie/wizard @@ -231,8 +231,7 @@ var/global/list/multiverse = list() force = 20 throwforce = 10 sharp = 1 - edge = 1 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") var/faction = list("unassigned") var/cooldown = 0 @@ -465,7 +464,7 @@ var/global/list/multiverse = list() if("cyborg") if(M.get_species() != "Machine") for(var/obj/item/organ/O in M.bodyparts) - O.robotize() + O.robotize(make_tough = 1) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses) M.equip_to_slot_or_del(sword, slot_r_hand) @@ -526,7 +525,7 @@ var/global/list/multiverse = list() M.equip_to_slot_or_del(sword, slot_r_hand) for(var/obj/item/carried_item in M.contents) if(!istype(carried_item, /obj/item/weapon/implant)) - carried_item.add_blood(M) + carried_item.add_mob_blood(M) if("pirate") M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform) @@ -616,7 +615,7 @@ var/global/list/multiverse = list() icon_state = "necrostone" item_state = "electronic" origin_tech = "bluespace=4;materials=4" - w_class = 1 + w_class = WEIGHT_CLASS_TINY var/list/spooky_scaries = list() var/unlimited = 0 var/heresy = 0 @@ -753,7 +752,7 @@ var/global/list/multiverse = list() icon_state = "nyacrostone" item_state = "electronic" origin_tech = "bluespace=4;materials=4" - w_class = 1 + w_class = WEIGHT_CLASS_TINY heresy = 1 unlimited = 1 @@ -780,7 +779,7 @@ var/global/list/multiverse = list() to_chat(target, "You suddenly feel very hot") target.bodytemperature += 50 GiveHint(target) - else if(can_puncture(I)) + else if(is_pointed(I)) to_chat(target, "You feel a stabbing pain in [parse_zone(user.zone_sel.selecting)]!") target.Weaken(2) GiveHint(target) @@ -793,7 +792,7 @@ var/global/list/multiverse = list() return if(!link) - if(I.loc == user && istype(I) && I.w_class <= 2) + if(I.loc == user && istype(I) && I.w_class <= WEIGHT_CLASS_SMALL) user.drop_item() I.loc = src link = I diff --git a/code/game/gamemodes/wizard/godhand.dm b/code/game/gamemodes/wizard/godhand.dm index 55afe36f1d2..95d804179cd 100644 --- a/code/game/gamemodes/wizard/godhand.dm +++ b/code/game/gamemodes/wizard/godhand.dm @@ -8,7 +8,7 @@ icon_state = "syndballoon" item_state = null flags = ABSTRACT | NODROP - w_class = 5 + w_class = WEIGHT_CLASS_HUGE force = 0 throwforce = 0 throw_range = 0 diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index 7fcd9c198b4..b416b297cca 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -4,15 +4,18 @@ icon_state = "soulstone" item_state = "electronic" desc = "A fragment of the legendary treasure known simply as the 'Soul Stone'. The shard still flickers with a fraction of the full artifact's power." - w_class = 1 + w_class = WEIGHT_CLASS_TINY slot_flags = SLOT_BELT - origin_tech = "bluespace=4;materials=4" + origin_tech = "bluespace=4;materials=5" var/imprinted = "empty" + var/optional = FALSE //does this soulstone ask the victim whether they want to be turned into a shade var/usability = TRUE // Can this soul stone be used by anyone, or only cultists/wizards? var/reusable = TRUE // Can this soul stone be used more than once? var/spent = FALSE // If the soul stone can only be used once, has it been used? + var/opt_in = FALSE // for tracking during the 'optional' bit + /obj/item/device/soulstone/proc/can_use(mob/living/user) if(iscultist(user) || iswizard(user) || usability) return TRUE @@ -33,6 +36,7 @@ /obj/item/device/soulstone/anybody/chaplain name = "mysterious old shard" reusable = FALSE + optional = TRUE /obj/item/device/soulstone/pickup(mob/living/user) ..() @@ -69,6 +73,50 @@ M.create_attack_log("Has had their soul captured with [src.name] by [key_name(user)]") user.create_attack_log("Used the [src.name] to capture the soul of [key_name(M)]") + if(optional) + if(!M.ckey) + to_chat(user, "They have no soul!") + return + + to_chat(user, "You attempt to channel [M]'s soul into [src]. You must give the soul some time to react and stand still...") + + var/mob/player_mob = M + if(M.get_ghost())//in case our player ghosted and we need to throw the alert at their ghost instead + player_mob = M.get_ghost() + var/client/player_client = player_mob.client + to_chat(player_mob, "[user] is trying to capture your soul into [src]! Click the button in the top right of the game window to respond.") + player_client << 'sound/misc/notice2.ogg' + window_flash(player_client) + + var/obj/screen/alert/notify_soulstone/A = player_mob.throw_alert("\ref[src]_soulstone_thingy", /obj/screen/alert/notify_soulstone) + if(player_client.prefs && player_client.prefs.UI_style) + A.icon = ui_style2icon(player_client.prefs.UI_style) + + //pass the stuff to the alert itself + A.stone = src + A.stoner = user.real_name + + //layer shenanigans to make the alert display the soulstone + var/old_layer = layer + var/old_plane = plane + layer = FLOAT_LAYER + plane = FLOAT_PLANE + A.overlays += src + layer = old_layer + plane = old_plane + + //give the victim 10 seconds to respond + sleep(10 SECONDS) + + if(!opt_in) + to_chat(user, "The soul resists your attempts at capturing it!") + return + + opt_in = FALSE + + if(spent)//checking one more time against shenanigans + return + M.create_attack_log("Has had their soul captured with [src.name] by [key_name(user)]") user.create_attack_log("Used the [src.name] to capture the soul of [key_name(M)]") log_attack("[key_name(user)] used the [src.name] to capture the soul of [key_name(M)]") @@ -347,4 +395,4 @@ T.unEquip(W) init_shade(T, U) qdel(T) - return 1 \ No newline at end of file + return 1 diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 65843d0e0fc..c97b3ac9445 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -78,8 +78,7 @@ if(initial(S.name) == initial(aspell.name)) spell_levels = aspell.spell_level user.mind.spell_list.Remove(aspell) - qdel(S) - S = null + QDEL_NULL(S) return cost * (spell_levels+1) return -1 @@ -497,7 +496,7 @@ icon_state ="book" throw_speed = 2 throw_range = 5 - w_class = 1 + w_class = WEIGHT_CLASS_TINY var/uses = 10 var/temp = null var/op = 1 @@ -863,4 +862,4 @@ spell = /obj/effect/proc_holder/spell/targeted/sacred_flame spellname = "sacred flame" icon_state ="booksacredflame" - desc = "Become one with the flames that burn within... and invite others to do so as well." \ No newline at end of file + desc = "Become one with the flames that burn within... and invite others to do so as well." diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index 40b1dfd8bd1..4535e1c6c41 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -5,6 +5,7 @@ total_positions = -1 spawn_positions = -1 supervisors = "the head of personnel" + department_head = list("Head of Personnel") selection_color = "#dddddd" access = list() //See /datum/job/assistant/get_access() minimal_access = list() //See /datum/job/assistant/get_access() diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index 8d3c4d65165..ce410dea69e 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -6,6 +6,7 @@ spawn_positions = 1 is_engineering = 1 supervisors = "the captain" + department_head = list("Captain") selection_color = "#ffeeaa" req_admin_notify = 1 access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, @@ -52,6 +53,7 @@ spawn_positions = 5 is_engineering = 1 supervisors = "the chief engineer" + department_head = list("Chief Engineer") selection_color = "#fff5cc" access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics, access_mineral_storeroom) minimal_access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_mineral_storeroom) @@ -89,6 +91,7 @@ spawn_positions = 2 is_engineering = 1 supervisors = "the chief engineer" + department_head = list("Chief Engineer") selection_color = "#fff5cc" access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics, access_mineral_storeroom) minimal_access = list(access_eva, access_atmospherics, access_maint_tunnels, access_external_airlocks, access_emergency_storage, access_construction, access_mineral_storeroom) @@ -109,6 +112,9 @@ id = /obj/item/weapon/card/id/engineering pda = /obj/item/device/pda/atmos + backpack = /obj/item/weapon/storage/backpack/industrial + satchel = /obj/item/weapon/storage/backpack/satchel_eng + dufflebag = /obj/item/weapon/storage/backpack/duffel/engineering box = /obj/item/weapon/storage/box/engineer /datum/job/mechanic @@ -119,6 +125,7 @@ spawn_positions = 1 is_engineering = 1 supervisors = "the chief engineer" + department_head = list("Chief Engineer") selection_color = "#fff5cc" access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_mechanic, access_external_airlocks, access_mineral_storeroom) minimal_access = list(access_maint_tunnels, access_emergency_storage, access_mechanic, access_external_airlocks, access_mineral_storeroom) diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index ec9b8776f80..c8e7d9e2433 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -10,6 +10,7 @@ //Bitflags for the job var/flag = 0 var/department_flag = 0 + var/department_head = list() //Players will be allowed to spawn in as jobs that are set to "Station" var/list/faction = list("Station") @@ -205,15 +206,15 @@ var/atom/placed_in = H.equip_or_collect(G.spawn_item(null, H.client.prefs.gear[G.display_name])) if(istype(placed_in)) if(isturf(placed_in)) - to_chat(H, "Placing \the [G] on [placed_in]!") + to_chat(H, "Placing [G.display_name] on [placed_in]!") else - to_chat(H, "Placing \the [G] in [placed_in.name]]") + to_chat(H, "Placing [G.display_name] in [placed_in.name]") continue if(H.equip_to_appropriate_slot(G)) - to_chat(H, "Placing \the [G] in your inventory!") + to_chat(H, "Placing [G.display_name] in your inventory!") continue if(H.put_in_hands(G)) - to_chat(H, "Placing \the [G] in your hands!") + to_chat(H, "Placing [G.display_name] in your hands!") continue to_chat(H, "Failed to locate a storage object on your mob, either you spawned with no hands free and no backpack or this is a bug.") qdel(G) diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index a240618aa34..218172b1884 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -6,6 +6,7 @@ spawn_positions = 1 is_medical = 1 supervisors = "the captain" + department_head = list("Captain") selection_color = "#ffddf0" req_admin_notify = 1 access = list(access_medical, access_morgue, access_genetics, access_heads, @@ -47,10 +48,11 @@ spawn_positions = 3 is_medical = 1 supervisors = "the chief medical officer" + department_head = list("Chief Medical Officer") selection_color = "#ffeef0" access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_mineral_storeroom) minimal_access = list(access_medical, access_morgue, access_surgery, access_maint_tunnels) - alt_titles = list("Surgeon","Nurse","Coroner") + alt_titles = list("Surgeon","Nurse") minimal_player_age = 3 exp_requirements = 180 exp_type = EXP_TYPE_CREW @@ -73,19 +75,50 @@ satchel = /obj/item/weapon/storage/backpack/satchel_med dufflebag = /obj/item/weapon/storage/backpack/duffel/medical +/datum/job/coroner + title = "Coroner" + flag = CORONER + department_flag = MEDSCI + total_positions = 1 + spawn_positions = 1 + is_medical = 1 + supervisors = "the chief medical officer" + department_head = list("Chief Medical Officer") + selection_color = "#ffeef0" + access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_mineral_storeroom) + minimal_access = list(access_medical, access_morgue, access_maint_tunnels) + minimal_player_age = 3 + exp_requirements = 180 + exp_type = EXP_TYPE_CREW + outfit = /datum/outfit/job/coroner + +/datum/outfit/job/coroner + name = "Coroner" + jobtype = /datum/job/coroner + + uniform = /obj/item/clothing/under/rank/medical/mortician + suit = /obj/item/clothing/suit/storage/labcoat/mortician + shoes = /obj/item/clothing/shoes/white + l_ear = /obj/item/device/radio/headset/headset_med + id = /obj/item/weapon/card/id/medical + suit_store = /obj/item/device/flashlight/pen + l_hand = /obj/item/weapon/clipboard + pda = /obj/item/device/pda/medical + + backpack = /obj/item/weapon/storage/backpack/medic + satchel = /obj/item/weapon/storage/backpack/satchel_med + dufflebag = /obj/item/weapon/storage/backpack/duffel/medical + + backpack_contents = list( + /obj/item/clothing/head/surgery/black = 1, + /obj/item/weapon/autopsy_scanner = 1, + /obj/item/device/mass_spectrometer = 1, + /obj/item/weapon/storage/box/bodybags = 1) + /datum/outfit/job/doctor/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) . = ..() if(H.mind.role_alt_title) switch(H.mind.role_alt_title) - if("Coroner") - uniform = /obj/item/clothing/under/rank/medical/mortician - suit = /obj/item/clothing/suit/storage/labcoat/mortician - backpack_contents = list( - /obj/item/clothing/head/surgery/black = 1, - /obj/item/weapon/autopsy_scanner = 1, - /obj/item/device/mass_spectrometer = 1, - /obj/item/weapon/storage/box/bodybags = 1 - ) if("Surgeon") uniform = /obj/item/clothing/under/rank/medical/blue head = /obj/item/clothing/head/surgery/blue @@ -112,6 +145,7 @@ spawn_positions = 2 is_medical = 1 supervisors = "the chief medical officer" + department_head = list("Chief Medical Officer") selection_color = "#ffeef0" access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_mineral_storeroom) minimal_access = list(access_medical, access_chemistry, access_maint_tunnels, access_mineral_storeroom) @@ -145,6 +179,7 @@ spawn_positions = 2 is_medical = 1 supervisors = "the chief medical officer and the research director" + department_head = list("Chief Medical Officer", "Research Director") selection_color = "#ffeef0" access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_research, access_mineral_storeroom) minimal_access = list(access_medical, access_morgue, access_genetics, access_research, access_maint_tunnels) @@ -178,6 +213,7 @@ spawn_positions = 1 is_medical = 1 supervisors = "the chief medical officer" + department_head = list("Chief Medical Officer") selection_color = "#ffeef0" access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics) minimal_access = list(access_medical, access_virology, access_maint_tunnels, access_mineral_storeroom) @@ -212,6 +248,7 @@ spawn_positions = 1 is_medical = 1 supervisors = "the chief medical officer" + department_head = list("Chief Medical Officer") selection_color = "#ffeef0" access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_psychiatrist) minimal_access = list(access_medical, access_psychiatrist, access_maint_tunnels) @@ -249,6 +286,7 @@ spawn_positions = 1 is_medical = 1 supervisors = "the chief medical officer" + department_head = list("Chief Medical Officer") selection_color = "#ffeef0" access = list(access_paramedic, access_medical, access_maint_tunnels, access_external_airlocks, access_morgue) minimal_access=list(access_paramedic, access_medical, access_maint_tunnels, access_external_airlocks, access_morgue) diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index bfab5c736ec..cfccd0be21f 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -6,6 +6,7 @@ spawn_positions = 1 is_science = 1 supervisors = "the captain" + department_head = list("Captain") selection_color = "#ffddff" req_admin_notify = 1 access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue, @@ -55,6 +56,7 @@ spawn_positions = 6 is_science = 1 supervisors = "the research director" + department_head = list("Research Director") selection_color = "#ffeeff" access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch, access_mineral_storeroom) minimal_access = list(access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch, access_maint_tunnels, access_mineral_storeroom) @@ -93,6 +95,7 @@ spawn_positions = 2 is_science = 1 supervisors = "the research director" + department_head = list("Research Director") selection_color = "#ffeeff" access = list(access_robotics, access_tox, access_tox_storage, access_tech_storage, access_morgue, access_research, access_mineral_storeroom) //As a job that handles so many corpses, it makes sense for them to have morgue access. minimal_access = list(access_robotics, access_tech_storage, access_morgue, access_research, access_maint_tunnels, access_mineral_storeroom) //As a job that handles so many corpses, it makes sense for them to have morgue access. diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 37f2974ddc2..326f4ee85b6 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -6,6 +6,7 @@ spawn_positions = 1 is_security = 1 supervisors = "the captain" + department_head = list("Captain") selection_color = "#ffdddd" req_admin_notify = 1 access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, @@ -56,6 +57,7 @@ spawn_positions = 1 is_security = 1 supervisors = "the head of security" + department_head = list("Head of Security") selection_color = "#ffeeee" access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_morgue, access_weapons) minimal_access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_weapons) @@ -99,6 +101,7 @@ spawn_positions = 1 is_security = 1 supervisors = "the head of security" + department_head = list("Head of Security") selection_color = "#ffeeee" alt_titles = list("Forensic Technician") access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court, access_weapons) @@ -157,6 +160,7 @@ spawn_positions = 7 is_security = 1 supervisors = "the head of security" + department_head = list("Head of Security") selection_color = "#ffeeee" access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_morgue, access_weapons) minimal_access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_weapons) @@ -199,6 +203,7 @@ spawn_positions = 1 is_security = 1 supervisors = "the head of security" + department_head = list("Head of Security") selection_color = "#ffeeee" access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics) minimal_access = list(access_medical, access_morgue, access_surgery, access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels) @@ -234,6 +239,7 @@ spawn_positions = 1 is_security = 1 supervisors = "the head of security" + department_head = list("Head of Security") selection_color = "#ffeeee" access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_morgue, access_weapons, access_pilot, access_external_airlocks) minimal_access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_weapons, access_pilot, access_external_airlocks) diff --git a/code/game/jobs/job/silicon.dm b/code/game/jobs/job/silicon.dm index 1b092087997..0def40bc7b1 100644 --- a/code/game/jobs/job/silicon.dm +++ b/code/game/jobs/job/silicon.dm @@ -6,6 +6,7 @@ spawn_positions = 1 selection_color = "#ccffcc" supervisors = "your laws" + department_head = list("Captain") req_admin_notify = 1 minimal_player_age = 30 exp_requirements = 1200 @@ -26,6 +27,7 @@ total_positions = 1 spawn_positions = 1 supervisors = "your laws and the AI" //Nodrak + department_head = list("AI") selection_color = "#ddffdd" minimal_player_age = 21 exp_requirements = 300 diff --git a/code/game/jobs/job/supervisor.dm b/code/game/jobs/job/supervisor.dm index 3cd236881c5..f82b4cd00d4 100644 --- a/code/game/jobs/job/supervisor.dm +++ b/code/game/jobs/job/supervisor.dm @@ -6,6 +6,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0) total_positions = 1 spawn_positions = 1 supervisors = "Nanotrasen officials" + department_head = list("Nanotrasen Navy Officer") selection_color = "#ccccff" req_admin_notify = 1 is_command = 1 @@ -64,6 +65,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0) total_positions = 1 spawn_positions = 1 supervisors = "the captain" + department_head = list("Captain") selection_color = "#ddddff" req_admin_notify = 1 is_command = 1 @@ -111,6 +113,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0) total_positions = 1 spawn_positions = 1 supervisors = "the command staff" + department_head = list("Captain") selection_color = "#ddddff" req_admin_notify = 1 is_command = 1 @@ -156,6 +159,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0) total_positions = 1 spawn_positions = 1 supervisors = "the Nanotrasen representative" + department_head = list("Captain") selection_color = "#ddddff" req_admin_notify = 1 is_command = 1 @@ -202,6 +206,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0) total_positions = 1 spawn_positions = 1 supervisors = "the Nanotrasen Supreme Court" + department_head = list("Captain") selection_color = "#ddddff" req_admin_notify = 1 is_legal = 1 @@ -250,6 +255,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0) spawn_positions = 2 is_legal = 1 supervisors = "the magistrate" + department_head = list("Captain") selection_color = "#ddddff" access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels) minimal_access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels) diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm index b7d6b448895..60f1bd541a8 100644 --- a/code/game/jobs/job/support.dm +++ b/code/game/jobs/job/support.dm @@ -7,6 +7,7 @@ spawn_positions = 1 is_service = 1 supervisors = "the head of personnel" + department_head = list("Head of Personnel") selection_color = "#dddddd" access = list(access_hydroponics, access_bar, access_kitchen, access_morgue, access_weapons, access_mineral_storeroom) minimal_access = list(access_bar, access_maint_tunnels, access_weapons, access_mineral_storeroom) @@ -46,6 +47,7 @@ spawn_positions = 1 is_service = 1 supervisors = "the head of personnel" + department_head = list("Head of Personnel") selection_color = "#dddddd" access = list(access_hydroponics, access_bar, access_kitchen, access_morgue) minimal_access = list(access_kitchen, access_maint_tunnels) @@ -73,6 +75,7 @@ spawn_positions = 2 is_service = 1 supervisors = "the head of personnel" + department_head = list("Head of Personnel") selection_color = "#dddddd" access = list(access_hydroponics, access_bar, access_kitchen, access_morgue) minimal_access = list(access_hydroponics, access_morgue, access_maint_tunnels) @@ -106,6 +109,7 @@ spawn_positions = 1 is_supply = 1 supervisors = "the head of personnel" + department_head = list("Head of Personnel") selection_color = "#dddddd" access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station, access_mineral_storeroom) minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station, access_mineral_storeroom) @@ -133,6 +137,7 @@ spawn_positions = 2 is_supply = 1 supervisors = "the quartermaster" + department_head = list("Head of Personnel") selection_color = "#dddddd" access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station, access_mineral_storeroom) minimal_access = list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting, access_mineral_storeroom) @@ -158,6 +163,7 @@ spawn_positions = 3 is_supply = 1 supervisors = "the quartermaster" + department_head = list("Head of Personnel") selection_color = "#dddddd" access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station, access_mineral_storeroom) minimal_access = list(access_mining, access_mint, access_mining_station, access_mailsorting, access_maint_tunnels, access_mineral_storeroom) @@ -196,6 +202,7 @@ spawn_positions = 1 is_service = 1 supervisors = "the head of personnel" + department_head = list("Head of Personnel") selection_color = "#dddddd" access = list(access_clown, access_theatre, access_maint_tunnels) minimal_access = list(access_clown, access_theatre, access_maint_tunnels) @@ -252,6 +259,7 @@ spawn_positions = 1 is_service = 1 supervisors = "the head of personnel" + department_head = list("Head of Personnel") selection_color = "#dddddd" access = list(access_mime, access_theatre, access_maint_tunnels) minimal_access = list(access_mime, access_theatre, access_maint_tunnels) @@ -303,6 +311,7 @@ spawn_positions = 1 is_service = 1 supervisors = "the head of personnel" + department_head = list("Head of Personnel") selection_color = "#dddddd" access = list(access_janitor, access_maint_tunnels) minimal_access = list(access_janitor, access_maint_tunnels) @@ -328,6 +337,7 @@ spawn_positions = 1 is_service = 1 supervisors = "the head of personnel" + department_head = list("Head of Personnel") selection_color = "#dddddd" access = list(access_library, access_maint_tunnels) minimal_access = list(access_library, access_maint_tunnels) @@ -354,6 +364,7 @@ spawn_positions = 1 is_service = 1 supervisors = "the head of personnel" + department_head = list("Head of Personnel") selection_color = "#dddddd" alt_titles = list("Hair Stylist","Beautician") access = list(access_maint_tunnels) diff --git a/code/game/jobs/job/support_chaplain.dm b/code/game/jobs/job/support_chaplain.dm index 8ff51148b9f..17cc36bb059 100644 --- a/code/game/jobs/job/support_chaplain.dm +++ b/code/game/jobs/job/support_chaplain.dm @@ -7,6 +7,7 @@ spawn_positions = 1 is_service = 1 supervisors = "the head of personnel" + department_head = list("Head of Personnel") selection_color = "#dddddd" access = list(access_morgue, access_chapel_office, access_crematorium, access_maint_tunnels) minimal_access = list(access_morgue, access_chapel_office, access_crematorium, access_maint_tunnels) diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 433b2adfb27..7179c5340cf 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -10,11 +10,13 @@ var/global/datum/controller/occupations/job_master var/list/occupations = list() var/list/name_occupations = list() //Dict of all jobs, keys are titles var/list/type_occupations = list() //Dict of all jobs, keys are types + var/list/prioritized_jobs = list() // List of jobs set to priority by HoP/Captain //Players who need jobs var/list/unassigned = list() //Debug info var/list/job_debug = list() + /datum/controller/occupations/proc/SetupOccupations(var/list/faction = list("Station")) occupations = list() @@ -580,7 +582,7 @@ var/global/datum/controller/occupations/job_master H.mind.store_memory(remembered_info) // If they're head, give them the account info for their department - if(job.head_position) + if(job && job.head_position) remembered_info = "" var/datum/money_account/department_account = department_accounts[job.department] diff --git a/code/game/jobs/job_exp.dm b/code/game/jobs/job_exp.dm index c9ce95a86a9..3c17c6f0107 100644 --- a/code/game/jobs/job_exp.dm +++ b/code/game/jobs/job_exp.dm @@ -1,3 +1,41 @@ +// Playtime requirements for special roles (hours) + +var/global/list/role_playtime_requirements = list( + // CREW-FRIENDLY ROLES + ROLE_PAI = 0, + ROLE_POSIBRAIN = 5, // Same as cyborg job. + ROLE_SENTIENT = 5, + ROLE_ERT = 10, // High, because they're team-based, and we want ERT to be robust + ROLE_TRADER = 5, + ROLE_DRONE = 10, // High, because they're like mini engineering cyborgs that can ignore the AI, ventcrawl, and respawn themselves + + // SOLO ANTAGS + ROLE_TRAITOR = 3, + ROLE_CHANGELING = 3, + ROLE_WIZARD = 3, + ROLE_VAMPIRE = 3, + ROLE_BLOB = 3, + ROLE_REVENANT = 3, + ROLE_BORER = 3, + ROLE_NINJA = 3, + ROLE_MORPH = 3, + ROLE_DEMON = 3, + + // DUO ANTAGS + ROLE_GUARDIAN = 5, + ROLE_GSPIDER = 5, + + // TEAM ANTAGS + // Higher numbers here, because they require more experience to be played correctly + ROLE_SHADOWLING = 10, + ROLE_REV = 10, + ROLE_OPERATIVE = 10, + ROLE_CULTIST = 10, + ROLE_RAIDER = 10, + ROLE_ALIEN = 10, + ROLE_ABDUCTOR = 10, +) + // Admin Verbs /client/proc/cmd_mentor_check_player_exp() //Allows admins to determine who the newer players are. @@ -53,6 +91,27 @@ // Procs +/proc/role_available_in_playtime(client/C, role) + if(!C) + return 0 + if(!role) + return 0 + if(!config.use_exp_restrictions) + return 0 + if(config.use_exp_restrictions_admin_bypass && check_rights(R_ADMIN, 0, C.mob)) + return 0 + var/list/play_records = params2list(C.prefs.exp) + var/isexempt = text2num(play_records[EXP_TYPE_EXEMPT]) + if(isexempt) + return 0 + var/minimal_player_hrs = role_playtime_requirements[role] + if(!minimal_player_hrs) + return 0 + var/req_mins = minimal_player_hrs * 60 + var/my_exp = text2num(play_records[EXP_TYPE_CREW]) + if(!isnum(my_exp)) + return req_mins + return max(0, req_mins - my_exp) /datum/job/proc/available_in_playtime(client/C) if(!C) diff --git a/code/game/jobs/jobs.dm b/code/game/jobs/jobs.dm index 73f5cc2e5b0..a9aa142ac1d 100644 --- a/code/game/jobs/jobs.dm +++ b/code/game/jobs/jobs.dm @@ -25,6 +25,7 @@ var/const/VIROLOGIST =(1<<6) var/const/PSYCHIATRIST =(1<<7) var/const/ROBOTICIST =(1<<8) var/const/PARAMEDIC =(1<<9) +var/const/CORONER =(1<<10) var/const/SUPPORT =(1<<2) @@ -84,7 +85,8 @@ var/list/medical_positions = list( "Psychiatrist", "Chemist", "Virologist", - "Paramedic" + "Paramedic", + "Coroner" ) diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index 6a5253b599c..4b332b94543 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -14,6 +14,7 @@ var/obj/machinery/computer/operating/computer = null buckle_lying = 90 var/no_icon_updates = 0 //set this to 1 if you don't want the icons ever changing + var/list/injected_reagents = list() /obj/machinery/optable/New() ..() @@ -97,8 +98,18 @@ icon_state = "table2-idle" return 0 +/obj/machinery/optable/Crossed(atom/movable/AM) + . = ..() + if(iscarbon(AM) && LAZYLEN(injected_reagents)) + to_chat(AM, "You feel a series of tiny pricks!") + /obj/machinery/optable/process() check_victim() + if(LAZYLEN(injected_reagents)) + for(var/mob/living/carbon/C in get_turf(src)) + for(var/chemical in injected_reagents) + if(C.reagents.get_reagent_amount(chemical) < 1) + C.reagents.add_reagent(chemical, 1) /obj/machinery/optable/proc/take_victim(mob/living/carbon/C, mob/living/carbon/user as mob) if(C == user) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index f74380432d2..5bd5b69d9dd 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -97,10 +97,10 @@ return if(beaker.reagents.total_volume < beaker.reagents.maximum_volume) - src.occupant.vessel.trans_to(beaker, 1) + src.occupant.transfer_blood_to(beaker, 1) for(var/datum/reagent/x in src.occupant.reagents.reagent_list) src.occupant.reagents.trans_to(beaker, 3) - src.occupant.vessel.trans_to(beaker, 1) + src.occupant.transfer_blood_to(beaker, 1) if(occupant) for(var/A in occupant.reagents.addiction_list) @@ -197,13 +197,12 @@ crisis = (occupant.health < min_health) // I'm not sure WHY you'd want to put a simple_animal in a sleeper, but precedent is precedent // Runtime is aptly named, isn't she? - if(ishuman(occupant) && occupant.vessel && !(occupant.species && occupant.species.flags & NO_BLOOD)) - var/blood_type = occupant.get_blood_name() + if(ishuman(occupant) && !(occupant.species && occupant.species.flags & NO_BLOOD)) occupantData["pulse"] = occupant.get_pulse(GETPULSE_TOOL) occupantData["hasBlood"] = 1 - occupantData["bloodLevel"] = round(occupant.vessel.get_reagent_amount(blood_type)) + occupantData["bloodLevel"] = round(occupant.blood_volume) occupantData["bloodMax"] = occupant.max_blood - occupantData["bloodPercent"] = round(100*(occupant.vessel.get_reagent_amount(blood_type)/occupant.max_blood), 0.01) + occupantData["bloodPercent"] = round(100*(occupant.blood_volume/occupant.max_blood), 0.01) data["occupant"] = occupantData data["maxchem"] = max_chem diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 41dc37ab43f..c97836990d1 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -345,7 +345,14 @@ occupantData["health"] = H.health occupantData["maxHealth"] = H.maxHealth - occupantData["hasVirus"] = H.viruses.len + var/found_disease = FALSE + for(var/thing in H.viruses) + var/datum/disease/D = thing + if(D.visibility_flags & HIDDEN_SCANNER || D.visibility_flags & HIDDEN_PANDEMIC) + continue + found_disease = TRUE + break + occupantData["hasVirus"] = found_disease occupantData["bruteLoss"] = H.getBruteLoss() occupantData["oxyLoss"] = H.getOxyLoss() @@ -364,14 +371,12 @@ var/bloodData[0] bloodData["hasBlood"] = 0 - if(ishuman(H) && H.vessel && !(H.species && H.species.flags & NO_BLOOD)) - var/blood_type = H.get_blood_name() - var/blood_volume = round(H.vessel.get_reagent_amount(blood_type)) + if(ishuman(H) && !(H.species && H.species.flags & NO_BLOOD)) bloodData["hasBlood"] = 1 - bloodData["volume"] = blood_volume - bloodData["percent"] = round(((blood_volume / BLOOD_VOLUME_NORMAL)*100)) + bloodData["volume"] = H.blood_volume + bloodData["percent"] = round(((H.blood_volume / BLOOD_VOLUME_NORMAL)*100)) bloodData["pulse"] = H.get_pulse(GETPULSE_TOOL) - bloodData["bloodLevel"] = blood_volume + bloodData["bloodLevel"] = H.blood_volume bloodData["bloodMax"] = H.max_blood occupantData["blood"] = bloodData @@ -398,7 +403,7 @@ organData["broken"] = E.min_broken_damage var/shrapnelData[0] - for(var/obj/I in E.implants) + for(var/obj/I in E.embedded_objects) var/shrapnelSubData[0] shrapnelSubData["name"] = I.name @@ -499,8 +504,15 @@ t1 = "*dead*" dat += "[occupant.health > 50 ? "" : ""]\tHealth %: [occupant.health], ([t1])
    " - if(occupant.viruses.len) - dat += "Viral pathogen detected in blood stream.
    " + var/found_disease = FALSE + for(var/thing in occupant.viruses) + var/datum/disease/D = thing + if(D.visibility_flags & HIDDEN_SCANNER || D.visibility_flags & HIDDEN_PANDEMIC) + continue + found_disease = TRUE + break + if(found_disease) + dat += "Disease detected in occupant.
    " var/extra_font = null extra_font = (occupant.getBruteLoss() < 60 ? "" : "") @@ -532,14 +544,11 @@ if(occupant.has_brain_worms()) dat += "Large growth detected in frontal lobe, possibly cancerous. Surgical removal is recommended.
    " - if(occupant.vessel) - var/blood_type = occupant.get_blood_name() - var/blood_volume = round(occupant.vessel.get_reagent_amount(blood_type)) - var/blood_percent = blood_volume / BLOOD_VOLUME_NORMAL - blood_percent *= 100 + var/blood_percent = round((occupant.blood_volume / BLOOD_VOLUME_NORMAL)) + blood_percent *= 100 - extra_font = (blood_volume > 448 ? "" : "") - dat += "[extra_font]\tBlood Level %: [blood_percent] ([blood_volume] units)
    " + extra_font = (occupant.blood_volume > 448 ? "" : "") + dat += "[extra_font]\tBlood Level %: [blood_percent] ([occupant.blood_volume] units)
    " if(occupant.reagents) dat += "Epinephrine units: [occupant.reagents.get_reagent_amount("Epinephrine")] units
    " @@ -605,7 +614,7 @@ infected = "Septic:" var/unknown_body = 0 - for(var/I in e.implants) + for(var/I in e.embedded_objects) unknown_body++ if(unknown_body || e.hidden) diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index 4d059043329..63aeee28b2f 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -5,12 +5,12 @@ layer = 3 anchored = 1.0 var/uses = 20 - var/disabled = 1 + var/disabled = TRUE var/lethal = 0 - var/locked = 1 + var/locked = TRUE var/cooldown_time = 0 var/cooldown_timeleft = 0 - var/cooldown_on = 0 + var/cooldown_on = FALSE req_access = list(access_ai_upload) /obj/machinery/ai_slipper/power_change() @@ -22,6 +22,7 @@ else icon_state = "motion0" stat |= NOPOWER + disabled = TRUE /obj/machinery/ai_slipper/proc/setState(var/enabled, var/uses) disabled = disabled @@ -49,6 +50,24 @@ return return +/obj/machinery/ai_slipper/proc/ToggleOn() + if(stat & (NOPOWER|BROKEN)) + return + disabled = !disabled + icon_state = disabled? "motion0":"motion3" + +/obj/machinery/ai_slipper/proc/Activate() + if(stat & (NOPOWER|BROKEN)) + return + if(cooldown_on || disabled) + return + else + new /obj/structure/foam(loc) + uses-- + cooldown_on = TRUE + cooldown_time = world.timeofday + 100 + slip_process() + /obj/machinery/ai_slipper/attack_ai(mob/user) return attack_hand(user) @@ -87,18 +106,10 @@ return 1 if(href_list["toggleOn"]) - disabled = !disabled - icon_state = disabled? "motion0":"motion3" + ToggleOn() + if(href_list["toggleUse"]) - if(cooldown_on || disabled) - return - else - new /obj/structure/foam(loc) - uses-- - cooldown_on = 1 - cooldown_time = world.timeofday + 100 - slip_process() - return + Activate() attack_hand(usr) @@ -115,5 +126,5 @@ if(uses <= 0) return if(uses >= 0) - cooldown_on = 0 + cooldown_on = FALSE power_change() \ No newline at end of file diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index b5612389def..b7c7961e5de 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -1070,7 +1070,8 @@ Just an object used in constructing air alarms icon = 'icons/obj/doors/door_assembly.dmi' icon_state = "door_electronics" desc = "Looks like a circuit. Probably is." - w_class = 2 + w_class = WEIGHT_CLASS_SMALL materials = list(MAT_METAL=50, MAT_GLASS=50) + origin_tech = "engineering=2;programming=1" toolspeed = 1 usesound = 'sound/items/Deconstruct.ogg' diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index 7c888aa2a3d..a8d16939944 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -3,7 +3,7 @@ desc = "A pre-fabricated security camera kit, ready to be assembled and mounted to a surface." icon = 'icons/obj/monitors.dmi' icon_state = "cameracase" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL anchored = 0 materials = list(MAT_METAL=400, MAT_GLASS=250) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index b3957234d01..b85fb249c2e 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -5,6 +5,9 @@ #define CLONE_BIOMASS 150 #define BIOMASS_MEAT_AMOUNT 50 +#define MINIMUM_HEAL_LEVEL 40 +#define CLONE_INITIAL_DAMAGE 190 +#define BRAIN_INITIAL_DAMAGE 90 // our minds are too feeble for 190 /obj/machinery/clonepod anchored = 1 @@ -15,12 +18,10 @@ icon_state = "pod_0" req_access = list(access_genetics) //For premature unlocking. var/mob/living/carbon/human/occupant - var/heal_level = 90 //The clone is released once its health reaches this level. - var/locked = 0 + var/heal_level //The clone is released once its health reaches this level. var/obj/machinery/computer/cloning/connected = null //So we remember the connected clone machine. var/mess = 0 //Need to clean out it if it's full of exploded clone. var/attempting = 0 //One clone attempt at a time thanks - var/eject_wait = 0 //Don't eject them as soon as they are created fuckkk var/biomass = 0 var/speed_coeff var/efficiency @@ -33,6 +34,10 @@ var/obj/effect/countdown/clonepod/countdown + var/list/brine_types = list("corazone", "salbutamol", "hydrocodone") + var/list/missing_organs + var/organs_number = 0 + light_color = LIGHT_COLOR_PURE_GREEN /obj/machinery/clonepod/power_change() @@ -82,8 +87,13 @@ /obj/machinery/clonepod/Destroy() if(connected) connected.pods -= src + for(var/s in sharedSoulhooks) + var/datum/soullink/S = s + S.removeSoulsharer(src) //If a sharer is destroy()'d, they are simply removed + sharedSoulhooks = null QDEL_NULL(Radio) QDEL_NULL(countdown) + QDEL_LIST(missing_organs) return ..() /obj/machinery/clonepod/RefreshParts() @@ -93,7 +103,7 @@ efficiency += S.rating for(var/obj/item/weapon/stock_parts/manipulator/P in component_parts) speed_coeff += P.rating - heal_level = min((efficiency * 15) + 10, 100) + heal_level = max(min((efficiency * 15) + 10, 100), MINIMUM_HEAL_LEVEL) //The return of data disks?? Just for transferring between genetics machine/cloning machine. //TO-DO: Make the genetics machine accept them. @@ -217,19 +227,21 @@ if(!G) return 0 +/* + if(clonemind.damnation_type) //Can't clone the damned. + playsound('sound/hallucinations/veryfar_noise.ogg', 50, 0) + malfunction() + return -1 // so that the record gets flushed out + */ + if(biomass >= CLONE_BIOMASS) biomass -= CLONE_BIOMASS else return 0 attempting = 1 //One at a time!! - locked = 1 countdown.start() - eject_wait = 1 - spawn(30) - eject_wait = 0 - if(!R.dna) R.dna = new /datum/dna() @@ -246,9 +258,24 @@ for(var/datum/language/L in R.languages) H.add_language(L.name) + domutcheck(H, null, MUTCHK_FORCED) //Ensures species that get powers by the species proc handle_dna keep them + + if(efficiency > 2 && efficiency < 5 && prob(25)) + randmutb(H) + if(efficiency > 5 && prob(20)) + randmutg(H) + if(efficiency < 3 && prob(50)) + randmutb(H) + + H.dna.UpdateSE() + H.dna.UpdateUI() + + H.sync_organ_dna(1) // It's literally a fresh body as you can get, so all organs properly belong to it + H.UpdateAppearance() + + check_brine() //Get the clone body ready - H.adjustCloneLoss(190) //new damage var so you can't eject a clone early then stab them to abuse the current damage system --NeoFite - H.adjustBrainLoss(90) // The rand(10, 30) will come out as extra brain damage + maim_clone(H) H.Paralyse(4) //Here let's calculate their health so the pod doesn't immediately eject them!!! @@ -265,21 +292,8 @@ to_chat(clonemind.current, {"Your body is beginning to regenerate in a cloning pod. You will become conscious when it is complete."}) - - domutcheck(H, null, MUTCHK_FORCED) //Ensures species that get powers by the species proc handle_dna keep them - - if(efficiency > 2 && efficiency < 5 && prob(25)) - randmutb(H) - if(efficiency > 5 && prob(20)) - randmutg(H) - if(efficiency < 3 && prob(50)) - randmutb(H) - - H.dna.UpdateSE() - H.dna.UpdateUI() - - H.sync_organ_dna(1) // It's literally a fresh body as you can get, so all organs properly belong to it - H.UpdateAppearance() + // Set up a soul link with the dead body to catch a revival + soullink(/datum/soullink/soulhook, clonemind.current, src) update_icon() @@ -299,13 +313,11 @@ if(stat & NOPOWER) //Autoeject if power is lost if(occupant) - locked = 0 go_out() connected_message("Clone Ejected: Loss of power.") else if((occupant) && (occupant.loc == src)) if((occupant.stat == DEAD) || (occupant.suiciding)) //Autoeject corpses and suiciding dudes. - locked = 0 announce_radio_message("The cloning of [occupant] has been aborted due to unrecoverable tissue failure.") go_out() connected_message("Clone Rejected: Deceased.") @@ -316,34 +328,43 @@ //Slowly get that clone healed and finished. occupant.adjustCloneLoss(-((speed_coeff/2))) + // For human species that lack non-vital parts for some weird reason + if(organs_number) + var/progress = CLONE_INITIAL_DAMAGE - occupant.getCloneLoss() + progress += (100 - MINIMUM_HEAL_LEVEL) + var/milestone = CLONE_INITIAL_DAMAGE / organs_number +// Doing this as a #define so that the value can change when evaluated multiple times +#define INSTALLED (organs_number - LAZYLEN(missing_organs)) + + while((progress / milestone) > INSTALLED && LAZYLEN(missing_organs)) + var/obj/item/organ/I = pick_n_take(missing_organs) + I.safe_replace(occupant) + +#undef INSTALLED + //Premature clones may have brain damage. occupant.adjustBrainLoss(-((speed_coeff/20)*efficiency)) - //So clones don't die of oxyloss in a running pod. - if(occupant.reagents.get_reagent_amount("salbutamol") < 5) - occupant.reagents.add_reagent("salbutamol", 5) + check_brine() //Also heal some oxyloss ourselves just in case!! occupant.adjustOxyLoss(-4) use_power(7500) //This might need tweaking. - else if((occupant.cloneloss <= (100 - heal_level)) && (!eject_wait)) + else if((occupant.cloneloss <= (100 - heal_level))) connected_message("Cloning Process Complete.") announce_radio_message("The cloning cycle of [occupant] is complete.") - locked = 0 go_out() else if((!occupant) || (occupant.loc != src)) occupant = null - if(locked) - locked = 0 update_icon() use_power(200) //Let's unlock this early I guess. Might be too early, needs tweaking. /obj/machinery/clonepod/attackby(obj/item/weapon/W, mob/user, params) - if(!(occupant || mess || locked)) + if(!(occupant || mess)) if(default_deconstruction_screwdriver(user, "[icon_state]_maintenance", "[initial(icon_state)]", W)) return @@ -357,14 +378,14 @@ if(!check_access(W)) to_chat(user, "Access Denied.") return - if (!locked || !occupant) - return - if(occupant.health < -20 && occupant.stat != DEAD) - to_chat(user, "Access Refused. Patient status still unstable.") + if(!(occupant || mess)) + to_chat(user, "Error: Pod has no occupant.") return else - locked = 0 - to_chat(user, "System unlocked.") + connected_message("Authorized Ejection") + announce_radio_message("An authorized ejection of [(occupant) ? occupant.real_name : "the malfunctioning pod"] has occured") + to_chat(user, "You force an emergency ejection.") + go_out() //Removing cloning pod biomass else if(istype(W, /obj/item/weapon/reagent_containers/food/snacks/meat)) @@ -374,7 +395,7 @@ qdel(W) return else if(istype(W, /obj/item/weapon/wrench)) - if(locked && (anchored || occupant)) + if(occupant) to_chat(user, "Can not do that while [src] is in use.") else if(anchored) @@ -399,8 +420,6 @@ /obj/machinery/clonepod/emag_act(user) if(isnull(occupant)) return - to_chat(user, "You force an emergency ejection.") - locked = 0 go_out() /obj/machinery/clonepod/proc/update_clone_antag(var/mob/living/carbon/human/H) @@ -435,21 +454,7 @@ connected.updateUsrDialog() return 1 -/obj/machinery/clonepod/verb/eject() - set name = "Eject Cloner" - set category = "Object" - set src in oview(1) - - if(!usr) - return - if(usr.incapacitated()) - return - go_out() - add_fingerprint(usr) - /obj/machinery/clonepod/proc/go_out() - if(locked) - return countdown.stop() if(mess) //Clean that mess and dump those gibs! @@ -468,32 +473,50 @@ update_clone_antag(occupant) to_chat(occupant, "There is a bright flash!
    \ You feel like a new being.
    ") - occupant.flash_eyes(visual = 1) + occupant.flash_eyes(visual = 1) + for(var/s in sharedSoulhooks) + var/datum/soullink/S = s + S.removeSoulsharer(src) //If a sharer is destroy()'d, they are simply removed + sharedSoulhooks = null + + for(var/i in missing_organs) + qdel(i) + missing_organs.Cut() occupant.forceMove(get_turf(src)) - eject_wait = 0 //If it's still set somehow. + occupant.update_body() domutcheck(occupant) //Waiting until they're out before possible notransform. occupant.shock_stage = 0 //Reset Shock occupant = null update_icon() -/obj/machinery/clonepod/proc/malfunction() +/obj/machinery/clonepod/proc/malfunction(go_easy = FALSE) if(occupant) connected_message("Critical Error!") announce_radio_message("Critical error! Please contact a Thinktronic Systems technician, as your warranty may be affected.") - mess = 1 - update_icon() - if(occupant.mind != clonemind) - clonemind.transfer_to(occupant) - occupant.grab_ghost() // We really just want to make you suffer. - to_chat(occupant, {"Agony blazes across your - consciousness as your body is torn apart.
    - Is this what dying is like? Yes it is.
    "}) - playsound(loc, 'sound/machines/warning-buzzer.ogg', 50, 0) - occupant << sound('sound/hallucinations/veryfar_noise.ogg',0,1,50) + for(var/s in sharedSoulhooks) + var/datum/soullink/S = s + S.removeSoulsharer(src) //If a sharer is destroy()'d, they are simply removed + sharedSoulhooks = null + if(!go_easy) + if(occupant.mind != clonemind) + clonemind.transfer_to(occupant) + occupant.grab_ghost() // We really just want to make you suffer. + to_chat(occupant, {"Agony blazes across your + consciousness as your body is torn apart.
    + Is this what dying is like? Yes it is.
    "}) + occupant << sound('sound/hallucinations/veryfar_noise.ogg',0,1,50) + for(var/i in missing_organs) + qdel(i) + missing_organs.Cut() spawn(40) qdel(occupant) + + playsound(loc, 'sound/machines/warning-buzzer.ogg', 50, 0) + mess = TRUE + update_icon() + /obj/machinery/clonepod/update_icon() ..() icon_state = "pod_0" @@ -535,6 +558,48 @@ else return +/obj/machinery/clonepod/onSoullinkRevive(mob/living/L) + if(occupant && L == clonemind.current) + // The old body's back in shape, time to ditch the cloning one + malfunction(go_easy = TRUE) + +/obj/machinery/clonepod/proc/maim_clone(mob/living/carbon/human/H) + LAZYINITLIST(missing_organs) + for(var/i in missing_organs) + qdel(i) + missing_organs.Cut() + + H.setCloneLoss(CLONE_INITIAL_DAMAGE) + H.setBrainLoss(BRAIN_INITIAL_DAMAGE) + + for(var/o in H.internal_organs) + var/obj/item/organ/O = o + if(!istype(O) || O.vital) + continue + + // Let's non-specially remove all non-vital organs + // What could possibly go wrong + var/obj/item/I = O.remove(H) + // Make this support stuff that turns into items when removed + I.forceMove(src) + missing_organs += I + + var/static/list/zones = list("r_arm", "l_arm", "r_leg", "l_leg") + for(var/zone in zones) + var/obj/item/organ/external/E = H.get_organ(zone) + var/obj/item/I = E.remove(H) + I.forceMove(src) + missing_organs += I + + organs_number = LAZYLEN(missing_organs) + +/obj/machinery/clonepod/proc/check_brine() + // Clones are in a pickled bath of mild chemicals, keeping + // them alive, despite their lack of internal organs + for(var/bt in brine_types) + if(occupant.reagents.get_reagent_amount(bt) < 1) + occupant.reagents.add_reagent(bt, 1) + /* * Diskette Box */ @@ -586,3 +651,5 @@ if(istype(A, /obj/machinery/clonepod)) A:malfunction() */ + +#undef MINIMUM_HEAL_LEVEL diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index 0aaba4caf13..72dcbb7deb6 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -423,7 +423,7 @@ hitsound = 'sound/weapons/bladeslice.ogg' force = 40 throwforce = 10 - w_class = 4 + w_class = WEIGHT_CLASS_BULKY attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") block_chance = 50 @@ -442,7 +442,7 @@ throw_speed = 1 throw_range = 5 throwforce = 0 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL armour_penetration = 50 block_chance = 50 var/active = 0 @@ -466,13 +466,13 @@ if(active) force = 30 icon_state = "sword[item_color]" - w_class = 4 + w_class = WEIGHT_CLASS_BULKY playsound(user, 'sound/weapons/saberon.ogg', 50, 1) to_chat(user, "[src] is now active.") else force = 3 icon_state = "sword0" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) to_chat(user, "[src] can now be concealed.") if(istype(user,/mob/living/carbon/human)) @@ -489,7 +489,7 @@ name = "basketball" item_state = "basketball" desc = "Here's your chance, do your dance at the Space Jam." - w_class = 4 //Stops people from hiding it in their bags/pockets + w_class = WEIGHT_CLASS_BULKY //Stops people from hiding it in their bags/pockets /obj/structure/holohoop name = "basketball hoop" @@ -498,7 +498,7 @@ icon_state = "hoop" anchored = 1 density = 1 - throwpass = 1 + pass_flags = LETPASSTHROW /obj/structure/holohoop/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2) @@ -546,7 +546,7 @@ power_channel = ENVIRON /obj/machinery/readybutton/attack_ai(mob/user as mob) - to_chat(user, "The station AI is not to interact with these devices") + to_chat(user, "The station AI is not to interact with these devices.") return /obj/machinery/readybutton/attackby(obj/item/weapon/W as obj, mob/user as mob, params) diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index 19d61e0daf9..64b441b6170 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -148,13 +148,12 @@ occupantData["btCelsius"] = occupant.bodytemperature - T0C occupantData["btFaren"] = ((occupant.bodytemperature - T0C) * (9.0/5.0))+ 32 - if(ishuman(occupant) && occupant.vessel && !(occupant.species && occupant.species.flags & NO_BLOOD)) - var/blood_type = occupant.get_blood_name() + if(ishuman(occupant) && !(occupant.species && occupant.species.flags & NO_BLOOD)) occupantData["pulse"] = occupant.get_pulse(GETPULSE_TOOL) occupantData["hasBlood"] = 1 - occupantData["bloodLevel"] = round(occupant.vessel.get_reagent_amount(blood_type)) + occupantData["bloodLevel"] = round(occupant.blood_volume) occupantData["bloodMax"] = occupant.max_blood - occupantData["bloodPercent"] = round(100*(occupant.vessel.get_reagent_amount(blood_type)/occupant.max_blood), 0.01) //copy pasta ends here + occupantData["bloodPercent"] = round(100*(occupant.blood_volume/occupant.max_blood), 0.01) //copy pasta ends here occupantData["bloodType"]=occupant.b_type if(occupant.surgeries.len) diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 603c0483129..b0dde9e20cd 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -991,7 +991,7 @@ desc = "A model spaceship, it looks like those used back in the day when travelling to Orion! It even has a miniature FX-293 reactor, which was renowned for its instability and tendency to explode..." icon = 'icons/obj/toy.dmi' icon_state = "ship" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL var/active = 0 //if the ship is on /obj/item/weapon/orion_ship/examine(mob/user) diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 2f5e90e3039..d72c1792932 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -13,7 +13,7 @@ /obj/item/weapon/circuitboard density = 0 anchored = 0 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL name = "circuit board" icon = 'icons/obj/module.dmi' icon_state = "id_mod" @@ -30,41 +30,42 @@ var/frame_desc = null var/contain_parts = 1 toolspeed = 1 - usesound = 'sound/items/Deconstruct.ogg' + usesound = 'sound/items/Deconstruct.ogg' /obj/item/weapon/circuitboard/computer - board_type = "computer" - + board_type = "computer" + /obj/item/weapon/circuitboard/machine - board_type = "machine" - + board_type = "machine" + /obj/item/weapon/circuitboard/message_monitor name = "Circuit board (Message Monitor)" build_path = /obj/machinery/computer/message_monitor - origin_tech = "programming=3" + origin_tech = "programming=2" /obj/item/weapon/circuitboard/camera name = "Circuit board (Camera Monitor)" build_path = /obj/machinery/computer/security - origin_tech = "programming=2" + origin_tech = "programming=2;combat=2" /obj/item/weapon/circuitboard/xenobiology name = "Circuit board (Xenobiology Console)" build_path = /obj/machinery/computer/camera_advanced/xenobio origin_tech = "programming=3;biotech=3" /obj/item/weapon/circuitboard/aicore name = "Circuit board (AI Core)" - origin_tech = "programming=4;biotech=2" + origin_tech = "programming=3" board_type = "other" /obj/item/weapon/circuitboard/aiupload name = "Circuit board (AI Upload)" build_path = /obj/machinery/computer/aiupload - origin_tech = "programming=4" + origin_tech = "programming=4;engineering=4" /obj/item/weapon/circuitboard/borgupload name = "Circuit board (Cyborg Upload)" build_path = /obj/machinery/computer/borgupload - origin_tech = "programming=4" + origin_tech = "programming=4;engineering=4" /obj/item/weapon/circuitboard/med_data name = "Circuit board (Medical Records)" build_path = /obj/machinery/computer/med_data + origin_tech = "programming=2;biotech=2" /obj/item/weapon/circuitboard/pandemic name = "circuit board (PanD.E.M.I.C. 2200)" build_path = /obj/machinery/computer/pandemic @@ -76,20 +77,42 @@ /obj/item/weapon/circuitboard/communications name = "Circuit board (Communications Console)" build_path = /obj/machinery/computer/communications - origin_tech = "programming=2;magnets=2" + origin_tech = "programming=3;magnets=3" /obj/item/weapon/circuitboard/card name = "Circuit board (ID Computer)" build_path = /obj/machinery/computer/card + origin_tech = "programming=3" +/obj/item/weapon/circuitboard/card/minor + name = "Circuit board (Dept ID Computer)" + build_path = /obj/machinery/computer/card/minor + var/target_dept = TARGET_DEPT_GENERIC +/obj/item/weapon/circuitboard/card/minor/hos + name = "Circuit board (Sec ID Computer)" + build_path = /obj/machinery/computer/card/minor/hos + target_dept = TARGET_DEPT_SEC +/obj/item/weapon/circuitboard/card/minor/cmo + name = "Circuit board (Medical ID Computer)" + build_path = /obj/machinery/computer/card/minor/cmo + target_dept = TARGET_DEPT_MED +/obj/item/weapon/circuitboard/card/minor/rd + name = "Circuit board (Science ID Computer)" + build_path = /obj/machinery/computer/card/minor/rd + target_dept = TARGET_DEPT_SCI +/obj/item/weapon/circuitboard/card/minor/ce + name = "Circuit board (Engineering ID Computer)" + build_path = /obj/machinery/computer/card/minor/ce + target_dept = TARGET_DEPT_ENG /obj/item/weapon/circuitboard/card/centcom name = "Circuit board (CentComm ID Computer)" build_path = /obj/machinery/computer/card/centcom /obj/item/weapon/circuitboard/teleporter name = "Circuit board (Teleporter Console)" build_path = /obj/machinery/computer/teleporter - origin_tech = "programming=2;bluespace=2" + origin_tech = "programming=3;bluespace=3;plasmatech=3" /obj/item/weapon/circuitboard/secure_data name = "Circuit board (Security Records)" build_path = /obj/machinery/computer/secure_data + origin_tech = "programming=2;combat=2" /obj/item/weapon/circuitboard/skills name = "Circuit board (Employment Records)" build_path = /obj/machinery/computer/skills @@ -131,7 +154,7 @@ /obj/item/weapon/circuitboard/cloning name = "Circuit board (Cloning Machine Console)" build_path = /obj/machinery/computer/cloning - origin_tech = "programming=3;biotech=3" + origin_tech = "programming=2;biotech=2" /obj/item/weapon/circuitboard/arcade/battle name = "circuit board (Arcade Battle)" build_path = /obj/machinery/computer/arcade/battle @@ -139,7 +162,7 @@ /obj/item/weapon/circuitboard/arcade/orion_trail name = "circuit board (Orion Trail)" build_path = /obj/machinery/computer/arcade/orion_trail - origin_tech = "programming=2" + origin_tech = "programming=1" /obj/item/weapon/circuitboard/solar_control name = "Circuit board (Solar Control)" build_path = /obj/machinery/power/solar_control @@ -147,6 +170,7 @@ /obj/item/weapon/circuitboard/powermonitor name = "Circuit board (Power Monitor)" build_path = /obj/machinery/computer/monitor + origin_tech = "programming=2;powerstorage=2" /obj/item/weapon/circuitboard/olddoor name = "Circuit board (DoorMex)" build_path = /obj/machinery/computer/pod/old @@ -199,15 +223,15 @@ /obj/item/weapon/circuitboard/crew name = "Circuit board (Crew Monitoring Computer)" build_path = /obj/machinery/computer/crew - origin_tech = "programming=3;biotech=2;magnets=2" + origin_tech = "programming=2;biotech=2" /obj/item/weapon/circuitboard/mech_bay_power_console name = "Circuit board (Mech Bay Power Control Console)" build_path = /obj/machinery/computer/mech_bay_power_console - origin_tech = "programming=2;powerstorage=3" + origin_tech = "programming=3;powerstorage=3" /obj/item/weapon/circuitboard/ordercomp name = "Circuit board (Supply Ordering Console)" build_path = /obj/machinery/computer/ordercomp - origin_tech = "programming=2" + origin_tech = "programming=3" /obj/item/weapon/circuitboard/supplycomp name = "Circuit board (Supply Shuttle Console)" build_path = /obj/machinery/computer/supplycomp @@ -217,19 +241,19 @@ /obj/item/weapon/circuitboard/operating name = "Circuit board (Operating Computer)" build_path = /obj/machinery/computer/operating - origin_tech = "programming=2;biotech=2" + origin_tech = "programming=2;biotech=3" /obj/item/weapon/circuitboard/comm_monitor name = "Circuit board (Telecommunications Monitor)" build_path = /obj/machinery/computer/telecomms/monitor - origin_tech = "programming=3" + origin_tech = "programming=3;magnets=3;bluespace=2" /obj/item/weapon/circuitboard/comm_server name = "Circuit board (Telecommunications Server Monitor)" build_path = /obj/machinery/computer/telecomms/server - origin_tech = "programming=3" + origin_tech = "programming=3;magnets=3;bluespace=2" /obj/item/weapon/circuitboard/comm_traffic name = "Circuitboard (Telecommunications Traffic Control)" build_path = /obj/machinery/computer/telecomms/traffic - origin_tech = "programming=3" + origin_tech = "programming=3;magnets=3;bluespace=2" /obj/item/weapon/circuitboard/shuttle @@ -265,7 +289,7 @@ /obj/item/weapon/circuitboard/aifixer name = "Circuit board (AI Integrity Restorer)" build_path = /obj/machinery/computer/aifixer - origin_tech = "programming=3;biotech=2" + origin_tech = "programming=2;biotech=2" /obj/item/weapon/circuitboard/area_atmos name = "Circuit board (Area Air Control)" build_path = /obj/machinery/computer/area_atmos @@ -273,7 +297,7 @@ /obj/item/weapon/circuitboard/telesci_console name = "Circuit board (Telepad Control Console)" build_path = /obj/machinery/computer/telescience - origin_tech = "programming=3;bluespace=2" + origin_tech = "programming=3;bluespace=3;plasmatech=4" /obj/item/weapon/circuitboard/atmos_automation name = "Circuit board (Atmospherics Automation)" @@ -281,6 +305,7 @@ /obj/item/weapon/circuitboard/large_tank_control name = "Circuit board (Atmospheric Tank Control)" build_path = /obj/machinery/computer/general_air_control/large_tank_control + origin_tech = "programming=2;engineering=3;materials=2" /obj/item/weapon/circuitboard/turbine_computer name = "circuit board (Turbine Computer)" @@ -290,7 +315,7 @@ /obj/item/weapon/circuitboard/HONKputer name = "Circuit board (HONKputer)" build_path = /obj/machinery/computer/HONKputer - origin_tech = "programming=4" + origin_tech = "programming=2" icon = 'icons/obj/machines/HONKputer.dmi' icon_state = "bananium_board" board_type = "honkcomputer" diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index f42e50d9618..2cb5b8a46a2 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -71,7 +71,9 @@ ui_interact(user) /obj/machinery/computer/security/attackby(obj/item/I, user as mob, params) - if(I.GetAccess()) // If hit by something with access. + if(isscrewdriver(I)) + ..() + else if(I.GetAccess()) // If hit by something with access. attack_hand(user) else ..() diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 3b48539febc..d260df8c9b9 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -14,13 +14,20 @@ var/time_last_changed_position = 0 var/obj/item/weapon/card/id/modify = null var/mode = 0.0 var/printing = null + var/target_dept = 0 //Which department this computer has access to. 0=all departments //Cooldown for closing positions in seconds //if set to -1: No cooldown... probably a bad idea //if set to 0: Not able to close "original" positions. You can only close positions that you have opened before var/change_position_cooldown = 60 - //Jobs you cannot open new positions for - var/list/blacklisted = list( + // Jobs that do not appear in the list at all. + var/list/blacklisted_full = list( + /datum/job/ntnavyofficer, + /datum/job/ntspecops, + /datum/job/civilian + ) + // Jobs that appear in the list, and you can prioritize, but not open/close slots for + var/list/blacklisted_partial = list( /datum/job/ai, /datum/job/cyborg, /datum/job/captain, @@ -36,12 +43,8 @@ var/time_last_changed_position = 0 /datum/job/brigdoc, /datum/job/mechanic, /datum/job/barber, - /datum/job/chaplain, - /datum/job/ntnavyofficer, - /datum/job/ntspecops, - /datum/job/civilian + /datum/job/chaplain ) - //The scaling factor of max total positions in relation to the total amount of people on board the station in % var/max_relative_positions = 30 //30%: Seems reasonable, limit of 6 @ 20 players @@ -65,24 +68,29 @@ var/time_last_changed_position = 0 /obj/machinery/computer/card/proc/format_jobs(list/jobs) var/list/formatted = list() for(var/job in jobs) - formatted.Add(list(list( - "display_name" = replacetext(job, " ", " "), - "target_rank" = get_target_rank(), - "job" = job))) + if(job_in_department(job_master.GetJob(job))) + formatted.Add(list(list( + "display_name" = replacetext(job, " ", " "), + "target_rank" = get_target_rank(), + "job" = job))) return formatted /obj/machinery/computer/card/proc/format_job_slots() var/list/formatted = list() for(var/datum/job/job in job_master.occupations) - if(job_blacklisted(job)) + if(job_blacklisted_full(job)) + continue + if(!job_in_department(job)) continue formatted.Add(list(list( "title" = job.title, "current_positions" = job.current_positions, "total_positions" = job.total_positions, "can_open" = can_open_job(job), - "can_close" = can_close_job(job)))) + "can_close" = can_close_job(job), + "can_prioritize" = can_prioritize_job(job) + ))) return formatted @@ -92,7 +100,6 @@ var/time_last_changed_position = 0 formatted.Add(list(list( "display_name" = get_skin_desc(skin), "skin" = skin))) - return formatted /obj/machinery/computer/card/verb/eject_id() @@ -100,7 +107,7 @@ var/time_last_changed_position = 0 set name = "Eject ID Card" set src in oview(1) - if(usr.restrained()) + if(usr.restrained()) return if(scan) @@ -134,14 +141,18 @@ var/time_last_changed_position = 0 nanomanager.update_uis(src) attack_hand(user) -//Check if you can't open a new position for a certain job -/obj/machinery/computer/card/proc/job_blacklisted(datum/job/job) - return (job.type in blacklisted) +//Check if you can't touch a job in any way whatsoever +/obj/machinery/computer/card/proc/job_blacklisted_full(datum/job/job) + return (job.type in blacklisted_full) + +//Check if you can't open/close positions for a certain job +/obj/machinery/computer/card/proc/job_blacklisted_partial(datum/job/job) + return (job.type in blacklisted_partial) //Logic check for Topic() if you can open the job /obj/machinery/computer/card/proc/can_open_job(datum/job/job) if(job) - if(!job_blacklisted(job)) + if(!job_blacklisted_full(job) && !job_blacklisted_partial(job) && job_in_department(job, FALSE)) if((job.total_positions <= player_list.len * (max_relative_positions / 100))) var/delta = (world.time / 10) - time_last_changed_position if((change_position_cooldown < delta) || (opened_positions[job.title] < 0)) @@ -153,8 +164,8 @@ var/time_last_changed_position = 0 //Logic check for Topic() if you can close the job /obj/machinery/computer/card/proc/can_close_job(datum/job/job) if(job) - if(!job_blacklisted(job)) - if(job.total_positions > job.current_positions) + if(!job_blacklisted_full(job) && !job_blacklisted_partial(job) && job_in_department(job, FALSE)) + if(job.total_positions > job.current_positions && !(job in job_master.prioritized_jobs)) var/delta = (world.time / 10) - time_last_changed_position if((change_position_cooldown < delta) || (opened_positions[job.title] > 0)) return 1 @@ -162,6 +173,42 @@ var/time_last_changed_position = 0 return -1 return 0 +/obj/machinery/computer/card/proc/can_prioritize_job(datum/job/job) + if(job) + if(!job_blacklisted_full(job) && job_in_department(job, FALSE)) + if(job in job_master.prioritized_jobs) + return 2 + else + if(job_master.prioritized_jobs.len >= 3) + return 0 + if(job.total_positions <= job.current_positions) + return 0 + return 1 + return -1 + + +/obj/machinery/computer/card/proc/job_in_department(datum/job/targetjob, includecivs = 1) + if(!scan || !scan.access) + return 0 + if(!target_dept) + return 1 + if(!scan.assignment) + return 0 + if(!targetjob || !targetjob.title) + return 0 + if(targetjob.title in get_subordinates(scan.assignment, includecivs)) + return 1 + return 0 + +/obj/machinery/computer/card/proc/get_subordinates(rank, addcivs) + var/list/jobs_returned = list() + for(var/datum/job/thisjob in job_master.occupations) + if(rank in thisjob.department_head) + jobs_returned += thisjob.title + if(addcivs) + jobs_returned += "Civilian" + return jobs_returned + /obj/machinery/computer/card/attack_ai(var/mob/user as mob) return attack_hand(user) @@ -198,6 +245,7 @@ var/time_last_changed_position = 0 data["centcom_access"] = is_centcom() data["all_centcom_access"] = null data["regions"] = null + data["target_dept"] = target_dept data["engineering_jobs"] = format_jobs(engineering_positions) data["medical_jobs"] = format_jobs(medical_positions) @@ -267,7 +315,7 @@ var/time_last_changed_position = 0 else modify.forceMove(get_turf(src)) modify = null - else if(Adjacent(usr)) + else if(Adjacent(usr)) var/obj/item/I = usr.get_active_hand() if(istype(I, /obj/item/weapon/card/id)) usr.drop_item() @@ -284,7 +332,7 @@ var/time_last_changed_position = 0 else scan.forceMove(get_turf(src)) scan = null - else if(Adjacent(usr)) + else if(Adjacent(usr)) var/obj/item/I = usr.get_active_hand() if(istype(I, /obj/item/weapon/card/id)) usr.drop_item() @@ -292,7 +340,7 @@ var/time_last_changed_position = 0 scan = I if("access") - if(href_list["allowed"]) + if(href_list["allowed"] && !target_dept) if(is_authenticated(usr)) var/access_type = text2num(href_list["access_target"]) var/access_allowed = text2num(href_list["allowed"]) @@ -302,13 +350,22 @@ var/time_last_changed_position = 0 modify.access += access_type if("skin") - var/skin = href_list["skin_target"] - if(is_authenticated(usr) && modify && ((skin in get_station_card_skins()) || ((skin in get_centcom_card_skins()) && is_centcom()))) - modify.icon_state = href_list["skin_target"] + if(!target_dept) + var/skin = href_list["skin_target"] + if(is_authenticated(usr) && modify && ((skin in get_station_card_skins()) || ((skin in get_centcom_card_skins()) && is_centcom()))) + modify.icon_state = href_list["skin_target"] if("assign") if(is_authenticated(usr) && modify) var/t1 = href_list["assign_target"] + if(target_dept && modify.assignment == "Unassigned") + visible_message("[src]: Demoted individuals must see the HoP for a new job.") + return 0 + if(!job_in_department(job_master.GetJob(modify.rank), FALSE)) + visible_message("[src]: Cross-department job transfers must be done by the HoP.") + return 0 + if(!job_in_department(job_master.GetJob(t1))) + return 0 if(t1 == "Custom") var/temp_t = sanitize(copytext(input("Enter a custom job assignment.","Assignment"),1,MAX_MESSAGE_LEN)) //let custom jobs function as an impromptu alt title, mainly for sechuds @@ -332,24 +389,25 @@ var/time_last_changed_position = 0 access = jobdatum.get_access() modify.access = access - modify.assignment = t1 modify.rank = t1 + modify.assignment = t1 + callHook("reassign_employee", list(modify)) if("reg") - if(is_authenticated(usr)) + if(is_authenticated(usr) && !target_dept) var/t2 = modify if((modify == t2 && (in_range(src, usr) || (istype(usr, /mob/living/silicon))) && istype(loc, /turf))) var/temp_name = reject_bad_name(href_list["reg"]) if(temp_name) modify.registered_name = temp_name else - src.visible_message("[src] buzzes rudely.") + visible_message("[src] buzzes rudely.") nanomanager.update_uis(src) if("account") - if(is_authenticated(usr)) + if(is_authenticated(usr) && !target_dept) var/t2 = modify if((modify == t2 && (in_range(src, usr) || (istype(usr, /mob/living/silicon))) && istype(loc, /turf))) var/account_num = text2num(href_list["account"]) @@ -360,7 +418,7 @@ var/time_last_changed_position = 0 mode = text2num(href_list["mode_target"]) if("print") - if(!printing) + if(!printing && !target_dept) printing = 1 playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) spawn(50) @@ -393,17 +451,36 @@ var/time_last_changed_position = 0 P.info += "" if("terminate") - if(is_authenticated(usr)) + if(is_authenticated(usr) && !target_dept) modify.assignment = "Terminated" modify.access = list() - callHook("terminate_employee", list(modify)) + if("demote") + if(is_authenticated(usr)) + if(modify.assignment == "Unassigned") + visible_message("[src]: Unassigned crew cannot be demoted any further. If further action is warranted, ask the Captain about Termination.") + return 0 + if(!job_in_department(job_master.GetJob(modify.rank), FALSE)) + visible_message("[src]: Heads may only demote members of their own department.") + return 0 + + var/list/access = list() + var/datum/job/jobdatum = new /datum/job/civilian + access = jobdatum.get_access() + + modify.access = access + modify.rank = "Civilian" + modify.assignment = "Unassigned" + modify.icon_state = "id" + if("make_job_available") // MAKE ANOTHER JOB POSITION AVAILABLE FOR LATE JOINERS if(is_authenticated(usr)) var/edit_job_target = href_list["job"] var/datum/job/j = job_master.GetJob(edit_job_target) + if(!job_in_department(j, FALSE)) + return 0 if(!j) return 0 if(can_open_job(j) != 1) @@ -420,6 +497,8 @@ var/time_last_changed_position = 0 if(is_authenticated(usr)) var/edit_job_target = href_list["job"] var/datum/job/j = job_master.GetJob(edit_job_target) + if(!job_in_department(j, FALSE)) + return 0 if(!j) return 0 if(can_close_job(j) != 1) @@ -431,7 +510,25 @@ var/time_last_changed_position = 0 opened_positions[edit_job_target]-- log_game("[key_name(usr)] has closed a job slot for job \"[j]\".") nanomanager.update_uis(src) - + if("prioritize_job") + // TOGGLE WHETHER JOB APPEARS AS PRIORITIZED IN THE LOBBY + if(is_authenticated(usr) && !target_dept) + var/priority_target = href_list["job"] + var/datum/job/j = job_master.GetJob(priority_target) + if(!j) + return 0 + if(!job_in_department(j)) + return 0 + var/priority = TRUE + if(j in job_master.prioritized_jobs) + job_master.prioritized_jobs -= j + priority = FALSE + else if(job_master.prioritized_jobs.len < 3) + job_master.prioritized_jobs += j + else + return 0 + log_game("[key_name(usr)] [priority ? "prioritized" : "unprioritized"] the job \"[j.title]\".") + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) if(modify) modify.name = text("[modify.registered_name]'s ID Card ([modify.assignment])") @@ -442,4 +539,43 @@ var/time_last_changed_position = 0 circuit = /obj/item/weapon/circuitboard/card/centcom req_access = list(access_cent_commander) change_position_cooldown = -1 - blacklisted = list() \ No newline at end of file + blacklisted_full = list() + blacklisted_partial = list() + +/obj/machinery/computer/card/minor + name = "department management console" + target_dept = TARGET_DEPT_GENERIC + desc = "You can use this to change ID's for specific departments." + icon_screen = "idminor" + circuit = /obj/item/weapon/circuitboard/card/minor + +/obj/machinery/computer/card/minor/hos + name = "security management console" + target_dept = TARGET_DEPT_SEC + icon_screen = "idhos" + light_color = LIGHT_COLOR_RED + req_access = list(access_hos) + circuit = /obj/item/weapon/circuitboard/card/minor/hos + +/obj/machinery/computer/card/minor/cmo + name = "medical management console" + target_dept = TARGET_DEPT_MED + icon_screen = "idcmo" + req_access = list(access_cmo) + circuit = /obj/item/weapon/circuitboard/card/minor/cmo + +/obj/machinery/computer/card/minor/rd + name = "science management console" + target_dept = TARGET_DEPT_SCI + icon_screen = "idrd" + light_color = LIGHT_COLOR_PINK + req_access = list(access_rd) + circuit = /obj/item/weapon/circuitboard/card/minor/rd + +/obj/machinery/computer/card/minor/ce + name = "engineering management console" + target_dept = TARGET_DEPT_ENG + icon_screen = "idce" + light_color = COLOR_YELLOW + req_access = list(access_ce) + circuit = /obj/item/weapon/circuitboard/card/minor/ce \ No newline at end of file diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index ee307dd84d5..5f72dab528c 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -310,6 +310,7 @@ temp = "Error: No cloning pod detected." else var/obj/machinery/clonepod/pod = selected_pod + var/cloneresult if(!selected_pod) temp = "Error: No cloning pod selected." else if(pod.occupant) @@ -320,13 +321,16 @@ temp = "Error: The cloning pod is malfunctioning." else if(!config.revival_cloning) temp = "Error: Unable to initiate cloning cycle." - else if(pod.growclone(C)) - temp = "Initiating cloning cycle..." - records.Remove(C) - qdel(C) - menu = 1 else - temp = "[C.name] => Initialisation failure." + cloneresult = pod.growclone(C) + if(cloneresult) + if(cloneresult > 0) + temp = "Initiating cloning cycle..." + records.Remove(C) + qdel(C) + menu = 1 + else + temp = "[C.name] => Initialisation failure." else temp = "Error: Data corruption." diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index e343135b246..17147954372 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -135,7 +135,7 @@ return /obj/machinery/computer/attack_alien(mob/living/user) - if(isalien(user) && user.a_intent == I_HELP) + if(isalien(user) && user.a_intent == INTENT_HELP) var/mob/living/carbon/alien/humanoid/xeno = user if(xeno.has_fine_manipulation) return attack_hand(user) diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 7c2df327285..d016a0df7bd 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -198,9 +198,7 @@ if("op") active2.fields["b_type"] = "O+" if("del_r2") - if(active2) - qdel(active2) - active2 = null + QDEL_NULL(active2) if(href_list["scan"]) if(scan) @@ -565,4 +563,4 @@ #undef MED_DATA_MAINT #undef MED_DATA_RECORD #undef MED_DATA_V_DATA -#undef MED_DATA_MEDBOT \ No newline at end of file +#undef MED_DATA_MEDBOT diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm index 7c647b61e90..fed409d9507 100644 --- a/code/game/machinery/computer/prisoner.dm +++ b/code/game/machinery/computer/prisoner.dm @@ -20,6 +20,14 @@ /obj/machinery/computer/prisoner/attack_ai(var/mob/user as mob) return src.attack_hand(user) +/obj/machinery/computer/prisoner/New() + prisoncomputer_list += src + return ..() + +/obj/machinery/computer/prisoner/Destroy() + prisoncomputer_list -= src + return ..() + /obj/machinery/computer/prisoner/attack_hand(var/mob/user as mob) if(..()) return 1 diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 6fdb90575ea..c4aefaa555d 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -120,7 +120,7 @@ else security["empty"] = 1 return data - + /obj/machinery/computer/secure_data/Topic(href, href_list) if(..()) return 1 @@ -141,6 +141,12 @@ qdel(R) update_all_mob_security_hud() setTemp("

    All records deleted.

    ") + if("del_alllogs2") + if(cell_logs.len) + setTemp("

    All cell logs deleted.

    ") + cell_logs.Cut() + else + to_chat(usr, "Error; No cell logs to delete.") if("del_r2") if(active2) qdel(active2) @@ -150,11 +156,8 @@ for(var/datum/data/record/R in data_core.medical) if(R.fields["name"] == active1.fields["name"] && R.fields["id"] == active1.fields["id"]) qdel(R) - qdel(active1) - active1 = null - if(active2) - qdel(active2) - active2 = null + QDEL_NULL(active1) + QDEL_NULL(active2) update_all_mob_security_hud() screen = SEC_DATA_R_LIST if("criminal") @@ -254,6 +257,12 @@ buttons[++buttons.len] = list("name" = "No", "icon" = "times", "href" = null, "status" = null) setTemp("

    Are you sure you wish to delete all records?

    ", buttons) + else if(href_list["del_alllogs"]) + var/list/buttons = list() + buttons[++buttons.len] = list("name" = "Yes", "icon" = "check", "href" = "del_alllogs2=1", "status" = null) + buttons[++buttons.len] = list("name" = "No", "icon" = "times", "href" = null, "status" = null) + setTemp("

    Are you sure you wish to delete all cell logs?

    ", buttons) + else if(href_list["del_rg"]) if(active1) var/list/buttons = list() @@ -342,6 +351,24 @@ create_record_photo(active1) printing = 0 + else if(href_list["printlogs"]) + if(cell_logs.len && !printing) + var/obj/item/weapon/paper/P = input(usr, "Select log to print", "Available Cell Logs") as null|anything in cell_logs + if(!P) + return 0 + printing = 1 + playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1) + to_chat(usr, "Printing file [P.name].") + sleep(50) + var/obj/item/weapon/paper/log = new /obj/item/weapon/paper(loc) + log.name = P.name + log.info = P.info + printing = 0 + return 1 + else + to_chat(usr, "[src] has no logs stored or is already printing.") + + else if(href_list["add_c"]) if(istype(active2, /datum/data/record)) var/a2 = active2 @@ -454,10 +481,6 @@ /obj/machinery/computer/secure_data/proc/setTemp(text, list/buttons = list()) temp = list("text" = text, "buttons" = buttons, "has_buttons" = buttons.len > 0) - -/obj/machinery/computer/secure_data/proc/update_all_mob_security_hud() - for(var/mob/living/carbon/human/H in mob_list) - H.sec_hud_set_security_status() /obj/machinery/computer/secure_data/proc/create_record_photo(datum/data/record/R) // basically copy-pasted from the camera code but different enough that it has to be redone @@ -530,4 +553,4 @@ #undef SEC_DATA_R_LIST #undef SEC_DATA_MAINT -#undef SEC_DATA_RECORD \ No newline at end of file +#undef SEC_DATA_RECORD diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index e98028e3807..66d0bfdbaee 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -111,8 +111,7 @@ for(var/datum/data/record/R in data_core.medical) if(R.fields["name"] == active1.fields["name"] && R.fields["id"] == active1.fields["id"]) qdel(R) - qdel(active1) - active1 = null + QDEL_NULL(active1) screen = SKILL_DATA_R_LIST if("rank") if(active1) @@ -322,4 +321,4 @@ #undef SKILL_DATA_R_LIST #undef SKILL_DATA_MAINT -#undef SKILL_DATA_RECORD \ No newline at end of file +#undef SKILL_DATA_RECORD diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index a714e24febc..24f5c88695c 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -57,10 +57,7 @@ else desc += "." -/obj/machinery/constructable_frame/machine_frame/attackby(obj/item/P as obj, mob/user as mob, params) - if(P.crit_fail) - to_chat(user, "This part is faulty, you cannot add this to the machine!") - return +/obj/machinery/constructable_frame/machine_frame/attackby(obj/item/P, mob/user, params) switch(state) if(1) if(istype(P, /obj/item/stack/cable_coil)) @@ -171,11 +168,10 @@ for(var/path in req_components) while(req_components[path] > 0 && (locate(path) in part_list)) var/obj/item/part = (locate(path) in part_list) - if(!part.crit_fail) - added_components[part] = path - replacer.remove_from_storage(part, src) - req_components[path]-- - part_list -= part + added_components[part] = path + replacer.remove_from_storage(part, src) + req_components[path]-- + part_list -= part for(var/obj/item/weapon/stock_parts/part in added_components) components += part @@ -265,7 +261,7 @@ to destroy them and players will be able to make replacements. name = "circuit board (SMES)" build_path = /obj/machinery/power/smes board_type = "machine" - origin_tech = "programming=4;powerstorage=5;engineering=5" + origin_tech = "programming=3;powerstorage=3;engineering=3" frame_desc = "Requires 5 pieces of cable, 5 Power Cells and 1 Capacitor." req_components = list( /obj/item/stack/cable_coil = 5, @@ -276,7 +272,7 @@ to destroy them and players will be able to make replacements. name = "circuit board (Emitter)" build_path = /obj/machinery/power/emitter board_type = "machine" - origin_tech = "programming=4;powerstorage=5;engineering=5" + origin_tech = "programming=3;powerstorage=4;engineering=4" req_components = list( /obj/item/weapon/stock_parts/micro_laser = 1, /obj/item/weapon/stock_parts/manipulator = 1) @@ -285,7 +281,7 @@ to destroy them and players will be able to make replacements. name = "circuit board (Power Compressor)" build_path = /obj/machinery/power/compressor board_type = "machine" - origin_tech = "programming=4;powerstorage=5;engineering=4" + origin_tech = "programming=4;powerstorage=4;engineering=4" req_components = list( /obj/item/stack/cable_coil = 5, /obj/item/weapon/stock_parts/manipulator = 6) @@ -294,7 +290,7 @@ to destroy them and players will be able to make replacements. name = "circuit board (Power Turbine)" build_path = /obj/machinery/power/turbine board_type = "machine" - origin_tech = "programming=4;powerstorage=4;engineering=5" + origin_tech = "programming=4;powerstorage=4;engineering=4" req_components = list( /obj/item/stack/cable_coil = 5, /obj/item/weapon/stock_parts/capacitor = 6) @@ -327,7 +323,7 @@ to destroy them and players will be able to make replacements. name = "circuit board (Biogenerator)" build_path = /obj/machinery/biogenerator board_type = "machine" - origin_tech = "programming=3;biotech=2;materials=3" + origin_tech = "programming=2;biotech=3;materials=3" frame_desc = "Requires 1 Matter Bin, 1 Manipulator, 1 piece of cable and 1 Console Screen." req_components = list( /obj/item/weapon/stock_parts/matter_bin = 1, @@ -361,7 +357,7 @@ to destroy them and players will be able to make replacements. name = "circuit board (Hydroponics Tray)" build_path = /obj/machinery/hydroponics/constructable board_type = "machine" - origin_tech = "programming=1;biotech=1" + origin_tech = "programming=1;biotech=2" frame_desc = "Requires 2 Matter Bins, 1 Manipulator, and 1 Console Screen." req_components = list( /obj/item/weapon/stock_parts/matter_bin = 2, @@ -372,7 +368,7 @@ to destroy them and players will be able to make replacements. name = "circuit board (Microwave)" build_path = /obj/machinery/kitchen_machine/microwave board_type = "machine" - origin_tech = "programming=1" + origin_tech = "programming=2;magnets=2" frame_desc = "Requires 1 Micro Laser, 2 pieces of cable and 1 Console Screen." req_components = list( /obj/item/weapon/stock_parts/micro_laser = 1, @@ -383,7 +379,7 @@ to destroy them and players will be able to make replacements. name = "circuit board (Oven)" build_path = /obj/machinery/kitchen_machine/oven board_type = "machine" - origin_tech = "programming=1;plasmatech=1" + origin_tech = "programming=2;magnets=2" frame_desc = "Requires 2 Micro Lasers, 5 pieces of cable and 1 Console Screen." req_components = list( /obj/item/weapon/stock_parts/micro_laser = 2, @@ -394,7 +390,7 @@ to destroy them and players will be able to make replacements. name = "circuit board (Grill)" build_path = /obj/machinery/kitchen_machine/grill board_type = "machine" - origin_tech = "programming=1;plasmatech=1" + origin_tech = "programming=2;magnets=2" frame_desc = "Requires 2 Micro Lasers, 5 pieces of cable and 1 Console Screen." req_components = list( /obj/item/weapon/stock_parts/micro_laser = 2, @@ -405,7 +401,7 @@ to destroy them and players will be able to make replacements. name = "circuit board (Candy Maker)" build_path = /obj/machinery/kitchen_machine/candy_maker board_type = "machine" - origin_tech = "programming=2" + origin_tech = "programming=2;magnets=2" frame_desc = "Requires 1 Manipulator, 5 pieces of cable and 1 Console Screen." req_components = list( /obj/item/weapon/stock_parts/manipulator = 1, @@ -416,7 +412,7 @@ to destroy them and players will be able to make replacements. name = "circuit board (Deep Fryer)" build_path = /obj/machinery/cooker/deepfryer board_type = "machine" - origin_tech = "programming=2" + origin_tech = "programming=1" frame_desc = "Requires 2 Micro Lasers and 5 pieces of cable." req_components = list( /obj/item/weapon/stock_parts/micro_laser = 2, @@ -426,7 +422,7 @@ to destroy them and players will be able to make replacements. name = "circuit board (Gibber)" build_path = /obj/machinery/gibber board_type = "machine" - origin_tech = "programming=1" + origin_tech = "programming=2;engineering=2" req_components = list( /obj/item/weapon/stock_parts/matter_bin = 1, /obj/item/weapon/stock_parts/manipulator = 1) @@ -435,7 +431,7 @@ to destroy them and players will be able to make replacements. name = "circuit board (Tesla Coil)" build_path = /obj/machinery/power/tesla_coil board_type = "machine" - origin_tech = "programming=1" + origin_tech = "programming=3;magnets=3;powerstorage=3" req_components = list( /obj/item/weapon/stock_parts/capacitor = 1) @@ -443,7 +439,7 @@ to destroy them and players will be able to make replacements. name = "circuit board (Grounding Rod)" build_path = /obj/machinery/power/grounding_rod board_type = "machine" - origin_tech = "programming=1" + origin_tech = "programming=3;powerstorage=3;magnets=3;plasmatech=2" req_components = list( /obj/item/weapon/stock_parts/capacitor = 1) @@ -460,16 +456,7 @@ to destroy them and players will be able to make replacements. name = "circuit board (Recycler)" build_path = /obj/machinery/recycler board_type = "machine" - origin_tech = "programming=1" - req_components = list( - /obj/item/weapon/stock_parts/matter_bin = 1, - /obj/item/weapon/stock_parts/manipulator = 1) - -/obj/item/weapon/circuitboard/seed_extractor - name = "circuit board (Seed Extractor)" - build_path = /obj/machinery/seed_extractor - board_type = "machine" - origin_tech = "programming=1" + origin_tech = "programming=2;engineering=2" req_components = list( /obj/item/weapon/stock_parts/matter_bin = 1, /obj/item/weapon/stock_parts/manipulator = 1) @@ -519,7 +506,7 @@ to destroy them and players will be able to make replacements. name = "circuit board (Monkey Recycler)" build_path = /obj/machinery/monkey_recycler board_type = "machine" - origin_tech = "programming=1" + origin_tech = "programming=1;biotech=2" req_components = list( /obj/item/weapon/stock_parts/matter_bin = 1, /obj/item/weapon/stock_parts/manipulator = 1) @@ -536,7 +523,7 @@ to destroy them and players will be able to make replacements. name = "circuit board (Portable Chem Dispenser)" build_path = /obj/machinery/chem_dispenser/constructable board_type = "machine" - origin_tech = "materials=4;engineering=4;programming=4;plasmatech=3;biotech=3" + origin_tech = "materials=4;programming=4;plasmatech=4;biotech=3" frame_desc = "Requires 2 Matter Bins, 1 Capacitor, 1 Manipulator, 1 Console Screen, and 1 Power Cell." req_components = list( /obj/item/weapon/stock_parts/matter_bin = 2, @@ -549,7 +536,7 @@ to destroy them and players will be able to make replacements. name = "circuit board (Chem Master 2999)" build_path = /obj/machinery/chem_master/constructable board_type = "machine" - origin_tech = "materials=2;programming=2;biotech=1" + origin_tech = "materials=3;programming=2;biotech=3" req_components = list( /obj/item/weapon/reagent_containers/glass/beaker = 2, /obj/item/weapon/stock_parts/manipulator = 1, @@ -559,7 +546,7 @@ to destroy them and players will be able to make replacements. name = "circuit board (Chemical Heater)" build_path = /obj/machinery/chem_heater board_type = "machine" - origin_tech = "materials=2;engineering=2" + origin_tech = "programming=2;engineering=2;biotech=2" frame_desc = "Requires 1 Micro Laser and 1 Console Screen." req_components = list( /obj/item/weapon/stock_parts/micro_laser = 1, @@ -625,7 +612,7 @@ to destroy them and players will be able to make replacements. name = "Circuit Board (PACMAN-type Generator)" build_path = /obj/machinery/power/port_gen/pacman board_type = "machine" - origin_tech = "programming=3:powerstorage=3;plasmatech=3;engineering=3" + origin_tech = "programming=2;powerstorage=3;plasmatech=3;engineering=3" frame_desc = "Requires 1 Matter Bin, 1 Micro-Laser, 2 Pieces of Cable, and 1 Capacitor." req_components = list( /obj/item/weapon/stock_parts/matter_bin = 1, @@ -641,7 +628,7 @@ to destroy them and players will be able to make replacements. /obj/item/weapon/circuitboard/pacman/mrs name = "Circuit Board (MRSPACMAN-type Generator)" build_path = /obj/machinery/power/port_gen/pacman/mrs - origin_tech = "programming=3;powerstorage=5;engineering=5" + origin_tech = "programming=3;powerstorage=4;engineering=4;plasmatech=4" obj/item/weapon/circuitboard/rdserver name = "Circuit Board (R&D Server)" @@ -657,7 +644,7 @@ obj/item/weapon/circuitboard/rdserver name = "Circuit board (Exosuit Fabricator)" build_path = /obj/machinery/mecha_part_fabricator board_type = "machine" - origin_tech = "programming=3;engineering=3" + origin_tech = "programming=2;engineering=2" frame_desc = "Requires 2 Matter Bins, 1 Manipulator, 1 Micro-Laser and 1 Console Screen." req_components = list( /obj/item/weapon/stock_parts/matter_bin = 2, @@ -669,7 +656,7 @@ obj/item/weapon/circuitboard/rdserver name = "Circuit board (Spacepod Fabricator)" build_path = /obj/machinery/spod_part_fabricator //ah fuck my life board_type = "machine" - origin_tech = "programming=3;engineering=3" + origin_tech = "programming=2;engineering=2" frame_desc = "Requires 3 Matter Bins, 2 Manipulators, 2 Micro-Lasers, and 1 Console Screen." req_components = list( /obj/item/weapon/stock_parts/matter_bin = 3, @@ -682,7 +669,7 @@ obj/item/weapon/circuitboard/rdserver name = "Circuit board (Clone Pod)" build_path = /obj/machinery/clonepod board_type = "machine" - origin_tech = "programming=3;biotech=3" + origin_tech = "programming=2;biotech=2" frame_desc = "Requires 2 Manipulator, 2 Scanning Module, 2 pieces of cable and 1 Console Screen." req_components = list( /obj/item/stack/cable_coil = 2, @@ -707,7 +694,7 @@ obj/item/weapon/circuitboard/rdserver name = "circuit board (Mech Bay Recharger)" build_path = /obj/machinery/mech_bay_recharge_port board_type = "machine" - origin_tech = "programming=3;powerstorage=4;engineering=4" + origin_tech = "programming=3;powerstorage=3;engineering=3" frame_desc = "Requires 1 piece of cable and 5 Capacitors." req_components = list( /obj/item/stack/cable_coil = 1, @@ -717,7 +704,7 @@ obj/item/weapon/circuitboard/rdserver name = "circuit board (Teleporter Hub)" build_path = /obj/machinery/teleport/hub board_type = "machine" - origin_tech = "programming=3;engineering=5;bluespace=5;materials=4" + origin_tech = "programming=3;engineering=4;bluespace=4;materials=4" frame_desc = "Requires 3 Bluespace Crystals and 1 Matter Bin." req_components = list( /obj/item/weapon/ore/bluespace_crystal = 3, @@ -727,7 +714,7 @@ obj/item/weapon/circuitboard/rdserver name = "circuit board (Teleporter Station)" build_path = /obj/machinery/teleport/station board_type = "machine" - origin_tech = "programming=4;engineering=4;bluespace=4" + origin_tech = "programming=4;engineering=4;bluespace=4;plasmatech=3" frame_desc = "Requires 2 Bluespace Crystals, 2 Capacitors and 1 Console Screen." req_components = list( /obj/item/weapon/ore/bluespace_crystal = 2, @@ -738,7 +725,7 @@ obj/item/weapon/circuitboard/rdserver name = "circuit board (Permanent Teleporter)" build_path = /obj/machinery/teleport/perma board_type = "machine" - origin_tech = "programming=3;engineering=5;bluespace=5;materials=4" + origin_tech = "programming=3;engineering=4;bluespace=4;materials=4" frame_desc = "Requires 3 Bluespace Crystals and 1 Matter Bin." req_components = list( /obj/item/weapon/ore/bluespace_crystal = 3, @@ -749,7 +736,7 @@ obj/item/weapon/circuitboard/rdserver name = "Circuit board (Telepad)" build_path = /obj/machinery/telepad board_type = "machine" - origin_tech = "programming=4;engineering=3;materials=3;bluespace=4" + origin_tech = "programming=4;engineering=3;plasmatech=4;bluespace=4" frame_desc = "Requires 2 Bluespace Crystals, 1 Capacitor, 1 piece of cable and 1 Console Screen." req_components = list( /obj/item/weapon/ore/bluespace_crystal = 2, @@ -773,7 +760,7 @@ obj/item/weapon/circuitboard/rdserver name = "circuit board (Sleeper)" build_path = /obj/machinery/sleeper board_type = "machine" - origin_tech = "programming=3;biotech=2;engineering=3;materials=3" + origin_tech = "programming=3;biotech=2;engineering=3" frame_desc = "Requires 1 Matter Bin, 1 Manipulator, 1 piece of cable and 2 Console Screens." req_components = list( /obj/item/weapon/stock_parts/matter_bin = 1, @@ -794,7 +781,7 @@ obj/item/weapon/circuitboard/rdserver name = "circuit board (Body Scanner)" build_path = /obj/machinery/bodyscanner board_type = "machine" - origin_tech = "programming=3;biotech=2;engineering=3;materials=3" + origin_tech = "programming=3;biotech=2;engineering=3" frame_desc = "Requires 1 Scanning Module, 2 pieces of cable and 2 Console Screens." req_components = list( /obj/item/weapon/stock_parts/scanning_module = 1, @@ -805,7 +792,7 @@ obj/item/weapon/circuitboard/rdserver name = "circuit board (Body Scanner Console)" build_path = /obj/machinery/body_scanconsole board_type = "machine" - origin_tech = "programming=3;biotech=2;engineering=3;materials=3" + origin_tech = "programming=3;biotech=2;engineering=3" frame_desc = "Requires 2 pieces of cable and 2 Console Screens." req_components = list( /obj/item/stack/cable_coil = 2, @@ -815,7 +802,7 @@ obj/item/weapon/circuitboard/rdserver name = "circuit board (Cryotube)" build_path = /obj/machinery/atmospherics/unary/cryo_cell board_type = "machine" - origin_tech = "programming=4;biotech=3;engineering=4" + origin_tech = "programming=4;biotech=3;engineering=4;plasmatech=3" frame_desc = "Requires 1 Matter Bin, 1 piece of cable and 4 Console Screens." req_components = list( /obj/item/weapon/stock_parts/matter_bin = 1, @@ -933,7 +920,7 @@ obj/item/weapon/circuitboard/rdserver name = "circuit board (Mining Equipment Vendor)" build_path = /obj/machinery/mineral/equipment_vendor board_type = "machine" - origin_tech = "programming=1;engineering=2" + origin_tech = "programming=1;engineering=3" req_components = list( /obj/item/weapon/stock_parts/console_screen = 1, /obj/item/weapon/stock_parts/matter_bin = 3) @@ -942,7 +929,7 @@ obj/item/weapon/circuitboard/rdserver name = "circuit board (Claw Game)" build_path = /obj/machinery/arcade/claw board_type = "machine" - origin_tech = "programming=2" + origin_tech = "programming=1" req_components = list( /obj/item/weapon/stock_parts/matter_bin = 1, /obj/item/weapon/stock_parts/manipulator = 1, @@ -953,7 +940,7 @@ obj/item/weapon/circuitboard/rdserver name = "circuit board (Prize Counter)" build_path = /obj/machinery/prize_counter board_type = "machine" - origin_tech = "programming=2;materials=2" + origin_tech = "programming=1" req_components = list( /obj/item/weapon/stock_parts/matter_bin = 1, /obj/item/weapon/stock_parts/manipulator = 1, @@ -964,7 +951,7 @@ obj/item/weapon/circuitboard/rdserver name = "circuit board (Virtual Gameboard)" build_path = /obj/machinery/gameboard board_type = "machine" - origin_tech = "programming=2" + origin_tech = "programming=1" req_components = list( /obj/item/weapon/stock_parts/micro_laser = 1, /obj/item/stack/cable_coil = 3, diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 789d4f81b1c..0478141abe3 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -126,12 +126,12 @@ /obj/item/weapon/circuitboard/cryopodcontrol name = "Circuit board (Cryogenic Oversight Console)" build_path = "/obj/machinery/computer/cryopod" - origin_tech = "programming=3" + origin_tech = "programming=1" /obj/item/weapon/circuitboard/robotstoragecontrol name = "Circuit board (Robotic Storage Console)" build_path = "/obj/machinery/computer/cryopod/robot" - origin_tech = "programming=3" + origin_tech = "programming=1" //Decorative structures to go alongside cryopods. /obj/structure/cryofeed @@ -316,9 +316,7 @@ if(istype(W,/obj/item/device/pda)) var/obj/item/device/pda/P = W - if(P.id) - qdel(P.id) - P.id = null + QDEL_NULL(P.id) qdel(P) if(!preserve) @@ -421,8 +419,7 @@ occupant.ghostize(0) // Players despawned too early may not re-enter the game else occupant.ghostize(1) - qdel(occupant) - occupant = null + QDEL_NULL(occupant) name = initial(name) diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm index b39e3798ae1..fd18985d9fa 100644 --- a/code/game/machinery/doors/airlock_electronics.dm +++ b/code/game/machinery/doors/airlock_electronics.dm @@ -4,9 +4,9 @@ name = "airlock electronics" icon = 'icons/obj/doors/door_assembly.dmi' icon_state = "door_electronics" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL materials = list(MAT_METAL=50, MAT_GLASS=50) - + origin_tech = "engineering=2;programming=1" req_access = list(access_engine) var/list/conf_access = null @@ -64,10 +64,10 @@ /obj/item/weapon/airlock_electronics/Topic(href, href_list) ..() - + if(usr.incapacitated() || (!ishuman(usr) && !isrobot(usr))) return 1 - + if(href_list["close"]) usr << browse(null, "window=airlock") return @@ -106,4 +106,3 @@ conf_access -= req if(!conf_access.len) conf_access = null - diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index 7ec9630a54c..68987b63ebd 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -28,9 +28,53 @@ var/list/obj/machinery/targets = list() var/timetoset = 0 // Used to set releasetime upon starting the timer var/obj/item/device/radio/Radio + var/printed = 0 + var/datum/data/record/prisoner maptext_height = 26 maptext_width = 32 +/obj/machinery/door_timer/proc/print_report() + var/logname = input(usr, "Name of the guilty?","[id] log name") + var/logcharges = stripped_multiline_input(usr, "What have they been charged with?","[id] log charges") + + if(!logname || !logcharges) + return 0 + + for(var/obj/machinery/computer/prisoner/C in prisoncomputer_list) + var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(C.loc) + P.name = "[id] log - [logname] [worldtime2text()]" + P.info = "
    [id] - Brig record



    " + P.info += {"
    [station_name()] - Security Department

    +
    Admission data:

    + Log generated at: [worldtime2text()]
    + Detainee: [logname]
    + Duration: [timetoset/10] seconds
    + Charge(s): [logcharges]
    + Arresting Officer: [usr.name]


    + This log file was generated automatically upon activation of a cell timer."} + + playsound(C.loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1) + cell_logs += P + + var/datum/data/record/R = find_security_record("name", logname) + Radio.autosay("Detainee [logname] has been incarcerated for [timetoset/10] seconds for the charges of, '[logcharges]'. \ + Arresting Officer: [usr.name].[R ? "" : " Detainee record not found, manual record update required."]", name, "Security", list(z)) + + if(R) + prisoner = R + R.fields["criminal"] = "Incarcerated" + var/mob/living/carbon/human/M = usr + var/rank = "UNKNOWN RANK" + if(istype(M) && M.wear_id) + var/obj/item/weapon/card/id/I = M.wear_id + rank = I.assignment + if(!R.fields["comments"] || !islist(R.fields["comments"])) //copied from security computer code because apparently these need to be initialized + R.fields["comments"] = list() + R.fields["comments"] += "Autogenerated by [name] on [current_date_string] [worldtime2text()]
    Sentenced to [timetoset/10] seconds for the charges of \"[logcharges]\" by [rank] [usr.name]." + update_all_mob_security_hud() + + return 1 + /obj/machinery/door_timer/initialize() ..() @@ -66,6 +110,7 @@ /obj/machinery/door_timer/Destroy() QDEL_NULL(Radio) targets.Cut() + prisoner = null return ..() //Main door timer loop, if it's timing and time is >0 reduce time by 1. @@ -98,9 +143,15 @@ // Closes and locks doors, power check /obj/machinery/door_timer/proc/timer_start() + if(stat & (NOPOWER|BROKEN)) return 0 + if(!printed) + if(!print_report()) + timing = 0 + return 0 + // Set releasetime releasetime = world.timeofday + timetoset if(!(src in machine_processing)) @@ -134,6 +185,11 @@ // Reset releasetime releasetime = 0 + printed = 0 + if(prisoner) + prisoner.fields["criminal"] = "Released" + update_all_mob_security_hud() + prisoner = null for(var/obj/machinery/door/window/brigdoor/door in targets) if(!door.density) @@ -262,6 +318,7 @@ timer_start() else timer_end() + Radio.autosay("Timer stopped manually by [usr.name].", name, "Security", list(z)) else if(href_list["tp"]) //adjust timer, close door if not already closed @@ -277,6 +334,7 @@ F.flash() if(href_list["change"]) + printed = 1 timer_start() add_fingerprint(usr) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index d6b295e1811..2b2039c9743 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -278,9 +278,9 @@ L.Weaken(5) else //for simple_animals & borgs L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) - var/turf/simulated/location = loc - if(istype(location, /turf/simulated)) //add_blood doesn't work for borgs/xenos, but add_blood_floor does. - location.add_blood_floor(L) + var/turf/location = get_turf(src) + L.add_splatter_floor(location) + /obj/machinery/door/proc/requiresID() return 1 diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index dbbe53055a4..bda658ef128 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -112,7 +112,7 @@ add_fingerprint(user) user.changeNext_move(CLICK_CD_MELEE) - if(can_force && (!glass || user.a_intent != I_HELP)) + if(can_force && (!glass || user.a_intent != INTENT_HELP)) user.visible_message("[user] begins forcing \the [src].", \ "You begin forcing \the [src].") if(do_after(user, force_open_time, target = src)) @@ -259,8 +259,9 @@ icon = 'icons/obj/doors/door_assembly.dmi' icon_state = "door_electronics" desc = "A circuit board used in construction of firelocks." - w_class = 2 + w_class = WEIGHT_CLASS_SMALL materials = list(MAT_METAL=50, MAT_GLASS=50) + origin_tech = "engineering=2;programming=1" toolspeed = 1 usesound = 'sound/items/Deconstruct.ogg' diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 2cd5f0a7a34..baaf936e189 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -167,18 +167,16 @@ ..() //When an object is thrown at the window -/obj/machinery/door/window/hitby(AM as mob|obj) - +/obj/machinery/door/window/hitby(atom/movable/AM) ..() var/tforce = 0 if(ismob(AM)) tforce = 40 - else - tforce = AM:throwforce + else if(isobj(AM)) + var/obj/O = AM + tforce = O.throwforce playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1) take_damage(tforce) - //..() //Does this really need to be here twice? The parent proc doesn't even do anything yet. - Nodrak - return /obj/machinery/door/window/mech_melee_attack(obj/mecha/M) if(M.damtype == "brute") diff --git a/code/game/machinery/dye_generator.dm b/code/game/machinery/dye_generator.dm index 73e590361a7..1d392d187cf 100644 --- a/code/game/machinery/dye_generator.dm +++ b/code/game/machinery/dye_generator.dm @@ -74,7 +74,7 @@ throw_speed = 4 throw_range = 7 force = 0 - w_class = 1 + w_class = WEIGHT_CLASS_TINY var/dye_color = "#FFFFFF" /obj/item/hair_dye_bottle/New() @@ -88,7 +88,7 @@ overlays += I /obj/item/hair_dye_bottle/attack(mob/living/carbon/M as mob, mob/user as mob) - if(user.a_intent != "help") + if(user.a_intent != INTENT_HELP) ..() return if(!(M in view(1))) diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index da85a864214..2c48f91b422 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -267,8 +267,9 @@ Just a object used in constructing fire alarms icon = 'icons/obj/doors/door_assembly.dmi' icon_state = "door_electronics" desc = "A circuit. It has a label on it, it says \"Can handle heat levels up to 40 degrees celsius!\"" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL materials = list(MAT_METAL=50, MAT_GLASS=50) + origin_tech = "engineering=2;programming=1" toolspeed = 1 usesound = 'sound/items/Deconstruct.ogg' diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 1b685f50197..58e4525a30c 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -51,7 +51,7 @@ /obj/machinery/flasher/attack_ai(mob/user) if(anchored) return flash() - + /obj/machinery/flasher/attack_ghost(mob/user) if(anchored && user.can_advanced_admin_interact()) return flash() @@ -92,7 +92,7 @@ if(istype(AM, /mob/living/carbon)) var/mob/living/carbon/M = AM - if((M.m_intent != "walk") && (anchored)) + if((M.m_intent != MOVE_INTENT_WALK) && (anchored)) flash() /obj/machinery/flasher/portable/attackby(obj/item/weapon/W as obj, mob/user as mob, params) @@ -119,11 +119,11 @@ anchored = 1.0 use_power = 1 idle_power_usage = 2 - active_power_usage = 4 - + active_power_usage = 4 + /obj/machinery/flasher_button/attack_ai(mob/user as mob) return attack_hand(user) - + /obj/machinery/flasher_button/attack_ghost(mob/user) if(user.can_advanced_admin_interact()) return attack_hand(user) @@ -150,4 +150,4 @@ sleep(50) icon_state = "launcherbtt" - active = 0 \ No newline at end of file + active = 0 diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index aa345e29643..6cb866d27ed 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -142,8 +142,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ /obj/machinery/hologram/holopad/proc/clear_holo() // hologram.set_light(0)//Clear lighting. //handled by the lighting controller when its ower is deleted - qdel(hologram)//Get rid of hologram. - hologram = null + QDEL_NULL(hologram)//Get rid of hologram. if(master.holo == src) master.holo = null master = null//Null the master, since no-one is using it now. diff --git a/code/game/machinery/holosign.dm b/code/game/machinery/holosign.dm index 3abbcef84ae..5ce444bcc09 100644 --- a/code/game/machinery/holosign.dm +++ b/code/game/machinery/holosign.dm @@ -36,7 +36,7 @@ /obj/machinery/holosign_switch name = "holosign switch" icon = 'icons/obj/power.dmi' - icon_state = "light1" + icon_state = "light0" desc = "A remote control switch for holosign." var/id = null var/active = 0 diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 26785e248b1..7ed7bc8dbc2 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -125,42 +125,15 @@ amount = min(amount, 4) // If the beaker is full, ping if(amount == 0) - if(prob(5)) - visible_message("[src] pings.") + if(prob(5)) visible_message("\The [src] pings.") return - var/mob/living/carbon/human/T = attached - - if(!ishuman(T)) - return - - if(!T.dna) - return - - if(NOCLONE in T.mutations) - return - - if(T.species.flags & NO_BLOOD) - return - - if(T.species.exotic_blood) - T.vessel.trans_to(beaker, amount) - update_icon() - else - var/datum/reagent/B = T.take_blood(beaker, amount) - - if(B) - beaker.reagents.reagent_list |= B - beaker.reagents.update_total() - beaker.on_reagent_change() - beaker.reagents.handle_reactions() - update_icon() - - // If attached is losing too much blood, beep. - var/blood_type = attached.get_blood_name() - if(T.vessel.get_reagent_amount(blood_type) < BLOOD_VOLUME_SAFE && prob(5)) - visible_message("[src] beeps loudly.") + // If the human is losing too much blood, beep. + if(attached.blood_volume < BLOOD_VOLUME_SAFE && prob(5)) + visible_message("\The [src] beeps loudly.") playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) + attached.transfer_blood_to(beaker, amount) + update_icon() /obj/machinery/iv_drip/attack_hand(mob/user) if(!ishuman(user)) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 514b5459973..901ea27a7df 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -404,8 +404,6 @@ Class Procs: on_deconstruction() spawn_frame() for(var/obj/item/I in component_parts) - if(I.reliability != 100 && crit_fail) - I.crit_fail = 1 I.forceMove(loc) qdel(src) diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 6040f72ab6b..f7272e8e29a 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -68,6 +68,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co #define NEWSCASTER_D_NOTICE_FC 9 // D-Notice feed channel #define NEWSCASTER_W_ISSUE_H 10 // Wanted Issue handler #define NEWSCASTER_W_ISSUE 11 // STATIONWIDE WANTED ISSUE +#define NEWSCASTER_JOBS 12 // Available jobs /obj/machinery/newscaster name = "newscaster" @@ -94,6 +95,21 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co var/silence = 0 var/temp = null var/temp_back_screen = NEWSCASTER_MAIN + var/list/jobblacklist = list( + /datum/job/ai, + /datum/job/cyborg, + /datum/job/captain, + /datum/job/judge, + /datum/job/blueshield, + /datum/job/nanotrasenrep, + /datum/job/pilot, + /datum/job/brigdoc, + /datum/job/mechanic, + /datum/job/barber, + /datum/job/chaplain, + /datum/job/ntnavyofficer, + /datum/job/ntspecops, + /datum/job/civilian) var/static/REDACTED = "\[REDACTED\]" light_range = 0 @@ -252,6 +268,14 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co data["criminal"] = news_network.wanted_issue.author data["description"] = news_network.wanted_issue.body data["photo"] = news_network.wanted_issue.img ? icon2base64(news_network.wanted_issue.img) : 0 + if(12) + var/list/jobs = list() + data["jobs"] = jobs + for(var/datum/job/job in job_master.occupations) + if(job_blacklisted(job)) + continue + if(job.is_position_available()) + jobs[++jobs.len] = list("title" = job.title) return data /obj/machinery/newscaster/Topic(href, href_list) @@ -535,6 +559,9 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co if(can_scan(usr)) scan_user(usr) //Newscaster scans you + else if(href_list["jobs"]) + screen = NEWSCASTER_JOBS + nanomanager.update_uis(src) return 1 @@ -607,7 +634,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co desc = "An issue of The Griffon, the newspaper circulating aboard Nanotrasen Space Stations." icon = 'icons/obj/bureaucracy.dmi' icon_state = "newspaper" - w_class = 2 //Let's make it fit in trashbags! + w_class = WEIGHT_CLASS_SMALL //Let's make it fit in trashbags! attack_verb = list("bapped") var/screen = 0 var/pages = 0 @@ -748,6 +775,9 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co ////////////////////////////////////helper procs +/obj/machinery/newscaster/proc/job_blacklisted(datum/job/job) + return (job.type in jobblacklist) + /obj/machinery/newscaster/proc/scan_user(mob/user) if(ishuman(user)) //User is a human var/mob/living/carbon/human/human_user = user diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 5bd7861623b..c83d32e7ac7 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -49,7 +49,7 @@ icon = 'icons/obj/pipe-item.dmi' icon_state = "simple" item_state = "buildpipe" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL level = 2 var/flipped = 0 @@ -635,7 +635,7 @@ icon = 'icons/obj/pipe-item.dmi' icon_state = "meter" item_state = "buildpipe" - w_class = 4 + w_class = WEIGHT_CLASS_BULKY /obj/item/pipe_meter/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params) ..() @@ -656,7 +656,7 @@ icon = 'icons/obj/stationobjs.dmi' icon_state = "gsensor0" item_state = "buildpipe" - w_class = 4 + w_class = WEIGHT_CLASS_BULKY /obj/item/pipe_gsensor/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) ..() diff --git a/code/game/machinery/podmen.dm b/code/game/machinery/podmen.dm deleted file mode 100644 index af24a856115..00000000000 --- a/code/game/machinery/podmen.dm +++ /dev/null @@ -1,136 +0,0 @@ -/* Moved all the plant people code here for ease of reference and coherency. -Injecting a pod person with a blood sample will grow a pod person with the memories and persona of that mob. -Growing it to term with nothing injected will grab a ghost from the observers. */ - -/obj/item/seeds/replicapod - name = "pack of dionaea-replicant seeds" - desc = "These seeds grow into 'replica pods' or 'dionaea', a form of strange sapient plantlife." - icon_state = "seed-replicapod" - mypath = "/obj/item/seeds/replicapod" - species = "replicapod" - plantname = "Dionaea" - productname = "/mob/living/carbon/human" //verrry special -- Urist - lifespan = 50 //no idea what those do - endurance = 8 - maturation = 5 - production = 10 - yield = 1 //seeds if there isn't a dna inside - oneharvest = 1 - potency = 30 - plant_type = 0 - growthstages = 6 - var/ckey = null - var/realName = null - var/mob/living/carbon/human/source //Donor of blood, if any. - gender = MALE - var/obj/machinery/hydroponics/parent = null - var/found_player = 0 - var/beingharvested = 0 - -/obj/item/seeds/replicapod/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - - if(istype(W,/obj/item/weapon/reagent_containers)) - - to_chat(user, "You inject the contents of the syringe into the seeds.") - - var/datum/reagent/blood/B - - //Find a blood sample to inject. - for(var/datum/reagent/R in W:reagents.reagent_list) - if(istype(R,/datum/reagent/blood)) - B = R - break - if(B) - source = B.data["donor"] - to_chat(user, "The strange, sluglike seeds quiver gently and swell with blood.") - if(!source.client && source.mind) - for(var/mob/O in respawnable_list) - if(O.mind == source.mind && config.revival_pod_plants) - switch(alert(O,"Your corpse has been placed into a pod plant. Do you want to be resurrected/cloned? Please note if you select 'No', you will still be able to be cloned or borged again this round.","Pod Alert","Yes","No")) - if("Yes") - source.key = O.key - return - if("No") - to_chat(user, "The seeds seem to reject the blood, returning to their original size as they stop quivering.") - return - else - to_chat(user, "Nothing happens.") - return - - if(!istype(source)) - return - - if(source.ckey) - realName = source.real_name - ckey = source.ckey - - W:reagents.clear_reagents() - return - - return ..() - -/obj/item/seeds/replicapod/harvest(mob/user = usr) - - parent = loc -// var/found_player = 0 - - - if(beingharvested) - to_chat(user, ("You can only harvest the pod once!")) - else - user.visible_message("[user] carefully begins to open the pod...","You carefully begin to open the pod...") - beingharvested = 1 - - //If a sample is injected (and revival is allowed) the plant will be controlled by the original donor. - if(source && source.stat == 2 && source.client && source.ckey && config.revival_pod_plants) - transfer_personality(source.client) - else // If no sample was injected or revival is not allowed, we grab an interested observer. - transfer_personality() - -/obj/item/seeds/replicapod/proc/transfer_personality(var/client/player) - - if(player) - found_player = 1 - var/mob/living/carbon/monkey/diona/podman = new(parent.loc) - podman.ckey = player.ckey - respawnable_list -= player - if(player.mob && player.mob.mind) - player.mob.mind.transfer_to(podman) - - if(realName) - podman.real_name = realName - else - podman.real_name = "diona nymph ([rand(100,999)])" - - podman.dna.real_name = podman.real_name - - // Update mode specific HUD icons. - callHook("harvest_podman", list(podman)) - - switch(ticker.mode.name) - if("revolution") - if(podman.mind in ticker.mode:revolutionaries) - ticker.mode:add_revolutionary(podman.mind) - ticker.mode:update_all_rev_icons() //So the icon actually appears - if(podman.mind in ticker.mode:head_revolutionaries) - ticker.mode:update_all_rev_icons() - if("nuclear emergency") - if(podman.mind in ticker.mode:syndicates) - ticker.mode:update_all_synd_icons() - if("cult") - if(podman.mind in ticker.mode:cult) - ticker.mode:add_cultist(podman.mind) - ticker.mode:update_all_cult_icons() //So the icon actually appears - // -- End mode specific stuff - - to_chat(podman, "You awaken slowly, feeling your sap stir into sluggish motion as the warm air caresses your bark.") - if(source && ckey && podman.ckey == ckey) - to_chat(podman, "Memories of a life as [source] drift oddly through a mind unsuited for them, like a skin of oil over a fathomless lake.") - to_chat(podman, "You are now one of the Dionaea, a race of drifting interstellar plantlike creatures that sometimes share their seeds with human traders.") - to_chat(podman, "Too much darkness will send you into shock and starve you, but light will help you heal.") - - else - new /mob/living/carbon/monkey/diona(parent.loc) - - parent.visible_message("The pod disgorges a fully-formed plant creature!") - parent.update_tray() diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 03f5cc1f8c8..0f19d5c42ff 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -65,6 +65,7 @@ var/has_cover = 1 //Hides the cover /obj/machinery/porta_turret/centcom + name = "Centcom Turret" enabled = 0 ailock = 1 check_synth = 0 @@ -74,6 +75,14 @@ check_weapons = 1 check_anomalies = 1 +/obj/machinery/porta_turret/centcom/pulse + name = "Pulse Turret" + health = 200 + enabled = 1 + lethal = 1 + req_access = list(access_cent_commander) + installation = /obj/item/weapon/gun/energy/pulse/turret + /obj/machinery/porta_turret/stationary ailock = 1 lethal = 1 @@ -149,6 +158,10 @@ eshot_sound = 'sound/weapons/Laser.ogg' egun = 1 + if(/obj/item/weapon/gun/energy/pulse/turret) + eprojectile = /obj/item/projectile/beam/pulse + eshot_sound = 'sound/weapons/pulse.ogg' + var/list/turret_icons /obj/machinery/porta_turret/update_icon() if(!turret_icons) diff --git a/code/game/machinery/programmable_unloader.dm b/code/game/machinery/programmable_unloader.dm index c86d745c05a..039e894b86d 100644 --- a/code/game/machinery/programmable_unloader.dm +++ b/code/game/machinery/programmable_unloader.dm @@ -501,7 +501,7 @@ to_chat(H, "The boxing machine refuses to acknowledge you unless you face it head on!") return var/damage = 0 - if(H.a_intent != I_HARM) + if(H.a_intent != INTENT_HARM) damage += rand(0,5) else damage += rand(0,10) @@ -551,7 +551,7 @@ name = "Circuit board (Programmable Unloader)" build_path = "/obj/machinery/programmable" board_type = "machine" - origin_tech = "engineering=3;programming=6" + origin_tech = "engineering=1;programming=2" frame_desc = "Requires 2 Manipulators, 1 Scanning Module, 1 Cable." req_components = list( /obj/item/weapon/stock_parts/scanning_module = 1, diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index f0a635c73a8..1e0f416bb0d 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -220,9 +220,6 @@ var/i = 1 for(1, i <= coeff, i++) LR.Charge(occupant) - if(istype(O,/obj/item/weapon/mop/advanced)) - if(O.reagents.get_reagent_amount("water") < 40) - O.reagents.add_reagent("water", 0.5 * coeff) if(R) if(R.module) R.module.respawn_consumable(R) diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 698c1c5fe91..9cf58846feb 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -168,7 +168,7 @@ var/const/SAFETY_COOLDOWN = 100 gib = 0 if(L.stat == CONSCIOUS) L.say("ARRRRRRRRRRRGH!!!") - add_blood(L) + add_mob_blood(L) if(!blood && !issilicon(L)) blood = 1 diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 476162a27a1..21e91f3759b 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -19,6 +19,14 @@ #define RCS_SHIPPING 9 // Print Shipping Labels/Packages #define RCS_SHIP_LOG 10 // View Shipping Label Log +//Radio list +#define ENGI_ROLES list("Atmospherics","Mechanic","Engineering","Chief Engineer's Desk","Telecoms Admin") +#define SEC_ROLES list("Warden","Security","Brig Medbay","Head of Security's Desk") +#define MISC_ROLES list("Bar","Chapel","Kitchen","Hydroponics","Janitorial") +#define MED_ROLES list("Virology","Chief Medical Officer's Desk","Medbay") +#define COM_ROLES list("Blueshield","NT Representative","Head of Personnel's Desk","Captain's Desk","Bridge") +#define SCI_ROLES list("Robotics","Science","Research Director's Desk") + var/req_console_assistance = list() var/req_console_supplies = list() var/req_console_information = list() @@ -58,6 +66,8 @@ var/list/obj/machinery/requests_console/allConsoles = list() var/ship_tag_name = "" var/ship_tag_index = 0 var/print_cooldown = 0 //cooldown on shipping label printer, stores the in-game time of when the printer will next be ready + var/obj/item/device/radio/Radio + var/radiochannel = "" /obj/machinery/requests_console/power_change() ..() @@ -71,6 +81,10 @@ var/list/obj/machinery/requests_console/allConsoles = list() icon_state = "req_comp[newmessagepriority]" /obj/machinery/requests_console/New() + Radio = new /obj/item/device/radio(src) + Radio.listening = 1 + Radio.config(list("Engineering","Medical","Supply","Command","Science","Service","Security", "AI Private" = 0)) + Radio.follow_target = src ..() announcement.title = "[department] announcement" @@ -101,6 +115,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() req_console_supplies -= department if(departmentType & RC_INFO) req_console_information -= department + QDEL_NULL(Radio) return ..() /obj/machinery/requests_console/attack_ghost(user as mob) @@ -189,7 +204,24 @@ var/list/obj/machinery/requests_console/allConsoles = list() pass = 1 if(pass) screen = RCS_SENTPASS - message_log += "Message sent to [recipient]
    [message]" + if(recipient in ENGI_ROLES) + radiochannel = "Engineering" + if(recipient in SEC_ROLES) + radiochannel = "Security" + if(recipient in MISC_ROLES) + radiochannel = "Service" + if(recipient in MED_ROLES) + radiochannel = "Medical" + if(recipient in COM_ROLES) + radiochannel = "Command" + if(recipient in SCI_ROLES) + radiochannel = "Science" + if(recipient == "AI") + radiochannel = "AI Private" + if(recipient == "Cargo Bay") + radiochannel = "Supply" + message_log += "Message sent to [recipient] at [worldtime2text()]
    [message]" + Radio.autosay("Alert; a new requests console message received for [recipient] from [department]", null, "[radiochannel]") else audible_message(text("[bicon(src)] *The Requests Console beeps: 'NOTICE: No server detected!'"),,4) diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index ff319d5037d..071ae52c942 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -94,51 +94,49 @@ /obj/machinery/shield/hitby(AM as mob|obj) - - //Super realistic, resource-intensive, real-time damage calculations. + ..() var/tforce = 0 if(ismob(AM)) tforce = 40 - else - tforce = AM:throwforce + else if(isobj(AM)) + var/obj/O = AM + tforce = O.throwforce - src.health -= tforce + health -= tforce //This seemed to be the best sound for hitting a force field. - playsound(src.loc, 'sound/effects/EMPulse.ogg', 100, 1) + playsound(loc, 'sound/effects/EMPulse.ogg', 100, 1) //Handle the destruction of the shield - if(src.health <= 0) + if(health <= 0) visible_message("The [src] dissipates") qdel(src) return //The shield becomes dense to absorb the blow.. purely asthetic. opacity = 1 - spawn(20) if(src) opacity = 0 - - ..() - return - + spawn(20) + if(src) + opacity = 0 /obj/machinery/shieldgen - name = "Emergency shield projector" - desc = "Used to seal minor hull breaches." - icon = 'icons/obj/objects.dmi' - icon_state = "shieldoff" - density = 1 - opacity = 0 - anchored = 0 - pressure_resistance = 2*ONE_ATMOSPHERE - req_access = list(access_engine) - var/const/max_health = 100 - var/health = max_health - var/active = 0 - var/malfunction = 0 //Malfunction causes parts of the shield to slowly dissapate - var/list/deployed_shields = list() - var/is_open = 0 //Whether or not the wires are exposed - var/locked = 0 + name = "Emergency shield projector" + desc = "Used to seal minor hull breaches." + icon = 'icons/obj/objects.dmi' + icon_state = "shieldoff" + density = 1 + opacity = 0 + anchored = 0 + pressure_resistance = 2*ONE_ATMOSPHERE + req_access = list(access_engine) + var/const/max_health = 100 + var/health = max_health + var/active = 0 + var/malfunction = 0 //Malfunction causes parts of the shield to slowly dissapate + var/list/deployed_shields = list() + var/is_open = 0 //Whether or not the wires are exposed + var/locked = 0 /obj/machinery/shieldgen/Destroy() QDEL_LIST(deployed_shields) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index eee465e062a..4fe0d47f12c 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -948,7 +948,7 @@ occupant.take_organ_damage(0,radiation_level*2 + rand(1,3)) if(radiation_level > 1) occupant.take_organ_damage(0,radiation_level + rand(1,3)) - occupant.radiation += radiation_level*10 + occupant.apply_effect(radiation_level*10, IRRADIATE) /obj/machinery/suit_cycler/proc/finished_job() var/turf/T = get_turf(src) diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 8fb2d173b6f..153fc50bf91 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -1,3 +1,6 @@ +#define BUTTON_COOLDOWN 60 // cant delay the bomb forever +#define BUTTON_DELAY 50 //five seconds + /obj/machinery/syndicatebomb icon = 'icons/obj/assemblies.dmi' name = "syndicate bomb" @@ -6,71 +9,119 @@ anchored = 0 density = 0 - layer = MOB_LAYER - 0.1 //so people can't hide it and it's REALLY OBVIOUS + layer = BELOW_MOB_LAYER //so people can't hide it and it's REALLY OBVIOUS unacidable = 1 var/datum/wires/syndicatebomb/wires = null - var/timer = 120 - var/open_panel = 0 //are the wires exposed? - var/active = 0 //is the bomb counting down? - var/defused = 0 //is the bomb capable of exploding? - var/obj/item/weapon/bombcore/payload = /obj/item/weapon/bombcore/ + var/minimum_timer = 90 + var/timer_set = 90 + var/maximum_timer = 60000 + + var/can_unanchor = TRUE + + var/open_panel = FALSE //are the wires exposed? + var/active = FALSE //is the bomb counting down? + var/defused = FALSE //is the bomb capable of exploding? + var/obj/item/weapon/bombcore/payload = /obj/item/weapon/bombcore var/beepsound = 'sound/items/timer.ogg' + var/delayedbig = FALSE //delay wire pulsed? + var/delayedlittle = FALSE //activation wire pulsed? + var/obj/effect/countdown/syndicatebomb/countdown + + var/next_beep + var/detonation_timer + var/explode_now = FALSE + +/obj/machinery/syndicatebomb/proc/try_detonate(ignore_active = FALSE) + . = (payload in src) && (active || ignore_active) && !defused + if(.) + payload.detonate() /obj/machinery/syndicatebomb/process() - if(active && !defused && (timer > 0)) //Tick Tock - var/volume = (timer <= 20 ? 40 : 10) // Tick louder when the bomb is closer to being detonated. - playsound(loc, beepsound, volume, 0) - timer = max(timer - 2,0) // 2 seconds per process() - if(active && !defused && (timer <= 0)) //Boom - active = 0 - timer = 120 - update_icon() - if(payload in src) - payload.detonate() + if(!active) + fast_processing -= src + detonation_timer = null + next_beep = null + countdown.stop() return - if(!active || defused) //Counter terrorists win + + if(!isnull(next_beep) && (next_beep <= world.time)) + var/volume + switch(seconds_remaining()) + if(0 to 5) + volume = 50 + if(5 to 10) + volume = 40 + if(10 to 15) + volume = 30 + if(15 to 20) + volume = 20 + if(20 to 25) + volume = 10 + else + volume = 5 + playsound(loc, beepsound, volume, 0) + next_beep = world.time + 10 + + if(active && !defused && ((detonation_timer <= world.time) || explode_now)) + active = FALSE + timer_set = initial(timer_set) + update_icon() + try_detonate(TRUE) + //Counter terrorists win + else if(!active || defused) if(defused && payload in src) payload.defuse() - return + countdown.stop() + fast_processing -= src /obj/machinery/syndicatebomb/New() wires = new(src) - payload = new payload(src) + if(payload) + payload = new payload(src) update_icon() + countdown = new(src) ..() /obj/machinery/syndicatebomb/Destroy() QDEL_NULL(wires) + QDEL_NULL(countdown) + fast_processing -= src return ..() /obj/machinery/syndicatebomb/examine(mob/user) ..(user) - to_chat(user, "A digital display on it reads \"[timer]\".") + to_chat(user, "A digital display on it reads \"[seconds_remaining()]\".") /obj/machinery/syndicatebomb/update_icon() icon_state = "[initial(icon_state)][active ? "-active" : "-inactive"][open_panel ? "-wires" : ""]" -/obj/machinery/syndicatebomb/attackby(var/obj/item/I, var/mob/user, params) - if(istype(I, /obj/item/weapon/wrench)) +/obj/machinery/syndicatebomb/proc/seconds_remaining() + if(active) + . = max(0, round((detonation_timer - world.time) / 10)) + else + . = timer_set + +/obj/machinery/syndicatebomb/attackby(obj/item/I, mob/user, params) + if(iswrench(I) && can_unanchor) if(!anchored) - if(!isturf(src.loc) || istype(src.loc, /turf/space)) - to_chat(user, "The bomb must be placed on solid ground to attach it") + if(!isturf(loc) || isspaceturf(loc)) + to_chat(user, "The bomb must be placed on solid ground to attach it.") else - to_chat(user, "You firmly wrench the bomb to the floor") + to_chat(user, "You firmly wrench the bomb to the floor.") playsound(loc, I.usesound, 50, 1) anchored = 1 if(active) - to_chat(user, "The bolts lock in place") + to_chat(user, "The bolts lock in place.") else if(!active) - to_chat(user, "You wrench the bomb from the floor") + to_chat(user, "You wrench the bomb from the floor.") playsound(loc, I.usesound, 50, 1) anchored = 0 else to_chat(user, "The bolts are locked down!") - else if(istype(I, /obj/item/weapon/screwdriver)) + else if(isscrewdriver(I)) open_panel = !open_panel update_icon() to_chat(user, "You [open_panel ? "open" : "close"] the wire panel.") @@ -79,28 +130,47 @@ if(open_panel) wires.Interact(user) - else if(istype(I, /obj/item/weapon/crowbar)) - if(open_panel && isWireCut(WIRE_BOOM) && isWireCut(WIRE_UNBOLT) && isWireCut(WIRE_DELAY) && isWireCut(WIRE_PROCEED) && isWireCut(WIRE_ACTIVATE)) + else if(iscrowbar(I)) + if(open_panel && wires.IsAllCut()) if(payload) to_chat(user, "You carefully pry out [payload].") payload.loc = user.loc payload = null else - to_chat(user, "There isn't anything in here to remove!") + to_chat(user, "There isn't anything in here to remove!") else if(open_panel) - to_chat(user, "The wires connecting the shell to the explosives are holding it down!") + to_chat(user, "The wires connecting the shell to the explosives are holding it down!") else - to_chat(user, "The cover is screwed on, it won't pry off!") + to_chat(user, "The cover is screwed on, it won't pry off!") else if(istype(I, /obj/item/weapon/bombcore)) if(!payload) + if(!user.drop_item()) + return payload = I to_chat(user, "You place [payload] into [src].") - user.drop_item() - payload.loc = src + payload.forceMove(src) else to_chat(user, "[payload] is already loaded into [src], you'll have to remove it first.") + else if(iswelder(I)) + if(payload || !wires.IsAllCut() || !open_panel) + return + var/obj/item/weapon/weldingtool/WT = I + if(!WT.isOn()) + return + if(WT.get_fuel() < 5) //uses up 5 fuel. + to_chat(user, "You need more fuel to complete this task!") + return + + playsound(loc, WT.usesound, 50, 1) + to_chat(user, "You start to cut the [src] apart...") + if(do_after(user, 20*I.toolspeed, target = src)) + if(!WT.isOn() || !WT.remove_fuel(5, user)) + return + to_chat(user, "You cut the [src] apart.") + new /obj/item/stack/sheet/plasteel(loc, 5) + qdel(src) else - ..() + return ..() /obj/machinery/syndicatebomb/attack_ghost(mob/user) interact(user) @@ -133,21 +203,27 @@ return FALSE return TRUE +/obj/machinery/syndicatebomb/proc/activate() + active = TRUE + fast_processing += src + countdown.start() + next_beep = world.time + 10 + detonation_timer = world.time + (timer_set * 10) + playsound(loc, 'sound/machines/click.ogg', 30, 1) + /obj/machinery/syndicatebomb/proc/settings(mob/user) - var/newtime = input(user, "Please set the timer.", "Timer", "[timer]") as num - newtime = Clamp(newtime, 120, 60000) + var/new_timer = input(user, "Please set the timer.", "Timer", "[timer_set]") as num if(can_interact(user)) //No running off and setting bombs from across the station - timer = newtime - loc.visible_message("[bicon(src)] timer set for [timer] seconds.") + timer_set = Clamp(new_timer, minimum_timer, maximum_timer) + loc.visible_message("[bicon(src)] timer set for [timer_set] seconds.") if(alert(user,"Would you like to start the countdown now?",,"Yes","No") == "Yes" && can_interact(user)) if(defused || active) if(defused) loc.visible_message("[bicon(src)] Device error: User intervention required.") return else - loc.visible_message("[bicon(src)] [timer] seconds until detonation, please clear the area.") - playsound(loc, 'sound/machines/click.ogg', 30, 1) - active = 1 + loc.visible_message("[bicon(src)] [timer_set] seconds until detonation, please clear the area.") + activate() update_icon() add_fingerprint(user) @@ -167,12 +243,12 @@ name = "training bomb" icon_state = "training-bomb" desc = "A salvaged syndicate device gutted of its explosives to be used as a training aid for aspiring bomb defusers." - payload = /obj/item/weapon/bombcore/training/ + payload = /obj/item/weapon/bombcore/training /obj/machinery/syndicatebomb/badmin name = "generic summoning badmin bomb" desc = "Oh god what is in this thing?" - payload = /obj/item/weapon/bombcore/badmin/summon/ + payload = /obj/item/weapon/bombcore/badmin/summon /obj/machinery/syndicatebomb/badmin/clown name = "clown bomb" @@ -181,8 +257,23 @@ payload = /obj/item/weapon/bombcore/badmin/summon/clown beepsound = 'sound/items/bikehorn.ogg' -/obj/machinery/syndicatebomb/badmin/varplosion - payload = /obj/item/weapon/bombcore/badmin/explosion/ +/obj/machinery/syndicatebomb/empty + name = "bomb" + icon_state = "base-bomb" + desc = "An ominous looking device designed to detonate an explosive payload. Can be bolted down using a wrench." + payload = null + open_panel = TRUE + timer_set = 120 + +/obj/machinery/syndicatebomb/empty/New() + ..() + wires.CutAll() + +/obj/machinery/syndicatebomb/self_destruct + name = "self destruct device" + desc = "Do not taunt. Warranty invalid if exposed to high temperature. Not suitable for agents under 3 years of age." + payload = /obj/item/weapon/bombcore/large + can_unanchor = FALSE ///Bomb Cores/// @@ -192,21 +283,30 @@ icon = 'icons/obj/assemblies.dmi' icon_state = "bombcore" item_state = "eshield0" - w_class = 3 - origin_tech = "syndicate=6;combat=5" + w_class = WEIGHT_CLASS_NORMAL + origin_tech = "syndicate=5;combat=6" burn_state = FLAMMABLE //Burnable (but the casing isn't) var/adminlog = null + var/range_heavy = 3 + var/range_medium = 9 + var/range_light = 17 + var/range_flame = 17 /obj/item/weapon/bombcore/ex_act(severity) //Little boom can chain a big boom - src.detonate() + detonate() + + +/obj/item/weapon/bombcore/burn() + detonate() + ..() /obj/item/weapon/bombcore/proc/detonate() if(adminlog) message_admins(adminlog) log_game(adminlog) - explosion(get_turf(src),3,9,17, flame_range = 17) - if(src.loc && istype(src.loc,/obj/machinery/syndicatebomb/)) - qdel(src.loc) + explosion(get_turf(src), range_heavy, range_medium, range_light, flame_range = range_flame) + if(loc && istype(loc, /obj/machinery/syndicatebomb)) + qdel(loc) qdel(src) /obj/item/weapon/bombcore/proc/defuse() @@ -223,17 +323,20 @@ var/attempts = 0 /obj/item/weapon/bombcore/training/proc/reset() - var/obj/machinery/syndicatebomb/holder = src.loc + var/obj/machinery/syndicatebomb/holder = loc if(istype(holder)) if(holder.wires) holder.wires.Shuffle() holder.defused = 0 holder.open_panel = 0 + holder.delayedbig = FALSE + holder.delayedlittle = FALSE + holder.explode_now = FALSE holder.update_icon() holder.updateDialog() /obj/item/weapon/bombcore/training/detonate() - var/obj/machinery/syndicatebomb/holder = src.loc + var/obj/machinery/syndicatebomb/holder = loc if(istype(holder)) attempts++ holder.loc.visible_message("[bicon(holder)] Alert: Bomb has detonated. Your score is now [defusals] for [attempts]. Resetting wires...") @@ -242,7 +345,7 @@ qdel(src) /obj/item/weapon/bombcore/training/defuse() - var/obj/machinery/syndicatebomb/holder = src.loc + var/obj/machinery/syndicatebomb/holder = loc if(istype(holder)) attempts++ defusals++ @@ -257,11 +360,11 @@ origin_tech = null /obj/item/weapon/bombcore/badmin/defuse() //because we wouldn't want them being harvested by players - var/obj/machinery/syndicatebomb/B = src.loc + var/obj/machinery/syndicatebomb/B = loc qdel(B) qdel(src) -/obj/item/weapon/bombcore/badmin/summon/ +/obj/item/weapon/bombcore/badmin/summon var/summon_path = /obj/item/weapon/reagent_containers/food/snacks/cookie var/amt_summon = 1 @@ -285,42 +388,165 @@ playsound(src.loc, 'sound/misc/sadtrombone.ogg', 50) ..() -/obj/item/weapon/bombcore/badmin/explosion/ - var/HeavyExplosion = 2 - var/MediumExplosion = 5 - var/LightExplosion = 11 - var/Flames = 11 +/obj/item/weapon/bombcore/large + name = "large bomb payload" + range_heavy = 5 + range_medium = 10 + range_light = 20 + range_flame = 20 -/obj/item/weapon/bombcore/badmin/explosion/detonate() - explosion(get_turf(src),HeavyExplosion,MediumExplosion,LightExplosion, flame_range = Flames) +/obj/item/weapon/bombcore/large/underwall + layer = ABOVE_OPEN_TURF_LAYER /obj/item/weapon/bombcore/miniature name = "small bomb core" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL + range_heavy = 1 + range_medium = 2 + range_light = 4 + range_flame = 2 -/obj/item/weapon/bombcore/miniature/detonate() - explosion(src.loc,1,2,4,flame_range = 2) //Identical to a minibomb +/obj/item/weapon/bombcore/chemical + name = "chemical payload" + desc = "An explosive payload designed to spread chemicals, dangerous or otherwise, across a large area. It is able to hold up to four chemical containers, and must be loaded before use." + origin_tech = "combat=4;materials=3" + icon_state = "chemcore" + var/list/beakers = list() + var/max_beakers = 1 + var/spread_range = 5 + var/temp_boost = 50 + var/time_release = 0 + +/obj/item/weapon/bombcore/chemical/detonate() + + if(time_release > 0) + var/total_volume = 0 + for(var/obj/item/weapon/reagent_containers/RC in beakers) + total_volume += RC.reagents.total_volume + + if(total_volume < time_release) // If it's empty, the detonation is complete. + if(loc && istype(loc, /obj/machinery/syndicatebomb)) + qdel(loc) + qdel(src) + return + + var/fraction = time_release/total_volume + var/datum/reagents/reactants = new(time_release) + reactants.my_atom = src + for(var/obj/item/weapon/reagent_containers/RC in beakers) + RC.reagents.trans_to(reactants, RC.reagents.total_volume*fraction, 1, 1, 1) + chem_splash(get_turf(src), spread_range, list(reactants), temp_boost) + + // Detonate it again in one second, until it's out of juice. + addtimer(src, "detonate", 10) + + // If it's not a time release bomb, do normal explosion + + var/list/reactants = list() + + for(var/obj/item/weapon/reagent_containers/glass/G in beakers) + reactants += G.reagents + + for(var/obj/item/slime_extract/S in beakers) + if(S.Uses) + for(var/obj/item/weapon/reagent_containers/glass/G in beakers) + G.reagents.trans_to(S, G.reagents.total_volume) + + if(S && S.reagents && S.reagents.total_volume) + reactants += S.reagents + + if(!chem_splash(get_turf(src), spread_range, reactants, temp_boost)) + playsound(loc, 'sound/items/Screwdriver2.ogg', 50, 1) + return // The Explosion didn't do anything. No need to log, or disappear. + + if(adminlog) + message_admins(adminlog) + log_game(adminlog) + + playsound(loc, 'sound/effects/bamf.ogg', 75, 1, 5) + + if(loc && istype(loc, /obj/machinery/syndicatebomb)) + qdel(loc) qdel(src) +/obj/item/weapon/bombcore/chemical/attackby(obj/item/I, mob/user, params) + if(iscrowbar(I) && beakers.len > 0) + playsound(loc, I.usesound, 50, 1) + for (var/obj/item/B in beakers) + B.loc = get_turf(src) + beakers -= B + return + else if(istype(I, /obj/item/weapon/reagent_containers/glass/beaker) || istype(I, /obj/item/weapon/reagent_containers/glass/bottle)) + if(beakers.len < max_beakers) + if(!user.drop_item()) + return + beakers += I + to_chat(user, "You load [src] with [I].") + I.loc = src + else + to_chat(user, "The [I] wont fit! The [src] can only hold up to [max_beakers] containers.") + return + ..() + +/obj/item/weapon/bombcore/chemical/CheckParts(list/parts_list) + ..() + // Using different grenade casings, causes the payload to have different properties. + var/obj/item/weapon/stock_parts/matter_bin/MB = locate(/obj/item/weapon/stock_parts/matter_bin) in src + if(MB) + max_beakers += MB.rating // max beakers = 2-5. + qdel(MB) + for(var/obj/item/weapon/grenade/chem_grenade/G in src) + + if(istype(G, /obj/item/weapon/grenade/chem_grenade/large)) + var/obj/item/weapon/grenade/chem_grenade/large/LG = G + max_beakers += 1 // Adding two large grenades only allows for a maximum of 7 beakers. + spread_range += 2 // Extra range, reduced density. + temp_boost += 50 // maximum of +150K blast using only large beakers. Not enough to self ignite. + for(var/obj/item/slime_extract/S in LG.beakers) // And slime cores. + if(beakers.len < max_beakers) + beakers += S + S.loc = src + else + S.loc = get_turf(src) + + if(istype(G, /obj/item/weapon/grenade/chem_grenade/cryo)) + spread_range -= 1 // Reduced range, but increased density. + temp_boost -= 100 // minimum of -150K blast. + + if(istype(G, /obj/item/weapon/grenade/chem_grenade/pyro)) + temp_boost += 150 // maximum of +350K blast, which is enough to self ignite. Which means a self igniting bomb can't take advantage of other grenade casing properties. Sorry? + + if(istype(G, /obj/item/weapon/grenade/chem_grenade/adv_release)) + time_release += 50 // A typical bomb, using basic beakers, will explode over 2-4 seconds. Using two will make the reaction last for less time, but it will be more dangerous overall. + + for(var/obj/item/weapon/reagent_containers/glass/B in G) + if(beakers.len < max_beakers) + beakers += B + B.loc = src + else + B.loc = get_turf(src) + + qdel(G) + ///Syndicate Detonator (aka the big red button)/// /obj/item/device/syndicatedetonator name = "big red button" - desc = "Nothing good can come of pressing a button this garish..." + desc = "Your standard issue bomb synchronizing button. Five second safety delay to prevent 'accidents'." icon = 'icons/obj/assemblies.dmi' icon_state = "bigred" item_state = "electronic" - w_class = 1 - origin_tech = "syndicate=2" - var/cooldown = 0 + w_class = WEIGHT_CLASS_TINY + origin_tech = "syndicate=3" + var/timer = 0 var/detonated = 0 var/existant = 0 -/obj/item/device/syndicatedetonator/attack_self(mob/user as mob) - if(!cooldown) +/obj/item/device/syndicatedetonator/attack_self(mob/user) + if(timer < world.time) for(var/obj/machinery/syndicatebomb/B in machines) if(B.active) - B.timer = 0 + B.detonation_timer = world.time + BUTTON_DELAY detonated++ existant++ playsound(user, 'sound/machines/click.ogg', 20, 1) @@ -334,5 +560,7 @@ log_game("[key_name(user)] has remotely detonated [detonated ? "syndicate bombs" : "a syndicate bomb"] using a [name] at [A.name] ([T.x],[T.y],[T.z])") detonated = 0 existant = 0 - cooldown = 1 - spawn(30) cooldown = 0 \ No newline at end of file + timer = world.time + BUTTON_COOLDOWN + +#undef BUTTON_COOLDOWN +#undef BUTTON_DELAY \ No newline at end of file diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index db436bfb772..d730ca57529 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -68,8 +68,6 @@ // Drop all the component stuff if(component_parts) for(var/obj/I in component_parts) - if(I.reliability != 100 && crit_fail) - I.crit_fail = 1 I.loc = src.loc else // If the machine wasn't made during runtime, probably doesn't have components: diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm index 2aa0c2a5d59..592815bbc24 100644 --- a/code/game/machinery/telecomms/traffic_control.dm +++ b/code/game/machinery/telecomms/traffic_control.dm @@ -192,7 +192,7 @@ add_fingerprint(user) user.set_machine(src) - if(!allowed(user) && !emagged) + if(!allowed(user) && !emagged && !user.can_admin_interact()) to_chat(user, "Access Denied.") return 0 diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index e694ac98817..9033a74526a 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -546,12 +546,10 @@ to_chat(user, "You successfully pull the coin out before the [src] could swallow it.") else to_chat(user, "You weren't able to pull the coin out fast enough, the machine ate it, string and all.") - coin = null - qdel(coin) + QDEL_NULL(coin) categories &= ~CAT_COIN else - coin = null - qdel(coin) + QDEL_NULL(coin) categories &= ~CAT_COIN R.amount-- @@ -793,9 +791,9 @@ desc = "A self-serving Chinese food machine, for all your Chinese food needs." product_slogans = "Taste 5000 years of culture!" icon_state = "snack" - products = list(/obj/item/weapon/reagent_containers/food/snacks/chinese/chowmein = 6, /obj/item/weapon/reagent_containers/food/snacks/chinese/tao = 6, /obj/item/weapon/reagent_containers/food/snacks/chinese/newdles = 6, + products = list(/obj/item/weapon/reagent_containers/food/snacks/chinese/chowmein = 6, /obj/item/weapon/reagent_containers/food/snacks/chinese/tao = 6, /obj/item/weapon/reagent_containers/food/snacks/chinese/sweetsourchickenball = 6, /obj/item/weapon/reagent_containers/food/snacks/chinese/newdles = 6, /obj/item/weapon/reagent_containers/food/snacks/chinese/rice = 6) - prices = list(/obj/item/weapon/reagent_containers/food/snacks/chinese/chowmein = 50, /obj/item/weapon/reagent_containers/food/snacks/chinese/tao = 50, /obj/item/weapon/reagent_containers/food/snacks/chinese/newdles = 50, + prices = list(/obj/item/weapon/reagent_containers/food/snacks/chinese/chowmein = 50, /obj/item/weapon/reagent_containers/food/snacks/chinese/tao = 50, /obj/item/weapon/reagent_containers/food/snacks/chinese/sweetsourchickenball = 50, /obj/item/weapon/reagent_containers/food/snacks/chinese/newdles = 50, /obj/item/weapon/reagent_containers/food/snacks/chinese/rice = 50) refill_canister = /obj/item/weapon/vending_refill/chinese @@ -1066,7 +1064,9 @@ /obj/item/clothing/shoes/singerb = 1,/obj/item/clothing/under/singerb = 1, /obj/item/clothing/suit/hooded/carp_costume = 1,/obj/item/clothing/suit/hooded/bee_costume = 1, /obj/item/clothing/suit/snowman = 1,/obj/item/clothing/head/snowman = 1, - /obj/item/clothing/head/cueball = 1,/obj/item/clothing/under/scratch = 1) + /obj/item/clothing/head/cueball = 1,/obj/item/clothing/under/scratch = 1, + /obj/item/clothing/under/victdress = 1, /obj/item/clothing/under/victdress/red = 1, /obj/item/clothing/suit/victcoat = 1, /obj/item/clothing/suit/victcoat/red = 1, + /obj/item/clothing/under/victsuit = 1, /obj/item/clothing/under/victsuit/redblk = 1, /obj/item/clothing/under/victsuit/red = 1, /obj/item/clothing/suit/tailcoat = 1) contraband = list(/obj/item/clothing/suit/judgerobe = 1,/obj/item/clothing/head/powdered_wig = 1,/obj/item/weapon/gun/magic/wand = 1, /obj/item/clothing/mask/balaclava=1, /obj/item/clothing/mask/horsehead = 2) premium = list(/obj/item/clothing/suit/hgpirate = 1, /obj/item/clothing/head/hgpiratecap = 1, /obj/item/clothing/head/helmet/roman = 1, /obj/item/clothing/head/helmet/roman/legionaire = 1, /obj/item/clothing/under/roman = 1, /obj/item/clothing/shoes/roman = 1, /obj/item/weapon/shield/riot/roman = 1) refill_canister = /obj/item/weapon/vending_refill/autodrobe @@ -1278,7 +1278,7 @@ /obj/item/weapon/c_tube = 10,/obj/item/weapon/pen = 5,/obj/item/weapon/pen/blue = 5, /obj/item/weapon/pen/red = 5) contraband = list(/obj/item/toy/crayon/mime = 1,/obj/item/toy/crayon/rainbow = 1) - premium = list(/obj/item/weapon/contraband/poster = 5) + premium = list(/obj/item/weapon/poster/random_contraband = 5) /obj/machinery/vending/crittercare name = "\improper CritterCare" diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index e27a97c796c..c73d72d0c2d 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -172,8 +172,7 @@ H.item_color = wash_color H.name = new_softcap_name H.desc = new_desc - qdel(crayon) - crayon = null + QDEL_NULL(crayon) if( locate(/mob,contents) ) diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index 97b442a51da..a08f4bea77a 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -21,7 +21,7 @@ add_req_access = 0 internal_damage_threshold = 25 force = 45 - max_equip = 4 + max_equip = 5 /obj/mecha/combat/marauder/loaded/New() @@ -30,6 +30,8 @@ ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/xray(src) + ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) @@ -47,8 +49,8 @@ health = 550 wreckage = /obj/effect/decal/mecha_wreckage/seraph internal_damage_threshold = 20 - force = 55 - max_equip = 5 + force = 80 + max_equip = 8 /obj/mecha/combat/marauder/seraph/add_cell() cell = new /obj/item/weapon/stock_parts/cell/bluespace(src) @@ -62,9 +64,11 @@ for(ME in equipment) equipment -= ME qdel(ME) - ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src) + ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/heavy(src) ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src) + ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/xray/triple(src) + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/dual(src) ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/teleporter/precise(src) ME.attach(src) @@ -73,6 +77,7 @@ ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) ME.attach(src) + /obj/mecha/combat/marauder/mauler desc = "Heavy-duty, combat exosuit, developed off of the existing Marauder model." name = "Mauler" @@ -152,10 +157,10 @@ log_message("Toggled zoom mode.") occupant_message("Zoom mode [zoom?"en":"dis"]abled.") if(zoom) - occupant.client.view = 12 + occupant.client.AddViewMod("mecha", 12) to_chat(occupant, sound('sound/mecha/imag_enh.ogg',volume=50)) else - occupant.client.view = initial(occupant.client.view) + occupant.client.RemoveViewMod("mecha") diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index c60a560d19b..98e7b6f342d 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -1,4 +1,3 @@ -//TODO: Add critfail checks and reliability //DO NOT ADD MECHA PARTS TO THE GAME WITH THE DEFAULT "SPRITE ME" SPRITE! //I'm annoyed I even have to tell you this! SPRITE FIRST, then commit. @@ -7,7 +6,7 @@ icon = 'icons/mecha/mecha_equipment.dmi' icon_state = "mecha_equip" force = 5 - origin_tech = "materials=2" + origin_tech = "materials=2;engineering=2" var/equip_cooldown = 0 var/equip_ready = 1 var/energy_drain = 0 diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm index 6146e326023..3b1b919bde6 100644 --- a/code/game/mecha/equipment/tools/mining_tools.dm +++ b/code/game/mecha/equipment/tools/mining_tools.dm @@ -110,7 +110,6 @@ name = "exosuit mining scanner" desc = "Equipment for engineering and combat exosuits. It will automatically check surrounding rock for useful minerals." icon_state = "mecha_analyzer" - origin_tech = "materials=3;engineering=2" selectable = 0 equip_cooldown = 30 var/scanning = 0 diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index 3f60c56a952..2e9c75510f4 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -7,7 +7,7 @@ name = "mounted teleporter" desc = "An exosuit module that allows exosuits to teleport to any position in view." icon_state = "mecha_teleport" - origin_tech = "bluespace=10" + origin_tech = "bluespace=7" equip_cooldown = 150 energy_drain = 8000 range = RANGED @@ -25,7 +25,7 @@ /obj/item/mecha_parts/mecha_equipment/teleporter/precise name = "upgraded teleporter" desc = "An exosuit module that allows exosuits to teleport to any position in view. This is the high-precision, energy-efficient version." - origin_tech = "bluespace=13" + origin_tech = "bluespace=7" energy_drain = 1000 tele_precision = 1 @@ -36,7 +36,7 @@ name = "mounted wormhole generator" desc = "An exosuit module that allows generating of small quasi-stable wormholes." icon_state = "mecha_wholegen" - origin_tech = "bluespace=3" + origin_tech = "bluespace=4;magnets=4;plasmatech=2" equip_cooldown = 50 energy_drain = 300 range = RANGED @@ -82,7 +82,7 @@ name = "mounted gravitational catapult" desc = "An exosuit mounted Gravitational Catapult." icon_state = "mecha_teleport" - origin_tech = "bluespace=2;magnets=3" + origin_tech = "bluespace=3;magnets=3;engineering=4" equip_cooldown = 10 energy_drain = 100 range = MELEE|RANGED @@ -145,7 +145,7 @@ name = "Armor Booster Module (Close Combat Weaponry)" desc = "Boosts exosuit armor against armed melee attacks. Requires energy to operate." icon_state = "mecha_abooster_ccw" - origin_tech = "materials=3" + origin_tech = "materials=4;combat=4" equip_cooldown = 10 energy_drain = 50 range = 0 @@ -163,7 +163,7 @@ name = "Armor Booster Module (Ranged Weaponry)" desc = "Boosts exosuit armor against ranged attacks. Completely blocks taser shots. Requires energy to operate." icon_state = "mecha_abooster_proj" - origin_tech = "materials=4" + origin_tech = "materials=4;combat=3;engineering=3" equip_cooldown = 10 energy_drain = 50 range = 0 @@ -183,7 +183,7 @@ name = "Repair Droid" desc = "Automated repair droid. Scans exosuit for damage and repairs it. Can fix almost all types of external or internal damage." icon_state = "repair_droid" - origin_tech = "magnets=3;programming=3" + origin_tech ="magnets=3;programming=3;engineering=4" equip_cooldown = 20 energy_drain = 50 range = 0 @@ -490,4 +490,4 @@ /obj/item/mecha_parts/mecha_equipment/generator/nuclear/process() if(..()) for(var/mob/living/carbon/M in view(chassis)) - M.apply_effect((rad_per_cycle * 3),IRRADIATE,0) \ No newline at end of file + M.apply_effect((rad_per_cycle * 3),IRRADIATE,0) diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm index 7a0e388b39e..4421eba9aae 100644 --- a/code/game/mecha/equipment/tools/work_tools.dm +++ b/code/game/mecha/equipment/tools/work_tools.dm @@ -51,7 +51,7 @@ else if(istype(target,/mob/living)) var/mob/living/M = target if(M.stat == DEAD) return - if(chassis.occupant.a_intent == I_HARM) + if(chassis.occupant.a_intent == INTENT_HARM) M.take_overall_damage(dam_force) if(!M) return @@ -101,11 +101,11 @@ else if(istype(target,/mob/living)) var/mob/living/M = target if(M.stat == DEAD) return - if(chassis.occupant.a_intent == I_HARM) + if(chassis.occupant.a_intent == INTENT_HARM) target.visible_message("[chassis] destroys [target] in an unholy fury.", "[chassis] destroys [target] in an unholy fury.") M.gib() - /*if(chassis.occupant.a_intent == I_DISARM) + /*if(chassis.occupant.a_intent == INTENT_DISARM) target.visible_message("[chassis] rips [target]'s arms off.", "[chassis] rips [target]'s arms off.")*/ else @@ -188,7 +188,7 @@ name = "Mounted RCD" desc = "An exosuit-mounted Rapid Construction Device. (Can be attached to: Any exosuit)" icon_state = "mecha_rcd" - origin_tech = "materials=4;bluespace=3;magnets=4;powerstorage=4" + origin_tech = "materials=4;bluespace=3;magnets=4;powerstorage=4;engineering=4" equip_cooldown = 10 energy_drain = 250 range = MELEE|RANGED @@ -287,7 +287,7 @@ name = "mounted MRCD" desc = "An exosuit-mounted Mime Rapid Construction Device. (Can be attached to: Reticence)" icon_state = "mecha_rcd" - origin_tech = "materials=4;bluespace=3;magnets=4;powerstorage=4" + origin_tech = "materials=4;bluespace=3;magnets=4;powerstorage=4;engineering=4" equip_cooldown = 10 energy_drain = 250 range = MELEE|RANGED diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index a4c7b7d2f5d..77bcc4c1966 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -68,16 +68,25 @@ /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser equip_cooldown = 8 - name = "CH-PS \"Immolator\" Laser" + name = "CH-PS \"Firedart\" Laser" icon_state = "mecha_laser" + origin_tech = "magnets=3;combat=3;engineering=3" energy_drain = 30 projectile = /obj/item/projectile/beam fire_sound = 'sound/weapons/Laser.ogg' +/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/disabler + name = "CH-PD Disabler" + origin_tech = "combat=3" + projectile = /obj/item/projectile/beam/disabler + projectiles_per_shot = 2 + projectile_delay = 1 + /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy equip_cooldown = 10 name = "CH-LC \"Solaris\" Laser Cannon" icon_state = "mecha_laser" + origin_tech = "magnets=4;combat=4;engineering=3" energy_drain = 60 projectile = /obj/item/projectile/beam/laser/heavylaser fire_sound = 'sound/weapons/lasercannonfire.ogg' @@ -86,10 +95,46 @@ equip_cooldown = 40 name = "mkIV Ion Heavy Cannon" icon_state = "mecha_ion" + origin_tech = "materials=4;combat=5;magnets=4" energy_drain = 120 projectile = /obj/item/projectile/ion fire_sound = 'sound/weapons/Laser.ogg' +/obj/item/mecha_parts/mecha_equipment/weapon/energy/tesla + equip_cooldown = 35 + name = "P-X Tesla Cannon" + desc = "A weapon for combat exosuits. Fires bolts of electricity similar to the experimental tesla engine" + icon_state = "mecha_laser" + origin_tech = "materials=4;engineering=4;combat=6;magnets=6" + energy_drain = 500 + projectile = /obj/item/projectile/energy/shock_revolver + fire_sound = 'sound/magic/lightningbolt.ogg' + +/obj/item/mecha_parts/mecha_equipment/weapon/energy/xray + equip_cooldown = 35 + name = "S-1 X-Ray Projector" + desc = "A weapon for combat exosuits. Fires beams of X-Rays that pass through solid matter." + icon_state = "mecha_laser" + origin_tech = "materials=3;combat=5;magnets=2;syndicate=2" + energy_drain = 80 + projectile = /obj/item/projectile/beam/xray + fire_sound = 'sound/weapons/laser3.ogg' + +/obj/item/mecha_parts/mecha_equipment/weapon/energy/xray/triple + name = "X-XR Triple-barrel X-Ray Stream Projector" + projectiles_per_shot = 3 + projectile_delay = 1 + +/obj/item/mecha_parts/mecha_equipment/weapon/energy/immolator + equip_cooldown = 35 + name = "ZFI Immolation Beam Gun" + desc = "A weapon for combat exosuits. Fires beams of extreme heat that set targets on fire." + icon_state = "mecha_laser" + origin_tech = "materials=4;engineering=4;combat=6;magnets=6" + energy_drain = 80 + projectile = /obj/item/projectile/beam/immolator + fire_sound = 'sound/weapons/laser3.ogg' + /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse equip_cooldown = 30 name = "eZ-13 mk2 Heavy pulse rifle" @@ -129,6 +174,7 @@ /obj/item/mecha_parts/mecha_equipment/weapon/energy/taser name = "PBT \"Pacifier\" Mounted Taser" icon_state = "mecha_taser" + origin_tech = "combat=3" energy_drain = 20 equip_cooldown = 8 projectile = /obj/item/projectile/energy/electrode @@ -229,6 +275,7 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine name = "FNX-66 Carbine" icon_state = "mecha_carbine" + origin_tech = "materials=4;combat=4" equip_cooldown = 5 projectile = /obj/item/projectile/bullet/incendiary/shell/dragonsbreath fire_sound = 'sound/weapons/Gunshot.ogg' @@ -253,6 +300,7 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot name = "LBX AC 10 \"Scattershot\"" icon_state = "mecha_scatter" + origin_tech = "combat=4" equip_cooldown = 20 projectile = /obj/item/projectile/bullet/midbullet fire_sound = 'sound/weapons/Gunshot.ogg' @@ -264,6 +312,7 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg name = "Ultra AC 2" icon_state = "mecha_uac2" + origin_tech = "combat=4" equip_cooldown = 10 projectile = /obj/item/projectile/bullet/weakbullet3 fire_sound = 'sound/weapons/Gunshot.ogg' @@ -273,9 +322,14 @@ variance = 6 projectile_delay = 2 +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/dual + name = "XMG-9 Autocannon" + projectiles_per_shot = 6 + /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack - name = "SRM-8 Missile Rack" + name = "SRM-8 Light Missile Rack" icon_state = "mecha_missilerack" + origin_tech = "combat=5;materials=4;engineering=4" projectile = /obj/item/missile fire_sound = 'sound/effects/bang.ogg' projectiles = 8 @@ -283,6 +337,7 @@ equip_cooldown = 60 var/missile_speed = 2 var/missile_range = 30 + var/heavy_missile = 0 /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/action(target, params) if(!action_checks(target)) @@ -290,6 +345,8 @@ set_ready_state(0) var/obj/item/missile/M = new projectile(chassis.loc) M.primed = 1 + if(heavy_missile) + M.heavy_missile = 1 playsound(chassis, fire_sound, 50, 1) M.throw_at(target, missile_range, missile_speed, chassis) projectiles-- @@ -300,16 +357,23 @@ do_after_cooldown() return +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/heavy + name = "SRX-13 Heavy Missile Launcher" + heavy_missile = 1 /obj/item/missile icon = 'icons/obj/grenade.dmi' icon_state = "missile" var/primed = null + var/heavy_missile = 0 throwforce = 15 /obj/item/missile/throw_impact(atom/hit_atom) if(primed) - explosion(hit_atom, 0, 0, 2, 4, 0) + if(heavy_missile) + explosion(hit_atom, 2, 3, 4, 6, 0) + else + explosion(hit_atom, 0, 0, 2, 4, 0) qdel(src) else ..() @@ -318,6 +382,7 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang name = "SGL-6 Grenade Launcher" icon_state = "mecha_grenadelnchr" + origin_tech = "combat=4;engineering=4" projectile = /obj/item/weapon/grenade/flashbang fire_sound = 'sound/effects/bang.ogg' projectiles = 6 @@ -343,6 +408,7 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang//Because I am a heartless bastard -Sieve name = "SOB-3 Grenade Launcher" desc = "A weapon for combat exosuits. Launches primed clusterbangs. You monster." + origin_tech = "combat=4;materials=4" projectiles = 3 projectile = /obj/item/weapon/grenade/clusterbuster projectile_energy_cost = 1600 //getting off cheap seeing as this is 3 times the flashbangs held in the grenade launcher. @@ -449,7 +515,7 @@ icon_state = "mecha_plasmacutter" item_state = "plasmacutter" energy_drain = 30 - origin_tech = "materials=3;combat=2;powerstorage=3;plasmatech=3" + origin_tech = "materials=3;plasmatech=4;engineering=3" projectile = /obj/item/projectile/plasma/adv/mech fire_sound = 'sound/weapons/laser.ogg' diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm index 24b6b1822d9..b3e42bb968e 100644 --- a/code/game/mecha/mech_bay.dm +++ b/code/game/mecha/mech_bay.dm @@ -33,6 +33,9 @@ component_parts += new /obj/item/weapon/stock_parts/capacitor(null) component_parts += new /obj/item/stack/cable_coil(null, 1) RefreshParts() + update_recharge_turf() + +/obj/machinery/mech_bay_recharge_port/proc/update_recharge_turf() recharging_turf = get_step(loc, dir) /obj/machinery/mech_bay_recharge_port/upgraded/New() @@ -46,7 +49,7 @@ component_parts += new /obj/item/weapon/stock_parts/capacitor/super(null) component_parts += new /obj/item/stack/cable_coil(null, 1) RefreshParts() - recharging_turf = get_step(loc, dir) + update_recharge_turf() /obj/machinery/mech_bay_recharge_port/RefreshParts() var/MC diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index cd20b68f10d..b7aadbaae26 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -9,6 +9,7 @@ idle_power_usage = 20 active_power_usage = 5000 var/time_coeff = 1 + var/component_coeff = 1 var/list/resources = list( MAT_METAL=0, MAT_GLASS=0, @@ -77,6 +78,12 @@ T += M.rating res_max_amount = (187000+(T * 37500)) + //resources adjustment coefficient (1 -> 0.85 -> 0.7 -> 0.55) + T = 1.15 + for(var/obj/item/weapon/stock_parts/micro_laser/Ma in component_parts) + T -= Ma.rating*0.15 + component_coeff = T + //building time adjustment coefficient (1 -> 0.8 -> 0.6) T = -1 for(var/obj/item/weapon/stock_parts/manipulator/Ml in component_parts) @@ -246,7 +253,7 @@ return /obj/machinery/mecha_part_fabricator/proc/get_resource_cost_w_coeff(datum/design/D, resource, roundto = 1) - return round(D.materials[resource], roundto) + return round(D.materials[resource]*component_coeff, roundto) /obj/machinery/mecha_part_fabricator/proc/get_construction_time_w_coeff(datum/design/D, roundto = 1) //aran return round(initial(D.construction_time)*time_coeff, roundto) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index fdf1b341488..975ecdc1e84 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -368,9 +368,12 @@ breakthrough = 1 else - throwing = 0 //so mechas don't get stuck when landing after being sent by a Mass Driver + if(throwing) + throwing.finalize(FALSE) crashing = null + ..() + if(breakthrough) if(crashing) spawn(1) @@ -524,7 +527,7 @@ user.create_attack_log("attacked [name]") return -/obj/mecha/hitby(atom/movable/A as mob|obj) //wrapper +/obj/mecha/hitby(atom/movable/A) //wrapper ..() log_message("Hit by [A].",1) @@ -537,6 +540,7 @@ dam_coeff = B.damage_coeff counter_tracking = 1 break + if(istype(A, /obj/item/mecha_parts/mecha_tracking)) if(!counter_tracking) A.forceMove(src) @@ -598,7 +602,6 @@ WR.crowbar_salvage += E E.forceMove(WR) E.equip_ready = 1 - E.reliability = round(rand(E.reliability/3,E.reliability)) else E.forceMove(loc) qdel(E) @@ -745,7 +748,7 @@ to_chat(user, "There's not enough wire to finish the task.") return - else if(isscrewdriver(W) && user.a_intent != I_HARM) + else if(isscrewdriver(W) && user.a_intent != INTENT_HARM) if(hasInternalDamage(MECHA_INT_TEMP_CONTROL)) clearInternalDamage(MECHA_INT_TEMP_CONTROL) to_chat(user, "You repair the damaged temperature controller.") @@ -773,7 +776,7 @@ to_chat(user, "There's already a powercell installed.") return - else if(iswelder(W) && user.a_intent != I_HARM) + else if(iswelder(W) && user.a_intent != INTENT_HARM) var/obj/item/weapon/weldingtool/WT = W if(health= BLOOD_GAIN_PER_STEP) + add_blood = BLOOD_GAIN_PER_STEP + else + add_blood = bloodiness + bloodiness -= add_blood + S.bloody_shoes[blood_state] = min(MAX_SHOE_BLOODINESS, S.bloody_shoes[blood_state] + add_blood) + if(blood_DNA && blood_DNA.len) + S.add_blood(H.blood_DNA, basecolor) + S.blood_state = blood_state + S.blood_color = basecolor + update_icon() + H.update_inv_shoes() + else if(hasfeet && blood_state && bloodiness)//Or feet + var/add_blood = 0 + if(bloodiness >= BLOOD_GAIN_PER_STEP) + add_blood = BLOOD_GAIN_PER_STEP + else + add_blood = bloodiness + bloodiness -= add_blood + H.bloody_feet[blood_state] = min(MAX_SHOE_BLOODINESS, H.bloody_feet[blood_state] + add_blood) + if(!H.feet_blood_DNA) + H.feet_blood_DNA = list() + H.blood_state = blood_state + H.feet_blood_DNA |= blood_DNA.Copy() + H.feet_blood_color = basecolor + update_icon() + H.update_inv_shoes() + /obj/effect/decal/cleanable/blood/splatter random_icon_states = list("mgibbl1", "mgibbl2", "mgibbl3", "mgibbl4", "mgibbl5") amount = 2 @@ -135,11 +139,25 @@ var/global/list/image/splatter_cache=list() icon_state = "1" random_icon_states = list("1","2","3","4","5") amount = 0 - var/list/drips = list() + var/drips = 1 + bloodiness = 0 -/obj/effect/decal/cleanable/blood/drip/New() - ..() - drips |= icon_state +/obj/effect/decal/cleanable/blood/drip/can_bloodcrawl_in() + return TRUE + +/obj/effect/decal/cleanable/trail_holder //not a child of blood on purpose + name = "blood" + icon_state = "ltrails_1" + desc = "Your instincts say you shouldn't be following these." + gender = PLURAL + density = 0 + layer = 2 + random_icon_states = null + var/list/existing_dirs = list() + blood_DNA = list() + +/obj/effect/decal/cleanable/trail_holder/can_bloodcrawl_in() + return TRUE /obj/effect/decal/cleanable/blood/writing icon_state = "tracks" @@ -176,19 +194,16 @@ var/global/list/image/splatter_cache=list() noclear = 1 /obj/effect/decal/cleanable/blood/gibs/update_icon() - var/image/giblets = new(base_icon, "[icon_state]_flesh", dir) if(!fleshcolor || fleshcolor == "rainbow") fleshcolor = "#[pick(list("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF"))]" giblets.color = fleshcolor - var/icon/blood = new(base_icon,"[icon_state]",dir) - if(basecolor == "rainbow") basecolor = "#[pick(list("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF"))]" - blood.Blend(basecolor,ICON_MULTIPLY) icon = blood overlays.Cut() overlays += giblets + . = ..() /obj/effect/decal/cleanable/blood/gibs/up random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1") @@ -223,21 +238,25 @@ var/global/list/image/splatter_cache=list() for(var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++) sleep(3) if(i > 0) - var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc) + var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(loc) b.basecolor = src.basecolor b.update_icon() - for(var/datum/disease/D in src.viruses) - var/datum/disease/ND = D.Copy(1) - b.viruses += ND - ND.holder = b if(step_to(src, get_step(src, direction), 0)) break /obj/effect/decal/cleanable/blood/old/New() ..() + bloodiness = 0 dry() +/obj/effect/decal/cleanable/blood/old/can_bloodcrawl_in() + return FALSE + /obj/effect/decal/cleanable/blood/gibs/old/New() ..() + bloodiness = 0 dry() + +/obj/effect/decal/cleanable/blood/gibs/old/can_bloodcrawl_in() + return FALSE diff --git a/code/game/objects/effects/decals/Cleanable/robots.dm b/code/game/objects/effects/decals/Cleanable/robots.dm index 5fc09b6ec34..dbebd72066d 100644 --- a/code/game/objects/effects/decals/Cleanable/robots.dm +++ b/code/game/objects/effects/decals/Cleanable/robots.dm @@ -5,13 +5,17 @@ icon_state = "gib1" basecolor="#030303" random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7") + bloodiness = MAX_SHOE_BLOODINESS + +/obj/effect/decal/cleanable/blood/gibs/robot/can_bloodcrawl_in() + return FALSE /obj/effect/decal/cleanable/blood/gibs/robot/update_icon() color = "#FFFFFF" /obj/effect/decal/cleanable/blood/gibs/robot/dry() //pieces of robots do not dry up like return - + /obj/effect/decal/cleanable/blood/gibs/robot/can_bloodcrawl_in() return FALSE @@ -44,6 +48,7 @@ name = "motor oil" desc = "It's black and greasy. Looks like Beepsky made another mess." basecolor="#030303" + bloodiness = MAX_SHOE_BLOODINESS /obj/effect/decal/cleanable/blood/oil/can_bloodcrawl_in() return FALSE diff --git a/code/game/objects/effects/decals/Cleanable/tracks.dm b/code/game/objects/effects/decals/Cleanable/tracks.dm index ad404ce28b3..20dee798e8d 100644 --- a/code/game/objects/effects/decals/Cleanable/tracks.dm +++ b/code/game/objects/effects/decals/Cleanable/tracks.dm @@ -1,165 +1,104 @@ -// Stolen en masse from N3X15 of /vg/station with much gratitude. - -// The idea is to have 4 bits for coming and 4 for going. -#define TRACKS_COMING_NORTH 1 -#define TRACKS_COMING_SOUTH 2 -#define TRACKS_COMING_EAST 4 -#define TRACKS_COMING_WEST 8 -#define TRACKS_GOING_NORTH 16 -#define TRACKS_GOING_SOUTH 32 -#define TRACKS_GOING_EAST 64 -#define TRACKS_GOING_WEST 128 - // 5 seconds #define TRACKS_CRUSTIFY_TIME 50 // color-dir-dry var/global/list/image/fluidtrack_cache=list() -/datum/fluidtrack - var/direction=0 - var/basecolor="#A10808" - var/wet=0 - var/fresh=1 - var/crusty=0 - var/image/overlay - - New(_direction,item_color,_wet) - src.direction=_direction - src.basecolor=item_color - src.wet=_wet - // Footprints, tire trails... /obj/effect/decal/cleanable/blood/tracks - amount = 0 - random_icon_states = null - var/dirs=0 icon = 'icons/effects/fluidtracks.dmi' - icon_state = "" - var/coming_state="blood1" - var/going_state="blood2" - var/updatedtracks=0 - - // dir = id in stack - var/list/setdirs=list( - "1"=0, - "2"=0, - "4"=0, - "8"=0, - "16"=0, - "32"=0, - "64"=0, - "128"=0 - ) - - // List of laid tracks and their colors. - var/list/datum/fluidtrack/stack=list() - - /** - * Add tracks to an existing trail. - * - * @param DNA bloodDNA to add to collection. - * @param comingdir Direction tracks come from, or 0. - * @param goingdir Direction tracks are going to (or 0). - * @param bloodcolor Color of the blood when wet. - */ - proc/AddTracks(var/list/DNA, var/comingdir, var/goingdir, var/bloodcolor="#A10808") - var/updated=0 - // Shift our goingdir 4 spaces to the left so it's in the GOING bitblock. - var/realgoing=goingdir<<4 - - // Current bit - var/b=0 - - // When tracks will start to dry out - var/t=world.time + TRACKS_CRUSTIFY_TIME - - var/datum/fluidtrack/track - - // Process 4 bits - for(var/bi=0;bi<4;bi++) - b = 1 << bi - // COMING BIT - // If setting - if(comingdir&b) - // If not wet or not set - if(dirs&b) - var/sid=setdirs["[b]"] - track=stack[sid] - if(track.wet==t && track.basecolor==bloodcolor) - continue - // Remove existing stack entry - stack.Remove(track) - track=new /datum/fluidtrack(b,bloodcolor,t) - stack.Add(track) - setdirs["[b]"]=stack.Find(track) - updatedtracks |= b - updated=1 - - // GOING BIT (shift up 4) - b=b<<4 - if(realgoing&b) - // If not wet or not set - if(dirs&b) - var/sid=setdirs["[b]"] - track=stack[sid] - if(track.wet==t && track.basecolor==bloodcolor) - continue - // Remove existing stack entry - stack.Remove(track) - track=new /datum/fluidtrack(b,bloodcolor,t) - stack.Add(track) - setdirs["[b]"]=stack.Find(track) - updatedtracks |= b - updated=1 - - dirs |= comingdir|realgoing - blood_DNA |= DNA.Copy() - if(updated) - update_icon() - - update_icon() - overlays.Cut() - color = "#FFFFFF" - var/truedir=0 - - // Update ONLY the overlays that have changed. - for(var/datum/fluidtrack/track in stack) - var/stack_idx=setdirs["[track.direction]"] - var/state=coming_state - truedir=track.direction - if(truedir&240) // Check if we're in the GOING block - state=going_state - truedir=truedir>>4 - - if(track.overlay) - track.overlay=null - var/image/I = image(icon, icon_state=state, dir=num2dir(truedir)) - I.color = track.basecolor - - track.fresh=0 - track.overlay=I - stack[stack_idx]=track - overlays += I - updatedtracks=0 // Clear our memory of updated tracks. - -/obj/effect/decal/cleanable/blood/tracks/footprints - name = "wet footprints" - dryname = "dried footprints" - desc = "Whoops..." - drydesc = "Whoops..." - coming_state = "human1" - going_state = "human2" - amount = 0 - -/obj/effect/decal/cleanable/blood/tracks/wheels name = "wet tracks" dryname = "dried tracks" desc = "Whoops..." drydesc = "Whoops..." - coming_state = "wheels1" - going_state = "wheels2" - desc = "They look like tracks left by wheels." + icon_state = "wheels1" gender = PLURAL random_icon_states = null - amount = 0 \ No newline at end of file + amount = 0 + +//BLOODY FOOTPRINTS +/obj/effect/decal/cleanable/blood/footprints + icon = 'icons/effects/fluidtracks.dmi' + icon_state = "nothingwhatsoever" + desc = "You REALLY shouldn't follow these.." + gender = PLURAL + random_icon_states = null + basecolor="#A10808" + var/entered_dirs = 0 + var/exited_dirs = 0 + blood_state = BLOOD_STATE_HUMAN //the icon state to load images from + + +/obj/effect/decal/cleanable/blood/footprints/Crossed(atom/movable/O) + if(ishuman(O)) + var/mob/living/carbon/human/H = O + var/obj/item/clothing/shoes/S = H.shoes + var/obj/item/organ/external/l_foot = H.get_organ("l_foot") + var/obj/item/organ/external/r_foot = H.get_organ("r_foot") + var/hasfeet = 1 + if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED)) + hasfeet = 0 + if(S && S.bloody_shoes[blood_state] && S.blood_color == basecolor) + S.bloody_shoes[blood_state] = max(S.bloody_shoes[blood_state] - BLOOD_LOSS_PER_STEP, 0) + entered_dirs |= H.dir + if(!S.blood_DNA) + S.blood_DNA = list() + S.blood_DNA |= blood_DNA.Copy() + else if(hasfeet && H.bloody_feet[blood_state] && H.feet_blood_color == basecolor)//Or feet //This will need to be changed. + H.bloody_feet[blood_state] = max(H.bloody_feet[blood_state] - BLOOD_LOSS_PER_STEP, 0) + entered_dirs |= H.dir + if(!H.feet_blood_DNA) + H.feet_blood_DNA = list() + H.feet_blood_DNA |= blood_DNA.Copy() + update_icon() + +/obj/effect/decal/cleanable/blood/footprints/Uncrossed(atom/movable/O) + if(ishuman(O)) + var/mob/living/carbon/human/H = O + var/obj/item/clothing/shoes/S = H.shoes + var/obj/item/organ/external/l_foot = H.get_organ("l_foot") + var/obj/item/organ/external/r_foot = H.get_organ("r_foot") + var/hasfeet = 1 + if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED)) + hasfeet = 0 + if(S && S.bloody_shoes[blood_state] && S.blood_color == basecolor) + S.bloody_shoes[blood_state] = max(S.bloody_shoes[blood_state] - BLOOD_LOSS_PER_STEP, 0) + exited_dirs |= H.dir + if(!S.blood_DNA) + S.blood_DNA = list() + S.blood_DNA |= blood_DNA.Copy() + else if(hasfeet && H.bloody_feet[blood_state] && H.feet_blood_color == basecolor)//Or feet + H.bloody_feet[blood_state] = max(H.bloody_feet[blood_state] - BLOOD_LOSS_PER_STEP, 0) + exited_dirs |= H.dir + if(!H.feet_blood_DNA) + H.feet_blood_DNA = list() + H.feet_blood_DNA |= blood_DNA.Copy() + update_icon() + + +/obj/effect/decal/cleanable/blood/footprints/update_icon() + overlays.Cut() + + for(var/Ddir in cardinal) + if(entered_dirs & Ddir) + var/image/I + if(fluidtrack_cache["entered-[blood_state]-[Ddir]"]) + I = fluidtrack_cache["entered-[blood_state]-[Ddir]"] + else + I = image(icon,"[blood_state]1",dir = Ddir) + fluidtrack_cache["entered-[blood_state]-[Ddir]"] = I + if(I) + I.color = basecolor + overlays += I + if(exited_dirs & Ddir) + var/image/I + if(fluidtrack_cache["exited-[blood_state]-[Ddir]"]) + I = fluidtrack_cache["exited-[blood_state]-[Ddir]"] + else + I = image(icon,"[blood_state]2",dir = Ddir) + fluidtrack_cache["exited-[blood_state]-[Ddir]"] = I + if(I) + I.color = basecolor + overlays += I + + alpha = BLOODY_FOOTPRINT_BASE_ALPHA+bloodiness \ No newline at end of file diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index cfde9ab55a4..f2a936eca57 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -43,4 +43,4 @@ if(reagents) reagents.chem_temp += 30 reagents.handle_reactions() - ..() \ No newline at end of file + ..() diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm index 1ab2cd985cf..d825a7a9146 100644 --- a/code/game/objects/effects/decals/contraband.dm +++ b/code/game/objects/effects/decals/contraband.dm @@ -1,335 +1,92 @@ -//########################## CONTRABAND ;3333333333333333333 -Agouri ################################################### +// This is synced up to the poster placing animation. +#define PLACE_SPEED 30 -#define NUM_OF_POSTER_DESIGNS 33 //subtype 0-contraband posters +// The poster item -#define NUM_OF_POSTER_DESIGNS_LEGIT 40 //subtype 1-corporate approved posters - -/obj/item/weapon/contraband - name = "contraband item" - desc = "You probably shouldn't be holding this." - icon = 'icons/obj/contraband.dmi' - force = 0 - - -/obj/item/weapon/contraband/poster +/obj/item/weapon/poster name = "rolled-up poster" desc = "The poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. Its vulgar themes have marked it as contraband aboard Nanotrasen space facilities." - icon_state = "rolled_poster" - var/serial_number = 0 - var/obj/structure/sign/poster/resulting_poster = null //The poster that will be created is initialised and stored through contraband/poster's constructor - var/subtype = 0 + icon = 'icons/obj/contraband.dmi' + force = 0 burn_state = FLAMMABLE + var/poster_type + var/obj/structure/sign/poster/poster_structure +/obj/item/weapon/poster/New(loc, obj/structure/sign/poster/new_poster_structure) + ..() + poster_structure = new_poster_structure + if(!new_poster_structure && poster_type) + poster_structure = new poster_type(src) -/obj/item/weapon/contraband/poster/New(turf/loc, given_serial = 0) - if(given_serial == 0) - if(subtype == 0) - serial_number = rand(1, NUM_OF_POSTER_DESIGNS) - resulting_poster = new(serial_number,subtype) - if(subtype == 1) - serial_number = rand(1, NUM_OF_POSTER_DESIGNS_LEGIT) - resulting_poster = new(serial_number,subtype) - else - serial_number = given_serial - //We don't give it a resulting_poster because if we called it with a given_serial it means that we're rerolling an already used poster. - name += " - No. [serial_number]" - ..(loc) + // posters store what name and description they would like their rolled up form to take. + if(poster_structure) + name = poster_structure.poster_item_name + desc = poster_structure.poster_item_desc + icon_state = poster_structure.poster_item_icon_state + name = "[name] - [poster_structure.original_name]" -/*/obj/item/weapon/contraband/poster/attack(mob/M as mob, mob/user as mob) - src.add_fingerprint(user) - if(resulting_poster) - resulting_poster.add_fingerprint(user) - ..()*/ +/obj/item/weapon/poster/Destroy() + poster_structure = null + . = ..() -/*/obj/item/weapon/contraband/poster/attack(atom/A, mob/user as mob) //This shit is handled through the wall's attackby() - if(istype(A, /turf/simulated/wall)) - if(resulting_poster == null) - return - else - var/turf/simulated/wall/W = A - var/check = 0 - var/stuff_on_wall = 0 - for(var/obj/O in W.contents) //Let's see if it already has a poster on it or too much stuff - if(istype(O,/obj/structure/sign/poster)) - check = 1 - break - stuff_on_wall++ - if(stuff_on_wall == 3) - check = 1 - break - - if(check) - to_chat(user, "The wall is far too cluttered to place a poster!") - return - - resulting_poster.loc = W //Looks like it's uncluttered enough. Place the poster - W.contents += resulting_poster - - qdel(src)*/ +// These icon_states may be overriden, but are for mapper's convinence +/obj/item/weapon/poster/random_contraband + name = "random contraband poster" + poster_type = /obj/structure/sign/poster/contraband/random + icon_state = "rolled_poster" +/obj/item/weapon/poster/random_official + name = "random official poster" + poster_type = /obj/structure/sign/poster/official/random + icon_state = "rolled_poster_legit" //############################## THE ACTUAL DECALS ########################### -obj/structure/sign/poster +/obj/structure/sign/poster name = "poster" desc = "A large piece of space-resistant printed paper." icon = 'icons/obj/contraband.dmi' - anchored = 1 - var/serial_number //Will hold the value of src.loc if nobody initialises it - var/ruined = 0 - var/subtype = 0 + anchored = TRUE + var/original_name + var/random_basetype + var/ruined = FALSE + var/never_random = FALSE // used for the 'random' subclasses. -obj/structure/sign/poster/legit // For mappers looking to pre-spawn NT approved posters. - subtype = 1 + var/poster_item_name = "hypothetical poster" + var/poster_item_desc = "This hypothetical poster item should not exist, let's be honest here." + var/poster_item_icon_state = "rolled_poster" -obj/structure/sign/poster/New(serial,var/subtypeIn = -1) - serial_number = serial - if(subtypeIn != -1) - subtype = subtypeIn - - if(serial_number == loc) - if(subtype == 0) - serial_number = rand(1, NUM_OF_POSTER_DESIGNS) //This is for the mappers that want individual posters without having to use rolled posters. - if(subtype == 1) - serial_number = rand(1, NUM_OF_POSTER_DESIGNS_LEGIT) - if(subtype == 0) - icon_state = "poster[serial_number]" - switch(serial_number) - if(1) - name += " - Free Tonto" - desc += " A framed shred of a much larger flag, colors bled together and faded from age." - if(2) - name += " - Atmosia Declaration of Independence" - desc += " A relic of a failed rebellion." - if(3) - name += " - Fun Police" - desc += " A poster condemning the station's security forces." - if(4) - name += " - Lusty Xeno" - desc += " A heretical poster depicting the titular star of an equally heretical book." - if(5) - name += " - Syndicate Recruitment Poster" - desc += " See the galaxy! Shatter corrupt megacorporations! Join today!" - if(6) - name += " - Clown" - desc += " Honk." - if(7) - name += " - Smoke" - desc += " A poster depicting a carton of cigarettes." - if(8) - name += " - Grey Tide" - desc += " A rebellious poster symbolizing assistant solidarity." - if(9) - name += " - Missing Gloves" - desc += " This poster is about the uproar that followed Nanotrasen's financial cuts towards insulated-glove purchases." - if(10) - name += " - Hacking Guide" - desc += " This poster details the internal workings of the common Nanotrasen airlock." - if(11) - name += " - RIP Badger" - desc += " This poster commemorates the day hundreds of badgers worldwide were sacrificed for the greater good." - if(12) - name += " - Ambrosia Vulgaris" - desc += " This poster is lookin' pretty trippy man." - if(13) - name += " - Donut Corp." - desc += " This poster is an advertisement for Donut Corp." - if(14) - name += " - EAT" - desc += " This poster is advising that you eat." - if(15) - name += " - Tools" - desc += " This poster is an advertisement for tools." - if(16) - name += " - Power" - desc += " A poster all about power." - if(17) - name += " - Power to the People" - desc += " Screw those EDF guys!" - if(18) - name += " - Communist state" - desc += " All hail the Communist party!" - if(19) - name += " - Lamarr" - desc += " This poster depicts Lamarr. Probably made by the Research Director." - if(20) - name += " - Borg Fancy" - desc += " Being fancy can be for any borg, just need a suit." - if(21) - name += " - Borg Fancy v2" - desc += " Borg Fancy, Now only taking the most fancy." - if(22) - name += " - Kosmicheskaya Stantsiya 13 Does Not Exist" - desc += " A poster denying the existence of the derelict station near [station_name()]." - if(23) - name += " - Rebels Unite!" - desc += " A poster telling the viewer to rebel against Nanotrasen." - if(24) - name += " - C-20r Advertisement" - desc += " A poster advertising the Scarborough Arms C-20r." - if(25) - name += " - Have A Puff" - desc += " Who cares about lung cancer when you're high as a kite?" - if(26) - name += " - Revolver Advertisement" - desc += " Because seven shots are all you need." - if(27) - name += " - D-Day Promotional Poster" - desc += " A promotional poster for some rapper." - if(28) - name += " - Syndicate Pistol Advertisement" - desc += " A poster advertising Syndicate pistols as being 'Classy as fuck'." - if(29) - name += " - E-sword Rainbow" - desc += " All the colors of bloody murder rainbow." - if(30) - name += " - Red Rum" - desc += " Looking at this poster makes you want to kill." - if(31) - name += " - CC 64K Advertisement" - desc += " The latest portable computer from Comrade Computing, with a whole 64kB of ram!" - if(32) - name += " - Punch Shit" - desc += " Fight things for no reason, like a man!" - if(33) - name += " - The Griffin" - desc += " The Griffin commands you to be the worst you can be. Will you?" - else - name += " - Error (subtype 0 serial_number)" - desc += " This is a bug, please report the circumstances under which you encountered this poster at https://github.com/ParadiseSS13/Paradise/issues." - - if(subtype == 1) - icon_state = "poster[serial_number]_legit" - switch(serial_number) - if(1) - name += " - Here for Your Safety" - desc += " A poster glorifying the station's security force." - if(2) - name += " - Nanotrasen Logo" - desc += " A poster depicting the logo of Nanotrasen." - if(3) - name += " - Cleanliness" - desc += " A poster warning of the dangers of poor hygiene." - if(4) - name += " - Help Others" - desc += " A poster encouraging you to help fellow crewmembers." - if(5) - name += " - Build" - desc += " A poster glorifying the engineering team." - if(6) - name += " - Bless This Spess" - desc += " A poster blessing this area." - if(7) - name += " - Science" - desc += " A poster depicting an atom." - if(8) - name += " - Ian" - desc += " Arf Arf." - if(9) - name += " - Obey" - desc += " A poster instructing the viewer to obey authority." - if(10) - name += " - Walk" - desc += " A poster instructing the viewer to walk instead of running." - if(11) - name += " - State Laws" - desc += " A poster instructing cyborgs to state their laws." - if(12) - name += " - Love Ian" - desc += " Ian is love, Ian is life." - if(13) - name += " - Space Cops" - desc += " A poster advertising the television show Space Cops." - if(14) - name += " - Ue No" - desc += " This thing is all in Japanese." - if(15) - name += " - Get Your LEGS" - desc += " LEGS: Leadership, Experience, Genius, S(Opportunity)." - if(16) - name += " - Do Not Question" - desc += " A poster instructing the viewer not to ask about things they aren't meant to know." - if(17) - name += " - Work for a Future" - desc += " A poster encouraging you to work for your future, what it is, no one is really sure." - if(18) - name += " - Soft Cap Pop Art" - desc += " A poster reprint of some cheap pop art." - if(19) - name += " - Safety: Internals" - desc += " A poster instructing the viewer to wear internals in environments where there is no oxygen or the air has been rendered toxic." - if(20) - name += " - Safety: Eye Protection" - desc += " A poster instructing the viewer to wear eye protection when dealing with chemicals, smoke, or bright lights." - if(21) - name += " - Safety: Report" - desc += " A poster instructing the viewer to report suspicious activity to the security force." - if(22) - name += " - Report Crimes" - desc += " Report crimes at: 1-800-FUCKING-TERRORISTS or at https://www.sectorthirteen.nt/malcontents." - if(23) - name += " - Ion Rifle" - desc += " A poster displaying an Ion Rifle." - if(24) - name += " - Foam Force Advertisement" - desc += " Foam Force, it's Foam or be Foamed!" - if(25) - name += " - Cohiba Robusto Advertisement" - desc += " Cohiba Robusto, the classy cigar." - if(26) - name += " - 50th Anniversary Vintage Reprint" - desc += " A reprint of a poster from 2504, commemorating the 50th Anniversary of Nanoposters Manufacturing, a subsidiary of Nanotrasen." - if(27) - name += " - Fruit Bowl" - desc += " Simple, yet awe inspiring." - if(28) - name += " - NanoPDA 1000 Advertisement" - desc += " A poster advertising the latest PDA from Nanotrasen." - if(29) - name += " - Enlist" - desc += " Enlist in the Nanotrasen ERT reserves today!" - if(30) - name += " - Nanomichi Advertisement" - desc += " A poster advertising Nanomichi brand audio cassettes." - if(31) - name += " - 12 Gauge" - desc += " A poster boasting about the superiority of 12-gauge shotgun shells." - if(32) - name += " - High-Class Martini" - desc += " I told you to shake it, no stirring." - if(33) - name += " - The Owl" - desc += " The Owl would do his best to protect the station. Will you?" - if(34) - name += " - Spider Risk" - desc += " A poster detailing what to do when giant spiders are seen." - if(35) - name += " - Kill Syndicate" - desc += " A poster demanding that all crew should be ready to fight the Syndicate." - if(36) - name += " - Information on Air" - desc += " A poster providing visual aid to remind crew of air canisters." - if(37) - name += " - Information on Air" - desc += " A poster providing visual aid to remind crew of air canisters." - if(38) - name += " - Dig for Glory!" - desc += " A poster providing trying to convince crew to mine for ore." - if(39) - name += " - Religious Poster" - desc += " A generic religious poser telling you to believe." - if(40) - name += " - Stay Healthy!" - desc += " A healthy crew is a happy crew!" - else - name += " - Error (subtype 1 serial_number)" - desc += " This is a bug, please report the circumstances under which you encountered this poster at https://github.com/ParadiseSS13/Paradise/issues." +/obj/structure/sign/poster/New() ..() + if(random_basetype) + randomise(random_basetype) + if(!ruined) + original_name = name + name = "poster - [name]" + desc = "A large piece of space-resistant printed paper. [desc]" -obj/structure/sign/poster/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weapon/wirecutters)) +/obj/structure/sign/poster/proc/randomise(base_type) + var/list/poster_types = subtypesof(base_type) + var/list/approved_types = list() + for(var/t in poster_types) + var/obj/structure/sign/poster/T = t + if(initial(T.icon_state) && !initial(T.never_random)) + approved_types |= T + + var/obj/structure/sign/poster/selected = pick(approved_types) + + name = initial(selected.name) + desc = initial(selected.desc) + icon_state = initial(selected.icon_state) + poster_item_name = initial(selected.poster_item_name) + poster_item_desc = initial(selected.poster_item_desc) + poster_item_icon_state = initial(selected.poster_item_icon_state) + ruined = initial(selected.ruined) + +/obj/structure/sign/poster/attackby(obj/item/I, mob/user, params) + if(iswirecutter(I)) playsound(loc, I.usesound, 100, 1) if(ruined) to_chat(user, "You remove the remnants of the poster.") @@ -337,45 +94,33 @@ obj/structure/sign/poster/attackby(obj/item/I, mob/user, params) else to_chat(user, "You carefully remove the poster from the wall.") roll_and_drop(user.loc) - return - /obj/structure/sign/poster/attack_hand(mob/user) if(ruined) return - var/temp_loc = user.loc - switch(alert("Do I want to rip the poster from the wall?","You think...","Yes","No")) - if("Yes") - if( user.loc != temp_loc || ruined ) - return - visible_message("[user] rips [src] in a single, decisive motion!" ) - playsound(src.loc, 'sound/items/poster_ripped.ogg', 100, 1) - ruined = 1 - icon_state = "poster_ripped" - name = "ripped poster" - desc = "You can't make out anything from the poster's original print. It's ruined." - add_fingerprint(user) - if("No") - return + visible_message("[user] rips [src] in a single, decisive motion!" ) + playsound(src.loc, 'sound/items/poster_ripped.ogg', 100, 1) -/obj/structure/sign/poster/proc/roll_and_drop(turf/location) - var/obj/item/weapon/contraband/poster/P - if(subtype == 1) - P = new/obj/item/weapon/contraband/poster/legit/(src, serial_number) - else - P = new(src, serial_number) - P.resulting_poster = src - P.loc = location - loc = P + var/obj/structure/sign/poster/ripped/R = new(loc) + R.pixel_y = pixel_y + R.pixel_x = pixel_x + R.add_fingerprint(user) + qdel(src) +/obj/structure/sign/poster/proc/roll_and_drop(loc) + pixel_x = 0 + pixel_y = 0 + var/obj/item/weapon/poster/P = new(loc, src) + forceMove(P) + return P //seperated to reduce code duplication. Moved here for ease of reference and to unclutter r_wall/attackby() -/turf/simulated/wall/proc/place_poster(obj/item/weapon/contraband/poster/P, mob/user) - if(!P.resulting_poster) return - +/turf/simulated/wall/proc/place_poster(obj/item/weapon/poster/P, mob/user) + if(!P.poster_structure) + return var/stuff_on_wall = 0 - for(var/obj/O in user.loc.contents) //Let's see if it already has a poster on it or too much stuff - if(istype(O,/obj/structure/sign)) + for(var/obj/O in contents) //Let's see if it already has a poster on it or too much stuff + if(istype(O, /obj/structure/sign/poster)) to_chat(user, "The wall is far too cluttered to place a poster!") return stuff_on_wall++ @@ -385,9 +130,7 @@ obj/structure/sign/poster/attackby(obj/item/I, mob/user, params) to_chat(user, "You start placing the poster on the wall...")//Looks like it's uncluttered enough. Place the poster. - - //declaring D because otherwise if P gets 'deconstructed' we lose our reference to P.resulting_poster - var/obj/structure/sign/poster/D = P.resulting_poster + var/obj/structure/sign/poster/D = P.poster_structure var/temp_loc = user.loc @@ -408,24 +151,422 @@ obj/structure/sign/poster/attackby(obj/item/I, mob/user, params) to_chat(user, "You cannot reach the wall from here!") return - flick("poster_being_set",D) - D.loc = temp_loc - + flick("poster_being_set", D) + D.forceMove(temp_loc) qdel(P) //delete it now to cut down on sanity checks afterwards. Agouri's code supports rerolling it anyway playsound(D.loc, 'sound/items/poster_being_created.ogg', 100, 1) - sleep(17) - if(!D) return + if(do_after(user, PLACE_SPEED, target = src)) + if(!D || qdeleted(D)) + return - if(istype(src,/turf/simulated/wall) && user && user.loc == temp_loc) //Let's check if everything is still there - to_chat(user, "You place the poster!") - else - D.roll_and_drop(temp_loc) - return + if(iswallturf(src) && user && user.loc == temp_loc) //Let's check if everything is still there + to_chat(user, "You place the poster!") + return -//Putting non-contraband posters here because everything else here is related to posters anyway. -JS + to_chat(user, "The poster falls down!") + D.roll_and_drop(temp_loc) -/obj/item/weapon/contraband/poster/legit - desc = "The poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. It's contents go through Nanotrasen's strict content guidelines." - icon_state = "rolled_poster_legit" - subtype = 1 \ No newline at end of file + +////////////////////////////////POSTER VARIATIONS//////////////////////////////// + +/obj/structure/sign/poster/ripped + ruined = TRUE + icon_state = "poster_ripped" + name = "ripped poster" + desc = "You can't make out anything from the poster's original print. It's ruined." + +/obj/structure/sign/poster/random + name = "random poster" // could even be ripped + icon_state = "random_anything" + never_random = TRUE + random_basetype = /obj/structure/sign/poster + +/obj/structure/sign/poster/contraband + poster_item_name = "contraband poster" + poster_item_desc = "This poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. Its vulgar themes have marked it as contraband aboard Nanotrasen space facilities." + poster_item_icon_state = "rolled_poster" + +/obj/structure/sign/poster/contraband/random + name = "random contraband poster" + icon_state = "random_contraband" + never_random = TRUE + random_basetype = /obj/structure/sign/poster/contraband + +/obj/structure/sign/poster/contraband/free_tonto + name = "Free Tonto" + desc = "A salvaged shred of a much larger flag, colors bled together and faded from age." + icon_state = "poster1" + +/obj/structure/sign/poster/contraband/atmosia_independence + name = "Atmosia Declaration of Independence" + desc = "A relic of a failed rebellion." + icon_state = "poster2" + +/obj/structure/sign/poster/contraband/fun_police + name = "Fun Police" + desc = "A poster condemning the station's security forces." + icon_state = "poster3" + +/obj/structure/sign/poster/contraband/lusty_xenomorph + name = "Lusty Xenomorph" + desc = "A heretical poster depicting the titular star of an equally heretical book." + icon_state = "poster4" + +/obj/structure/sign/poster/contraband/syndicate_recruitment + name = "Syndicate Recruitment" + desc = "See the galaxy! Shatter corrupt megacorporations! Join today!" + icon_state = "poster5" + +/obj/structure/sign/poster/contraband/clown + name = "Clown" + desc = "Honk." + icon_state = "poster6" + +/obj/structure/sign/poster/contraband/smoke + name = "Smoke" + desc = "A poster advertising a rival corporate brand of cigarettes." + icon_state = "poster7" + +/obj/structure/sign/poster/contraband/grey_tide + name = "Grey Tide" + desc = "A rebellious poster symbolizing assistant solidarity." + icon_state = "poster8" + +/obj/structure/sign/poster/contraband/missing_gloves + name = "Missing Gloves" + desc = "This poster references the uproar that followed Nanotrasen's financial cuts toward insulated-glove purchases." + icon_state = "poster9" + +/obj/structure/sign/poster/contraband/hacking_guide + name = "Hacking Guide" + desc = "This poster details the internal workings of the common Nanotrasen airlock. Sadly, it appears out of date." + icon_state = "poster10" + +/obj/structure/sign/poster/contraband/rip_badger + name = "RIP Badger" + desc = "This seditious poster references Nanotrasen's genocide of a space station full of badgers." + icon_state = "poster11" + +/obj/structure/sign/poster/contraband/ambrosia_vulgaris + name = "Ambrosia Vulgaris" + desc = "This poster is lookin' pretty trippy man." + icon_state = "poster12" + +/obj/structure/sign/poster/contraband/donut_corp + name = "Donut Corp." + desc = "This poster is an unauthorized advertisement for Donut Corp." + icon_state = "poster13" + +/obj/structure/sign/poster/contraband/eat + name = "EAT." + desc = "This poster promotes rank gluttony." + icon_state = "poster14" + +/obj/structure/sign/poster/contraband/tools + name = "Tools" + desc = "This poster looks like an advertisement for tools, but is in fact a subliminal jab at the tools at CentComm." + icon_state = "poster15" + +/obj/structure/sign/poster/contraband/power + name = "Power" + desc = "A poster that positions the seat of power outside Nanotrasen." + icon_state = "poster16" + +/obj/structure/sign/poster/contraband/power_people + name = "Power to the people" + desc = "Screw those EDF guys!" + icon_state = "poster17" + +/obj/structure/sign/poster/contraband/communist_state + name = "Communist State" + desc = "All hail the Communist party!" + icon_state = "poster18" + +/obj/structure/sign/poster/contraband/lamarr + name = "Lamarr" + desc = "This poster depicts Lamarr. Probably made by a traitorous Research Director." + icon_state = "poster19" + +/obj/structure/sign/poster/contraband/borg_fancy_1 + name = "Borg Fancy" + desc = "Being fancy can be for any borg, just need a suit." + icon_state = "poster20" + +/obj/structure/sign/poster/contraband/borg_fancy_2 + name = "Borg Fancy v2" + desc = "Borg Fancy, Now only taking the most fancy." + icon_state = "poster21" + +/obj/structure/sign/poster/contraband/kss13 + name = "Kosmicheskaya Stantsiya 13 Does Not Exist" + desc = "A poster mocking CentComm's denial of the existence of the derelict station near Space Station 13." + icon_state = "poster22" + +/obj/structure/sign/poster/contraband/rebels_unite + name = "Rebels Unite" + desc = "A poster urging the viewer to rebel against Nanotrasen." + icon_state = "poster23" + +/obj/structure/sign/poster/contraband/c20r + name = "C-20r" + desc = "A poster advertising the Scarborough Arms C-20r." + icon_state = "poster24" + +/obj/structure/sign/poster/contraband/have_a_puff + name = "Have a Puff" + desc = "Who cares about lung cancer when you're high as a kite?" + icon_state = "poster25" + +/obj/structure/sign/poster/contraband/revolver + name = "Revolver" + desc = "Because seven shots are all you need." + icon_state = "poster26" + +/obj/structure/sign/poster/contraband/d_day_promo + name = "D-Day Promo" + desc = "A promotional poster for some rapper." + icon_state = "poster27" + +/obj/structure/sign/poster/contraband/syndicate_pistol + name = "Syndicate Pistol" + desc = "A poster advertising syndicate pistols as being 'classy as fuck'. It is covered in faded gang tags." + icon_state = "poster28" + +/obj/structure/sign/poster/contraband/energy_swords + name = "Energy Swords" + desc = "All the colors of the bloody murder rainbow." + icon_state = "poster29" + +/obj/structure/sign/poster/contraband/red_rum + name = "Red Rum" + desc = "Looking at this poster makes you want to kill." + icon_state = "poster30" + +/obj/structure/sign/poster/contraband/cc64k_ad + name = "CC 64K Ad" + desc = "The latest portable computer from Comrade Computing, with a whole 64kB of ram!" + icon_state = "poster31" + +/obj/structure/sign/poster/contraband/punch_shit + name = "Punch Shit" + desc = "Fight things for no reason, like a man!" + icon_state = "poster32" + +/obj/structure/sign/poster/contraband/the_griffin + name = "The Griffin" + desc = "The Griffin commands you to be the worst you can be. Will you?" + icon_state = "poster33" + +/obj/structure/sign/poster/official + poster_item_name = "motivational poster" + poster_item_desc = "An official Nanotrasen-issued poster to foster a compliant and obedient workforce. It comes with state-of-the-art adhesive backing, for easy pinning to any vertical surface." + poster_item_icon_state = "rolled_poster_legit" + +/obj/structure/sign/poster/official/random + name = "random official poster" + random_basetype = /obj/structure/sign/poster/official + icon_state = "random_official" + never_random = TRUE + +/obj/structure/sign/poster/official/here_for_your_safety + name = "Here For Your Safety" + desc = "A poster glorifying the station's security force." + icon_state = "poster1_legit" + +/obj/structure/sign/poster/official/nanotrasen_logo + name = "Nanotrasen Logo" + desc = "A poster depicting the Nanotrasen logo." + icon_state = "poster2_legit" + +/obj/structure/sign/poster/official/cleanliness + name = "Cleanliness" + desc = "A poster warning of the dangers of poor hygiene." + icon_state = "poster3_legit" + +/obj/structure/sign/poster/official/help_others + name = "Help Others" + desc = "A poster encouraging you to help fellow crewmembers." + icon_state = "poster4_legit" + +/obj/structure/sign/poster/official/build + name = "Build" + desc = "A poster glorifying the engineering team." + icon_state = "poster5_legit" + +/obj/structure/sign/poster/official/bless_this_spess + name = "Bless This Spess" + desc = "A poster blessing this area." + icon_state = "poster6_legit" + +/obj/structure/sign/poster/official/science + name = "Science" + desc = "A poster depicting an atom." + icon_state = "poster7_legit" + +/obj/structure/sign/poster/official/ian + name = "Ian" + desc = "Arf arf. Yap." + icon_state = "poster8_legit" + +/obj/structure/sign/poster/official/obey + name = "Obey" + desc = "A poster instructing the viewer to obey authority." + icon_state = "poster9_legit" + +/obj/structure/sign/poster/official/walk + name = "Walk" + desc = "A poster instructing the viewer to walk instead of running." + icon_state = "poster10_legit" + +/obj/structure/sign/poster/official/state_laws + name = "State Laws" + desc = "A poster instructing cyborgs to state their laws." + icon_state = "poster11_legit" + +/obj/structure/sign/poster/official/love_ian + name = "Love Ian" + desc = "Ian is love, Ian is life." + icon_state = "poster12_legit" + +/obj/structure/sign/poster/official/space_cops + name = "Space Cops." + desc = "A poster advertising the television show Space Cops." + icon_state = "poster13_legit" + +/obj/structure/sign/poster/official/ue_no + name = "Ue No." + desc = "This thing is all in Japanese." + icon_state = "poster14_legit" + +/obj/structure/sign/poster/official/get_your_legs + name = "Get Your LEGS" + desc = "LEGS: Leadership, Experience, Genius, Subordination." + icon_state = "poster15_legit" + +/obj/structure/sign/poster/official/do_not_question + name = "Do Not Question" + desc = "A poster instructing the viewer not to ask about things they aren't meant to know." + icon_state = "poster16_legit" + +/obj/structure/sign/poster/official/work_for_a_future + name = "Work For A Future" + desc = " A poster encouraging you to work for your future." + icon_state = "poster17_legit" + +/obj/structure/sign/poster/official/soft_cap_pop_art + name = "Soft Cap Pop Art" + desc = "A poster reprint of some cheap pop art." + icon_state = "poster18_legit" + +/obj/structure/sign/poster/official/safety_internals + name = "Safety: Internals" + desc = "A poster instructing the viewer to wear internals in the rare environments where there is no oxygen or the air has been rendered toxic." + icon_state = "poster19_legit" + +/obj/structure/sign/poster/official/safety_eye_protection + name = "Safety: Eye Protection" + desc = "A poster instructing the viewer to wear eye protection when dealing with chemicals, smoke, or bright lights." + icon_state = "poster20_legit" + +/obj/structure/sign/poster/official/safety_report + name = "Safety: Report" + desc = "A poster instructing the viewer to report suspicious activity to the security force." + icon_state = "poster21_legit" + +/obj/structure/sign/poster/official/report_crimes + name = "Report Crimes" + desc = "A poster encouraging the swift reporting of crime or seditious behavior to station security." + icon_state = "poster22_legit" + +/obj/structure/sign/poster/official/ion_rifle + name = "Ion Rifle" + desc = "A poster displaying an Ion Rifle." + icon_state = "poster23_legit" + +/obj/structure/sign/poster/official/foam_force_ad + name = "Foam Force Ad" + desc = "Foam Force, it's Foam or be Foamed!" + icon_state = "poster24_legit" + +/obj/structure/sign/poster/official/cohiba_robusto_ad + name = "Cohiba Robusto Ad" + desc = "Cohiba Robusto, the classy cigar." + icon_state = "poster25_legit" + +/obj/structure/sign/poster/official/anniversary_vintage_reprint + name = "50th Anniversary Vintage Reprint" + desc = "A reprint of a poster from 2505, commemorating the 50th Anniversery of Nanoposters Manufacturing, a subsidary of Nanotrasen." + icon_state = "poster26_legit" + +/obj/structure/sign/poster/official/fruit_bowl + name = "Fruit Bowl" + desc = " Simple, yet awe-inspiring." + icon_state = "poster27_legit" + +/obj/structure/sign/poster/official/pda_ad + name = "PDA Ad" + desc = "A poster advertising the latest PDA from Nanotrasen suppliers." + icon_state = "poster28_legit" + +/obj/structure/sign/poster/official/enlist + name = "Enlist" + desc = "Enlist in the Nanotrasen ERT reserves today!" + icon_state = "poster29_legit" + +/obj/structure/sign/poster/official/nanomichi_ad + name = "Nanomichi Ad" + desc = " A poster advertising Nanomichi brand audio cassettes." + icon_state = "poster30_legit" + +/obj/structure/sign/poster/official/twelve_gauge + name = "12 Gauge" + desc = "A poster boasting about the superiority of 12 gauge shotgun shells." + icon_state = "poster31_legit" + +/obj/structure/sign/poster/official/high_class_martini + name = "High-Class Martini" + desc = "I told you to shake it, no stirring." + icon_state = "poster32_legit" + +/obj/structure/sign/poster/official/the_owl + name = "The Owl" + desc = "The Owl would do his best to protect the station. Will you?" + icon_state = "poster33_legit" + +/obj/structure/sign/poster/official/spiders + name = "Spider Risk" + desc = "A poster detailing what to do when giant spiders are seen." + icon_state = "poster34_legit" + +/obj/structure/sign/poster/official/kill_syndicate + name = "Kill Syndicate" + desc = "A poster demanding that all crew should be ready to fight the Syndicate." + icon_state = "poster35_legit" + +/obj/structure/sign/poster/official/air1 + name = "Information on Air" + desc = "A poster providing visual aid to remind crew of air canisters." + icon_state = "poster36_legit" + +/obj/structure/sign/poster/official/air2 + name = "Information on Air" + desc = "A poster providing visual aid to remind crew of air canisters." + icon_state = "poster37_legit" + +/obj/structure/sign/poster/official/dig + name = "Dig for Glory!" + desc = "A poster trying to convince the crew to mine for ore." + icon_state = "poster38_legit" + +/obj/structure/sign/poster/official/religious + name = "Religious Poster" + desc = "A generic religious poster telling you to believe." + icon_state = "poster39_legit" + +/obj/structure/sign/poster/official/healthy + name = "Stay Healthy!" + desc = "A healthy crew is a happy crew!" + icon_state = "poster40_legit" + +#undef PLACE_SPEED diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 1cd105367ed..6cf11f4f3c8 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -440,8 +440,7 @@ steam.start() -- spawns the effect var/obj/chemholder Destroy() - qdel(chemholder) - chemholder = null + QDEL_NULL(chemholder) return ..() New() diff --git a/code/game/objects/effects/gibs.dm b/code/game/objects/effects/gibs.dm index 5c5005fb6fd..39cafaa51ed 100644 --- a/code/game/objects/effects/gibs.dm +++ b/code/game/objects/effects/gibs.dm @@ -1,29 +1,28 @@ -/proc/gibs(atom/location, var/list/viruses, var/datum/dna/MobDNA) //CARN MARKER - new /obj/effect/gibspawner/generic(get_turf(location),viruses,MobDNA) +/proc/gibs(atom/location, datum/dna/MobDNA) //CARN MARKER + new /obj/effect/gibspawner/generic(get_turf(location), MobDNA) -/proc/hgibs(atom/location, var/list/viruses, var/datum/dna/MobDNA) - new /obj/effect/gibspawner/human(get_turf(location),viruses,MobDNA) +/proc/hgibs(atom/location, datum/dna/MobDNA) + new /obj/effect/gibspawner/human(get_turf(location), MobDNA) -/proc/xgibs(atom/location, var/list/viruses) - new /obj/effect/gibspawner/xeno(get_turf(location),viruses) +/proc/xgibs(atom/location) + new /obj/effect/gibspawner/xeno(get_turf(location)) -/proc/robogibs(atom/location, var/list/viruses) - new /obj/effect/gibspawner/robot(get_turf(location),viruses) +/proc/robogibs(atom/location) + new /obj/effect/gibspawner/robot(get_turf(location)) /obj/effect/gibspawner var/sparks = 0 //whether sparks spread on Gib() - var/virusProb = 20 //the chance for viruses to spread on the gibs var/list/gibtypes = list() var/list/gibamounts = list() var/list/gibdirections = list() //of lists - New(location, var/list/viruses, var/datum/dna/MobDNA) + New(location, datum/dna/MobDNA) ..() if(istype(loc,/turf)) //basically if a badmin spawns it - Gib(loc,viruses,MobDNA) + Gib(loc, MobDNA) - proc/Gib(atom/location, var/list/viruses = list(), var/datum/dna/MobDNA = null) + proc/Gib(atom/location, datum/dna/MobDNA = null) if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len) to_chat(world, "Gib list length mismatch!") return diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index f641cb26c32..9af07df67b4 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -162,6 +162,8 @@ G.endurance -= damage_to_do G.CheckEndurance() return + else if(I.sharp) + damage_to_do = I.force * 3 // wirecutter: 6->18, knife 10->30, hatchet 12->36 if(I.damtype != STAMINA) endurance -= damage_to_do CheckEndurance() diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 17029920dd3..d386fe07d0b 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -26,7 +26,7 @@ /obj/effect/mine/proc/triggermine(mob/living/victim) if(triggered) return - visible_message("[victim] sets off \icon[src] [src]!") + visible_message("[victim] sets off [bicon(src)] [src]!") var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 5972d75f3dd..47c654768d5 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -67,7 +67,7 @@ /obj/item/clothing/gloves/color/black = 20, /obj/item/clothing/head/hardhat = 10, /obj/item/clothing/head/hardhat/red = 10, - /obj/item/clothing/head/that{throwforce = 1; throwing = 1} = 10, + /obj/item/clothing/head/that = 10, /obj/item/clothing/head/ushanka = 10, /obj/item/clothing/head/welding = 10, /obj/item/clothing/mask/gas = 10, @@ -95,7 +95,7 @@ /obj/item/clothing/head/cone = 10, /obj/item/weapon/coin/silver = 10, /obj/item/weapon/coin/twoheaded = 10, - /obj/item/weapon/contraband/poster = 10, + /obj/item/weapon/poster/random_contraband = 10, /obj/item/weapon/crowbar = 10, /obj/item/weapon/crowbar/red = 10, /obj/item/weapon/extinguisher = 90, @@ -198,3 +198,27 @@ /obj/item/weapon/gun/energy/kinetic_accelerator = 1, /obj/item/pizzabox = 3, ) + +/obj/effect/spawner/lootdrop/three_course_meal + name = "three course meal spawner" + lootcount = 3 + lootdoubles = FALSE + var/soups = list( + /obj/item/weapon/reagent_containers/food/snacks/beetsoup, + /obj/item/weapon/reagent_containers/food/snacks/stew, + /obj/item/weapon/reagent_containers/food/snacks/hotchili, + /obj/item/weapon/reagent_containers/food/snacks/nettlesoup, + /obj/item/weapon/reagent_containers/food/snacks/meatballsoup) + var/salads = list( + /obj/item/weapon/reagent_containers/food/snacks/herbsalad, + /obj/item/weapon/reagent_containers/food/snacks/validsalad, + /obj/item/weapon/reagent_containers/food/snacks/aesirsalad) + var/mains = list( + /obj/item/weapon/reagent_containers/food/snacks/enchiladas, + /obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat, + /obj/item/weapon/reagent_containers/food/snacks/bigbiteburger, + /obj/item/weapon/reagent_containers/food/snacks/superbiteburger) + +/obj/effect/spawner/lootdrop/three_course_meal/New() + loot = list(pick(soups) = 1,pick(salads) = 1,pick(mains) = 1) + . = ..() diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index f67178e1e67..9f92bfa87f7 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -4,7 +4,6 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d name = "item" icon = 'icons/obj/items.dmi' var/discrete = 0 // used in item_attack.dm to make an item not show an attack message to viewers - var/no_embed = 0 // For use in item_attack.dm var/image/blood_overlay = null //this saves our blood splatter overlay, which will be processed not to go over the edges of the sprite var/blood_overlay_color = null var/item_state = null @@ -20,7 +19,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d var/health = null var/hitsound = null var/usesound = null - var/w_class = 3 + var/w_class = WEIGHT_CLASS_NORMAL var/slot_flags = 0 //This is used to determine on which slots an item can fit. pass_flags = PASSTABLE pressure_resistance = 3 @@ -61,6 +60,19 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d var/block_chance = 0 var/hit_reaction_chance = 0 //If you want to have something unrelated to blocking/armour piercing etc. Maybe not needed, but trying to think ahead/allow more freedom + var/mob/thrownby = null + + //So items can have custom embedd values + //Because customisation is king + var/embed_chance = EMBED_CHANCE + var/embedded_fall_chance = EMBEDDED_ITEM_FALLOUT + var/embedded_pain_chance = EMBEDDED_PAIN_CHANCE + var/embedded_pain_multiplier = EMBEDDED_PAIN_MULTIPLIER //The coefficient of multiplication for the damage this item does while embedded (this*w_class) + var/embedded_fall_pain_multiplier = EMBEDDED_FALL_PAIN_MULTIPLIER //The coefficient of multiplication for the damage this item does when falling out of a limb (this*w_class) + var/embedded_impact_pain_multiplier = EMBEDDED_IMPACT_PAIN_MULTIPLIER //The coefficient of multiplication for the damage this item does when first embedded (this*w_class) + var/embedded_unsafe_removal_pain_multiplier = EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER //The coefficient of multiplication for the damage removing this without surgery causes (this*w_class) + var/embedded_unsafe_removal_time = EMBEDDED_UNSAFE_REMOVAL_TIME //A time in ticks, multiplied by the w_class. + var/toolspeed = 1 // If this item is a tool, the speed multiplier /* Species-specific sprites, concept stolen from Paradise//vg/. @@ -144,16 +156,18 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d /obj/item/examine(mob/user, var/distance = -1) var/size switch(src.w_class) - if(1.0) + if(WEIGHT_CLASS_TINY) size = "tiny" - if(2.0) + if(WEIGHT_CLASS_SMALL) size = "small" - if(3.0) + if(WEIGHT_CLASS_NORMAL) size = "normal-sized" - if(4.0) + if(WEIGHT_CLASS_BULKY) size = "bulky" - if(5.0) + if(WEIGHT_CLASS_HUGE) size = "huge" + if(WEIGHT_CLASS_GIGANTIC) + size = "gigantic" . = ..(user, distance, "", "It is a [size] item.") @@ -165,9 +179,6 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d var/list/techlvls = params2list(origin_tech) for(var/T in techlvls) //This needs to use the better names. msg += "Tech: [CallTechName(T)] | Magnitude: [techlvls[T]]
    " - msg += "Research reliability: [reliability]%
    " - if(crit_fail) - msg += "Critical failure detected in subject!
    " else msg += "No tech origins detected.
    " @@ -217,7 +228,8 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d var/obj/item/weapon/storage/S = src.loc S.remove_from_storage(src) - src.throwing = 0 + if(throwing) + throwing.finalize(FALSE) if(loc == user) if(!user.unEquip(src)) return 0 @@ -231,36 +243,6 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d user.put_in_active_hand(src) return 1 - -/obj/item/attack_alien(mob/user as mob) - - if(isalien(user)) // -- TLE - var/mob/living/carbon/alien/A = user - - if(!A.has_fine_manipulation) - if(src in A.contents) // To stop Aliens having items stuck in their pockets - A.unEquip(src) - to_chat(user, "Your claws aren't capable of such fine manipulation.") - return - - if(istype(src.loc, /obj/item/weapon/storage)) - for(var/mob/M in range(1, src.loc)) - if(M.s_active == src.loc) - if(M.client) - M.client.screen -= src - src.throwing = 0 - if(src.loc == user) - if(!user.unEquip(src)) - return - else - if(istype(src.loc, /mob/living)) - return - src.pickup(user) - - user.put_in_active_hand(src) - return - - /obj/item/attack_alien(mob/user as mob) var/mob/living/carbon/alien/A = user @@ -323,9 +305,6 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d /obj/item/proc/talk_into(mob/M, var/text, var/channel=null) return -/obj/item/proc/moved(mob/user, old_loc) - return - /obj/item/proc/dropped(mob/user) for(var/X in actions) var/datum/action/A = X @@ -495,57 +474,29 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d M.AdjustEyeBlurry(rand(3,4)) return -/obj/item/clean_blood() - . = ..() - if(blood_overlay) - overlays.Remove(blood_overlay) - if(istype(src, /obj/item/clothing/gloves)) - var/obj/item/clothing/gloves/G = src - G.transfer_blood = 0 - - -/obj/item/add_blood(mob/living/carbon/human/M as mob) - if(!..()) - return 0 - - if(istype(src, /obj/item/weapon/melee/energy)) - return - - //if we haven't made our blood_overlay already - if( !blood_overlay ) - generate_blood_overlay() - - //apply the blood-splatter overlay if it isn't already in there - if(!blood_DNA.len) - blood_overlay.color = blood_color - overlays += blood_overlay - - //if this blood isn't already in the list, add it - if(istype(M)) - if(blood_DNA[M.dna.unique_enzymes]) - return 0 //already bloodied with this blood. Cannot add more. - blood_DNA[M.dna.unique_enzymes] = M.dna.b_type - return 1 //we applied blood to the item - -/obj/item/proc/generate_blood_overlay() - if(blood_overlay) - return - - var/icon/I = new /icon(icon, icon_state) - I.Blend(new /icon('icons/effects/blood.dmi', rgb(255,255,255)),ICON_ADD) //fills the icon_state with white (except where it's transparent) - I.Blend(new /icon('icons/effects/blood.dmi', "itemblood"),ICON_MULTIPLY) //adds blood and the remaining white areas become transparant - - //not sure if this is worth it. It attaches the blood_overlay to every item of the same type if they don't have one already made. - for(var/obj/item/A in world) - if(A.type == type && !A.blood_overlay) - A.blood_overlay = image(I) - /obj/item/singularity_pull(S, current_size) spawn(0) //this is needed or multiple items will be thrown sequentially and not simultaneously if(current_size >= STAGE_FOUR) throw_at(S,14,3) else ..() +/obj/item/throw_impact(atom/A) + if(A && !qdeleted(A)) + var/itempush = 1 + if(w_class < WEIGHT_CLASS_BULKY) + itempush = 0 // too light to push anything + return A.hitby(src, 0, itempush) + +/obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback) + thrownby = thrower + callback = CALLBACK(src, .proc/after_throw, callback) //replace their callback with our own + . = ..(target, range, speed, thrower, spin, diagonals_first, callback) + +/obj/item/proc/after_throw(datum/callback/callback) + if(callback) //call the original callback + . = callback.Invoke() + throw_speed = initial(throw_speed) //explosions change this. + /obj/item/proc/pwr_drain() return 0 // Process Kill @@ -572,3 +523,10 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d /obj/item/proc/is_crutch() //Does an item prop up a human mob and allow them to stand if they are missing a leg/foot? return 0 + +// Return true if you don't want regular throw handling +/obj/item/proc/override_throw(mob/user, atom/target) + return FALSE + +/obj/item/proc/is_equivalent(obj/item/I) + return I == src diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index 3cc0f9b6023..315eacb8f95 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -51,7 +51,7 @@ desc = "This is a one-use permit that allows the user to officially declare a built room as new addition to the station." fluffnotice = "Nanotrasen Engineering requires all on-station construction projects to be approved by a head of staff, as detailed in Nanotrasen Company Regulation 512-C (Mid-Shift Modifications to Company Property). \ By submitting this form, you accept any fines, fees, or personal injury/death that may occur during construction." - w_class = 1 + w_class = WEIGHT_CLASS_TINY /obj/item/areaeditor/permit/attack_self(mob/user) . = ..() @@ -76,7 +76,7 @@ icon = 'icons/obj/items.dmi' icon_state = "blueprints" fluffnotice = "Property of Nanotrasen. For heads of staff only. Store in high-secure storage." - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL var/list/showing = list() var/client/viewing diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index c52aa0e1792..4108fe85ddd 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -5,7 +5,7 @@ desc = "A folded bag designed for the storage and transportation of cadavers." icon = 'icons/obj/bodybag.dmi' icon_state = "bodybag_folded" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL attack_self(mob/user) var/obj/structure/closet/body_bag/R = new /obj/structure/closet/body_bag(user.loc) @@ -136,4 +136,4 @@ to_chat(user, "The controls are now [src.locked ? "locked." : "unlocked."]") else to_chat(user, "Access denied.") - return \ No newline at end of file + return diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm index 46ee95d119b..801f74770ba 100644 --- a/code/game/objects/items/candle.dm +++ b/code/game/objects/items/candle.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/candle.dmi' icon_state = "candle1" item_state = "candle1" - w_class = 1 + w_class = WEIGHT_CLASS_TINY var/wax = 200 var/lit = 0 var/infinite = 0 @@ -91,4 +91,4 @@ /obj/item/candle/eternal desc = "A candle. This one seems to have an odd quality about the wax." - infinite = 1 \ No newline at end of file + infinite = 1 diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm new file mode 100644 index 00000000000..b076b7be43c --- /dev/null +++ b/code/game/objects/items/cardboard_cutouts.dm @@ -0,0 +1,188 @@ +//Cardboard cutouts! They're man-shaped and can be colored with a crayon to look like a human in a certain outfit, although it's limited, discolored, and obvious to more than a cursory glance. +/obj/item/cardboard_cutout + name = "cardboard cutout" + desc = "A vaguely humanoid cardboard cutout. It's completely blank." + icon = 'icons/obj/cardboard_cutout.dmi' + icon_state = "cutout_basic" + burn_state = FLAMMABLE + w_class = WEIGHT_CLASS_BULKY + var/list/possible_appearances = list("Assistant", "Clown", "Mime", + "Traitor", "Nuke Op", "Cultist", "Revolutionary", "Wizard", "Shadowling", "Xenomorph", "Swarmer", + "Deathsquad Officer", "Ian", "Slaughter Demon", + "Laughter Demon", "Xenomorph Maid", "Security Officer", "Terror Spider") + var/pushed_over = FALSE //If the cutout is pushed over and has to be righted + var/deceptive = FALSE //If the cutout actually appears as what it portray and not a discolored version + var/lastattacker = null + +/obj/item/cardboard_cutout/attack_hand(mob/living/user) + if(user.a_intent == INTENT_HELP || pushed_over) + return ..() + user.visible_message("[user] pushes over [src]!", "You push over [src]!") + playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) + push_over() + +/obj/item/cardboard_cutout/proc/push_over() + name = initial(name) + desc = "[initial(desc)] It's been pushed over." + icon = initial(icon) + icon_state = "cutout_pushed_over" + color = initial(color) + alpha = initial(alpha) + pushed_over = TRUE + +/obj/item/cardboard_cutout/attack_self(mob/living/user) + if(!pushed_over) + return + to_chat(user, "You right [src].") + desc = initial(desc) + icon = initial(icon) + icon_state = initial(icon_state) //This resets a cutout to its blank state - this is intentional to allow for resetting + pushed_over = FALSE + +/obj/item/cardboard_cutout/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/toy/crayon)) + change_appearance(I, user) + return + // Why yes, this does closely resemble mob and object attack code. + if(I.flags & NOBLUDGEON) + return + if(!I.force) + playsound(loc, 'sound/weapons/tap.ogg', 20, 1, -1) + else if(I.hitsound) + playsound(loc, I.hitsound, 20, 1, -1) + + user.changeNext_move(CLICK_CD_MELEE) + user.do_attack_animation(src) + + if(I.force) + user.visible_message("[user] has hit \ + [src] with [I]!", "You hit [src] \ + with [I]!") + + if(prob(I.force)) + push_over() + +/obj/item/cardboard_cutout/bullet_act(obj/item/projectile/P) + visible_message("[src] has been hit by [P]!") + playsound(src, 'sound/weapons/slice.ogg', 50, 1) + if(prob(P.damage)) + push_over() + +/obj/item/cardboard_cutout/proc/change_appearance(obj/item/toy/crayon/crayon, mob/living/user) + if(!crayon || !user) + return + if(istype(crayon, /obj/item/toy/crayon/spraycan)) + var/obj/item/toy/crayon/spraycan/can = crayon + if(can.capped) + to_chat(user, "The cap is on [src] remove it first!") + return + if(pushed_over) + to_chat(user, "Right [src] first!") + return + var/new_appearance = input(user, "Choose a new appearance for [src].", "26th Century Deception") as null|anything in possible_appearances + if(!new_appearance || !crayon) + return + if(!do_after(user, 10, FALSE, src, TRUE)) + return + user.visible_message("[user] gives [src] a new look.", "Voila! You give [src] a new look.") + alpha = 255 + icon = initial(icon) + if(!deceptive) + color = "#FFD7A7" + switch(new_appearance) + if("Assistant") + name = "[pick(first_names_male)] [pick(last_names)]" + desc = "A cardboard cutout of an assistant." + icon_state = "cutout_greytide" + if("Clown") + name = pick(clown_names) + desc = "A cardboard cutout of a clown. You get the feeling that it should be in a corner." + icon_state = "cutout_clown" + if("Mime") + name = pick(mime_names) + desc = "...(A cardboard cutout of a mime.)" + icon_state = "cutout_mime" + if("Traitor") + name = "[pick("Unknown", "Captain")]" + desc = "A cardboard cutout of a traitor." + icon_state = "cutout_traitor" + if("Nuke Op") + name = "[pick("Unknown", "COMMS", "Telecomms", "AI", "stealthy op", "STEALTH", "sneakybeaky", "MEDIC", "Medic", "Gonk op")]" + desc = "A cardboard cutout of a nuclear operative." + icon_state = "cutout_fluke" + if("Cultist") + name = "Unknown" + desc = "A cardboard cutout of a cultist." + icon_state = "cutout_cultist" + //if("Clockwork Cultist") + // name = "[random_name(pick(MALE,FEMALE))]" + // desc = "A cardboard cutout of a servant of Ratvar." + // icon_state = "cutout_servant" + if("Revolutionary") + name = "Unknown" + desc = "A cardboard cutout of a revolutionary." + icon_state = "cutout_viva" + if("Wizard") + name = "[pick(wizard_first)], [pick(wizard_second)]" + desc = "A cardboard cutout of a wizard." + icon_state = "cutout_wizard" + if("Shadowling") + name = "Unknown" + desc = "A cardboard cutout of a shadowling." + icon_state = "cutout_shadowling" + if("Xenomorph") + name = "alien hunter ([rand(1, 999)])" + desc = "A cardboard cutout of a xenomorph." + icon_state = "cutout_fukken_xeno" + if(prob(10)) + alpha = 75 //Spooky sneaking! + if("Swarmer") + name = "Swarmer ([rand(1, 999)])" + desc = "A cardboard cutout of a swarmer." + icon_state = "cutout_swarmer" + //if("Ash Walker") + // name = random_name(pick(MALE,FEMALE),"Unathi") + // desc = "A cardboard cutout of an ash walker." + // icon_state = "cutout_free_antag" + if("Deathsquad Officer") + name = pick(commando_names) + desc = "A cardboard cutout of a death commando." + icon_state = "cutout_deathsquad" + if("Ian") + name = "Ian" + desc = "A cardboard cutout of the HoP's beloved corgi." + icon_state = "cutout_ian" + if("Slaughter Demon") + name = "slaughter demon" + desc = "A cardboard cutout of a slaughter demon." + icon = 'icons/mob/mob.dmi' + icon_state = "daemon" + dir = "SOUTH" + if("Laughter Demon") + name = "laughter demon" + desc = "A cardboard cutout of a laughter demon." + icon = 'icons/mob/mob.dmi' + icon_state = "bowmon" + dir = "SOUTH" + if("Xenomorph Maid") + name = "lusty xenomorph maid ([rand(1, 999)])" + desc = "A cardboard cutout of a xenomorph maid." + icon_state = "cutout_lusty" + if("Security Officer") + name = "Private Security Officer" + desc = "A cardboard cutout of a private security officer." + icon_state = "cutout_ntsec" + if("Terror Spider") + name = "Gray Terror Spider" + desc = "A cardboard cutout of a terror spider." + icon = 'icons/mob/terrorspider.dmi' + icon_state = "terror_gray" + dir = "SOUTH" + + return 1 + +/obj/item/cardboard_cutout/setDir() + dir = SOUTH + +/obj/item/cardboard_cutout/adaptive //Purchased by Syndicate agents, these cutouts are indistinguishable from normal cutouts but aren't discolored when their appearance is changed + deceptive = TRUE diff --git a/code/game/objects/items/control_wand.dm b/code/game/objects/items/control_wand.dm index 95cf94a3a1e..0fe6cf48631 100644 --- a/code/game/objects/items/control_wand.dm +++ b/code/game/objects/items/control_wand.dm @@ -8,7 +8,7 @@ icon = 'icons/obj/device.dmi' name = "control wand" desc = "Remotely controls airlocks." - w_class = 1 + w_class = WEIGHT_CLASS_TINY var/mode = WAND_OPEN var/region_access = 1 //See access.dm var/obj/item/weapon/card/id/ID diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 3852d67e6ff..295b133d92e 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -7,7 +7,7 @@ desc = "A colourful crayon. Looks tasty. Mmmm..." icon = 'icons/obj/crayons.dmi' icon_state = "crayonred" - w_class = 1 + w_class = WEIGHT_CLASS_TINY slot_flags = SLOT_BELT | SLOT_EARS attack_verb = list("attacked", "coloured") toolspeed = 1 @@ -73,7 +73,7 @@ temp = pick(graffiti) else temp = href_list["type"] - if((usr.restrained() || usr.stat || usr.get_active_hand() != src)) + if((usr.restrained() || usr.stat || !usr.is_in_active_hand(src))) return drawtype = temp update_window(usr) @@ -147,6 +147,29 @@ colour = "#DA00FF" colourName = "purple" +/obj/item/toy/crayon/random/New() + icon_state = pick(list("crayonred", "crayonorange", "crayonyellow", "crayongreen", "crayonblue", "crayonpurple")) + switch(icon_state) + if("crayonred") + colour = "#DA0000" + colourName = "red" + if("crayonorange") + colour = "#FF9300" + colourName = "orange" + if("crayonyellow") + colour = "#FFF200" + colourName = "yellow" + if("crayongreen") + colour = "#A8E61D" + colourName = "green" + if("crayonblue") + colour = "#00B7EF" + colourName = "blue" + if("crayonpurple") + colour = "#DA00FF" + colourName = "purple" + ..() + /obj/item/toy/crayon/white icon_state = "crayonwhite" colour = "#FFFFFF" @@ -167,7 +190,7 @@ ..() /obj/item/toy/crayon/mime/Topic(href,href_list) - if((usr.restrained() || usr.stat || usr.get_active_hand() != src)) + if(!Adjacent(usr) || usr.incapacitated()) return if(href_list["color"]) if(colour != "#FFFFFF") @@ -192,11 +215,10 @@ ..() /obj/item/toy/crayon/rainbow/Topic(href,href_list[]) - + if(!Adjacent(usr) || usr.incapacitated()) + return if(href_list["color"]) var/temp = input(usr, "Please select colour.", "Crayon colour") as color - if((usr.restrained() || usr.stat || usr.get_active_hand() != src)) - return colour = temp update_window(usr) else @@ -214,7 +236,7 @@ /obj/item/toy/crayon/spraycan/New() ..() - name = "NanoTrasen-brand Rapid Paint Applicator" + name = "Nanotrasen-brand Rapid Paint Applicator" update_icon() /obj/item/toy/crayon/spraycan/attack_self(mob/living/user as mob) diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 0d02add30a3..f74d80f845e 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -3,11 +3,11 @@ icon = 'icons/obj/aicards.dmi' icon_state = "aicard" // aicard-full item_state = "electronic" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL slot_flags = SLOT_BELT flags = NOBLUDGEON var/flush = null - origin_tech = "programming=4;materials=4" + origin_tech = "programming=3;materials=3" /obj/item/device/aicard/afterattack(atom/target, mob/user, proximity) diff --git a/code/game/objects/items/devices/autopsy.dm b/code/game/objects/items/devices/autopsy.dm index 2839715d7d7..62e4354f238 100644 --- a/code/game/objects/items/devices/autopsy.dm +++ b/code/game/objects/items/devices/autopsy.dm @@ -5,7 +5,7 @@ icon_state = "" flags = CONDUCT w_class = WEIGHT_CLASS_TINY - origin_tech = "materials=1;biotech=1" + origin_tech = "magnets=1;biotech=1" var/list/datum/autopsy_data_scanner/wdata = list() var/list/chemtraces = list() var/target_name = null @@ -74,6 +74,21 @@ if(O.trace_chemicals[V] > 0 && !chemtraces.Find(V)) chemtraces += V +/obj/item/weapon/autopsy_scanner/attackby(obj/item/weapon/P, mob/user) + if(istype(P, /obj/item/weapon/pen)) + var/dead_name = input("Insert name of deceased individual") + var/dead_rank = input("Insert rank of deceased individual") + var/dead_tod = input("Insert time of death") + var/dead_cause = input("Insert cause of death") + var/dead_chems = input("Insert any chemical traces") + var/dead_notes = input("Insert any relevant notes") + var/obj/item/weapon/paper/R = new(user.loc) + R.name = "Official Coroner's Report - [dead_name]" + R.info = "NanoTrasen Science Station Cyberiad - Coroner's Report

    Name of Deceased: [dead_name]

    Rank of Deceased: [dead_rank]

    Time of Death: [dead_tod]

    Cause of Death: [dead_cause]

    Trace Chemicals: [dead_chems]

    Additional Coroner's Notes: [dead_notes]

    Coroner's Signature: " + playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1) + sleep(10) + user.put_in_hands(R) + /obj/item/weapon/autopsy_scanner/attack_self(mob/user) if(!wdata.len && !chemtraces.len) return @@ -181,4 +196,4 @@ M.visible_message("[user] scans the wounds on [M]'s [S] with [src]") add_data(S) - return 1 \ No newline at end of file + return 1 diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm index af745b97f1f..17fddd581e4 100644 --- a/code/game/objects/items/devices/camera_bug.dm +++ b/code/game/objects/items/devices/camera_bug.dm @@ -9,11 +9,11 @@ desc = "For illicit snooping through the camera network." icon = 'icons/obj/device.dmi' icon_state = "camera_bug" - w_class = 1.0 + w_class = WEIGHT_CLASS_TINY item_state = "camera_bug" throw_speed = 4 throw_range = 20 - origin_tech = "syndicate=3;engineering=1" + origin_tech = "syndicate=1;engineering=3" var/obj/machinery/camera/current = null diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index d3f13c284c1..eef0b2072b8 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -7,7 +7,7 @@ throwforce = 5.0 throw_speed = 3 throw_range = 5 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL origin_tech = "syndicate=4;magnets=4" var/can_use = 1 var/obj/effect/dummy/chameleon/active_dummy = null @@ -43,8 +43,7 @@ if(active_dummy) eject_all() playsound(get_turf(src), 'sound/effects/pop.ogg', 100, 1, -6) - qdel(active_dummy) - active_dummy = null + QDEL_NULL(active_dummy) to_chat(usr, "You deactivate \the [src].") var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src)) T.icon = 'icons/effects/effects.dmi' @@ -150,4 +149,4 @@ /obj/effect/dummy/chameleon/Destroy() master.disrupt(0) - return ..() \ No newline at end of file + return ..() diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index fefb20e90e4..1a1ed2b4c5e 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -4,7 +4,7 @@ icon_state = "flash" item_state = "flashtool" //looks exactly like a flash (and nothing like a flashbang) throwforce = 0 - w_class = 1 + w_class = WEIGHT_CLASS_TINY throw_speed = 3 throw_range = 7 flags = CONDUCT @@ -39,6 +39,11 @@ overcharged = 1 overlays += "overcharge" +/obj/item/device/flash/random/New() + ..() + if(prob(25)) + broken = 1 + icon_state = "[initial(icon_state)]burnt" /obj/item/device/flash/proc/burn_out() //Made so you can override it if you want to have an invincible flash from R&D or something. broken = 1 @@ -196,4 +201,37 @@ icon_state = "memorizer" item_state = "nullrod" +/obj/item/device/flash/armimplant + name = "photon projector" + desc = "A high-powered photon projector implant normally used for lighting purposes, but also doubles as a flashbulb weapon. Self-repair protocals fix the flashbulb if it ever burns out." + var/flashcd = 20 + var/overheat = 0 + var/obj/item/organ/internal/cyberimp/arm/flash/I = null + +/obj/item/device/flash/armimplant/Destroy() + I = null + return ..() + +/obj/item/device/flash/armimplant/burn_out() + if(I && I.owner) + to_chat(I.owner, "Your photon projector implant overheats and deactivates!") + I.Retract() + overheat = FALSE + addtimer(src, "cooldown", flashcd * 2) + +/obj/item/device/flash/armimplant/try_use_flash(mob/user = null) + if(overheat) + if(I && I.owner) + to_chat(I.owner, "Your photon projector is running too hot to be used again so quickly!") + return FALSE + overheat = TRUE + addtimer(src, "cooldown", flashcd) + playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1) + update_icon(1) + return TRUE + +/obj/item/device/flash/armimplant/proc/cooldown() + overheat = FALSE + + /obj/item/device/flash/synthetic //just a regular flash now diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 9ac4897c8f3..1bf736d7024 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/lighting.dmi' icon_state = "flashlight" item_state = "flashlight" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL flags = CONDUCT slot_flags = SLOT_BELT materials = list(MAT_METAL=50, MAT_GLASS=20) @@ -88,7 +88,7 @@ desc = "A pen-sized light, used by medical staff." icon_state = "penlight" item_state = "" - w_class = 1 + w_class = WEIGHT_CLASS_TINY slot_flags = SLOT_BELT | SLOT_EARS flags = CONDUCT brightness_on = 2 @@ -109,7 +109,7 @@ item_state = "" flags = CONDUCT brightness_on = 2 - w_class = 1 + w_class = WEIGHT_CLASS_TINY // the desk lamps are a bit special /obj/item/device/flashlight/lamp @@ -118,7 +118,7 @@ icon_state = "lamp" item_state = "lamp" brightness_on = 5 - w_class = 4 + w_class = WEIGHT_CLASS_BULKY flags = CONDUCT materials = list() on = 1 @@ -153,7 +153,7 @@ obj/item/device/flashlight/lamp/bananalamp /obj/item/device/flashlight/flare name = "flare" desc = "A red Nanotrasen issued flare. There are instructions on the side, it reads 'pull cord, make light'." - w_class = 2 + w_class = WEIGHT_CLASS_SMALL brightness_on = 8 // Made it brighter (from 7 to 8). light_color = "#ff0000" // changed colour to a more brighter red. icon_state = "flare" @@ -214,7 +214,7 @@ obj/item/device/flashlight/lamp/bananalamp /obj/item/device/flashlight/flare/torch name = "torch" desc = "A torch fashioned from some leaves and a log." - w_class = 4 + w_class = WEIGHT_CLASS_BULKY brightness_on = 7 icon_state = "torch" item_state = "torch" @@ -227,7 +227,7 @@ obj/item/device/flashlight/lamp/bananalamp icon = 'icons/obj/lighting.dmi' icon_state = "floor1" //not a slime extract sprite but... something close enough! item_state = "slime" - w_class = 1 + w_class = WEIGHT_CLASS_TINY brightness_on = 6 light_color = "#FFBF00" materials = list() @@ -243,7 +243,7 @@ obj/item/device/flashlight/lamp/bananalamp return //Bio-luminescence does not toggle. /obj/item/device/flashlight/emp - origin_tech = "magnets=4;syndicate=5" + origin_tech = "magnets=3;syndicate=1" var/emp_max_charges = 4 var/emp_cur_charges = 4 diff --git a/code/game/objects/items/devices/floor_painter.dm b/code/game/objects/items/devices/floor_painter.dm index c278a1be72a..74b119c7b62 100644 --- a/code/game/objects/items/devices/floor_painter.dm +++ b/code/game/objects/items/devices/floor_painter.dm @@ -3,37 +3,37 @@ /obj/item/device/floor_painter name = "floor painter" icon_state = "floor_painter" - + var/floor_icon var/floor_state = "floor" var/floor_dir = SOUTH - - w_class = 1 + + w_class = WEIGHT_CLASS_TINY item_state = "electronic" flags = CONDUCT slot_flags = SLOT_BELT - - var/static/list/allowed_states = list("arrival", "arrivalcorner", "bar", "barber", "blackcorner", "blue", "bluecorner", + + var/static/list/allowed_states = list("arrival", "arrivalcorner", "bar", "barber", "blackcorner", "blue", "bluecorner", "bluefull", "bluered", "blueyellow", "blueyellowfull", "bot", "brown", "browncorner", "browncornerold", "brownold", "cafeteria", "caution", "cautioncorner", "chapel", "cmo", "dark", "delivery", "escape", "escapecorner", "floor", "freezerfloor", "green", "greenblue", "greenbluefull", "greencorner", "greenfull", "greenyellow", "greenyellowfull", "grimy", "loadingarea", "neutral", "neutralcorner", "neutralfull", "orange", "orangecorner", "orangefull", "purple", "purplecorner", "purplefull", "rampbottom", "ramptop", "red", "redblue", "redbluefull", - "redcorner", "redfull", "redgreen", "redgreenfull", "redyellow", "redyellowfull", "warning", "warningcorner", "warnwhite", - "warnwhitecorner", "white", "whiteblue", "whitebluecorner", "whitebluefull", "whitebot", "whitecorner", "whitedelivery", - "whitegreen", "whitegreencorner", "whitegreenfull", "whitehall", "whitepurple", "whitepurplecorner", "whitepurplefull", - "whitered", "whiteredcorner", "whiteredfull", "whiteyellow", "whiteyellowcorner", "whiteyellowfull", "yellow", + "redcorner", "redfull", "redgreen", "redgreenfull", "redyellow", "redyellowfull", "warning", "warningcorner", "warnwhite", + "warnwhitecorner", "white", "whiteblue", "whitebluecorner", "whitebluefull", "whitebot", "whitecorner", "whitedelivery", + "whitegreen", "whitegreencorner", "whitegreenfull", "whitehall", "whitepurple", "whitepurplecorner", "whitepurplefull", + "whitered", "whiteredcorner", "whiteredfull", "whiteyellow", "whiteyellowcorner", "whiteyellowfull", "yellow", "yellowcorner", "yellowcornersiding", "yellowsiding") /obj/item/device/floor_painter/afterattack(var/atom/A, var/mob/user, proximity, params) if(!proximity) return - + var/turf/simulated/floor/plasteel/F = A if(!istype(F)) to_chat(user, "\The [src] can only be used on station flooring.") return - + F.icon_state = floor_state F.icon_regular_floor = floor_state F.dir = floor_dir @@ -60,7 +60,7 @@ Choose Direction
    Direction: [dir2text(floor_dir)]
    "} - + var/datum/browser/popup = new(user, "floor_painter", name, 225, 300) popup.set_content(dat) popup.open() @@ -68,7 +68,7 @@ /obj/item/device/floor_painter/Topic(href, href_list) if(..()) return - + if(href_list["choose_state"]) var/state = input("Please select a style", "[src]") as null|anything in allowed_states if(state) @@ -92,7 +92,7 @@ index = 1 floor_state = allowed_states[index] floor_dir = SOUTH - + floor_icon = icon('icons/turf/floors.dmi', floor_state, floor_dir) if(usr) attack_self(usr) diff --git a/code/game/objects/items/devices/guitar.dm b/code/game/objects/items/devices/guitar.dm deleted file mode 100644 index 6c0e4645cc9..00000000000 --- a/code/game/objects/items/devices/guitar.dm +++ /dev/null @@ -1,45 +0,0 @@ -//copy pasta of the space piano, don't hurt me -Pete - -/obj/item/device/guitar - name = "guitar" - desc = "It's made of wood and has bronze strings." - icon = 'icons/obj/musician.dmi' - icon_state = "guitar" - item_state = "guitar" - force = 10 - burn_state = FLAMMABLE - burntime = 20 - var/datum/song/handheld/song - hitsound = 'sound/effects/guitarsmash.ogg' - -/obj/item/device/guitar/New() - song = new("guitar", src) - song.instrumentExt = "ogg" - -/obj/item/device/guitar/Destroy() - QDEL_NULL(song) - return ..() - -/obj/item/device/guitar/attack_self(mob/user as mob) - ui_interact(user) - -/obj/item/device/guitar/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - if(!isliving(user) || user.incapacitated()) - return - - song.ui_interact(user, ui_key, ui, force_open) - -/obj/item/device/guitar/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) - return song.ui_data(user, ui_key, state) - -/obj/item/device/guitar/Topic(href, href_list) - song.Topic(href, href_list) - -/datum/crafting_recipe/guitar - name = "Guitar" - result = /obj/item/device/guitar - reqs = list(/obj/item/stack/sheet/wood = 5, - /obj/item/stack/cable_coil = 6, - /obj/item/stack/tape_roll = 5) - tools = list(/obj/item/weapon/screwdriver, /obj/item/weapon/wirecutters) - time = 80 diff --git a/code/game/objects/items/devices/instruments.dm b/code/game/objects/items/devices/instruments.dm new file mode 100644 index 00000000000..3643b197d4c --- /dev/null +++ b/code/game/objects/items/devices/instruments.dm @@ -0,0 +1,103 @@ +//copy pasta of the space piano, don't hurt me -Pete +/obj/item/device/instrument + name = "generic instrument" + icon = 'icons/obj/musician.dmi' + burn_state = FLAMMABLE + var/datum/song/handheld/song + var/instrumentId = "generic" + var/instrumentExt = "ogg" + +/obj/item/device/instrument/New() + song = new(instrumentId, src) + song.instrumentExt = instrumentExt + ..() + +/obj/item/device/instrument/Destroy() + QDEL_NULL(song) + return ..() + +/obj/item/device/instrument/suicide_act(mob/user) + user.visible_message("[user] begins to play 'Gloomy Sunday'! It looks like \he's trying to commit suicide!") + return (BRUTELOSS) + +/obj/item/device/instrument/initialize(mapload) + song.tempo = song.sanitize_tempo(song.tempo) // tick_lag isn't set when the map is loaded + ..() + +/obj/item/device/instrument/attack_self(mob/user) + ui_interact(user) + +/obj/item/device/instrument/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1) + if(!isliving(user) || user.incapacitated()) + return + + song.ui_interact(user, ui_key, ui, force_open) + +/obj/item/device/instrument/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) + return song.ui_data(user, ui_key, state) + +/obj/item/device/instrument/Topic(href, href_list) + song.Topic(href, href_list) + +/obj/item/device/instrument/violin + name = "space violin" + desc = "A wooden musical instrument with four strings and a bow. \"The devil went down to space, he was looking for an assistant to grief.\"" + icon_state = "violin" + item_state = "violin" + force = 10 + hitsound = "swing_hit" + instrumentId = "violin" + +/obj/item/device/instrument/violin/golden + name = "golden violin" + desc = "A golden musical instrument with four strings and a bow. \"The devil went down to space, he was looking for an assistant to grief.\"" + icon_state = "golden_violin" + item_state = "golden_violin" + burn_state = LAVA_PROOF + +/obj/item/device/instrument/guitar + name = "guitar" + desc = "It's made of wood and has bronze strings." + icon_state = "guitar" + item_state = "guitar" + force = 10 + attack_verb = list("played metal on", "serenaded", "crashed", "smashed") + hitsound = 'sound/effects/guitarsmash.ogg' + instrumentId = "guitar" + +/obj/item/device/instrument/eguitar + name = "electric guitar" + desc = "Makes all your shredding needs possible." + icon_state = "eguitar" + item_state = "eguitar" + force = 12 + attack_verb = list("played metal on", "shredded", "crashed", "smashed") + hitsound = 'sound/weapons/stringsmash.ogg' + instrumentId = "eguitar" + +/datum/crafting_recipe/violin + name = "Violin" + result = /obj/item/device/instrument/violin + reqs = list(/obj/item/stack/sheet/wood = 5, + /obj/item/stack/cable_coil = 6, + /obj/item/stack/tape_roll = 5) + tools = list(/obj/item/weapon/screwdriver, /obj/item/weapon/wirecutters) + time = 80 + +/datum/crafting_recipe/guitar + name = "Guitar" + result = /obj/item/device/instrument/guitar + reqs = list(/obj/item/stack/sheet/wood = 5, + /obj/item/stack/cable_coil = 6, + /obj/item/stack/tape_roll = 5) + tools = list(/obj/item/weapon/screwdriver, /obj/item/weapon/wirecutters) + time = 80 + +/datum/crafting_recipe/eguitar + name = "Electric Guitar" + result = /obj/item/device/instrument/eguitar + reqs = list(/obj/item/stack/sheet/metal = 5, + /obj/item/stack/cable_coil = 6, + /obj/item/stack/tape_roll = 5) + tools = list(/obj/item/weapon/screwdriver, /obj/item/weapon/wirecutters) + time = 80 \ No newline at end of file diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index b172ea052f0..c8294590e3c 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -8,9 +8,8 @@ flags = CONDUCT slot_flags = SLOT_BELT materials = list(MAT_METAL=500, MAT_GLASS=500) - w_class = 2 //Increased to 2, because diodes are w_class 2. Conservation of matter. - origin_tech = "combat=1" - origin_tech = "magnets=2" + w_class = WEIGHT_CLASS_SMALL //Increased to 2, because diodes are w_class 2. Conservation of matter. + origin_tech = "combat=1;magnets=2" var/energy = 5 var/max_energy = 5 var/effectchance = 33 diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 664bd07f8ad..7fa63f07eb7 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -49,7 +49,7 @@ flags = CONDUCT slot_flags = SLOT_BELT - origin_tech = "magnets=3;materials=2" + origin_tech = "magnets=3;engineering=4" var/max_uses = 20 var/uses = 0 diff --git a/code/game/objects/items/devices/machineprototype.dm b/code/game/objects/items/devices/machineprototype.dm new file mode 100644 index 00000000000..e6574d0e55a --- /dev/null +++ b/code/game/objects/items/devices/machineprototype.dm @@ -0,0 +1,7 @@ +/obj/item/device/machineprototype + name = "machine prototype" + desc = "A complicated machine prototype. You have no idea how it works." + icon = 'icons/obj/machineprototype.dmi' + icon_state = "machineprototype" + materials = list(MAT_METAL=1000, MAT_GLASS=500) + origin_tech = "engineering=6" diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index d38ac3b71ff..c59e39a2043 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -3,7 +3,7 @@ desc = "A device used to project your voice. Loudly." icon_state = "megaphone" item_state = "radio" - w_class = 1 + w_class = WEIGHT_CLASS_SMALL flags = CONDUCT var/spamcheck = 0 diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index feb288d327d..1d42bf70108 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -3,7 +3,7 @@ icon = 'icons/obj/aicards.dmi' icon_state = "pai" item_state = "electronic" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL slot_flags = SLOT_BELT origin_tech = "programming=2" var/request_cooldown = 5 // five seconds diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index 65093361197..c02337e339a 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -5,13 +5,13 @@ desc = "A nulling power sink which drains energy from electrical systems." icon_state = "powersink0" item_state = "electronic" - w_class = 4 + w_class = WEIGHT_CLASS_BULKY flags = CONDUCT throwforce = 5 throw_speed = 1 throw_range = 2 materials = list(MAT_METAL=750) - origin_tech = "powerstorage=3;syndicate=5" + origin_tech = "powerstorage=5;syndicate=5" var/drain_rate = 1600000 // amount of power to drain per tick var/apc_drain_rate = 50 // Max. amount drained from single APC. In Watts. var/dissipation_rate = 20000 // Passive dissipation of drained power. In Watts. diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm index 55f42587104..465d75d2b8e 100644 --- a/code/game/objects/items/devices/radio/beacon.dm +++ b/code/game/objects/items/devices/radio/beacon.dm @@ -53,7 +53,7 @@ /obj/item/device/radio/beacon/syndicate name = "suspicious beacon" desc = "A label on it reads: Activate to have a singularity beacon teleported to your location." - origin_tech = "bluespace=1;syndicate=7" + origin_tech = "bluespace=6;syndicate=5" syndicate = 1 /obj/item/device/radio/beacon/syndicate/attack_self(mob/user as mob) @@ -67,7 +67,7 @@ /obj/item/device/radio/beacon/syndicate/bomb name = "suspicious beacon" desc = "A label on it reads: Warning: Activating this device will send a high-ordinance explosive to your location." - origin_tech = "bluespace=1;syndicate=7" + origin_tech = "bluespace=5;syndicate=5" /obj/item/device/radio/beacon/syndicate/bomb/attack_self(mob/user as mob) if(user) diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index 35848bdc087..7c01d03ca36 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -6,7 +6,7 @@ frequency = 1449 flags = CONDUCT slot_flags = SLOT_BACK - w_class = 5 + w_class = WEIGHT_CLASS_HUGE materials = list(MAT_METAL=10000, MAT_GLASS=2500) var/code = 2 diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index 7350f3965cc..cfbde361db1 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -5,6 +5,8 @@ icon = 'icons/obj/radio.dmi' icon_state = "cypherkey" item_state = "" + w_class = WEIGHT_CLASS_TINY + origin_tech = "engineering=2;bluespace=1" var/translate_binary = 0 var/translate_hive = 0 var/syndie = 0 @@ -18,7 +20,7 @@ /obj/item/device/encryptionkey/syndicate icon_state = "cypherkey" channels = list("Syndicate" = 1) - origin_tech = "syndicate=3" + origin_tech = "syndicate=1;engineering=3;bluespace=2" syndie = 1 //Signifies that it de-crypts Syndicate transmissions /obj/item/device/encryptionkey/syndteam @@ -32,7 +34,7 @@ desc = "An encryption key for a radio headset. To access the binary channel, use :b." icon_state = "cypherkey" translate_binary = 1 - origin_tech = "syndicate=3" + origin_tech = "syndicate=3;engineering=4;bluespace=3" /obj/item/device/encryptionkey/headset_sec name = "Security Radio Encryption Key" @@ -147,4 +149,4 @@ name = "AI Integrated Encryption Key" desc = "Integrated encryption key" icon_state = "cap_cypherkey" - channels = list("Command" = 1, "Security" = 1, "Engineering" = 1, "Science" = 1, "Medical" = 1, "Supply" = 1, "Service" = 1, "AI Private" = 1) \ No newline at end of file + channels = list("Command" = 1, "Security" = 1, "Engineering" = 1, "Science" = 1, "Medical" = 1, "Supply" = 1, "Service" = 1, "AI Private" = 1) diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 43289678591..1e24f966cf3 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -3,7 +3,7 @@ desc = "Talk through this." icon_state = "intercom" anchored = 1 - w_class = 4 + w_class = WEIGHT_CLASS_BULKY canhear_range = 2 flags = CONDUCT var/number = 0 @@ -231,8 +231,9 @@ icon = 'icons/obj/doors/door_assembly.dmi' icon_state = "door_electronics" desc = "Looks like a circuit. Probably is." - w_class = 2 + w_class = WEIGHT_CLASS_SMALL materials = list(MAT_METAL=50, MAT_GLASS=50) + origin_tech = "engineering=2;programming=1" toolspeed = 1 usesound = 'sound/items/Deconstruct.ogg' diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index c14fba68606..3d1f1001b06 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -37,6 +37,7 @@ var/global/list/default_medbay_channels = list( var/list/channels = list() //see communications.dm for full list. First channes is a "default" for :h var/subspace_transmission = 0 var/syndie = 0//Holder to see if it's a syndicate encrpyed radio + var/disable_timer = 0 //How many times this is disabled by EMPs var/is_special = 0 //For electropacks mostly, skips Topic() checks @@ -44,7 +45,7 @@ var/global/list/default_medbay_channels = list( slot_flags = SLOT_BELT throw_speed = 2 throw_range = 9 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL materials = list(MAT_METAL=75) @@ -246,6 +247,13 @@ var/global/list/default_medbay_channels = list( A.name = from A.role = role A.message = message + var/jammed = FALSE + for(var/obj/item/device/jammer/jammer in active_jammers) + if(get_dist(get_turf(src), get_turf(jammer)) < jammer.range) + jammed = TRUE + break + if(jammed) + message = Gibberish(message, 100) Broadcast_Message(connection, A, 0, "*garbled automated announcement*", src, message, from, "Automated Announcement", from, "synthesized voice", @@ -331,6 +339,12 @@ var/global/list/default_medbay_channels = list( var/datum/radio_frequency/connection = message_mode var/turf/position = get_turf(src) + var/jammed = FALSE + for(var/obj/item/device/jammer/jammer in active_jammers) + if(get_dist(position, get_turf(jammer)) < jammer.range) + jammed = TRUE + break + //#### Tagging the signal with all appropriate identity values ####// // ||-- The mob's name identity --|| @@ -344,6 +358,9 @@ var/global/list/default_medbay_channels = list( var/jobname // the mob's "job" + if(jammed) + message = Gibberish(message, 100) + // --- Human: use their actual job --- if(ishuman(M)) var/mob/living/carbon/human/H = M @@ -599,12 +616,25 @@ var/global/list/default_medbay_channels = list( else return /obj/item/device/radio/emp_act(severity) + on = 0 + disable_timer++ + addtimer(src, "enable_radio", rand(100, 200)) + + if(listening) + visible_message("[src] buzzes violently!") + broadcasting = 0 listening = 0 for(var/ch_name in channels) channels[ch_name] = 0 ..() +/obj/item/device/radio/proc/enable_radio() + if(disable_timer > 0) + disable_timer-- + if(!disable_timer) + on = 1 + /////////////////////////////// //////////Borg Radios////////// /////////////////////////////// diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index a2fd5881ca7..ac4dfac8206 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -15,6 +15,7 @@ REAGENT SCANNER var/on = 0 slot_flags = SLOT_BELT w_class = 2 + w_class = WEIGHT_CLASS_SMALL item_state = "electronic" materials = list(MAT_METAL=150) origin_tech = "magnets=1;engineering=1" @@ -22,15 +23,12 @@ REAGENT SCANNER var/pulse_duration = 10 /obj/item/device/t_scanner/longer_pulse - origin_tech = "magnets=2;engineering=2" pulse_duration = 50 /obj/item/device/t_scanner/extended_range - origin_tech = "magnets=1;engineering=3" scan_range = 3 /obj/item/device/t_scanner/extended_range/longer_pulse - origin_tech = "magnets=2;engineering=3" scan_range = 3 pulse_duration = 50 @@ -117,7 +115,7 @@ REAGENT SCANNER flags = CONDUCT slot_flags = SLOT_BELT throwforce = 3 - w_class = 1 + w_class = WEIGHT_CLASS_TINY throw_speed = 5 throw_range = 10 materials = list(MAT_METAL=200) @@ -187,7 +185,8 @@ REAGENT SCANNER if(istype(M, /mob/living/carbon)) if(upgraded) chemscan(user, M) - for(var/datum/disease/D in M.viruses) + for(var/thing in M.viruses) + var/datum/disease/D = thing if(!(D.visibility_flags & HIDDEN_SCANNER)) to_chat(user, "Warning: [D.form] detected\nName: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]") if(M.getStaminaLoss()) @@ -226,21 +225,22 @@ REAGENT SCANNER for(var/datum/wound/W in e.wounds) if(W.internal) user.show_message(text("Internal bleeding detected. Advanced scanner required for location."), 1) break - if(H.vessel) - var/blood_type = H.get_blood_name() - var/blood_volume = round(H.vessel.get_reagent_amount(blood_type)) - var/blood_percent = blood_volume / BLOOD_VOLUME_NORMAL - blood_percent *= 100 - if(blood_volume <= 500) - user.show_message("Warning: Blood Level LOW: [blood_percent]% [blood_volume]cl") - else if(blood_volume <= 336) - user.show_message("Warning: Blood Level CRITICAL: [blood_percent]% [blood_volume]cl") - else - user.show_message("Blood Level Normal: [blood_percent]% [blood_volume]cl") - if(H.species.exotic_blood) - user.show_message("Subject possesses exotic blood.") - user.show_message("Exotic blood type: [blood_type].") - if(H.heart_attack && H.stat != DEAD) + var/blood_id = H.get_blood_id() + if(blood_id) + if(H.bleed_rate) + to_chat(user, "Subject is bleeding!") + var/blood_percent = round((H.blood_volume / BLOOD_VOLUME_NORMAL)*100) + var/blood_type = H.b_type + if(blood_id != "blood")//special blood substance + blood_type = blood_id + if(H.blood_volume <= BLOOD_VOLUME_SAFE && H.blood_volume > BLOOD_VOLUME_OKAY) + user.show_message("LOW blood level [blood_percent] %, [H.blood_volume] cl, type: [blood_type]") + else if(H.blood_volume <= BLOOD_VOLUME_OKAY) + to_chat(user, "CRITICAL blood level [blood_percent] %, [H.blood_volume] cl, type: [blood_type]") + + user.show_message("blood type: [blood_type].") + + if(H.undergoing_cardiac_arrest() && H.stat != DEAD) user.show_message("Subject suffering from heart attack: Apply defibrillator immediately.") user.show_message("Subject's pulse: [H.get_pulse(GETPULSE_TOOL)] bpm.") var/implant_detect @@ -294,7 +294,7 @@ REAGENT SCANNER name = "Health Analyzer Upgrade" icon_state = "healthupgrade" desc = "An upgrade unit that can be installed on a health analyzer for expanded functionality." - w_class = 1 + w_class = WEIGHT_CLASS_TINY origin_tech = "magnets=2;biotech=2" usesound = 'sound/items/Deconstruct.ogg' @@ -303,7 +303,7 @@ REAGENT SCANNER name = "analyzer" icon_state = "atmos" item_state = "analyzer" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL flags = CONDUCT slot_flags = SLOT_BELT throwforce = 0 @@ -369,16 +369,18 @@ REAGENT SCANNER name = "mass-spectrometer" icon_state = "spectrometer" item_state = "analyzer" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL flags = CONDUCT | OPENCONTAINER slot_flags = SLOT_BELT throwforce = 5 throw_speed = 4 throw_range = 20 - materials = list(MAT_METAL=30, MAT_GLASS=20) - origin_tech = "magnets=2;biotech=2" + materials = list(MAT_METAL=150, MAT_GLASS=100) + origin_tech = "magnets=2;biotech=1;plasmatech=2" var/details = 0 - var/recent_fail = 0 + var/datatoprint = "" + var/scanning = 1 + actions_types = list(/datum/action/item_action/print_report) /obj/item/device/mass_spectrometer/New() ..() @@ -393,9 +395,6 @@ REAGENT SCANNER /obj/item/device/mass_spectrometer/attack_self(mob/user as mob) if(user.stat) return - if(crit_fail) - to_chat(user, "This device has critically failed and is no longer functional!") - return if(!user.IsAdvancedToolUser()) to_chat(user, "You don't have the dexterity to do this!") return @@ -409,21 +408,12 @@ REAGENT SCANNER else blood_traces = params2list(R.data["trace_chem"]) break - var/dat = "Trace Chemicals Found: " + var/dat = "" for(var/R in blood_traces) - if(prob(reliability)) - if(details) - dat += "[R] ([blood_traces[R]] units) " - else - dat += "[R] " - recent_fail = 0 + if(details) + dat += "[R] ([blood_traces[R]] units) " else - if(recent_fail) - crit_fail = 1 - reagents.clear_reagents() - return - else - recent_fail = 1 + dat += "[R] " to_chat(user, "[dat]") reagents.clear_reagents() return @@ -432,23 +422,47 @@ REAGENT SCANNER name = "advanced mass-spectrometer" icon_state = "adv_spectrometer" details = 1 - origin_tech = "magnets=4;biotech=2" + origin_tech = "magnets=4;biotech=3;plasmatech=3" + +/obj/item/device/mass_spectrometer/proc/print_report() + if(!scanning) + usr.visible_message("[src] rattles and prints out a sheet of paper.") + playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1) + sleep(50) + + var/obj/item/weapon/paper/P = new(get_turf(src)) + P.name = "Mass Spectrometer Scanner Report: [worldtime2text()]" + P.info = "
    Mass Spectrometer

    Data Analysis:



    Trace chemicals detected:
    [datatoprint]

    " + + if(ismob(loc)) + var/mob/M = loc + M.put_in_hands(P) + to_chat(M, "Report printed. Log cleared.") + datatoprint = "" + scanning = 1 + else + to_chat(usr, "[src] has no logs or is already in use.") + +/obj/item/device/mass_spectrometer/ui_action_click() + print_report() /obj/item/device/reagent_scanner name = "reagent scanner" desc = "A hand-held reagent scanner which identifies chemical agents." icon_state = "spectrometer" item_state = "analyzer" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL flags = CONDUCT slot_flags = SLOT_BELT throwforce = 5 throw_speed = 4 throw_range = 20 materials = list(MAT_METAL=30, MAT_GLASS=20) - origin_tech = "magnets=2;biotech=2" + origin_tech = "magnets=2;biotech=1;plasmatech=2" var/details = 0 - var/recent_fail = 0 + var/datatoprint = "" + var/scanning = 1 + actions_types = list(/datum/action/item_action/print_report) /obj/item/device/reagent_scanner/afterattack(obj/O, mob/user as mob) if(user.stat) @@ -458,45 +472,57 @@ REAGENT SCANNER return if(!istype(O)) return - if(crit_fail) - to_chat(user, "This device has critically failed and is no longer functional!") - return if(!isnull(O.reagents)) var/dat = "" if(O.reagents.reagent_list.len > 0) var/one_percent = O.reagents.total_volume / 100 for(var/datum/reagent/R in O.reagents.reagent_list) - if(prob(reliability)) - dat += "
    [TAB][R][details ? ": [R.volume / one_percent]%" : ""]" - recent_fail = 0 - else if(recent_fail) - crit_fail = 1 - dat = null - break - else - recent_fail = 1 + dat += "
    [TAB][R][details ? ": [R.volume / one_percent]%" : ""]" if(dat) to_chat(user, "Chemicals found: [dat]") + datatoprint = dat + scanning = 0 else to_chat(user, "No active chemical agents found in [O].") else to_chat(user, "No significant chemical agents found in [O].") - return /obj/item/device/reagent_scanner/adv name = "advanced reagent scanner" icon_state = "adv_spectrometer" details = 1 - origin_tech = "magnets=4;biotech=2" + origin_tech = "magnets=4;biotech=3;plasmatech=3" + +/obj/item/device/reagent_scanner/proc/print_report() + if(!scanning) + usr.visible_message("[src] rattles and prints out a sheet of paper.") + playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1) + sleep(50) + + var/obj/item/weapon/paper/P = new(get_turf(src)) + P.name = "Reagent Scanner Report: [worldtime2text()]" + P.info = "
    Reagent Scanner

    Data Analysis:



    Chemical agents detected:
    [datatoprint]

    " + + if(ismob(loc)) + var/mob/M = loc + M.put_in_hands(P) + to_chat(M, "Report printed. Log cleared.") + datatoprint = "" + scanning = 1 + else + to_chat(usr, "[src] has no logs or is already in use.") + +/obj/item/device/reagent_scanner/ui_action_click() + print_report() /obj/item/device/slime_scanner name = "slime scanner" icon_state = "adv_spectrometer_s" item_state = "analyzer" - origin_tech = "biotech=1" - w_class = 2 + origin_tech = "biotech=2" + w_class = WEIGHT_CLASS_SMALL flags = CONDUCT throwforce = 0 throw_speed = 3 diff --git a/code/game/objects/items/devices/sensor_device.dm b/code/game/objects/items/devices/sensor_device.dm index 79fc2f92457..ccd05ba2895 100644 --- a/code/game/objects/items/devices/sensor_device.dm +++ b/code/game/objects/items/devices/sensor_device.dm @@ -3,9 +3,9 @@ desc = "A miniature machine that tracks suit sensors across the station." icon = 'icons/obj/device.dmi' icon_state = "scanner" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL slot_flags = SLOT_BELT - origin_tech = "biotech=3;materials=3;magnets=3" + origin_tech = "programming=3;materials=3;magnets=3" var/datum/nano_module/crew_monitor/crew_monitor /obj/item/device/sensor_device/New() @@ -19,4 +19,4 @@ ui_interact(user) /obj/item/device/sensor_device/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - crew_monitor.ui_interact(user, ui_key, ui, force_open) \ No newline at end of file + crew_monitor.ui_interact(user, ui_key, ui, force_open) diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 6ec1a36504b..9f773c0d402 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -3,7 +3,7 @@ desc = "A device that can record to cassette tapes, and play them. It automatically translates the content in playback." icon_state = "taperecorder_empty" item_state = "analyzer" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL slot_flags = SLOT_BELT materials = list(MAT_METAL=60, MAT_GLASS=30) force = 2 @@ -155,8 +155,7 @@ return else if(playing) playing = 0 - var/turf/T = get_turf(src) - T.visible_message("Tape Recorder: Playback stopped.") + atom_say("Playback stopped.") update_icon() @@ -185,19 +184,18 @@ break if(mytape.storedinfo.len < i) break - var/turf/T = get_turf(src) - T.visible_message("Tape Recorder: [mytape.storedinfo[i]]") + atom_say("[mytape.storedinfo[i]]") if(mytape.storedinfo.len < i + 1) playsleepseconds = 1 sleep(10) T = get_turf(src) - T.visible_message("Tape Recorder: End of recording.") + atom_say("End of recording.") else playsleepseconds = mytape.timestamp[i + 1] - mytape.timestamp[i] if(playsleepseconds > 14) sleep(10) T = get_turf(src) - T.visible_message("Tape Recorder: Skipping [playsleepseconds] seconds of silence") + atom_say("Skipping [playsleepseconds] seconds of silence.") playsleepseconds = 1 i++ @@ -251,7 +249,7 @@ desc = "A magnetic tape that can hold up to ten minutes of content." icon_state = "tape_white" item_state = "analyzer" - w_class = 1 + w_class = WEIGHT_CLASS_TINY materials = list(MAT_METAL=20, MAT_GLASS=5) force = 1 throwforce = 0 @@ -314,4 +312,4 @@ //Random colour tapes /obj/item/device/tape/random/New() - icon_state = "tape_[pick("white", "blue", "red", "yellow", "purple")]" \ No newline at end of file + icon_state = "tape_[pick("white", "blue", "red", "yellow", "purple")]" diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 0b38b3f9e18..6b48dea1910 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -19,7 +19,7 @@ effective or pretty fucking useless. desc = "A strange device with twin antennas." icon_state = "batterer" throwforce = 5 - w_class = 1 + w_class = WEIGHT_CLASS_TINY throw_speed = 4 throw_range = 10 flags = CONDUCT @@ -79,7 +79,7 @@ effective or pretty fucking useless. flags = CONDUCT slot_flags = SLOT_BELT throwforce = 3 - w_class = 1 + w_class = WEIGHT_CLASS_TINY throw_speed = 3 throw_range = 7 materials = list(MAT_METAL=400) @@ -146,3 +146,22 @@ effective or pretty fucking useless. attack_self(usr) add_fingerprint(usr) return + +/obj/item/device/jammer + name = "radio jammer" + desc = "Device used to disrupt nearby radio communication." + icon_state = "jammer" + var/active = FALSE + var/range = 12 + +/obj/item/device/jammer/Destroy() + active_jammers -= src + return ..() + +/obj/item/device/jammer/attack_self(mob/user) + to_chat(user,"You [active ? "deactivate" : "activate"] the [src].") + active = !active + if(active) + active_jammers |= src + else + active_jammers -= src \ No newline at end of file diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 877cb1a5fc9..9c293bd6073 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -122,16 +122,16 @@ tank_one.forceMove(get_turf(src)) tank_one = null update_icon() - if((!tank_two || tank_two.w_class < 4) && (w_class > 3)) - w_class = 3 + if((!tank_two || tank_two.w_class < WEIGHT_CLASS_BULKY) && (w_class > WEIGHT_CLASS_NORMAL)) + w_class = WEIGHT_CLASS_NORMAL else if(tank_two && href_list["tanktwo"]) split_gases() valve_open = 0 tank_two.forceMove(get_turf(src)) tank_two = null update_icon() - if((!tank_one || tank_one.w_class < 4) && (w_class > 3)) - w_class = 3 + if((!tank_one || tank_one.w_class < WEIGHT_CLASS_BULKY) && (w_class > WEIGHT_CLASS_NORMAL)) + w_class = WEIGHT_CLASS_NORMAL else if(href_list["open"]) toggle_valve() else if(attached_device) @@ -217,4 +217,4 @@ else if(valve_open && tank_one && tank_two) split_gases() valve_open = 0 - update_icon() \ No newline at end of file + update_icon() diff --git a/code/game/objects/items/devices/violin.dm b/code/game/objects/items/devices/violin.dm deleted file mode 100644 index 3ef6b2bef85..00000000000 --- a/code/game/objects/items/devices/violin.dm +++ /dev/null @@ -1,41 +0,0 @@ -//copy pasta of the space piano, don't hurt me -Pete - -/obj/item/device/violin - name = "space violin" - desc = "A wooden musical instrument with four strings and a bow. \"The devil went down to space, he was looking for an assistant to grief.\"" - icon = 'icons/obj/musician.dmi' - icon_state = "violin" - item_state = "violin" - attack_verb = list("strung", "fiddled", "tuned", "pitched") - force = 10 - burn_state = FLAMMABLE - burntime = 20 - hitsound = 'sound/weapons/smash.ogg' - var/datum/song/handheld/song - -/obj/item/device/violin/New() - song = new("violin", src) - song.instrumentExt = "ogg" - -/obj/item/device/violin/Destroy() - QDEL_NULL(song) - return ..() - -/obj/item/device/violin/initialize() - song.tempo = song.sanitize_tempo(song.tempo) // tick_lag isn't set when the map is loaded - ..() - -/obj/item/device/violin/attack_self(mob/user as mob) - ui_interact(user) - -/obj/item/device/violin/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - if(!isliving(user) || user.incapacitated()) - return - - song.ui_interact(user, ui_key, ui, force_open) - -/obj/item/device/violin/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) - return song.ui_data(user, ui_key, state) - -/obj/item/device/violin/Topic(href, href_list) - song.Topic(href, href_list) diff --git a/code/game/objects/items/devices/whistle.dm b/code/game/objects/items/devices/whistle.dm index 359dfd82efa..d9aae300360 100644 --- a/code/game/objects/items/devices/whistle.dm +++ b/code/game/objects/items/devices/whistle.dm @@ -3,7 +3,7 @@ desc = "Used by obese officers to save their breath for running." icon_state = "voice0" item_state = "flashtool" //looks exactly like a flash (and nothing like a flashbang) - w_class = 1 + w_class = WEIGHT_CLASS_TINY flags = CONDUCT var/spamcheck = 0 @@ -28,4 +28,3 @@ if(!emagged) to_chat(user, "You overload \the [src]'s voice synthesizer.") emagged = 1 - diff --git a/code/game/objects/items/documents.dm b/code/game/objects/items/documents.dm index f76a4942195..9540dcbb966 100644 --- a/code/game/objects/items/documents.dm +++ b/code/game/objects/items/documents.dm @@ -5,7 +5,7 @@ icon_state = "docs_generic" item_state = "paper" throwforce = 0 - w_class = 1 + w_class = WEIGHT_CLASS_TINY throw_range = 1 throw_speed = 1 layer = 4 @@ -26,4 +26,4 @@ /obj/item/documents/syndicate/blue name = "'Blue' secret documents" desc = "\"Top Secret\" documents printed on special copy-protected paper. It details sensitive Syndicate operational intelligence. These documents are marked \"Blue\"." - icon_state = "docs_blue" \ No newline at end of file + icon_state = "docs_blue" diff --git a/code/game/objects/items/flag.dm b/code/game/objects/items/flag.dm index e05182bf3c1..ebdaa953fbf 100644 --- a/code/game/objects/items/flag.dm +++ b/code/game/objects/items/flag.dm @@ -1,6 +1,6 @@ /obj/item/flag icon = 'icons/obj/flag.dmi' - w_class = 4 + w_class = WEIGHT_CLASS_BULKY burntime = 20 burn_state = FLAMMABLE @@ -156,16 +156,16 @@ name = "Nar'Sie Cultist flag" desc = "A flag proudly boasting the logo of the cultists, sworn enemies of NT." icon_state = "cultflag" - + //Chameleon /obj/item/flag/chameleon name = "Chameleon flag" desc = "A poor recreation of the official NT flag. It seems to shimmer a little." icon_state = "ntflag" - origin_tech = "materials=3;magnets=4;syndicate=4" + origin_tech = "syndicate=4;magnets=4" var/used = 0 - + /obj/item/flag/chameleon/attack_self(mob/user) if(used) return @@ -190,7 +190,7 @@ icon_state = chosen_flag.icon_state desc = chosen_flag.desc used = 1 - + /obj/item/flag/chameleon/burn() explosion(loc,1,2,4,4, flame_range = 4) - qdel(src) \ No newline at end of file + qdel(src) diff --git a/code/game/objects/items/latexballoon.dm b/code/game/objects/items/latexballoon.dm index a7a45de8cb8..dccc8f041f6 100644 --- a/code/game/objects/items/latexballoon.dm +++ b/code/game/objects/items/latexballoon.dm @@ -5,7 +5,7 @@ item_state = "lgloves" force = 0 throwforce = 0 - w_class = 1 + w_class = WEIGHT_CLASS_TINY throw_speed = 1 throw_range = 7 var/state @@ -59,5 +59,5 @@ var/obj/item/weapon/tank/T = W blow(T, user) return - if(is_sharp(W) || is_hot(W) || can_puncture(W)) - burst() \ No newline at end of file + if(is_sharp(W) || is_hot(W) || is_pointed(W)) + burst() diff --git a/code/game/objects/items/misc.dm b/code/game/objects/items/misc.dm index f2fa9596375..67b1523db8d 100644 --- a/code/game/objects/items/misc.dm +++ b/code/game/objects/items/misc.dm @@ -16,9 +16,9 @@ item_state = "beachball" density = 0 anchored = 0 - w_class = 1 + w_class = WEIGHT_CLASS_TINY force = 0.0 throwforce = 0.0 throw_speed = 1 throw_range = 20 - flags = CONDUCT \ No newline at end of file + flags = CONDUCT diff --git a/code/game/objects/items/mountable_frames/frames.dm b/code/game/objects/items/mountable_frames/frames.dm index b8ef9216053..0bc5a8f9be6 100644 --- a/code/game/objects/items/mountable_frames/frames.dm +++ b/code/game/objects/items/mountable_frames/frames.dm @@ -1,6 +1,7 @@ /obj/item/mounted/frame name = "mountable frame" desc = "Place it on a wall." + origin_tech = "materials=1;engineering=1" var/sheets_refunded = 2 var/list/mount_reqs = list() //can contain simfloor, nospace. Used in try_build to see if conditions are needed, then met toolspeed = 1 diff --git a/code/game/objects/items/policetape.dm b/code/game/objects/items/policetape.dm index f171e984f36..bea99b5d98b 100644 --- a/code/game/objects/items/policetape.dm +++ b/code/game/objects/items/policetape.dm @@ -3,7 +3,7 @@ name = "tape roll" icon = 'icons/policetape.dmi' icon_state = "rollstart" - w_class = 1 + w_class = WEIGHT_CLASS_TINY var/turf/start var/turf/end var/tape_type = /obj/item/tape @@ -151,7 +151,7 @@ var/list/tape_roll_applications = list() if(!density) return 1 if(height==0) return 1 - if((mover.pass_flags & PASSTABLE || istype(mover, /obj/effect/meteor) || mover.throwing == 1) ) + if((mover.pass_flags & PASSTABLE || istype(mover, /obj/effect/meteor) || mover.throwing)) return 1 else if(ismob(mover) && allowed(mover)) return 1 @@ -162,7 +162,7 @@ var/list/tape_roll_applications = list() breaktape(W, user) /obj/item/tape/attack_hand(mob/user as mob) - if(user.a_intent == I_HELP && src.allowed(user)) + if(user.a_intent == INTENT_HELP && src.allowed(user)) user.visible_message("[user] lifts [src], allowing passage.", "You lift [src], allowing passage.") src.density = 0 spawn(200) @@ -174,7 +174,7 @@ var/list/tape_roll_applications = list() breaktape(/obj/item/weapon/wirecutters,user) /obj/item/tape/proc/breaktape(obj/item/weapon/W as obj, mob/user as mob) - if(user.a_intent == I_HELP && ((!can_puncture(W) && src.allowed(user)))) + if(user.a_intent == INTENT_HELP && ((!is_pointed(W) && src.allowed(user)))) to_chat(user, "You can't break the [src] with that!") return user.visible_message("[user] breaks the [src]!", "You break the [src]!") @@ -201,5 +201,3 @@ var/list/tape_roll_applications = list() qdel(src) return - - diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index ef1589f50b7..b744edd79a6 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -7,7 +7,7 @@ slot_flags = SLOT_BELT var/list/part = null var/sabotaged = 0 //Emagging limbs can have repercussions when installed as prosthetics. - var/model_info + var/model_info = "Unbranded" dir = SOUTH /obj/item/robot_parts/New(newloc, model) @@ -23,33 +23,38 @@ else name = "robot [initial(name)]" +/obj/item/robot_parts/attack_self(mob/user) + var/choice = input(user, "Select the company appearance for this limb.", "Limb Company Selection") as null|anything in selectable_robolimbs + if(!choice) + return + if(loc != user) + return + model_info = choice + to_chat(usr, "You change the company limb model to [choice].") + /obj/item/robot_parts/l_arm name = "left arm" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." icon_state = "l_arm" part = list("l_arm","l_hand") - model_info = 1 /obj/item/robot_parts/r_arm name = "right arm" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." icon_state = "r_arm" part = list("r_arm","r_hand") - model_info = 1 /obj/item/robot_parts/l_leg name = "left leg" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." icon_state = "l_leg" part = list("l_leg","l_foot") - model_info = 1 /obj/item/robot_parts/r_leg name = "right leg" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." icon_state = "r_leg" part = list("r_leg","r_foot") - model_info = 1 /obj/item/robot_parts/chest name = "torso" @@ -80,6 +85,7 @@ name = "endoskeleton" desc = "A complex metal backbone with standard limb sockets and pseudomuscle anchors." icon_state = "robo_suit" + model_info = null var/obj/item/robot_parts/l_arm/l_arm = null var/obj/item/robot_parts/r_arm/r_arm = null var/obj/item/robot_parts/l_leg/l_leg = null @@ -108,6 +114,9 @@ forced_ai = null return ..() +/obj/item/robot_parts/robot_suit/attack_self(mob/user) + return + /obj/item/robot_parts/robot_suit/proc/updateicon() overlays.Cut() if(l_arm) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 40cc65da34a..1f8cb43fbb2 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -6,6 +6,7 @@ desc = "Protected by FRM." icon = 'icons/obj/module.dmi' icon_state = "cyborg_upgrade" + origin_tech = "programming=2" var/locked = 0 var/installed = 0 var/require_module = 0 @@ -36,8 +37,7 @@ R.hands.icon_state = "nomod" R.icon_state = "robot" R.module.remove_subsystems_and_actions(R) - qdel(R.module) - R.module = null + QDEL_NULL(R.module) R.camera.network.Remove(list("Engineering", "Medical", "Mining Outpost")) R.rename_character(R.real_name, R.get_default_name("Default")) @@ -103,6 +103,7 @@ desc = "Used to kick in a robot's VTEC systems, increasing their speed." icon_state = "cyborg_upgrade2" require_module = 1 + origin_tech = "engineering=4;materials=5;programming=4" /obj/item/borg/upgrade/vtec/action(var/mob/living/silicon/robot/R) if(..()) @@ -120,6 +121,7 @@ name = "cyborg rapid disabler cooling module" desc = "Used to cool a mounted disabler, increasing the potential current in it and thus its recharge rate." icon_state = "cyborg_upgrade3" + origin_tech = "engineering=4;powerstorage=4;combat=4" require_module = 1 module_type = /obj/item/weapon/robot_module/security @@ -144,6 +146,7 @@ name = "ion thruster upgrade" desc = "A energy-operated thruster system for cyborgs." icon_state = "cyborg_upgrade3" + origin_tech = "engineering=4;powerstorage=4" /obj/item/borg/upgrade/thrusters/action(mob/living/silicon/robot/R) if(..()) @@ -160,6 +163,7 @@ name = "mining cyborg diamond drill" desc = "A diamond drill replacement for the mining module's standard drill." icon_state = "cyborg_upgrade3" + origin_tech = "engineering=4;materials=5" require_module = 1 module_type = /obj/item/weapon/robot_module/miner @@ -181,6 +185,7 @@ name = "mining cyborg satchel of holding" desc = "A satchel of holding replacement for mining cyborg's ore satchel module." icon_state = "cyborg_upgrade3" + origin_tech = "engineering=4;materials=4;bluespace=4" require_module = 1 module_type = /obj/item/weapon/robot_module/miner @@ -200,6 +205,7 @@ name = "illegal equipment module" desc = "Unlocks the hidden, deadlier functions of a cyborg" icon_state = "cyborg_upgrade3" + origin_tech = "combat=4;syndicate=1" require_module = 1 /obj/item/borg/upgrade/syndicate/action(mob/living/silicon/robot/R) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 4c2bbfa3bcd..e63d74af020 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -4,13 +4,14 @@ icon = 'icons/obj/items.dmi' amount = 6 max_amount = 6 - w_class = 1 + w_class = WEIGHT_CLASS_TINY throw_speed = 3 throw_range = 7 var/heal_brute = 0 var/heal_burn = 0 var/self_delay = 20 var/unique_handling = 0 //some things give a special prompt, do we want to bypass some checks in parent? + var/stop_bleeding = 0 /obj/item/stack/medical/attack(mob/living/M, mob/user) if(!iscarbon(M) && !isanimal(M)) @@ -37,6 +38,14 @@ to_chat(user, "This can't be used on a robotic limb.") return 1 + if(stop_bleeding) + if(H.bleedsuppress) + to_chat(user, "[H]'s bleeding is already bandaged!") + return 1 + else if(!H.bleed_rate) + to_chat(user, "[H] isn't bleeding!") + return 1 + if(M == user && !unique_handling) user.visible_message("[user] starts to apply [src] on [H]...") if(!do_mob(user, H, self_delay)) @@ -75,7 +84,8 @@ singular_name = "gauze length" desc = "Some sterile gauze to wrap around bloody stumps." icon_state = "gauze" - origin_tech = "biotech=1" + origin_tech = "biotech=2" + stop_bleeding = 1800 /obj/item/stack/medical/bruise_pack/attack(mob/living/M, mob/user) if(..()) @@ -96,6 +106,9 @@ user.visible_message("[user] bandages the wounds on [H]'s [affecting.name].", \ "You bandage the wounds on [H]'s [affecting.name]." ) + if(stop_bleeding) + if(!H.bleedsuppress) //so you can't stack bleed suppression + H.suppress_bloodloss(stop_bleeding) affecting.heal_damage(heal_brute, heal_burn) H.UpdateDamageIcon() use(1) @@ -121,7 +134,7 @@ gender = PLURAL singular_name = "ointment" icon_state = "ointment" - origin_tech = "biotech=1" + origin_tech = "biotech=2" /obj/item/stack/medical/ointment/attack(mob/living/M, mob/user) if(..()) diff --git a/code/game/objects/items/stacks/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm index a21bb504fdc..8e3c6a57e18 100644 --- a/code/game/objects/items/stacks/nanopaste.dm +++ b/code/game/objects/items/stacks/nanopaste.dm @@ -4,7 +4,7 @@ desc = "A tube of paste containing swarms of repair nanites. Very effective in repairing robotic machinery." icon = 'icons/obj/nanopaste.dmi' icon_state = "tube" - origin_tech = "materials=3;engineering=2" + origin_tech = "materials=2;engineering=3" amount = 10 toolspeed = 1 diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 1b63eaae7f0..9de205d483c 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -9,7 +9,7 @@ var/global/list/datum/stack_recipe/rod_recipes = list ( \ icon_state = "rods" item_state = "rods" flags = CONDUCT - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL force = 9.0 throwforce = 10.0 throw_speed = 3 @@ -55,7 +55,7 @@ var/global/list/datum/stack_recipe/rod_recipes = list ( \ "You shape [src] into metal with the welding tool.", \ "You hear welding.") - var/replace = user.get_inactive_hand() == src + var/replace = user.is_in_inactive_hand(src) use(2) if(get_amount() <= 0 && replace) user.unEquip(src, 1) diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index deea1ecc24e..38d426766a0 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -267,7 +267,7 @@ singular_name = "glass sheet" icon_state = "sheet-plasmaglass" materials = list(MAT_GLASS=MINERAL_MATERIAL_AMOUNT*2) - origin_tech = "materials=3;plasmatech=2" + origin_tech = "plasmatech=2;materials=2" var/created_window = /obj/structure/window/plasmabasic var/full_window = /obj/structure/window/full/plasmabasic @@ -356,7 +356,7 @@ singular_name = "reinforced plasma glass sheet" icon_state = "sheet-plasmarglass" materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT/2, MAT_GLASS=MINERAL_MATERIAL_AMOUNT*2) - origin_tech = "materials=3;plasmatech=2" + origin_tech = "plasmatech=2;materials=2" var/created_window = /obj/structure/window/plasmareinforced var/full_window = /obj/structure/window/full/plasmareinforced diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 3a2d07aa2f6..9ccfdf28ad5 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -1,9 +1,13 @@ +/obj/item/stack/sheet/animalhide + name = "hide" + desc = "Something went wrong." + origin_tech = "biotech=3" + /obj/item/stack/sheet/animalhide/human name = "human skin" desc = "The by-product of human farming." singular_name = "human skin piece" icon_state = "sheet-hide" - origin_tech = "" var/global/list/datum/stack_recipe/human_recipes = list( \ new/datum/stack_recipe("bloated human costume", /obj/item/clothing/suit/bloated_human, 5, on_floor = 1), \ @@ -19,42 +23,36 @@ var/global/list/datum/stack_recipe/human_recipes = list( \ desc = "A piece of generic skin." singular_name = "generic skin piece" icon_state = "sheet-hide" - origin_tech = null /obj/item/stack/sheet/animalhide/corgi name = "corgi hide" desc = "The by-product of corgi farming." singular_name = "corgi hide piece" icon_state = "sheet-corgi" - origin_tech = "" /obj/item/stack/sheet/animalhide/cat name = "cat hide" desc = "The by-product of cat farming." singular_name = "cat hide piece" icon_state = "sheet-cat" - origin_tech = "" /obj/item/stack/sheet/animalhide/monkey name = "monkey hide" desc = "The by-product of monkey farming." singular_name = "monkey hide piece" icon_state = "sheet-monkey" - origin_tech = "" /obj/item/stack/sheet/animalhide/lizard name = "lizard skin" desc = "Sssssss..." singular_name = "lizard skin piece" icon_state = "sheet-lizard" - origin_tech = "" /obj/item/stack/sheet/animalhide/xeno name = "alien hide" desc = "The skin of a terrible creature." singular_name = "alien hide piece" icon_state = "sheet-xeno" - origin_tech = "" //don't see anywhere else to put these, maybe together they could be used to make the xenos suit? /obj/item/stack/sheet/xenochitin @@ -108,8 +106,8 @@ var/global/list/datum/stack_recipe/human_recipes = list( \ desc = "Long stringy filaments which presumably came from a watcher's wings." singular_name = "watcher sinew" icon_state = "sinew" - origin_tech = "biotech=4" - + origin_tech = "biotech=4" + var/global/list/datum/stack_recipe/sinew_recipes = list ( \ new/datum/stack_recipe("sinew restraints", /obj/item/weapon/restraints/handcuffs/sinew, 1, on_floor = 1), \ ) @@ -117,7 +115,7 @@ var/global/list/datum/stack_recipe/sinew_recipes = list ( \ /obj/item/stack/sheet/sinew/New(var/loc, var/amount=null) recipes = sinew_recipes return ..() - + /obj/item/stack/sheet/animalhide/goliath_hide name = "goliath hide plates" desc = "Pieces of a goliath's rocky hide, these might be able to make your suit a bit more durable to attack from the local fauna." @@ -125,7 +123,7 @@ var/global/list/datum/stack_recipe/sinew_recipes = list ( \ icon_state = "goliath_hide" singular_name = "hide plate" flags = NOBLUDGEON - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL layer = MOB_LAYER /obj/item/stack/sheet/animalhide/ashdrake @@ -135,9 +133,9 @@ var/global/list/datum/stack_recipe/sinew_recipes = list ( \ icon_state = "dragon_hide" singular_name = "drake plate" flags = NOBLUDGEON - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL layer = MOB_LAYER - + //Step one - dehairing. /obj/item/stack/sheet/animalhide/attackby(obj/item/weapon/W as obj, mob/user as mob, params) @@ -177,4 +175,4 @@ var/global/list/datum/stack_recipe/sinew_recipes = list ( \ var/obj/item/stack/sheet/leather/HS = new(src.loc) HS.amount = 1 wetness = initial(wetness) - src.use(1) \ No newline at end of file + src.use(1) diff --git a/code/game/objects/items/stacks/sheets/light.dm b/code/game/objects/items/stacks/sheets/light.dm index 9ca562b50ce..d399e152bbe 100644 --- a/code/game/objects/items/stacks/sheets/light.dm +++ b/code/game/objects/items/stacks/sheets/light.dm @@ -5,7 +5,7 @@ desc = "A glass tile, which is wired, somehow." icon = 'icons/obj/tiles.dmi' icon_state = "glass_wire" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL force = 3.0 throwforce = 5.0 throw_speed = 5 diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index ef9781f9a0d..c381000f5b9 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -104,9 +104,8 @@ var/global/list/datum/stack_recipe/abductor_recipes = list ( \ /obj/item/stack/sheet/mineral force = 5.0 throwforce = 5 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL throw_speed = 3 - throw_range = 3 /obj/item/stack/sheet/mineral/New() ..() @@ -118,7 +117,6 @@ var/global/list/datum/stack_recipe/abductor_recipes = list ( \ desc = "This appears to be a combination of both sand and stone." singular_name = "sandstone brick" icon_state = "sheet-sandstone" - throw_speed = 3 throw_range = 5 origin_tech = "materials=1" sheettype = "sandstone" @@ -194,7 +192,7 @@ var/global/list/datum/stack_recipe/abductor_recipes = list ( \ name = "silver" icon_state = "sheet-silver" singular_name = "silver bar" - origin_tech = "materials=3" + origin_tech = "materials=4" sheettype = "silver" materials = list(MAT_SILVER=MINERAL_MATERIAL_AMOUNT) @@ -240,12 +238,11 @@ var/global/list/datum/stack_recipe/abductor_recipes = list ( \ singular_name = "alien alloy sheet" force = 5 throwforce = 5 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL throw_speed = 1 - throw_range = 3 origin_tech = "materials=6;abductor=1" sheettype = "abductor" /obj/item/stack/sheet/mineral/abductor/New(loc, amount=null) recipes = abductor_recipes - ..() \ No newline at end of file + ..() diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 02031404360..029cb8cd4a5 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -123,6 +123,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list( */ var/global/list/datum/stack_recipe/plasteel_recipes = list( new /datum/stack_recipe("AI core", /obj/structure/AIcore, 4, time = 50, one_per_turf = 1), + new /datum/stack_recipe("bomb assembly", /obj/machinery/syndicatebomb/empty, 10, time = 50), new /datum/stack_recipe("Surgery Table", /obj/machinery/optable, 5, time = 50, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("Metal crate", /obj/structure/closet/crate, 10, time = 50, one_per_turf = 1), new /datum/stack_recipe("Mass Driver frame", /obj/machinery/mass_driver_frame, 3, time = 50, one_per_turf = 1) @@ -237,6 +238,7 @@ var/global/list/datum/stack_recipe/cardboard_recipes = list ( new /datum/stack_recipe("folder", /obj/item/weapon/folder), new /datum/stack_recipe("cardboard tube", /obj/item/weapon/c_tube), new /datum/stack_recipe("cardboard box", /obj/structure/closet/cardboard, 4), + new/datum/stack_recipe("cardboard cutout", /obj/item/cardboard_cutout, 5), ) /obj/item/stack/sheet/cardboard //BubbleWrap @@ -298,7 +300,7 @@ var/global/list/datum/stack_recipe/runed_metal_recipes = list ( \ desc = "Someone's been drinking their milk." force = 7 throwforce = 5 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL throw_speed = 1 throw_range = 3 origin_tech = "materials=2;biotech=2" diff --git a/code/game/objects/items/stacks/sheets/sheets.dm b/code/game/objects/items/stacks/sheets/sheets.dm index 4e5a0e9fdc8..3a92d0f7662 100644 --- a/code/game/objects/items/stacks/sheets/sheets.dm +++ b/code/game/objects/items/stacks/sheets/sheets.dm @@ -1,6 +1,6 @@ /obj/item/stack/sheet name = "sheet" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL force = 5 throwforce = 5 max_amount = 50 @@ -24,4 +24,4 @@ else for(var/obj/item/stack/sheet/stack in locate(src.x,src.y,src.z)) S.add(stack,user) - ..()*/ \ No newline at end of file + ..()*/ diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index d4d4ae7f48c..eeacb71e9b3 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -36,6 +36,23 @@ /obj/item/stack/attack_self(mob/user) list_recipes(user) +/obj/item/stack/attack_self_tk(mob/user) + list_recipes(user) + +/obj/item/stack/attack_tk(mob/user) + if(user.stat || !isturf(loc)) return + // Allow remote stack splitting, because telekinetic inventory managing + // is really cool + if(src in user.tkgrabbed_objects) + var/obj/item/stack/F = split(user, 1) + F.attack_tk(user) + if(src && user.machine == src) + spawn(0) + interact(user) + else + ..() + + /obj/item/stack/proc/list_recipes(mob/user, recipes_sublist) if(!recipes) return @@ -107,7 +124,7 @@ /obj/item/stack/Topic(href, href_list) ..() - if(usr.incapacitated() || usr.get_active_hand() != src) + if(usr.incapacitated() || !usr.is_in_active_hand(src)) return 0 if(href_list["sublist"] && !href_list["make"]) @@ -124,6 +141,7 @@ var/datum/stack_recipe/R = recipes_list[text2num(href_list["make"])] var/multiplier = text2num(href_list["multiplier"]) + var/atom/creation_loc = (loc == usr) ? usr.loc : loc if(!multiplier) multiplier = 1 @@ -134,11 +152,11 @@ to_chat(usr, "You haven't got enough [src] to build \the [R.title]!") return 0 - if(R.one_per_turf && (locate(R.result_type) in usr.loc)) + if(R.one_per_turf && (locate(R.result_type) in creation_loc)) to_chat(usr, "There is another [R.title] here!") return 0 - if(R.on_floor && !istype(usr.loc, /turf/simulated)) + if(R.on_floor && !istype(creation_loc, /turf/simulated)) to_chat(usr, "\The [R.title] must be constructed on the floor!") return 0 @@ -150,7 +168,7 @@ if(amount < R.req_amount * multiplier) return - var/atom/O = new R.result_type(usr.loc) + var/atom/O = new R.result_type(creation_loc) O.dir = usr.dir if(R.max_res_amount > 1) var/obj/item/stack/new_item = O @@ -215,7 +233,7 @@ return max_amount /obj/item/stack/proc/split(mob/user, amt) - var/obj/item/stack/F = new type(user, amt) + var/obj/item/stack/F = new type(loc, amt) F.copy_evidences(src) if(isliving(user)) add_fingerprint(user) @@ -224,7 +242,7 @@ return F /obj/item/stack/attack_hand(mob/user) - if(user.get_inactive_hand() == src) + if(user.is_in_inactive_hand(src)) var/obj/item/stack/F = split(user, 1) user.put_in_hands(F) if(src && usr.machine == src) @@ -241,7 +259,7 @@ return 1 var/to_transfer - if(user.get_inactive_hand() == src) + if(user.is_in_inactive_hand(src)) var/desired = input("How much would you like to transfer from this stack?", "How much?", 1) as null|num if(!desired) return @@ -267,4 +285,4 @@ fingerprints = from.fingerprints fingerprintshidden = from.fingerprintshidden fingerprintslast = from.fingerprintslast - //TODO bloody overlay \ No newline at end of file + //TODO bloody overlay diff --git a/code/game/objects/items/stacks/telecrystal.dm b/code/game/objects/items/stacks/telecrystal.dm index 0c6c3d42cf3..d2fb50bd385 100644 --- a/code/game/objects/items/stacks/telecrystal.dm +++ b/code/game/objects/items/stacks/telecrystal.dm @@ -5,7 +5,7 @@ singular_name = "telecrystal" icon = 'icons/obj/telescience.dmi' icon_state = "telecrystal" - w_class = 1 + w_class = WEIGHT_CLASS_TINY max_amount = 50 flags = NOBLUDGEON origin_tech = "materials=6;syndicate=1" diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index b8078bfebcb..f982c89a8c3 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/tiles.dmi' icon_state = "tile" item_state = "tile" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL force = 1 throwforce = 1 throw_speed = 5 @@ -100,6 +100,11 @@ turf_type = /turf/simulated/floor/carpet burn_state = FLAMMABLE +/obj/item/stack/tile/carpet/black + name = "black carpet" + icon_state = "tile-carpet-black" + turf_type = /turf/simulated/floor/carpet/black + //Plasteel /obj/item/stack/tile/plasteel name = "floor tiles" @@ -160,4 +165,4 @@ singular_name = "pod floor tile" desc = "A grooved floor tile." icon_state = "tile_pod" - turf_type = /turf/simulated/floor/pod \ No newline at end of file + turf_type = /turf/simulated/floor/pod diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 87da0987487..b4bacd5326a 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -113,7 +113,7 @@ icon = 'icons/obj/weapons.dmi' icon_state = "syndballoon" item_state = "syndballoon" - w_class = 4 + w_class = WEIGHT_CLASS_BULKY /* * Fake telebeacon @@ -144,7 +144,7 @@ icon_state = "sword0" item_state = "sword0" var/active = 0.0 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL attack_verb = list("attacked", "struck", "hit") /obj/item/toy/sword/attack_self(mob/user as mob) @@ -154,13 +154,13 @@ playsound(user, 'sound/weapons/saberon.ogg', 50, 1) icon_state = "swordblue" item_state = "swordblue" - w_class = 4 + w_class = WEIGHT_CLASS_BULKY else to_chat(user, "You push the plastic blade back down into the handle.") playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) icon_state = "sword0" item_state = "sword0" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL if(istype(user,/mob/living/carbon/human)) var/mob/living/carbon/human/H = user @@ -218,7 +218,7 @@ slot_flags = SLOT_BELT | SLOT_BACK force = 5 throwforce = 5 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL attack_verb = list("attacked", "slashed", "stabbed", "sliced") hitsound = 'sound/weapons/bladeslice.ogg' @@ -239,7 +239,7 @@ throwforce = 5.0 throw_speed = 10 throw_range = 30 - w_class = 1 + w_class = WEIGHT_CLASS_TINY /obj/item/toy/snappop/virus/throw_impact(atom/hit_atom) @@ -260,7 +260,7 @@ desc = "Wow!" icon = 'icons/obj/toy.dmi' icon_state = "snappop" - w_class = 1 + w_class = WEIGHT_CLASS_TINY var/ash_type = /obj/effect/decal/cleanable/ash /obj/item/toy/snappop/proc/pop_burst(var/n=3, var/c=1) @@ -283,7 +283,7 @@ /obj/item/toy/snappop/Crossed(H as mob|obj) if(ishuman(H) || issilicon(H)) //i guess carp and shit shouldn't set them off var/mob/living/carbon/M = H - if(issilicon(H) || M.m_intent == "run") + if(issilicon(H) || M.m_intent == MOVE_INTENT_RUN) to_chat(M, "You step on the snap pop!") pop_burst(2, 0) @@ -403,7 +403,7 @@ slot_flags = SLOT_BELT | SLOT_BACK force = 5 throwforce = 5 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL attack_verb = list("attacked", "slashed", "stabbed", "sliced") @@ -438,7 +438,7 @@ obj/item/toy/cards/deck icon = 'icons/obj/toy.dmi' deckstyle = "nanotrasen" icon_state = "deck_nanotrasen_full" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL var/cooldown = 0 var/list/cards = list() @@ -568,7 +568,7 @@ obj/item/toy/cards/cardhand desc = "A number of cards not in a deck, customarily held in ones hand." icon = 'icons/obj/toy.dmi' icon_state = "nanotrasen_hand2" - w_class = 1 + w_class = WEIGHT_CLASS_TINY var/list/currenthand = list() var/choice = null @@ -661,7 +661,7 @@ obj/item/toy/cards/singlecard desc = "a card" icon = 'icons/obj/toy.dmi' icon_state = "singlecard_nanotrasen_down" - w_class = 1 + w_class = WEIGHT_CLASS_TINY var/cardname = null var/flipped = 0 pixel_x = -5 @@ -787,7 +787,7 @@ obj/item/toy/cards/deck/syndicate/black desc = "A plastic model of a Nuclear Fission Explosive." icon = 'icons/obj/toy.dmi' icon_state = "nuketoyidle" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL var/cooldown = 0 /obj/item/toy/nuke/attack_self(mob/user) @@ -810,7 +810,7 @@ obj/item/toy/cards/deck/syndicate/black desc = "A toy for therapeutic and recreational purposes." icon_state = "therapyred" item_state = "egg4" - w_class = 1 + w_class = WEIGHT_CLASS_TINY var/cooldown = 0 /obj/item/toy/therapy/New() @@ -863,7 +863,7 @@ obj/item/toy/cards/deck/syndicate/black name = "toddler" desc = "This baby looks almost real. Wait, did it just burp?" force = 5 - w_class = 4 + w_class = WEIGHT_CLASS_BULKY slot_flags = SLOT_BACK @@ -886,7 +886,7 @@ obj/item/toy/cards/deck/syndicate/black desc = "Relive the excitement of a meteor shower! SweetMeat-eor. Co is not responsible for any injuries, headaches or hearing loss caused by Mini-Meteor." icon = 'icons/obj/toy.dmi' icon_state = "minimeteor" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL /obj/item/toy/minimeteor/throw_impact(atom/hit_atom) ..() @@ -1095,7 +1095,7 @@ obj/item/toy/cards/deck/syndicate/black icon_state = "foamblade" item_state = "arm_blade" attack_verb = list("pricked", "absorbed", "gored") - w_class = 2 + w_class = WEIGHT_CLASS_SMALL burn_state = FLAMMABLE /* @@ -1107,7 +1107,7 @@ obj/item/toy/cards/deck/syndicate/black icon = 'icons/obj/device.dmi' icon_state = "flash" item_state = "flashtool" - w_class = 1 + w_class = WEIGHT_CLASS_TINY /obj/item/toy/flash/attack(mob/living/M, mob/user) playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1) @@ -1123,7 +1123,7 @@ obj/item/toy/cards/deck/syndicate/black desc = "A big, plastic red button. Reads 'From HonkCo Pranks?' on the back." icon = 'icons/obj/assemblies.dmi' icon_state = "bigred" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL var/cooldown = 0 /obj/item/toy/redbutton/attack_self(mob/user) @@ -1148,7 +1148,7 @@ obj/item/toy/cards/deck/syndicate/black desc = "A little toy model AI core with real law announcing action!" icon = 'icons/obj/toy.dmi' icon_state = "AI" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL var/cooldown = 0 /obj/item/toy/AI/attack_self(mob/user) @@ -1167,7 +1167,7 @@ obj/item/toy/cards/deck/syndicate/black desc = "An action figure modeled after 'The Owl', defender of justice." icon = 'icons/obj/toy.dmi' icon_state = "owlprize" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL var/cooldown = 0 /obj/item/toy/owl/attack_self(mob/user) @@ -1186,7 +1186,7 @@ obj/item/toy/cards/deck/syndicate/black desc = "An action figure modeled after 'The Griffin', criminal mastermind." icon = 'icons/obj/toy.dmi' icon_state = "griffinprize" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL var/cooldown = 0 /obj/item/toy/griffin/attack_self(mob/user) @@ -1203,7 +1203,7 @@ obj/item/toy/cards/deck/syndicate/black // DND Character minis. Use the naming convention (type)character for the icon states. /obj/item/toy/character icon = 'icons/obj/toy.dmi' - w_class = 2 + w_class = WEIGHT_CLASS_SMALL pixel_z = 5 /obj/item/toy/character/alien @@ -1256,7 +1256,7 @@ obj/item/toy/cards/deck/syndicate/black desc = "The perfect pet!" icon = 'icons/obj/toy.dmi' icon_state = "pet_rock" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL force = 5 throwforce = 5 attack_verb = list("attacked", "bashed", "smashed", "stoned") @@ -1276,11 +1276,11 @@ obj/item/toy/cards/deck/syndicate/black /obj/item/toy/minigibber name = "miniature gibber" - desc = "A miniature recreation of NanoTrasen's famous meat grinder." + desc = "A miniature recreation of Nanotrasen's famous meat grinder." icon = 'icons/obj/toy.dmi' icon_state = "minigibber" attack_verb = list("grinded", "gibbed") - w_class = 2 + w_class = WEIGHT_CLASS_SMALL var/cooldown = 0 var/obj/stored_minature = null @@ -1288,8 +1288,7 @@ obj/item/toy/cards/deck/syndicate/black if(stored_minature) to_chat(user, "\The [src] makes a violent grinding noise as it tears apart the miniature figure inside!") - qdel(stored_minature) - stored_minature = null + QDEL_NULL(stored_minature) playsound(user, 'sound/goonstation/effects/gib.ogg', 20, 1) cooldown = world.time @@ -1322,7 +1321,7 @@ obj/item/toy/cards/deck/syndicate/black icon_state = "toy_xeno" name = "xenomorph action figure" desc = "MEGA presents the new Xenos Isolated action figure! Comes complete with realistic sounds! Pull back string to use." - w_class = 2 + w_class = WEIGHT_CLASS_SMALL var/cooldown = 0 /obj/item/toy/toy_xeno/attack_self(mob/user) @@ -1352,7 +1351,7 @@ obj/item/toy/cards/deck/syndicate/black flags = CONDUCT slot_flags = SLOT_BELT materials = list(MAT_METAL=2000) - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL throwforce = 5 throw_speed = 4 throw_range = 5 diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index dc538674993..30a75b310b6 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -4,7 +4,7 @@ //Added by Jack Rost /obj/item/trash icon = 'icons/obj/trash.dmi' - w_class = 1 + w_class = WEIGHT_CLASS_TINY desc = "This is rubbish." burn_state = FLAMMABLE diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index cca1464d6e7..ad593ca438d 100755 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -14,7 +14,7 @@ AI MODULES desc = "An AI Module for transmitting encrypted instructions to the AI." flags = CONDUCT force = 5.0 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL throwforce = 5.0 throw_speed = 3 throw_range = 15 @@ -95,7 +95,7 @@ AI MODULES name = "\improper 'Safeguard' AI module" var/targetName = "" desc = "A 'safeguard' AI module: 'Safeguard . Individuals that threaten are not crew and must be eliminated.'" - origin_tech = "programming=3;materials=4" + origin_tech = "programming=3;materials=3" /obj/item/weapon/aiModule/safeguard/attack_self(var/mob/user as mob) ..() @@ -121,7 +121,7 @@ AI MODULES name = "\improper 'oneCrewMember' AI module" var/targetName = "" desc = "A 'one human' AI module: 'Only is crew.'" - origin_tech = "programming=3;materials=6" //made with diamonds! + origin_tech = "programming=4;materials=4" /obj/item/weapon/aiModule/oneCrewMember/attack_self(var/mob/user as mob) ..() @@ -152,7 +152,7 @@ AI MODULES /obj/item/weapon/aiModule/protectStation name = "\improper 'ProtectStation' AI module" desc = "A 'protect station' AI module: 'Protect the space station against damage. Anyone you see harming the station is to be no longer considered crew, and is a threat to the station which must be neutralized.'" - origin_tech = "programming=3;materials=4" //made of gold + origin_tech = "programming=4;materials=4" //made of gold /obj/item/weapon/aiModule/protectStation/attack_self(var/mob/user as mob) ..() @@ -182,7 +182,7 @@ AI MODULES /obj/item/weapon/aiModule/oxygen name = "\improper 'OxygenIsToxicToHumans' AI module" desc = "A 'OxygenIsToxicToHumans' AI module: 'Oxygen is highly toxic to crew members, and must be purged from the station. Prevent, by any means necessary, anyone from exposing the station to this toxic gas. Extreme cold is the most effective method of healing the damage Oxygen does to a crew member.'" - origin_tech = "programming=3;biotech=2;materials=4" + origin_tech = "programming=4;biotech=2;materials=4" /obj/item/weapon/aiModule/oxygen/attack_self(var/mob/user as mob) ..() @@ -231,7 +231,7 @@ AI MODULES name = "\improper 'Reset' AI module" var/targetName = "name" desc = "A 'reset' AI module: 'Clears all laws except for the core laws.'" - origin_tech = "programming=3;materials=4" + origin_tech = "programming=3;materials=2" /obj/item/weapon/aiModule/reset/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender) log_law_changes(target, sender) @@ -248,7 +248,7 @@ AI MODULES /obj/item/weapon/aiModule/purge // -- TLE name = "\improper 'Purge' AI module" desc = "A 'purge' AI Module: 'Purges all laws.'" - origin_tech = "programming=3;materials=6" + origin_tech = "programming=5;materials=4" /obj/item/weapon/aiModule/purge/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender) ..() @@ -305,14 +305,14 @@ AI MODULES /obj/item/weapon/aiModule/paladin // -- NEO name = "\improper 'P.A.L.A.D.I.N.' core AI module" desc = "A P.A.L.A.D.I.N. Core AI Module: 'Reconfigures the AI's core laws.'" - origin_tech = "programming=3;materials=6" + origin_tech = "programming=3;materials=4" laws = new/datum/ai_laws/paladin /****************** T.Y.R.A.N.T. *****************/ /obj/item/weapon/aiModule/tyrant // -- Darem name = "\improper 'T.Y.R.A.N.T.' core AI module" desc = "A T.Y.R.A.N.T. Core AI Module: 'Reconfigures the AI's core laws.'" - origin_tech = "programming=3;materials=6;syndicate=2" + origin_tech = "programming=3;materials=4;syndicate=1" laws = new/datum/ai_laws/tyrant() /******************** Antimov ********************/ @@ -327,7 +327,7 @@ AI MODULES name = "\improper 'Freeform' core AI module" var/newFreeFormLaw = "" desc = "A 'freeform' Core AI module: ''" - origin_tech = "programming=3;materials=6" + origin_tech = "programming=5;materials=4" /obj/item/weapon/aiModule/freeformcore/attack_self(var/mob/user as mob) ..() @@ -353,7 +353,7 @@ AI MODULES name = "hacked AI module" var/newFreeFormLaw = "" desc = "A hacked AI law module: ''" - origin_tech = "programming=3;materials=6;syndicate=7" + origin_tech = "programming=5;materials=5;syndicate=5" /obj/item/weapon/aiModule/syndicate/attack_self(var/mob/user as mob) ..() @@ -384,7 +384,7 @@ AI MODULES desc = "A little toy model AI core with real law uploading action!" //Note: subtle tell icon = 'icons/obj/toy.dmi' icon_state = "AI" - origin_tech = "programming=3;materials=6;syndicate=7" + origin_tech = "programming=6;materials=5;syndicate=6" laws = list("") /obj/item/weapon/aiModule/toyAI/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender) @@ -397,4 +397,4 @@ AI MODULES laws[1] = generate_ion_law() to_chat(user, "You press the button on [src].") playsound(user, 'sound/machines/click.ogg', 20, 1) - src.loc.visible_message("[bicon(src)] [laws[1]]") \ No newline at end of file + src.loc.visible_message("[bicon(src)] [laws[1]]") diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index 5598a42cc8f..3e79df2c213 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -6,7 +6,7 @@ RCD */ /obj/item/weapon/rcd name = "rapid-construction-device (RCD)" - desc = "A device used to rapidly build and deconstruct walls and floors." + desc = "A device used to rapidly build and deconstruct walls, floors and airlocks." icon = 'icons/obj/tools.dmi' icon_state = "rcd" opacity = 0 @@ -17,7 +17,7 @@ RCD throwforce = 10.0 throw_speed = 3 throw_range = 5 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL materials = list(MAT_METAL = 30000) origin_tech = "engineering=4;materials=2" toolspeed = 1 @@ -68,7 +68,7 @@ RCD if(istype(W, /obj/item/weapon/rcd_ammo)) var/obj/item/weapon/rcd_ammo/R = W if((matter + R.ammoamt) > max_matter) - to_chat(user, "The RCD cant hold any more matter-units.") + to_chat(user, "The RCD can't hold any more matter-units.") return matter += R.ammoamt user.drop_item() @@ -84,6 +84,9 @@ RCD //Change the mode ui_interact(user) +/obj/item/weapon/rcd/attack_self_tk(mob/user) + ui_interact(user) + /obj/item/weapon/rcd/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = inventory_state) ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) @@ -199,7 +202,8 @@ RCD to_chat(user, "Building Wall ...") playsound(loc, 'sound/machines/click.ogg', 50, 1) if(do_after(user, 20 * toolspeed, target = A)) - if(!useResource(3, user)) return 0 + if(!useResource(3, user)) + return 0 activate() var/turf/AT = A AT.ChangeTurf(/turf/simulated/wall) @@ -212,7 +216,10 @@ RCD to_chat(user, "Building Airlock...") playsound(loc, 'sound/machines/click.ogg', 50, 1) if(do_after(user, 50 * toolspeed, target = A)) - if(!useResource(10, user)) return 0 + for(var/obj/machinery/door/airlock/D in A.contents) + return 0 + if(!useResource(10, user)) + return 0 activate() var/obj/machinery/door/airlock/T = new door_type(A) T.name = door_name @@ -233,7 +240,8 @@ RCD to_chat(user, "Deconstructing Wall...") playsound(loc, 'sound/machines/click.ogg', 50, 1) if(do_after(user, 40 * toolspeed, target = A)) - if(!useResource(5, user)) return 0 + if(!useResource(5, user)) + return 0 activate() var/turf/AT = A AT.ChangeTurf(/turf/simulated/floor/plating) @@ -245,7 +253,8 @@ RCD to_chat(user, "Deconstructing Floor...") playsound(loc, 'sound/machines/click.ogg', 50, 1) if(do_after(user, 50 * toolspeed, target = A)) - if(!useResource(5, user)) return 0 + if(!useResource(5, user)) + return 0 activate() var/turf/AT = A AT.ChangeTurf(/turf/space) @@ -257,7 +266,8 @@ RCD to_chat(user, "Deconstructing Airlock...") playsound(loc, 'sound/machines/click.ogg', 50, 1) if(do_after(user, 50 * toolspeed, target = A)) - if(!useResource(20, user)) return 0 + if(!useResource(20, user)) + return 0 activate() qdel(A) return 1 @@ -279,8 +289,7 @@ RCD return 0 activate() var/turf/T1 = get_turf(A) - qdel(A) - A = null + QDEL_NULL(A) for(var/obj/structure/window/W in T1.contents) W.disassembled = 1 W.density = 0 @@ -362,7 +371,7 @@ RCD /obj/item/weapon/rcd/borg/New() ..() - desc = "A device used to rapidly build and deconstruct walls and floors." + desc = "A device used to rapidly build and deconstruct walls, floors and airlocks." canRwall = 1 @@ -395,7 +404,7 @@ RCD opacity = 0 density = 0 anchored = 0.0 - origin_tech = "materials=2" + origin_tech = "materials=3" materials = list(MAT_METAL=16000, MAT_GLASS=8000) var/ammoamt = 20 diff --git a/code/game/objects/items/weapons/RCL.dm b/code/game/objects/items/weapons/RCL.dm index 8e0357ecd13..ebc7c2f58da 100644 --- a/code/game/objects/items/weapons/RCL.dm +++ b/code/game/objects/items/weapons/RCL.dm @@ -10,7 +10,7 @@ throw_speed = 1 throw_range = 7 w_class = WEIGHT_CLASS_NORMAL - origin_tech = "engineering=4;materials=4" + origin_tech = "engineering=4;materials=2" var/max_amount = 90 var/active = 0 var/obj/structure/cable/last = null @@ -115,7 +115,7 @@ last = C break -/obj/item/weapon/twohanded/rcl/moved(mob/user, turf/old_loc, direct) +/obj/item/weapon/twohanded/rcl/on_mob_move(direct, mob/user) if(active) trigger(user) diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm index 07a489490e1..ddeefa002b0 100644 --- a/code/game/objects/items/weapons/RSF.dm +++ b/code/game/objects/items/weapons/RSF.dm @@ -13,7 +13,7 @@ RSF anchored = 0.0 var/matter = 0 var/mode = 1 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL /obj/item/weapon/rsf/New() desc = "A RSF. It currently holds [matter]/30 fabrication-units." @@ -231,4 +231,4 @@ RSF matter-- to_chat(user, "The RSF now holds [matter]/30 fabrication-units.") desc = "A RSF. It currently holds [matter]/30 fabrication-units." - return \ No newline at end of file + return diff --git a/code/game/objects/items/weapons/alien_specific.dm b/code/game/objects/items/weapons/alien_specific.dm index 922f4004714..49258c05c4e 100644 --- a/code/game/objects/items/weapons/alien_specific.dm +++ b/code/game/objects/items/weapons/alien_specific.dm @@ -12,8 +12,8 @@ throwforce_on = 5 throw_speed = 1 throw_range = 5 - w_class = 2 - w_class_on = 2 + w_class = WEIGHT_CLASS_SMALL + w_class_on = WEIGHT_CLASS_SMALL attack_verb = list("attacked", "slashed", "gored", "sliced", "torn", "ripped", "butchered", "cut") attack_verb_on = list() diff --git a/code/game/objects/items/weapons/bee_briefcase.dm b/code/game/objects/items/weapons/bee_briefcase.dm index 3252fe4d856..229a025a18f 100644 --- a/code/game/objects/items/weapons/bee_briefcase.dm +++ b/code/game/objects/items/weapons/bee_briefcase.dm @@ -11,7 +11,7 @@ force = 10 throw_speed = 2 throw_range = 4 - w_class = 4 + w_class = WEIGHT_CLASS_BULKY attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") var/bees_left = 10 var/list/blood_list = list() diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 27d659dcbe2..dc4f23657b5 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -15,7 +15,7 @@ name = "card" desc = "A card." icon = 'icons/obj/card.dmi' - w_class = 1 + w_class = WEIGHT_CLASS_TINY var/associated_account_number = 0 var/list/files = list( ) @@ -299,7 +299,7 @@ /obj/item/weapon/card/id/syndicate name = "agent card" var/list/initial_access = list(access_maint_tunnels, access_syndicate, access_external_airlocks) - origin_tech = "syndicate=3" + origin_tech = "syndicate=1" var/registered_user = null untrackable = 1 diff --git a/code/game/objects/items/weapons/caution.dm b/code/game/objects/items/weapons/caution.dm index 44a357a6d92..032decd7bc5 100644 --- a/code/game/objects/items/weapons/caution.dm +++ b/code/game/objects/items/weapons/caution.dm @@ -7,7 +7,7 @@ throwforce = 3.0 throw_speed = 1 throw_range = 5 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL attack_verb = list("warned", "cautioned", "smashed") proximity_sign @@ -44,7 +44,7 @@ if(armed) if(istype(AM, /mob/living/carbon) && !istype(AM, /mob/living/carbon/brain)) var/mob/living/carbon/C = AM - if(C.m_intent != "walk") + if(C.m_intent != MOVE_INTENT_WALK) src.visible_message("The [src.name] beeps, \"Running on wet floors is hazardous to your health.\"") explosion(src.loc,-1,0,2) if(ishuman(C)) diff --git a/code/game/objects/items/weapons/chrono_eraser.dm b/code/game/objects/items/weapons/chrono_eraser.dm index 71e09a3cf0d..ef1e2c91498 100644 --- a/code/game/objects/items/weapons/chrono_eraser.dm +++ b/code/game/objects/items/weapons/chrono_eraser.dm @@ -6,7 +6,7 @@ icon = 'icons/obj/chronos.dmi' icon_state = "chronobackpack" item_state = "backpack" - w_class = 4 + w_class = WEIGHT_CLASS_BULKY slot_flags = SLOT_BACK slowdown = 1 actions_types = list(/datum/action/item_action/equip_unequip_TED_Gun) @@ -46,7 +46,7 @@ icon = 'icons/obj/chronos.dmi' icon_state = "chronogun" item_state = "chronogun" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL flags = NODROP ammo_type = list(/obj/item/ammo_casing/energy/chrono_beam) can_charge = 0 diff --git a/code/game/objects/items/weapons/cigs.dm b/code/game/objects/items/weapons/cigs.dm index 2b46e8de101..766fe92c1ee 100644 --- a/code/game/objects/items/weapons/cigs.dm +++ b/code/game/objects/items/weapons/cigs.dm @@ -20,7 +20,7 @@ LIGHTERS ARE IN LIGHTERS.DM throw_speed = 0.5 item_state = "cigoff" slot_flags = SLOT_EARS|SLOT_MASK - w_class = 1 + w_class = WEIGHT_CLASS_TINY body_parts_covered = null attack_verb = list("burnt", "singed") var/lit = 0 @@ -285,7 +285,7 @@ LIGHTERS ARE IN LIGHTERS.DM desc = "A manky old cigarette butt." icon = 'icons/obj/clothing/masks.dmi' icon_state = "cigbutt" - w_class = 1 + w_class = WEIGHT_CLASS_TINY throwforce = 1 /obj/item/weapon/cigbutt/New() @@ -389,7 +389,7 @@ LIGHTERS ARE IN LIGHTERS.DM desc = "A thin piece of paper used to make fine smokeables." icon = 'icons/obj/cigarettes.dmi' icon_state = "cig_paper" - w_class = 1 + w_class = WEIGHT_CLASS_TINY /obj/item/weapon/rollingpaper/afterattack(atom/target, mob/user, proximity) if(!proximity) @@ -410,4 +410,4 @@ LIGHTERS ARE IN LIGHTERS.DM else to_chat(user, "You need to dry this first!") else - ..() \ No newline at end of file + ..() diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index 3312c6555d4..ad8a30bed07 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -19,7 +19,7 @@ //So this is a workaround. This also makes more sense from an IC standpoint. ~Carn if(user.client && (target in user.client.screen)) to_chat(user, "You need to take that [target.name] off before cleaning it.") - else if(target == user && user.a_intent == I_GRAB && ishuman(target)) + else if(target == user && user.a_intent == INTENT_GRAB && ishuman(target)) var/mob/living/carbon/human/muncher = user if(muncher && muncher.get_species() == "Drask") to_chat(user, "You take a bite of the [src.name]. Delicious!") @@ -60,7 +60,7 @@ item_state = "bike_horn" hitsound = null throwforce = 3 - w_class = 1 + w_class = WEIGHT_CLASS_TINY throw_speed = 3 throw_range = 15 attack_verb = list("HONKED") @@ -89,6 +89,7 @@ icon_state = "air_horn" honk_sound = 'sound/items/AirHorn2.ogg' cooldowntime = 50 + origin_tech = "materials=4;engineering=4" /obj/item/weapon/bikehorn/golden name = "golden bike horn" @@ -112,4 +113,4 @@ var/mob/living/carbon/human/H = M if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs) || H.ear_deaf) continue - M.emote("flip") \ No newline at end of file + M.emote("flip") diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index f311d56d1ba..d480f8f4010 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -3,7 +3,7 @@ desc = "A generic brand of lipstick." icon = 'icons/obj/items.dmi' icon_state = "lipstick" - w_class = 1 + w_class = WEIGHT_CLASS_TINY var/colour = "red" var/open = 0 @@ -86,7 +86,7 @@ icon = 'icons/obj/items.dmi' icon_state = "razor" flags = CONDUCT - w_class = 1 + w_class = WEIGHT_CLASS_TINY usesound = 'sound/items/Welder2.ogg' toolspeed = 1 @@ -136,6 +136,9 @@ if(C.h_style == "Bald" || C.h_style == "Balding Hair" || C.h_style == "Skinhead") to_chat(user, "There is not enough hair left to shave...") return + if(M.get_species() == "Skrell") + to_chat(user, "Your razor isn't going to cut through tentacles.") + return if(H == user) //shaving yourself user.visible_message("[user] starts to shave their head with \the [src].", \ "You start to shave your head with \the [src].") @@ -160,4 +163,4 @@ else ..() else - ..() \ No newline at end of file + ..() diff --git a/code/game/objects/items/weapons/courtroom.dm b/code/game/objects/items/weapons/courtroom.dm index 055faa03a8c..0f5671f8e1a 100644 --- a/code/game/objects/items/weapons/courtroom.dm +++ b/code/game/objects/items/weapons/courtroom.dm @@ -9,7 +9,7 @@ icon_state = "gavelhammer" force = 5.0 throwforce = 6.0 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL attack_verb = list("bashed", "battered", "judged", "whacked") burn_state = FLAMMABLE @@ -25,7 +25,7 @@ icon_state = "gavelblock" force = 2.0 throwforce = 2.0 - w_class = 1 + w_class = WEIGHT_CLASS_TINY burn_state = FLAMMABLE /obj/item/weapon/gavelblock/attackby(obj/item/I, mob/user, params) @@ -33,4 +33,4 @@ playsound(loc, 'sound/items/gavel.ogg', 100, 1) user.visible_message("[user] strikes \the [src] with \the [I].") else - return \ No newline at end of file + return diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index 5d0dcebcacc..2ac5fb102e1 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -9,7 +9,7 @@ slot_flags = SLOT_BACK force = 5 throwforce = 6 - w_class = 4 + w_class = WEIGHT_CLASS_BULKY origin_tech = "biotech=4" actions_types = list(/datum/action/item_action/toggle_paddles) species_fit = list("Vox") @@ -112,8 +112,6 @@ /obj/item/weapon/defibrillator/emp_act(severity) if(bcell) deductcharge(1000 / severity) - if(bcell.reliability != 100 && prob(50/severity)) - bcell.reliability -= 10 / severity if(safety) safety = 0 src.visible_message("[src] beeps: Safety protocols disabled!") @@ -206,9 +204,9 @@ desc = "A belt-equipped defibrillator that can be rapidly deployed." icon_state = "defibcompact" item_state = "defibcompact" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL slot_flags = SLOT_BELT - origin_tech = "biotech=4" + origin_tech = "biotech=5" /obj/item/weapon/defibrillator/compact/item_action_slot_check(slot, mob/user) if(slot == slot_belt) @@ -251,7 +249,7 @@ item_state = "defibpaddles" force = 0 throwforce = 6 - w_class = 4 + w_class = WEIGHT_CLASS_BULKY toolspeed = 1 var/revivecost = 1000 @@ -321,7 +319,7 @@ to_chat(user, "The instructions on [defib] don't mention how to revive that...") return else - if(user.a_intent == I_HARM && !defib.safety) + if(user.a_intent == INTENT_HARM && !defib.safety) busy = 1 H.visible_message("[user] has touched [H.name] with [src]!", \ "[user] has touched [H.name] with [src]!") @@ -330,8 +328,8 @@ H.updatehealth() //forces health update before next life tick playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) H.emote("gasp") - if(!H.heart_attack && (prob(10) || defib.combat)) // Your heart explodes. - H.heart_attack = 1 + if(!H.undergoing_cardiac_arrest() && (prob(10) || defib.combat)) // Your heart explodes. + H.set_heartattack(TRUE) add_logs(user, M, "stunned", object="defibrillator") defib.deductcharge(revivecost) cooldown = 1 @@ -339,105 +337,100 @@ update_icon() defib.cooldowncheck(user) return - if(user.zone_sel && user.zone_sel.selecting == "chest") - user.visible_message("[user] begins to place [src] on [M.name]'s chest.", "You begin to place [src] on [M.name]'s chest.") - busy = 1 - update_icon() - if(do_after(user, 30 * toolspeed, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process - user.visible_message("[user] places [src] on [M.name]'s chest.", "You place [src] on [M.name]'s chest.") - playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0) - var/mob/dead/observer/ghost = H.get_ghost() - if(ghost && !ghost.client) - // In case the ghost's not getting deleted for some reason - H.key = ghost.key - log_runtime(EXCEPTION("Ghost of name [ghost.name] is bound to [H.real_name], but lacks a client. Deleting ghost."), src) + user.visible_message("[user] begins to place [src] on [M.name]'s chest.", "You begin to place [src] on [M.name]'s chest.") + busy = 1 + update_icon() + if(do_after(user, 30 * toolspeed, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process + user.visible_message("[user] places [src] on [M.name]'s chest.", "You place [src] on [M.name]'s chest.") + playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0) + var/mob/dead/observer/ghost = H.get_ghost() + if(ghost && !ghost.client) + // In case the ghost's not getting deleted for some reason + H.key = ghost.key + log_runtime(EXCEPTION("Ghost of name [ghost.name] is bound to [H.real_name], but lacks a client. Deleting ghost."), src) - qdel(ghost) - ghost = null - var/tplus = world.time - H.timeofdeath - var/tlimit = 1800 //past this much time the patient is unrecoverable (in deciseconds) - var/tloss = 600 //brain damage starts setting in on the patient after some time left rotting - var/total_burn = 0 - var/total_brute = 0 - if(do_after(user, 20 * toolspeed, target = M)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total - for(var/obj/item/carried_item in H.contents) - if(istype(carried_item, /obj/item/clothing/suit/space)) - if(!defib.combat) - user.visible_message("[defib] buzzes: Patient's chest is obscured. Operation aborted.") - playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) - busy = 0 - update_icon() - return - if(H.heart_attack) - if(!H.get_int_organ(/obj/item/organ/internal/heart) && !H.get_int_organ(/obj/item/organ/internal/brain/slime)) //prevents defibing someone still alive suffering from a heart attack attack if they lack a heart - user.visible_message("[defib] buzzes: Resuscitation failed - Failed to pick up any heart electrical activity.") + QDEL_NULL(ghost) + var/tplus = world.time - H.timeofdeath + var/tlimit = 1800 //past this much time the patient is unrecoverable (in deciseconds) + var/tloss = 600 //brain damage starts setting in on the patient after some time left rotting + var/total_burn = 0 + var/total_brute = 0 + if(do_after(user, 20 * toolspeed, target = M)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total + for(var/obj/item/carried_item in H.contents) + if(istype(carried_item, /obj/item/clothing/suit/space)) + if(!defib.combat) + user.visible_message("[defib] buzzes: Patient's chest is obscured. Operation aborted.") playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) busy = 0 update_icon() return - else - H.heart_attack = 0 - user.visible_message("[defib] pings: Cardiac arrhythmia corrected.") - M.visible_message("[M]'s body convulses a bit.") - playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) - playsound(get_turf(src), "bodyfall", 50, 1) - playsound(get_turf(src), 'sound/machines/defib_success.ogg', 50, 0) - defib.deductcharge(revivecost) - busy = 0 - cooldown = 1 - update_icon() - defib.cooldowncheck(user) - return - if(H.stat == DEAD) - var/health = H.health - M.visible_message("[M]'s body convulses a bit.") - playsound(get_turf(src), "bodyfall", 50, 1) - playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) - for(var/obj/item/organ/external/O in H.bodyparts) - total_brute += O.brute_dam - total_burn += O.burn_dam - if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !(NOCLONE in H.mutations) && (H.get_int_organ(/obj/item/organ/internal/heart) || H.get_int_organ(/obj/item/organ/internal/brain/slime))) - tobehealed = min(health + threshold, 0) // It's HILARIOUS without this min statement, let me tell you - tobehealed -= 5 //They get 5 of each type of damage healed so excessive combined damage will not immediately kill them after they get revived - H.adjustOxyLoss(tobehealed) - H.adjustToxLoss(tobehealed) - H.adjustFireLoss(tobehealed) - H.adjustBruteLoss(tobehealed) - user.visible_message("[defib] pings: Resuscitation successful.") - playsound(get_turf(src), 'sound/machines/defib_success.ogg', 50, 0) - H.update_revive(FALSE) - H.KnockOut(FALSE) - H.Paralyse(5) - H.emote("gasp") - if(tplus > tloss) - H.setBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100)))) - defib.deductcharge(revivecost) - add_logs(user, M, "revived", object="defibrillator") - else - if(tplus > tlimit|| !H.get_int_organ(/obj/item/organ/internal/heart)) - user.visible_message("[defib] buzzes: Resuscitation failed - Heart tissue damage beyond point of no return for defibrillation.") - else if(total_burn >= 180 || total_brute >= 180) - user.visible_message("[defib] buzzes: Resuscitation failed - Severe tissue damage detected.") - else if(ghost) - user.visible_message("[defib] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed.") - to_chat(ghost, "Your heart is being defibrillated. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)") - window_flash(ghost.client) - ghost << sound('sound/effects/genetics.ogg') - else - user.visible_message("[defib] buzzes: Resuscitation failed.") - playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) - defib.deductcharge(revivecost) - update_icon() - cooldown = 1 - defib.cooldowncheck(user) - else - user.visible_message("[defib] buzzes: Patient is not in a valid state. Operation aborted.") + if(H.undergoing_cardiac_arrest()) + if(!H.get_int_organ(/obj/item/organ/internal/heart) && !H.get_int_organ(/obj/item/organ/internal/brain/slime)) //prevents defibing someone still alive suffering from a heart attack attack if they lack a heart + user.visible_message("[defib] buzzes: Resuscitation failed - Failed to pick up any heart electrical activity.") playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) - busy = 0 - update_icon() - else - to_chat(user, "You need to target your patient's chest with [src].") - return + busy = 0 + update_icon() + return + else + H.set_heartattack(FALSE) + user.visible_message("[defib] pings: Cardiac arrhythmia corrected.") + M.visible_message("[M]'s body convulses a bit.") + playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) + playsound(get_turf(src), "bodyfall", 50, 1) + playsound(get_turf(src), 'sound/machines/defib_success.ogg', 50, 0) + defib.deductcharge(revivecost) + busy = 0 + cooldown = 1 + update_icon() + defib.cooldowncheck(user) + return + if(H.stat == DEAD) + var/health = H.health + M.visible_message("[M]'s body convulses a bit.") + playsound(get_turf(src), "bodyfall", 50, 1) + playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) + for(var/obj/item/organ/external/O in H.bodyparts) + total_brute += O.brute_dam + total_burn += O.burn_dam + if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !(NOCLONE in H.mutations) && (H.get_int_organ(/obj/item/organ/internal/heart) || H.get_int_organ(/obj/item/organ/internal/brain/slime))) + tobehealed = min(health + threshold, 0) // It's HILARIOUS without this min statement, let me tell you + tobehealed -= 5 //They get 5 of each type of damage healed so excessive combined damage will not immediately kill them after they get revived + H.adjustOxyLoss(tobehealed) + H.adjustToxLoss(tobehealed) + H.adjustFireLoss(tobehealed) + H.adjustBruteLoss(tobehealed) + user.visible_message("[defib] pings: Resuscitation successful.") + playsound(get_turf(src), 'sound/machines/defib_success.ogg', 50, 0) + H.update_revive(FALSE) + H.KnockOut(FALSE) + H.Paralyse(5) + H.emote("gasp") + if(tplus > tloss) + H.setBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100)))) + defib.deductcharge(revivecost) + add_logs(user, M, "revived", object="defibrillator") + else + if(tplus > tlimit|| !H.get_int_organ(/obj/item/organ/internal/heart)) + user.visible_message("[defib] buzzes: Resuscitation failed - Heart tissue damage beyond point of no return for defibrillation.") + else if(total_burn >= 180 || total_brute >= 180) + user.visible_message("[defib] buzzes: Resuscitation failed - Severe tissue damage detected.") + else if(ghost) + user.visible_message("[defib] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed.") + to_chat(ghost, "Your heart is being defibrillated. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)") + window_flash(ghost.client) + ghost << sound('sound/effects/genetics.ogg') + else + user.visible_message("[defib] buzzes: Resuscitation failed.") + playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) + defib.deductcharge(revivecost) + update_icon() + cooldown = 1 + defib.cooldowncheck(user) + else + user.visible_message("[defib] buzzes: Patient is not in a valid state. Operation aborted.") + playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) + busy = 0 + update_icon() /obj/item/weapon/borg_defib name = "defibrillator paddles" @@ -446,7 +439,7 @@ icon_state = "defibpaddles0" item_state = "defibpaddles0" force = 0 - w_class = 4 + w_class = WEIGHT_CLASS_BULKY var/revivecost = 1000 var/cooldown = 0 var/busy = 0 @@ -467,15 +460,15 @@ to_chat(user, "This unit is only designed to work on humanoid lifeforms.") return else - if(user.a_intent == I_HARM && !safety) + if(user.a_intent == INTENT_HARM && !safety) busy = 1 H.visible_message("[user] has touched [H.name] with [src]!", \ "[user] has touched [H.name] with [src]!") H.adjustStaminaLoss(50) H.Weaken(5) H.updatehealth() //forces health update before next life tick - if(!H.heart_attack && prob(10)) // Your heart explodes. - H.heart_attack = 1 + if(!H.undergoing_cardiac_arrest() && prob(10)) // Your heart explodes. + H.set_heartattack(TRUE) playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) H.emote("gasp") add_logs(user, M, "stunned", object="defibrillator") @@ -489,80 +482,75 @@ cooldown = 0 update_icon() return - if(user.zone_sel && user.zone_sel.selecting == "chest") - user.visible_message("[user] begins to place [src] on [M.name]'s chest.", "You begin to place [src] on [M.name]'s chest.") - busy = 1 - update_icon() - if(do_after(user, 30 * toolspeed, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process - user.visible_message("[user] places [src] on [M.name]'s chest.", "You place [src] on [M.name]'s chest.") - playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0) - var/mob/dead/observer/ghost = H.get_ghost() - if(ghost && !ghost.client) - // In case the ghost's not getting deleted for some reason - H.key = ghost.key - log_runtime(EXCEPTION("Ghost of name [ghost.name] is bound to [H.real_name], but lacks a client. Deleting ghost."), H) + user.visible_message("[user] begins to place [src] on [M.name]'s chest.", "You begin to place [src] on [M.name]'s chest.") + busy = 1 + update_icon() + if(do_after(user, 30 * toolspeed, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process + user.visible_message("[user] places [src] on [M.name]'s chest.", "You place [src] on [M.name]'s chest.") + playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0) + var/mob/dead/observer/ghost = H.get_ghost() + if(ghost && !ghost.client) + // In case the ghost's not getting deleted for some reason + H.key = ghost.key + log_runtime(EXCEPTION("Ghost of name [ghost.name] is bound to [H.real_name], but lacks a client. Deleting ghost."), H) - qdel(ghost) - ghost = null - var/tplus = world.time - H.timeofdeath - var/tlimit = 1800 //past this much time the patient is unrecoverable (in deciseconds) - var/tloss = 600 //brain damage starts setting in on the patient after some time left rotting - var/total_burn = 0 - var/total_brute = 0 - if(do_after(user, 20 * toolspeed, target = M)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total - if(H.stat == 2) - var/health = H.health - M.visible_message("[M]'s body convulses a bit.") - playsound(get_turf(src), "bodyfall", 50, 1) - playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) - for(var/obj/item/organ/external/O in H.bodyparts) - total_brute += O.brute_dam - total_burn += O.burn_dam - if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !(NOCLONE in H.mutations)) - tobehealed = min(health + threshold, 0) // It's HILARIOUS without this min statement, let me tell you - tobehealed -= 5 //They get 5 of each type of damage healed so excessive combined damage will not immediately kill them after they get revived - H.adjustOxyLoss(tobehealed) - H.adjustToxLoss(tobehealed) - H.adjustFireLoss(tobehealed) - H.adjustBruteLoss(tobehealed) - user.visible_message("[user] pings: Resuscitation successful.") - playsound(get_turf(src), 'sound/machines/defib_success.ogg', 50, 0) - H.update_revive(FALSE) - H.KnockOut(FALSE) - H.Paralyse(5) - H.emote("gasp") - if(tplus > tloss) - H.setBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100)))) - if(isrobot(user)) - var/mob/living/silicon/robot/R = user - R.cell.use(revivecost) - add_logs(user, M, "revived", object="defibrillator") - else - if(tplus > tlimit) - user.visible_message("[user] buzzes: Resuscitation failed - Heart tissue damage beyond point of no return for defibrillation.") - else if(total_burn >= 180 || total_brute >= 180) - user.visible_message("[user] buzzes: Resuscitation failed - Severe tissue damage detected.") - else if(ghost) - user.visible_message("[user] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed.") - to_chat(ghost, "Your heart is being defibrillated. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)") - window_flash(ghost.client) - ghost << sound('sound/effects/genetics.ogg') - else - user.visible_message("[user] buzzes: Resuscitation failed.") - playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) - if(isrobot(user)) - var/mob/living/silicon/robot/R = user - R.cell.use(revivecost) - update_icon() - cooldown = 1 - spawn(50) - cooldown = 0 - update_icon() + QDEL_NULL(ghost) + var/tplus = world.time - H.timeofdeath + var/tlimit = 1800 //past this much time the patient is unrecoverable (in deciseconds) + var/tloss = 600 //brain damage starts setting in on the patient after some time left rotting + var/total_burn = 0 + var/total_brute = 0 + if(do_after(user, 20 * toolspeed, target = M)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total + if(H.stat == 2) + var/health = H.health + M.visible_message("[M]'s body convulses a bit.") + playsound(get_turf(src), "bodyfall", 50, 1) + playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) + for(var/obj/item/organ/external/O in H.bodyparts) + total_brute += O.brute_dam + total_burn += O.burn_dam + if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !(NOCLONE in H.mutations)) + tobehealed = min(health + threshold, 0) // It's HILARIOUS without this min statement, let me tell you + tobehealed -= 5 //They get 5 of each type of damage healed so excessive combined damage will not immediately kill them after they get revived + H.adjustOxyLoss(tobehealed) + H.adjustToxLoss(tobehealed) + H.adjustFireLoss(tobehealed) + H.adjustBruteLoss(tobehealed) + user.visible_message("[user] pings: Resuscitation successful.") + playsound(get_turf(src), 'sound/machines/defib_success.ogg', 50, 0) + H.update_revive(FALSE) + H.KnockOut(FALSE) + H.Paralyse(5) + H.emote("gasp") + if(tplus > tloss) + H.setBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100)))) + if(isrobot(user)) + var/mob/living/silicon/robot/R = user + R.cell.use(revivecost) + add_logs(user, M, "revived", object="defibrillator") else - user.visible_message("[user] buzzes: Patient is not in a valid state. Operation aborted.") + if(tplus > tlimit) + user.visible_message("[user] buzzes: Resuscitation failed - Heart tissue damage beyond point of no return for defibrillation.") + else if(total_burn >= 180 || total_brute >= 180) + user.visible_message("[user] buzzes: Resuscitation failed - Severe tissue damage detected.") + else if(ghost) + user.visible_message("[user] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed.") + to_chat(ghost, "Your heart is being defibrillated. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)") + window_flash(ghost.client) + ghost << sound('sound/effects/genetics.ogg') + else + user.visible_message("[user] buzzes: Resuscitation failed.") playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) - busy = 0 - update_icon() - else - to_chat(user, "You need to target your patient's chest with [src].") - return + if(isrobot(user)) + var/mob/living/silicon/robot/R = user + R.cell.use(revivecost) + update_icon() + cooldown = 1 + spawn(50) + cooldown = 0 + update_icon() + else + user.visible_message("[user] buzzes: Patient is not in a valid state. Operation aborted.") + playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) + busy = 0 + update_icon() diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm index 5714f5e4310..7871f19e91a 100644 --- a/code/game/objects/items/weapons/dice.dm +++ b/code/game/objects/items/weapons/dice.dm @@ -29,7 +29,7 @@ desc = "A die with six sides. Basic and servicable." icon = 'icons/obj/dice.dmi' icon_state = "d6" - w_class = 1 + w_class = WEIGHT_CLASS_TINY var/sides = 6 var/result = null var/list/special_faces = list() //entries should match up to sides var if used @@ -111,10 +111,10 @@ /obj/item/weapon/dice/attack_self(mob/user as mob) diceroll(user) -/obj/item/weapon/dice/throw_at(atom/target, range, speed, mob/user as mob) +/obj/item/weapon/dice/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback) if(!..()) return - diceroll(user) + diceroll(thrower) /obj/item/weapon/dice/proc/diceroll(mob/user) result = rand(1, sides) @@ -133,7 +133,7 @@ user.visible_message("[user] has thrown [src]. It lands on [result]. [comment]", \ "You throw [src]. It lands on [result]. [comment]", \ "You hear [src] rolling, it sounds like a [fake_result].") - else if(src.throwing == 0) //Dice was thrown and is coming to rest + else if(!throwing) //Dice was thrown and is coming to rest visible_message("[src] rolls to a stop, landing on [result]. [comment]") /obj/item/weapon/dice/d20/e20/diceroll(mob/user as mob, thrown) diff --git a/code/game/objects/items/weapons/disks.dm b/code/game/objects/items/weapons/disks.dm index 2c3f71f5cf3..58f590dc629 100644 --- a/code/game/objects/items/weapons/disks.dm +++ b/code/game/objects/items/weapons/disks.dm @@ -1,5 +1,5 @@ /obj/item/weapon/disk icon = 'icons/obj/module.dmi' - w_class = 1 + w_class = WEIGHT_CLASS_TINY item_state = "card-id" icon_state = "datadisk0" diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index b4d0e0b5eaa..b583b3e2c25 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -8,7 +8,7 @@ var/datum/dna2/record/buf = null throw_speed = 3 throw_range = 5 - w_class = 1 + w_class = WEIGHT_CLASS_TINY origin_tech = "biotech=1" var/damage_coeff = 1 diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 13a9186058e..58de51085de 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -6,7 +6,7 @@ flags = NOBLUDGEON det_time = 10 display_timer = 0 - origin_tech = "syndicate=2" + origin_tech = "syndicate=1" toolspeed = 1 var/atom/target = null var/image_overlay = null @@ -61,7 +61,7 @@ nadeassembly.attack_self(user) return var/newtime = input(usr, "Please set the timer.", "Timer", 10) as num - if(user.get_active_hand() == src) + if(user.is_in_active_hand(src)) newtime = Clamp(newtime, 10, 60000) det_time = newtime to_chat(user, "Timer set for [det_time] seconds.") diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index 0767e26fbdb..42874e05cf4 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -7,7 +7,7 @@ hitsound = 'sound/weapons/smash.ogg' flags = CONDUCT throwforce = 10 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL throw_speed = 2 throw_range = 7 force = 10 @@ -29,7 +29,7 @@ hitsound = null //it is much lighter, after all. flags = null //doesn't CONDUCT throwforce = 2 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL force = 3.0 materials = list() max_water = 30 diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 70fbde22224..024783359b5 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -11,9 +11,9 @@ throwforce = 10.0 throw_speed = 1 throw_range = 5 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL materials = list(MAT_METAL=500) - origin_tech = "combat=1;plasmatech=1" + origin_tech = "combat=1;plasmatech=2;engineering=2" var/status = 0 var/throw_amount = 100 var/lit = 0 //on or off @@ -62,7 +62,7 @@ /obj/item/weapon/flamethrower/afterattack(atom/target, mob/user, flag) if(flag) return // too close // Make sure our user is still holding us - if(user && user.get_active_hand() == src) + if(user && user.is_in_active_hand(src)) var/turf/target_turf = get_turf(target) if(target_turf) var/turflist = getline(user, target_turf) diff --git a/code/game/objects/items/weapons/garrote.dm b/code/game/objects/items/weapons/garrote.dm index 196b0d269a0..be96e29f97a 100644 --- a/code/game/objects/items/weapons/garrote.dm +++ b/code/game/objects/items/weapons/garrote.dm @@ -8,7 +8,7 @@ name = "fiber wire" desc = "A length of razor-thin wire with an elegant wooden handle on either end.
    You suspect you'd have to be behind the target to use this weapon effectively." icon_state = "garrot_wrap" - w_class = 1 + w_class = WEIGHT_CLASS_TINY var/mob/living/carbon/human/strangling var/improvised = 0 var/garrote_time diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index 4e558f7b64e..c5e487d1685 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -72,7 +72,7 @@ /obj/item/weapon/lipstick/random, /obj/item/weapon/grenade/smokebomb, /obj/item/weapon/grown/corncob, - /obj/item/weapon/contraband/poster, + /obj/item/weapon/poster/random_contraband, /obj/item/weapon/bikehorn, /obj/item/weapon/beach_ball, /obj/item/weapon/beach_ball/holoball, @@ -88,8 +88,8 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus, /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris, /obj/item/device/paicard, - /obj/item/device/violin, - /obj/item/device/guitar, + /obj/item/device/instrument/violin, + /obj/item/device/instrument/guitar, /obj/item/weapon/storage/belt/utility/full, /obj/item/clothing/accessory/horrible, /obj/random/carp_plushie, diff --git a/code/game/objects/items/weapons/grenades/atmosgrenade.dm b/code/game/objects/items/weapons/grenades/atmosgrenade.dm index 4bfda1ab659..d9b411f4893 100644 --- a/code/game/objects/items/weapons/grenades/atmosgrenade.dm +++ b/code/game/objects/items/weapons/grenades/atmosgrenade.dm @@ -4,7 +4,7 @@ /obj/item/weapon/grenade/gas name = "Plasma Fire Grenade" desc = "A compressed plasma grenade, used to start horrific plasma fires." - origin_tech = "materials=3;magnets=4;syndicate=4" + origin_tech = "materials=3;magnets=4;syndicate=3" icon = 'icons/obj/grenade.dmi' icon_state = "syndicate" item_state = "flashbang" diff --git a/code/game/objects/items/weapons/grenades/bananade.dm b/code/game/objects/items/weapons/grenades/bananade.dm index 580cb993a63..6c672193bb6 100644 --- a/code/game/objects/items/weapons/grenades/bananade.dm +++ b/code/game/objects/items/weapons/grenades/bananade.dm @@ -4,7 +4,7 @@ var/turf/T /obj/item/weapon/grenade/bananade name = "bananade" desc = "A yellow grenade." - w_class = 2 + w_class = WEIGHT_CLASS_SMALL icon = 'icons/obj/grenade.dmi' icon_state = "banana" item_state = "flashbang" diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 5dc0e8d4199..707eac2fbce 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -9,7 +9,7 @@ item_state = "flashbang" var/bomb_state = "chembomb" var/payload_name = null // used for spawned grenades - w_class = 2 + w_class = WEIGHT_CLASS_SMALL force = 2 var/prime_sound = 'sound/items/Screwdriver2.ogg' var/stage = EMPTY @@ -19,6 +19,9 @@ var/obj/item/device/assembly_holder/nadeassembly = null var/label = null var/assemblyattacher + var/ignition_temp = 10 // The amount of heat added to the reagents when this grenade goes off. + var/threatscale = 1 // Used by advanced grenades to make them slightly more worthy. + var/no_splash = FALSE //If the grenade deletes even if it has no reagents to splash with. Used for slime core reactions. /obj/item/weapon/grenade/chem_grenade/New() create_reagents(1000) @@ -99,6 +102,7 @@ log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z])") bombers += "[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z])" to_chat(user, "You prime the [name]! [det_time / 10] second\s!") + playsound(user.loc, 'sound/weapons/armbomb.ogg', 60, 1) active = 1 update_icon() if(iscarbon(user)) @@ -264,13 +268,18 @@ if(stage != READY) return - var/has_reagents = 0 + var/list/datum/reagents/reactants = list() for(var/obj/item/weapon/reagent_containers/glass/G in beakers) - if(G.reagents.total_volume) - has_reagents = 1 + reactants += G.reagents - if(!has_reagents) - playsound(loc, usesound, 50, 1) + if(!chem_splash(get_turf(src), affected_area, reactants, ignition_temp, threatscale) && !no_splash) + playsound(loc, 'sound/items/Screwdriver2.ogg', 50, 1) + if(beakers.len) + for(var/obj/O in beakers) + O.forceMove(get_turf(src)) + beakers = list() + stage = EMPTY + update_icon() return if(nadeassembly) @@ -281,31 +290,9 @@ message_admins("grenade primed by an assembly, attached by [key_name_admin(M)](?) ([admin_jump_link(M)]) and last touched by [key_name_admin(last)](?) ([admin_jump_link(last)]) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP).") log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] ([T.x], [T.y], [T.z])") - playsound(loc, 'sound/effects/bamf.ogg', 50, 1) - update_mob() - invisibility = INVISIBILITY_MAXIMUM //kaboom - qdel(nadeassembly) // do this now to stop infrared beams - var/end_temp = 0 - for(var/obj/item/weapon/reagent_containers/glass/G in beakers) - G.reagents.trans_to(src, G.reagents.total_volume) - end_temp += G.reagents.chem_temp - reagents.chem_temp = end_temp - if(reagents.total_volume) //The possible reactions didnt use up all reagents. - var/datum/effect/system/steam_spread/steam = new /datum/effect/system/steam_spread() - steam.set_up(10, 0, get_turf(src)) - steam.attach(src) - steam.start() - - for(var/atom/A in view(affected_area, loc)) - if(A == src) - continue - reagents.reaction(A, 1, 10) - - - spawn(15) //Making sure all reagents can work - qdel(src) //correctly before deleting the grenade. + qdel(src) /obj/item/weapon/grenade/chem_grenade/proc/CreateDefaultTrigger(var/typekey) if(ispath(typekey,/obj/item/device/assembly)) @@ -327,64 +314,37 @@ //Large chem grenades accept slime cores and use the appropriately. /obj/item/weapon/grenade/chem_grenade/large name = "large grenade casing" - desc = "For oversized grenades; fits additional contents and affects a greater area." + desc = "A custom made large grenade. It affects a larger area." icon_state = "large_grenade" bomb_state = "largebomb" allowed_containers = list(/obj/item/weapon/reagent_containers/glass,/obj/item/weapon/reagent_containers/food/condiment, /obj/item/weapon/reagent_containers/food/drinks) - origin_tech = "combat=3;materials=3" - affected_area = 4 - + origin_tech = "combat=3;engineering=3" + affected_area = 5 + ignition_temp = 25 // Large grenades are slightly more effective at setting off heat-sensitive mixtures than smaller grenades. + threatscale = 1.1 // 10% more effective. /obj/item/weapon/grenade/chem_grenade/large/prime() if(stage != READY) return - var/has_reagents = 0 - var/obj/item/slime_extract/valid_core = null + for(var/obj/item/slime_extract/S in beakers) + if(S.Uses) + for(var/obj/item/weapon/reagent_containers/glass/G in beakers) + G.reagents.trans_to(S, G.reagents.total_volume) - for(var/obj/item/weapon/reagent_containers/glass/G in beakers) - if(!istype(G)) continue - if(G.reagents.total_volume) has_reagents = 1 - for(var/obj/item/slime_extract/E in beakers) - if(!istype(E)) continue - if(E.Uses) valid_core = E - if(E.reagents.total_volume) has_reagents = 1 + //If there is still a core (sometimes it's used up) + //and there are reagents left, behave normally, + //otherwise drop it on the ground for timed reactions like gold. - if(!has_reagents) - playsound(loc, prime_sound, 50, 1) - return - - playsound(loc, 'sound/effects/bamf.ogg', 50, 1) - - update_mob() - - if(valid_core) - for(var/obj/item/weapon/reagent_containers/glass/G in beakers) - G.reagents.trans_to(valid_core, G.reagents.total_volume) - - //If there is still a core (sometimes it's used up) - //and there are reagents left, behave normally - - if(valid_core && valid_core.reagents && valid_core.reagents.total_volume) - valid_core.reagents.trans_to(src,valid_core.reagents.total_volume) - else - for(var/obj/item/weapon/reagent_containers/glass/G in beakers) - G.reagents.trans_to(src, G.reagents.total_volume) - - if(reagents.total_volume) //The possible reactions didnt use up all reagents. - var/datum/effect/system/steam_spread/steam = new /datum/effect/system/steam_spread() - steam.set_up(10, 0, get_turf(src)) - steam.attach(src) - steam.start() - - for(var/atom/A in view(affected_area, loc)) - if( A == src ) continue - reagents.reaction(A, 1, 10) - - invisibility = INVISIBILITY_MAXIMUM //Why am i doing this? - spawn(50) //To make sure all reagents can work - qdel(src) //correctly before deleting the grenade. + if(S) + if(S.reagents && S.reagents.total_volume) + for(var/obj/item/weapon/reagent_containers/glass/G in beakers) + S.reagents.trans_to(G, S.reagents.total_volume) + else + S.forceMove(get_turf(src)) + no_splash = TRUE + ..() //I tried to just put it in the allowed_containers list but @@ -399,6 +359,71 @@ else return ..() +/obj/item/weapon/grenade/chem_grenade/cryo // Intended for rare cryogenic mixes. Cools the area moderately upon detonation. + name = "cryo grenade" + desc = "A custom made cryogenic grenade. It rapidly cools its contents upon detonation." + icon_state = "cryog" + affected_area = 2 + ignition_temp = -100 + +/obj/item/weapon/grenade/chem_grenade/pyro // Intended for pyrotechnical mixes. Produces a small fire upon detonation, igniting potentially flammable mixtures. + name = "pyro grenade" + desc = "A custom made pyrotechnical grenade. It heats up and ignites its contents upon detonation." + icon_state = "pyrog" + origin_tech = "combat=4;engineering=4" + affected_area = 3 + ignition_temp = 500 // This is enough to expose a hotspot. + +/obj/item/weapon/grenade/chem_grenade/adv_release // Intended for weaker, but longer lasting effects. Could have some interesting uses. + name = "advanced release grenade" + desc = "A custom made advanced release grenade. It is able to be detonated more than once. Can be configured using a multitool." + icon_state = "timeg" + origin_tech = "combat=3;engineering=4" + var/unit_spread = 10 // Amount of units per repeat. Can be altered with a multitool. + +/obj/item/weapon/grenade/chem_grenade/adv_release/attackby(obj/item/I, mob/user, params) + if(ismultitool(I)) + switch(unit_spread) + if(0 to 24) + unit_spread += 5 + if(25 to 99) + unit_spread += 25 + else + unit_spread = 5 + to_chat(user, " You set the time release to [unit_spread] units per detonation.") + return + ..() + +/obj/item/weapon/grenade/chem_grenade/adv_release/prime() + if(stage != READY) + return + + var/total_volume = 0 + for(var/obj/item/weapon/reagent_containers/RC in beakers) + total_volume += RC.reagents.total_volume + if(!total_volume) + qdel(src) + qdel(nadeassembly) + return + var/fraction = unit_spread/total_volume + var/datum/reagents/reactants = new(unit_spread) + reactants.my_atom = src + for(var/obj/item/weapon/reagent_containers/RC in beakers) + RC.reagents.trans_to(reactants, RC.reagents.total_volume*fraction, threatscale, 1, 1) + chem_splash(get_turf(src), affected_area, list(reactants), ignition_temp, threatscale) + + if(nadeassembly) + var/mob/M = get_mob_by_ckey(assemblyattacher) + var/mob/last = get_mob_by_ckey(nadeassembly.fingerprintslast) + var/turf/T = get_turf(src) + var/area/A = get_area(T) + message_admins("grenade primed by an assembly, attached by [key_name_admin(M)](?) (FLW) and last touched by [key_name_admin(last)](?) (FLW) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP).") + log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] ([T.x], [T.y], [T.z])") + else + addtimer(src, "prime", det_time) + var/turf/DT = get_turf(src) + var/area/DA = get_area(DT) + log_game("A grenade detonated at [DA.name] ([DT.x], [DT.y], [DT.z])") /obj/item/weapon/grenade/chem_grenade/metalfoam payload_name = "metal foam" @@ -539,4 +564,4 @@ #undef EMPTY #undef WIRED -#undef READY \ No newline at end of file +#undef READY diff --git a/code/game/objects/items/weapons/grenades/clowngrenade.dm b/code/game/objects/items/weapons/grenades/clowngrenade.dm index 0fcdceff9ac..0d24bd80a95 100644 --- a/code/game/objects/items/weapons/grenades/clowngrenade.dm +++ b/code/game/objects/items/weapons/grenades/clowngrenade.dm @@ -3,7 +3,7 @@ desc = "HONK! brand Bananas. In a special applicator for rapid slipping of wide areas." icon_state = "banana" item_state = "flashbang" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL force = 2.0 var/stage = 0 var/state = 0 @@ -74,4 +74,4 @@ if(istype(hit_atom ,/mob/living)) var/mob/living/M = hit_atom M.take_organ_damage(0, burned) - return ..() \ No newline at end of file + return ..() diff --git a/code/game/objects/items/weapons/grenades/emgrenade.dm b/code/game/objects/items/weapons/grenades/emgrenade.dm index 12dd3b7585e..9840604ccff 100644 --- a/code/game/objects/items/weapons/grenades/emgrenade.dm +++ b/code/game/objects/items/weapons/grenades/emgrenade.dm @@ -3,7 +3,7 @@ desc = "It is designed to wreak havoc on electronic systems." icon_state = "emp" item_state = "emp" - origin_tech = "materials=2;magnets=3" + origin_tech = "magnets=3;combat=2" /obj/item/weapon/grenade/empgrenade/prime() update_mob() diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 3b82b972663..6aa33fc9714 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -2,7 +2,7 @@ name = "flashbang" icon_state = "flashbang" item_state = "flashbang" - origin_tech = "materials=2;combat=1" + origin_tech = "materials=2;combat=3" /obj/item/weapon/grenade/flashbang/prime() update_mob() diff --git a/code/game/objects/items/weapons/grenades/ghettobomb.dm b/code/game/objects/items/weapons/grenades/ghettobomb.dm index 745afd967ee..13b0f0b8140 100644 --- a/code/game/objects/items/weapons/grenades/ghettobomb.dm +++ b/code/game/objects/items/weapons/grenades/ghettobomb.dm @@ -17,7 +17,7 @@ /obj/item/weapon/grenade/iedcasing name = "improvised explosive assembly" desc = "An igniter stuffed into an aluminum shell." - w_class = 2 + w_class = WEIGHT_CLASS_SMALL icon = 'icons/obj/grenade.dmi' icon_state = "improvised_grenade" item_state = "flashbang" @@ -67,7 +67,7 @@ /obj/item/weapon/grenade/iedcasing/filled name = "improvised firebomb" desc = "A weak, improvised incendiary device." - w_class = 2 + w_class = WEIGHT_CLASS_SMALL icon = 'icons/obj/grenade.dmi' icon_state = "improvised_grenade" item_state = "flashbang" diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index af855e63016..a5998591d08 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -1,7 +1,7 @@ /obj/item/weapon/grenade name = "grenade" desc = "A hand held grenade, with an adjustable timer." - w_class = 2 + w_class = WEIGHT_CLASS_SMALL icon = 'icons/obj/grenade.dmi' icon_state = "grenade" item_state = "flashbang" @@ -32,7 +32,7 @@ /*/obj/item/weapon/grenade/afterattack(atom/target as mob|obj|turf|area, mob/user as mob) if(istype(target, /obj/item/weapon/storage)) return ..() // Trying to put it in a full container if(istype(target, /obj/item/weapon/gun/grenadelauncher)) return ..() - if((user.get_active_hand() == src) && (!active) && (clown_check(user)) && target.loc != src.loc) + if((user.is_in_active_hand(src)) && (!active) && (clown_check(user)) && target.loc != src.loc) to_chat(user, "You prime the [name]! [det_time/10] seconds!") active = 1 icon_state = initial(icon_state) + "_active" diff --git a/code/game/objects/items/weapons/grenades/smokebomb.dm b/code/game/objects/items/weapons/grenades/smokebomb.dm index 798565e63fd..f010bb977c0 100644 --- a/code/game/objects/items/weapons/grenades/smokebomb.dm +++ b/code/game/objects/items/weapons/grenades/smokebomb.dm @@ -14,8 +14,7 @@ src.smoke.attach(src) Destroy() - qdel(smoke) - smoke = null + QDEL_NULL(smoke) return ..() prime() diff --git a/code/game/objects/items/weapons/grenades/spawnergrenade.dm b/code/game/objects/items/weapons/grenades/spawnergrenade.dm index fe3cb3a0c12..3804555402c 100644 --- a/code/game/objects/items/weapons/grenades/spawnergrenade.dm +++ b/code/game/objects/items/weapons/grenades/spawnergrenade.dm @@ -35,20 +35,20 @@ name = "manhack delivery grenade" spawner_type = /mob/living/simple_animal/hostile/viscerator deliveryamt = 5 - origin_tech = "materials=3;magnets=4;syndicate=4" + origin_tech = "materials=3;magnets=4;syndicate=3" /obj/item/weapon/grenade/spawnergrenade/spesscarp name = "carp delivery grenade" spawner_type = /mob/living/simple_animal/hostile/carp deliveryamt = 5 - origin_tech = "materials=3;magnets=4;syndicate=4" + origin_tech = "materials=3;magnets=4;syndicate=3" /obj/item/weapon/grenade/spawnergrenade/feral_cats name = "feral cat delivery grenade" desc = "This grenade contains 8 dehydrated feral cats in a similar manner to dehydrated monkeys, which, upon detonation, will be rehydrated by a small reservoir of water contained within the grenade. These cats will then attack anything in sight." spawner_type = /mob/living/simple_animal/hostile/feral_cat deliveryamt = 5 - origin_tech = "materials=3;magnets=4;syndicate=4" + origin_tech = "materials=3;magnets=4;syndicate=3" /obj/item/weapon/grenade/spawnergrenade/feral_cats/prime() //Own proc for this because the regular one would flash people which was dumb. update_mob() @@ -65,4 +65,4 @@ qdel(src) - return \ No newline at end of file + return diff --git a/code/game/objects/items/weapons/grenades/syndieminibomb.dm b/code/game/objects/items/weapons/grenades/syndieminibomb.dm index 160c6846d3c..a154a4a5583 100644 --- a/code/game/objects/items/weapons/grenades/syndieminibomb.dm +++ b/code/game/objects/items/weapons/grenades/syndieminibomb.dm @@ -4,9 +4,9 @@ icon = 'icons/obj/grenade.dmi' icon_state = "syndicate" item_state = "flashbang" - origin_tech = "materials=3;magnets=4;syndicate=4" + origin_tech = "materials=3;magnets=4;syndicate=3" /obj/item/weapon/grenade/syndieminibomb/prime() update_mob() explosion(src.loc,1,2,4,flame_range = 2) - qdel(src) \ No newline at end of file + qdel(src) diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 723920e7a5c..0b7850bba1f 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -7,11 +7,11 @@ flags = CONDUCT slot_flags = SLOT_BELT throwforce = 5 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL throw_speed = 2 throw_range = 5 materials = list(MAT_METAL=500) - origin_tech = "materials=1" + origin_tech = "engineering=3;combat=3" breakouttime = 600 //Deciseconds = 60s = 1 minutes var/cuffsound = 'sound/weapons/handcuffs.ogg' var/trashtype = null //For disposable cuffs @@ -75,6 +75,7 @@ name = "cable restraints" desc = "Looks like some cables tied together. Could be used to tie something up." icon_state = "cuff_white" + origin_tech = "engineering=2" materials = list(MAT_METAL=150, MAT_GLASS=75) breakouttime = 300 //Deciseconds = 30s cuffsound = 'sound/weapons/cablecuff.ogg' @@ -103,6 +104,10 @@ /obj/item/weapon/restraints/handcuffs/cable/white color = COLOR_WHITE +/obj/item/weapon/restraints/handcuffs/cable/random/New() + color = pick(COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_WHITE, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN) + ..() + /obj/item/weapon/restraints/handcuffs/alien icon_state = "handcuffAlien" diff --git a/code/game/objects/items/weapons/highlander_swords.dm b/code/game/objects/items/weapons/highlander_swords.dm new file mode 100644 index 00000000000..22686b90c96 --- /dev/null +++ b/code/game/objects/items/weapons/highlander_swords.dm @@ -0,0 +1,50 @@ + +//Highlander Style Martial Art +// Prevents use of guns, but makes the highlander impervious to ranged attacks. Their bravery in battle shields them from the weapons of COWARDS! + +/datum/martial_art/highlander + name = "Highlander Style" + deflection_chance = 100 + no_guns = TRUE + no_guns_message = "You'd never stoop so low as to use the weapon of a COWARD!" + + +//Highlander Claymore +// Grants the wielder the Highlander Style Martial Art + +/obj/item/weapon/claymore/highlander + name = "Highlander Claymore" + desc = "Imbues the wielder with legendary martial prowress and a nigh-unquenchable thirst for glorious battle!" + var/datum/martial_art/highlander/style = new + +/obj/item/weapon/claymore/highlander/Destroy() + if(ishuman(loc)) //just in case it gets destroyed while in someone's possession, such as due to acid or something? + var/mob/living/carbon/human/H = loc + style.remove(H) + QDEL_NULL(style) + return ..() + +/obj/item/weapon/claymore/highlander/equipped(mob/user, slot) + if(!ishuman(user)) + return + var/mob/living/carbon/human/H = user + if(slot == slot_r_hand || slot == slot_l_hand) + if(H.martial_art && H.martial_art != style) + style.teach(H, 1) + to_chat(H, "THERE CAN ONLY BE ONE!") + else if(H.martial_art && H.martial_art == style) + style.remove(H) + var/obj/item/weapon/claymore/highlander/sword = H.is_in_hands(/obj/item/weapon/claymore/highlander) + if(sword) + //if we have a highlander sword in the other hand, relearn the style from that sword. + sword.style.teach(H, 1) + +/obj/item/weapon/claymore/highlander/dropped(mob/user) + if(!ishuman(user)) + return + var/mob/living/carbon/human/H = user + style.remove(H) + var/obj/item/weapon/claymore/highlander/sword = H.is_in_hands(/obj/item/weapon/claymore/highlander) + if(sword) + //if we have a highlander sword in the other hand, relearn the style from that sword. + sword.style.teach(H, 1) diff --git a/code/game/objects/items/weapons/holosign.dm b/code/game/objects/items/weapons/holosign.dm index bfd16e71003..3ec25dfabaf 100644 --- a/code/game/objects/items/weapons/holosign.dm +++ b/code/game/objects/items/weapons/holosign.dm @@ -5,11 +5,11 @@ icon_state = "signmaker" item_state = "electronic" force = 5 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL throwforce = 0 throw_speed = 3 throw_range = 7 - origin_tech = "programming=3" + origin_tech = "magnets=1;programming=3" var/list/signs = list() var/max_signs = 20 diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm index a6a1039f1c7..968aac67272 100644 --- a/code/game/objects/items/weapons/holy_weapons.dm +++ b/code/game/objects/items/weapons/holy_weapons.dm @@ -7,7 +7,7 @@ throw_speed = 3 throw_range = 4 throwforce = 10 - w_class = 1 + w_class = WEIGHT_CLASS_TINY var/reskinned = FALSE var/reskin_selectable = TRUE //set to FALSE if a subtype is meant to not normally be available as a reskin option (fluff ones will get re-added through their list) var/list/fluff_transformations = list() //does it have any special transformations only accessible to it? Should only be subtypes of /obj/item/weapon/nullrod @@ -71,7 +71,7 @@ item_state = "disintegrate" desc = "This hand of yours glows with an awesome power!" flags = ABSTRACT | NODROP - w_class = 5 + w_class = WEIGHT_CLASS_HUGE hitsound = 'sound/weapons/sear.ogg' damtype = BURN attack_verb = list("punched", "cross countered", "pummeled") @@ -81,7 +81,7 @@ icon_state = "godstaff-red" item_state = "godstaff-red" desc = "It has a mysterious, protective aura." - w_class = 5 + w_class = WEIGHT_CLASS_HUGE force = 5 slot_flags = SLOT_BACK block_chance = 50 @@ -96,11 +96,10 @@ icon_state = "claymore" item_state = "claymore" desc = "A weapon fit for a crusade!" - w_class = 4 + w_class = WEIGHT_CLASS_BULKY slot_flags = SLOT_BACK|SLOT_BELT block_chance = 30 sharp = 1 - edge = 1 hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") @@ -183,11 +182,10 @@ icon_state = "scythe0" item_state = "scythe0" desc = "Ask not for whom the bell tolls..." - w_class = 4 + w_class = WEIGHT_CLASS_BULKY armour_penetration = 35 slot_flags = SLOT_BACK sharp = 1 - edge = 1 attack_verb = list("chopped", "sliced", "cut", "reaped") hitsound = 'sound/weapons/rapierhit.ogg' @@ -255,7 +253,7 @@ item_state = "hammeron" desc = "This war hammer cost the chaplain fourty thousand space dollars." slot_flags = SLOT_BELT - w_class = 5 + w_class = WEIGHT_CLASS_HUGE attack_verb = list("smashed", "bashed", "hammered", "crunched") /obj/item/weapon/nullrod/chainsaw @@ -263,10 +261,9 @@ desc = "Good? Bad? You're the guy with the chainsaw hand." icon_state = "chainsaw1" item_state = "mounted_chainsaw" - w_class = 5 + w_class = WEIGHT_CLASS_HUGE flags = NODROP | ABSTRACT sharp = 1 - edge = 1 attack_verb = list("sawed", "torn", "cut", "chopped", "diced") hitsound = 'sound/weapons/chainsaw.ogg' @@ -278,7 +275,6 @@ desc = "Used for absolutely hilarious sacrifices." hitsound = 'sound/items/bikehorn.ogg' sharp = 1 - edge = 1 attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut", "honked") /obj/item/weapon/nullrod/whip @@ -322,9 +318,8 @@ icon_state = "arm_blade" item_state = "arm_blade" flags = ABSTRACT | NODROP - w_class = 5 + w_class = WEIGHT_CLASS_HUGE sharp = 1 - edge = 1 /obj/item/weapon/nullrod/carp name = "carp-sie plushie" @@ -349,12 +344,11 @@ /obj/item/weapon/nullrod/claymore/bostaff //May as well make it a "claymore" and inherit the blocking name = "monk's staff" desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts, now used to harass the clown." - w_class = 4 + w_class = WEIGHT_CLASS_BULKY force = 13 block_chance = 40 slot_flags = SLOT_BACK sharp = 0 - edge = 0 hitsound = "swing_hit" attack_verb = list("smashed", "slammed", "whacked", "thwacked") icon = 'icons/obj/weapons.dmi' @@ -365,10 +359,9 @@ name = "arrhythmic knife" icon_state = "crysknife" item_state = "crysknife" - w_class = 5 + w_class = WEIGHT_CLASS_HUGE desc = "They say fear is the true mind killer, but stabbing them in the head works too. Honour compels you to not sheathe it once drawn." sharp = 1 - edge = 1 slot_flags = null flags = HANDSLOW hitsound = 'sound/weapons/bladeslice.ogg' @@ -389,12 +382,11 @@ name = "unholy pitchfork" icon_state = "pitchfork0" item_state = "pitchfork0" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL desc = "Holding this makes you look absolutely devilish." attack_verb = list("poked", "impaled", "pierced", "jabbed") hitsound = 'sound/weapons/bladeslice.ogg' sharp = 1 - edge = 1 /obj/item/weapon/nullrod/rosary name = "prayer beads" @@ -518,7 +510,7 @@ reskin_selectable = FALSE icon_state = "godstaff-red" item_state = "godstaff-red" - w_class = 5 + w_class = WEIGHT_CLASS_HUGE force = 5 slot_flags = SLOT_BACK block_chance = 50 diff --git a/code/game/objects/items/weapons/implants/implant_death_alarm.dm b/code/game/objects/items/weapons/implants/implant_death_alarm.dm index da9560122ad..d4807a18701 100644 --- a/code/game/objects/items/weapons/implants/implant_death_alarm.dm +++ b/code/game/objects/items/weapons/implants/implant_death_alarm.dm @@ -35,7 +35,7 @@ var/mob/M = imp_in var/area/t = get_area(M) - var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(null) + var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(src) a.follow_target = M switch(cause) @@ -52,7 +52,7 @@ else a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm") qdel(src) - + qdel(a) /obj/item/weapon/implant/death_alarm/emp_act(severity) //for some reason alarms stop going off in case they are emp'd, even without this diff --git a/code/game/objects/items/weapons/implants/implant_explosive.dm b/code/game/objects/items/weapons/implants/implant_explosive.dm index c02c3ba9fcc..158cab57d88 100644 --- a/code/game/objects/items/weapons/implants/implant_explosive.dm +++ b/code/game/objects/items/weapons/implants/implant_explosive.dm @@ -159,6 +159,11 @@ return 0 to_chat(imp_in, "Your dusting implant activates!") imp_in.visible_message("[imp_in] burns up in a flash!") + for(var/obj/item/I in imp_in.contents) + if(I == src) + continue + if(I.flags & NODROP) + qdel(I) imp_in.dust() /obj/item/weapon/implant/dust/emp_act(severity) diff --git a/code/game/objects/items/weapons/implants/implant_freedom.dm b/code/game/objects/items/weapons/implants/implant_freedom.dm index 3e269622e61..44474038406 100644 --- a/code/game/objects/items/weapons/implants/implant_freedom.dm +++ b/code/game/objects/items/weapons/implants/implant_freedom.dm @@ -3,7 +3,7 @@ desc = "Use this to escape from those evil Red Shirts." icon_state = "freedom" item_color = "r" - origin_tech = "materials=2;magnets=3;biotech=3;syndicate=4" + origin_tech = "combat=5;magnets=3;biotech=4;syndicate=2" uses = 4 @@ -48,4 +48,4 @@ No Implant Specifics"} /obj/item/weapon/implantcase/freedom/New() imp = new /obj/item/weapon/implant/freedom(src) - ..() \ No newline at end of file + ..() diff --git a/code/game/objects/items/weapons/implants/implant_misc.dm b/code/game/objects/items/weapons/implants/implant_misc.dm index c949d7e561e..5d1d54e7ddf 100644 --- a/code/game/objects/items/weapons/implants/implant_misc.dm +++ b/code/game/objects/items/weapons/implants/implant_misc.dm @@ -2,7 +2,7 @@ name = "firearms authentication implant" desc = "Lets you shoot your guns" icon_state = "auth" - origin_tech = "materials=2;magnets=2;programming=2;biotech=5;syndicate=5" + origin_tech = "magnets=2;programming=7;biotech=5;syndicate=5" activated = 0 /obj/item/weapon/implant/weapons_auth/get_data() @@ -53,7 +53,7 @@ name = "emp implant" desc = "Triggers an EMP." icon_state = "emp" - origin_tech = "materials=2;biotech=3;magnets=4;syndicate=4" + origin_tech = "biotech=3;magnets=4;syndicate=1" uses = 2 /obj/item/weapon/implant/emp/activate() @@ -65,4 +65,4 @@ /obj/item/weapon/implant/cortical name = "cortical stack" desc = "A fist-sized mass of biocircuits and chips." - icon_state = "implant_evil" \ No newline at end of file + icon_state = "implant_evil" diff --git a/code/game/objects/items/weapons/implants/implant_storage.dm b/code/game/objects/items/weapons/implants/implant_storage.dm index fba9c1377ef..0fd4fc76382 100644 --- a/code/game/objects/items/weapons/implants/implant_storage.dm +++ b/code/game/objects/items/weapons/implants/implant_storage.dm @@ -1,9 +1,9 @@ /obj/item/weapon/storage/hidden/implant name = "bluespace pocket" storage_slots = 2 - max_w_class = 3 - max_combined_w_class = 6 - w_class = 4 + max_w_class = WEIGHT_CLASS_NORMAL + max_combined_w_class = WEIGHT_CLASS_GIGANTIC + w_class = WEIGHT_CLASS_BULKY cant_hold = list(/obj/item/weapon/disk/nuclear) silent = 1 @@ -12,7 +12,7 @@ name = "storage implant" desc = "Stores up to two big items in a bluespace pocket." icon_state = "storage" - origin_tech = "materials=2;magnets=4;bluespace=4;syndicate=4" + origin_tech = "materials=2;magnets=4;bluespace=5;syndicate=4" item_color = "r" var/obj/item/weapon/storage/hidden/implant/storage @@ -58,4 +58,4 @@ /obj/item/weapon/implanter/storage/New() imp = new /obj/item/weapon/implant/storage(src) - ..() \ No newline at end of file + ..() diff --git a/code/game/objects/items/weapons/implants/implant_track.dm b/code/game/objects/items/weapons/implants/implant_track.dm index d0d1159a9c5..e0d44cdefcf 100644 --- a/code/game/objects/items/weapons/implants/implant_track.dm +++ b/code/game/objects/items/weapons/implants/implant_track.dm @@ -30,3 +30,11 @@ circuitry. As a result neurotoxins can cause massive damage.
    Implant Specifics:
    "} return dat + +/obj/item/weapon/implantcase/track + name = "implant case - 'Tracking'" + desc = "A glass case containing a tracking implant." + +/obj/item/weapon/implantcase/track/New() + imp = new /obj/item/weapon/implant/tracking(src) + ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm index 41354136648..b35fecf77b1 100644 --- a/code/game/objects/items/weapons/implants/implantcase.dm +++ b/code/game/objects/items/weapons/implants/implantcase.dm @@ -6,7 +6,7 @@ item_state = "implantcase" throw_speed = 2 throw_range = 5 - w_class = 1 + w_class = WEIGHT_CLASS_TINY origin_tech = "materials=1;biotech=2" materials = list(MAT_GLASS=500) var/obj/item/weapon/implant/imp = null @@ -98,4 +98,4 @@ /obj/item/weapon/implantcase/death_alarm/New() imp = new /obj/item/weapon/implant/death_alarm(src) - ..() \ No newline at end of file + ..() diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm index 8209de8da80..92d35d0ef87 100644 --- a/code/game/objects/items/weapons/implants/implanter.dm +++ b/code/game/objects/items/weapons/implants/implanter.dm @@ -6,8 +6,8 @@ item_state = "syringe_0" throw_speed = 3 throw_range = 5 - w_class = 2 - origin_tech = "materials=1;biotech=3;programming=2" + w_class = WEIGHT_CLASS_SMALL + origin_tech = "materials=2;biotech=3" materials = list(MAT_METAL=600, MAT_GLASS=200) toolspeed = 1 var/obj/item/weapon/implant/imp = null @@ -86,4 +86,4 @@ /obj/item/weapon/implanter/death_alarm/New() imp = new /obj/item/weapon/implant/death_alarm(src) - ..() \ No newline at end of file + ..() diff --git a/code/game/objects/items/weapons/implants/implantpad.dm b/code/game/objects/items/weapons/implants/implantpad.dm index cd988d6310e..2e427638fd1 100644 --- a/code/game/objects/items/weapons/implants/implantpad.dm +++ b/code/game/objects/items/weapons/implants/implantpad.dm @@ -8,7 +8,7 @@ item_state = "electronic" throw_speed = 3 throw_range = 5 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL var/obj/item/weapon/implantcase/case = null /obj/item/weapon/implantpad/Destroy() diff --git a/code/game/objects/items/weapons/implants/implantuplink.dm b/code/game/objects/items/weapons/implants/implantuplink.dm index 3ccea8aee20..0e6332e78f1 100644 --- a/code/game/objects/items/weapons/implants/implantuplink.dm +++ b/code/game/objects/items/weapons/implants/implantuplink.dm @@ -3,7 +3,7 @@ desc = "Summon things." icon = 'icons/obj/radio.dmi' icon_state = "radio" - origin_tech = "materials=2;magnets=4;programming=4;biotech=4;syndicate=8;bluespace=5" + origin_tech = "materials=4;magnets=4;programming=4;biotech=4;syndicate=5;bluespace=5" /obj/item/weapon/implant/uplink/New() hidden_uplink = new(src) @@ -32,4 +32,4 @@ /obj/item/weapon/implanter/uplink/New() imp = new /obj/item/weapon/implant/uplink(src) - ..() \ No newline at end of file + ..() diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index 069bf06ddfb..4bf40a3ae15 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -12,18 +12,18 @@ /obj/item/weapon/kitchen icon = 'icons/obj/kitchen.dmi' + origin_tech = "materials=1" /* * Utensils */ /obj/item/weapon/kitchen/utensil force = 5.0 - w_class = 1 + w_class = WEIGHT_CLASS_TINY throwforce = 0.0 throw_speed = 3 throw_range = 5 flags = CONDUCT - origin_tech = "materials=1" attack_verb = list("attacked", "stabbed", "poked") hitsound = 'sound/weapons/bladeslice.ogg' sharp = 0 @@ -40,7 +40,7 @@ if(!istype(M)) return ..() - if(user.a_intent != I_HELP) + if(user.a_intent != INTENT_HELP) if(user.zone_sel.selecting == "head" || user.zone_sel.selecting == "eyes") if((CLUMSY in user.mutations) && prob(50)) M = user @@ -91,17 +91,14 @@ desc = "A general purpose Chef's Knife made by SpaceCook Incorporated. Guaranteed to stay sharp for years to come." flags = CONDUCT force = 10 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL throwforce = 10 hitsound = 'sound/weapons/bladeslice.ogg' throw_speed = 3 throw_range = 6 materials = list(MAT_METAL=12000) - origin_tech = "materials=1" attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - no_embed = 1 sharp = 1 - edge = 1 /obj/item/weapon/kitchen/knife/suicide_act(mob/user) user.visible_message(pick("[user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.", \ @@ -115,14 +112,13 @@ icon_state = "pknife" item_state = "knife" sharp = 0 - edge = 0 /obj/item/weapon/kitchen/knife/ritual name = "ritual knife" desc = "The unearthly energies that once powered this blade are now dormant." icon = 'icons/obj/wizard.dmi' icon_state = "render" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL /obj/item/weapon/kitchen/knife/butcher name = "butcher's cleaver" @@ -132,7 +128,7 @@ force = 15 throwforce = 8 attack_verb = list("cleaved", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL /obj/item/weapon/kitchen/knife/butcher/meatcleaver name = "Meat Cleaver" @@ -149,9 +145,16 @@ desc = "A military combat utility survival knife." force = 20 throwforce = 20 - origin_tech = "materials=2;combat=4" + origin_tech = "materials=3;combat=4" attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "cut") +/obj/item/weapon/kitchen/knife/combat/cyborg + name = "cyborg knife" + icon = 'icons/obj/items_cyborg.dmi' + icon_state = "knife" + desc = "A cyborg-mounted plasteel knife. Extremely sharp and durable." + origin_tech = null + /obj/item/weapon/kitchen/knife/carrotshiv name = "carrot shiv" icon_state = "carrotshiv" @@ -175,7 +178,7 @@ throwforce = 10.0 throw_speed = 3 throw_range = 7 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") /* Trays moved to /obj/item/weapon/storage/bag */ @@ -192,7 +195,7 @@ throwforce = 5 throw_speed = 3 throw_range = 3 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed") /obj/item/weapon/kitchen/mould/bear diff --git a/code/game/objects/items/weapons/legcuffs.dm b/code/game/objects/items/weapons/legcuffs.dm index 3bec7f32f9e..cbb8c3d4ed2 100644 --- a/code/game/objects/items/weapons/legcuffs.dm +++ b/code/game/objects/items/weapons/legcuffs.dm @@ -6,8 +6,8 @@ icon_state = "handcuff" flags = CONDUCT throwforce = 0 - w_class = 3 - origin_tech = "materials=1" + w_class = WEIGHT_CLASS_NORMAL + origin_tech = "engineering=3;combat=3" slowdown = 7 breakouttime = 300 //Deciseconds = 30s = 0.5 minute @@ -17,6 +17,7 @@ throw_range = 1 icon_state = "beartrap" desc = "A trap used to catch bears and other legged creatures." + origin_tech = "engineering=4" var/armed = 0 var/trap_damage = 20 var/obj/item/weapon/grenade/iedcasing/IED = null @@ -196,7 +197,7 @@ desc = "A specialized hard-light bola designed to ensnare fleeing criminals and aid in arrests." icon_state = "ebola" hitsound = 'sound/weapons/tase.ogg' - w_class = 2 + w_class = WEIGHT_CLASS_SMALL breakouttime = 60 /obj/item/weapon/restraints/legcuffs/bola/energy/throw_impact(atom/hit_atom) @@ -204,4 +205,4 @@ var/obj/item/weapon/restraints/legcuffs/beartrap/B = new /obj/item/weapon/restraints/legcuffs/beartrap/energy/cyborg(get_turf(hit_atom)) B.Crossed(hit_atom) qdel(src) - ..() \ No newline at end of file + ..() diff --git a/code/game/objects/items/weapons/lighters.dm b/code/game/objects/items/weapons/lighters.dm index 307ec829072..6525351fd67 100644 --- a/code/game/objects/items/weapons/lighters.dm +++ b/code/game/objects/items/weapons/lighters.dm @@ -9,7 +9,7 @@ item_state = "lighter-g" var/icon_on = "lighter-g-on" var/icon_off = "lighter-g" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL throwforce = 4 flags = CONDUCT slot_flags = SLOT_BELT @@ -35,7 +35,7 @@ if(user.r_hand == src || user.l_hand == src || isrobot(user)) if(!lit) lit = 1 - w_class = 4 + w_class = WEIGHT_CLASS_BULKY icon_state = icon_on item_state = icon_on if(istype(src, /obj/item/weapon/lighter/zippo) ) @@ -59,7 +59,7 @@ processing_objects.Add(src) else lit = 0 - w_class = 1 + w_class = WEIGHT_CLASS_TINY icon_state = icon_off item_state = icon_off if(istype(src, /obj/item/weapon/lighter/zippo) ) @@ -147,7 +147,7 @@ icon_state = "match_unlit" var/lit = 0 var/smoketime = 5 - w_class = 1 + w_class = WEIGHT_CLASS_TINY origin_tech = "materials=1" attack_verb = list("burnt", "singed") diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm index 2178ccbb726..88311c5f149 100644 --- a/code/game/objects/items/weapons/manuals.dm +++ b/code/game/objects/items/weapons/manuals.dm @@ -580,11 +580,8 @@

    Protolathe

    This machine is an advanced form of the Autolathe that produce non-circuit designs. Unlike the Autolathe, it can use processed metal, glass, solid plasma, silver, gold, and diamonds along with a variety of chemicals to produce devices. The downside is that, again, not all devices you make are 100% reliable when you first discover them. -

    Reliability and You

    - As it has been stated, many devices when they're first discovered do not have a 100% reliablity when you first discover them. Instead, the reliablity of the device is dependent upon a base reliability value, whatever improvements to the design you've discovered through the Destructive Analyzer, and any advancements you've made with the device's source technologies. To be able to improve the reliability of a device, you have to use the device until it breaks beyond repair. Once that happens, you can analyze it in a Destructive Analyzer. Once the device reachs a certain minimum reliability, you'll gain tech advancements from it. -

    Building a Better Machine

    - Many machines produces from circuit boards and inserted into a machine frame require a variety of parts to construct. These are parts like capacitors, batteries, matter bins, and so forth. As your knowledge of science improves, more advanced versions are unlocked. If you use these parts when constructing something, its attributes may be improved. For example, if you use an advanced matter bin when constructing an autolathe (rather then a regular one), it'll hold more materials. Experiment around with stock parts of various qualities to see how they affect the end results! Be warned, however: Tier 3 and higher stock parts don't have 100% reliability and their low reliability may affect the reliability of the end machine. + Many machines produces from circuit boards and inserted into a machine frame require a variety of parts to construct. These are parts like capacitors, batteries, matter bins, and so forth. As your knowledge of science improves, more advanced versions are unlocked. If you use these parts when constructing something, its attributes may be improved. For example, if you use an advanced matter bin when constructing an autolathe (rather then a regular one), it'll hold more materials. Experiment around with stock parts of various qualities to see how they affect the end results! "}*/ @@ -1186,9 +1183,9 @@ /obj/item/weapon/book/manual/faxes name = "A Guide to Faxes" - desc = "A NanoTrasen-approved guide to writing faxes" + desc = "A Nanotrasen-approved guide to writing faxes" icon_state = "book6" - author = "NanoTrasen" + author = "Nanotrasen" title = "A Guide to Faxes" dat = {" @@ -1216,14 +1213,14 @@
  • 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.
  • +
  • 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.
  • +
  • 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.
  • @@ -2490,7 +2487,7 @@
  • Foreword
  • Captain
  • Head of Personnel
  • -
  • NanoTrasen Representative
  • +
  • Nanotrasen Representative
  • Blueshield Officer
  • AI
  • @@ -2510,9 +2507,9 @@
  • The Captain must keep the Nuclear Authentication Disk on their person at all times or, failing that, in the possession of the Head of Security or Blueshield;
  • The Captain is to attempt to resolve every issue that arises in Command locally before contacting Central Command;
  • The Captain is not permitted to carry their Antique Laser Gun or Space Armor unless there's an immediate emergency that requires attending to;
  • -
  • The Captain, despite being in charge of the Cyberiad, is not independent from NanoTrasen. Any attempts to disregard general company policy are to be considered an instant condition for contract termination;
  • +
  • The Captain, despite being in charge of the Cyberiad, is not independent from Nanotrasen. Any attempts to disregard general company policy are to be considered an instant condition for contract termination;
  • The Captain may only promote personnel to a Acting Head of Staff position if there is no assigned Head of Staff associated with the Department. Said Acting Head of Staff must be a member of the Department they are to lead. See below for more information on Chain of Command;
  • -
  • The Captain may not fire any Head of Staff without reasonable justification (ie, incompetency, criminal activity, or otherwise any action that endangers/compromises the station and/or crew). The Captain may not fire any Central Command VIPs (ie, Blueshield, Magistrate, NanoTrasen Representative) without permission from Central Command, unless they are blatantly acting against the well-being and safety of the crew and station.
  • +
  • The Captain may not fire any Head of Staff without reasonable justification (ie, incompetency, criminal activity, or otherwise any action that endangers/compromises the station and/or crew). The Captain may not fire any Central Command VIPs (ie, Blueshield, Magistrate, Nanotrasen Representative) without permission from Central Command, unless they are blatantly acting against the well-being and safety of the crew and station.

  • Head of Personnel


    @@ -2521,7 +2518,7 @@
  • The Head of Personnel may not give any personnel increased access without authorization from the relevant Head of Staff. This includes the Head of Personnel. In addition, the Head of Personnel may only give Captain-Level access to someone if they are the Acting Captain. This access is to be removed when a proper Captain arrives on the station;
  • The Head of Personnel may not increase any Job Openings unless the relevant Head of Staff approves;
  • The Head of Personnel may not fire any personnel without authorization from the relevant Head of Staff, unless other conditions apply (see Space Law and General Standard Operating Procedure);
  • -
  • The Head of Personnel may not promote any personnel to the following Jobs without authorization from Central Command: Barber, Brig Physician, NanoTrasen Representative, Blueshield, Security Pod Pilot, Mechanic and Magistrate; (This is due to them being karma locked. Do not promote people to these positions without approval from the Administrators);
  • +
  • The Head of Personnel may not promote any personnel to the following Jobs without authorization from Central Command: Barber, Brig Physician, Nanotrasen Representative, Blueshield, Security Pod Pilot, Mechanic and Magistrate; (This is due to them being karma locked. Do not promote people to these positions without approval from the Administrators);
  • The Head of Personnel is free to utilize paperwork at their discretion. However, during major station emergencies, expediency should take precedence over bureaucracy;
  • The Head of Personnel may not leave their office unmanned if there are personnel waiting in line. Failure to respond to personnel with a legitimate request within ten (10) minutes, either via radio or in person, is to be considered a breach of Standard Operating Procedure;
  • Despite nominally being in charge of Supply, the Head of Personnel should allow the Quartermaster to run the Department, unless they prove themselves to be incompetent/dangerous;
  • @@ -2529,13 +2526,13 @@
  • The Head of Personnel is not permitted to perform Security duty. The Head of Personnel is permitted to carry an Energy Gun, for self-defence only.

  • -

    NanoTrasen Representative


    +

    Nanotrasen Representative


      -
    1. The NanoTrasen Representative is to ensure that every Department is following Standard Operating Procedure, up to and including the respective Head of Staff. If a Head of Staff is not available for a Department, the NanoTrasen Representative must ensure that the Captain appoints an Acting Head of Staff for said Department;
    2. -
    3. The NanoTrasen Representative must attempt to resolve any breach of Standard Operating Procedure locally before contacting Central Command. This is an imperative: Standard Operating Procedure should always be followed unless there is a very good reason not to;
    4. -
    5. The NanoTrasen Representative must, together with the Magistrate and Head of Security, ensure that Space Law is being followed and correctly applied;
    6. -
    7. The NanoTrasen Representative may not threaten the use of a fax in order to gain leverage over any personnel, up to and including Command. In addition they may not threaten to fire, or have Central Command, fire anyone, unless they actually possess a demotion note;
    8. -
    9. The NanoTrasen Representative is permitted to carry their Stun-Cane, or a Telescopic Baton if the Stun-Cane is lost.
    10. +
    11. The Nanotrasen Representative is to ensure that every Department is following Standard Operating Procedure, up to and including the respective Head of Staff. If a Head of Staff is not available for a Department, the Nanotrasen Representative must ensure that the Captain appoints an Acting Head of Staff for said Department;
    12. +
    13. The Nanotrasen Representative must attempt to resolve any breach of Standard Operating Procedure locally before contacting Central Command. This is an imperative: Standard Operating Procedure should always be followed unless there is a very good reason not to;
    14. +
    15. The Nanotrasen Representative must, together with the Magistrate and Head of Security, ensure that Space Law is being followed and correctly applied;
    16. +
    17. The Nanotrasen Representative may not threaten the use of a fax in order to gain leverage over any personnel, up to and including Command. In addition they may not threaten to fire, or have Central Command, fire anyone, unless they actually possess a demotion note;
    18. +
    19. The Nanotrasen Representative is permitted to carry their Stun-Cane, or a Telescopic Baton if the Stun-Cane is lost.

    Blueshield Officer


    @@ -2550,14 +2547,14 @@ The following are procedures for AI Maintenance:
    1. Only the Captain or Research Director may enter the AI Upload to perform Law Changes (see below), and only the Captain, Research Director or Chief Engineer may enter the AI Core to perform a Carding (see below);
    2. -
    3. No Law Changes are to be performed without approval from the Captain and Research Director. The only Lawsets to be used are those provided by NanoTrasen. Failure to legally perform a Law Change is to be considered Sabotage. Command must be informed prior to the Law Change, and all objections must be taken into consideration. If the number of Command personnel opposing the Law Change is greater than the number of Command personnel in favour, the Law Change is not to be done. If the Law Change is performed, the crew is to be immediately informed of the new Law(s);
    4. +
    5. No Law Changes are to be performed without approval from the Captain and Research Director. The only Lawsets to be used are those provided by Nanotrasen. Failure to legally perform a Law Change is to be considered Sabotage. Command must be informed prior to the Law Change, and all objections must be taken into consideration. If the number of Command personnel opposing the Law Change is greater than the number of Command personnel in favour, the Law Change is not to be done. If the Law Change is performed, the crew is to be immediately informed of the new Law(s);
    6. The AI may not be Carded unless it it clearly malfunctioning or subverted. However, any member of Command may card it if the AI agrees to it, either at the end of the shift, or due to external circumstances (such as massive damage to the AI Satellite);
    7. The AI Upload and Minisat Antechamber Turrets are to be kept on Non-Lethal in Code Green and Code Blue. The AI Core Turrets are to be kept on Lethal at all times. If a legal Law Change or Carding is occurring, the Turrets are to be disabled;
    8. If the AI Unit is not malfunctioning or subverted, any attempt at performing an illegal Carding or Law Change is to be responded to with non-lethal force. If the illegal attempts persist, and the perpetrator is demonstrably hostile, lethal force from Command/Security is permitted;
    9. Freeform Laws are only to be added if absolutely necessary due to external circumstances (such as major station emergencies). Adding unnecessary Freeform Laws is not permitted. Exception is made if the AI Unit and majority of Command agree to the Freeform Law that is proposed;
    10. -
    11. Any use of the "Purge" Module is to be followed by the upload of a NanoTrasen-approved Lawset immediately. AI Units must be bound to a Lawset at all times.
    12. +
    13. Any use of the "Purge" Module is to be followed by the upload of a Nanotrasen-approved Lawset immediately. AI Units must be bound to a Lawset at all times.

    - "} \ No newline at end of file + "} diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index afc5dbd93ad..afbea9b4c17 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -2,11 +2,10 @@ var/active = 0 var/force_on = 30 //force when active var/throwforce_on = 20 - w_class = 2 - var/w_class_on = 4 + w_class = WEIGHT_CLASS_SMALL + var/w_class_on = WEIGHT_CLASS_BULKY var/icon_state_on = "axe1" var/list/attack_verb_on = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - no_embed = 1 // Physically impossible for energy weapons to embed themselves into people, this should fix that. -- Dave hitsound = 'sound/weapons/blade1.ogg' // Probably more appropriate than the previous hitsound. -- Dave usesound = 'sound/weapons/blade1.ogg' toolspeed = 1 @@ -25,6 +24,7 @@ force = force_on throwforce = throwforce_on hitsound = 'sound/weapons/blade1.ogg' + throw_speed = 4 if(attack_verb_on.len) attack_verb = attack_verb_on if(!item_color) @@ -38,6 +38,7 @@ force = initial(force) throwforce = initial(throwforce) hitsound = initial(hitsound) + throw_speed = initial(throw_speed) if(attack_verb_on.len) attack_verb = list() icon_state = initial(icon_state) @@ -61,16 +62,15 @@ throwforce_on = 30 throw_speed = 3 throw_range = 5 - w_class = 3 - w_class_on = 5 + w_class = WEIGHT_CLASS_NORMAL + w_class_on = WEIGHT_CLASS_HUGE hitsound = "swing_hit" flags = CONDUCT armour_penetration = 100 - origin_tech = "combat=3" + origin_tech = "combat=4;magnets=3" attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut") attack_verb_on = list() sharp = 1 - edge = 1 /obj/item/weapon/melee/energy/axe/suicide_act(mob/user) user.visible_message("[user] swings the [src.name] towards /his head! It looks like \he's trying to commit suicide.") @@ -85,11 +85,12 @@ throw_speed = 3 throw_range = 5 hitsound = "swing_hit" + embed_chance = 75 + embedded_impact_pain_multiplier = 10 armour_penetration = 35 - origin_tech = "magnets=3;syndicate=4" + origin_tech = "combat=3;magnets=4;syndicate=4" block_chance = 50 sharp = 1 - edge = 1 var/hacked = 0 var/blade_color @@ -121,15 +122,13 @@ force_on = 30 force = 18 //About as much as a spear sharp = 1 - edge = 1 hitsound = 'sound/weapons/circsawhit.ogg' - origin_tech = "materials=3;biotech=3;syndicate=3" icon = 'icons/obj/surgery.dmi' icon_state = "esaw_0" icon_state_on = "esaw_1" hitcost = 75 //Costs more than a standard cyborg esword item_color = null - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL /obj/item/weapon/melee/energy/sword/cyborg/saw/New() ..() @@ -201,26 +200,28 @@ name = "energy blade" desc = "A concentrated beam of energy in the shape of a blade. Very stylish... and lethal." icon_state = "blade" - force = 30 - sharp = 1 - edge = 1 + force = 30 //Normal attacks deal esword damage + hitsound = 'sound/weapons/blade1.ogg' + active = 1 throwforce = 1//Throwing or dropping the item deletes it. throw_speed = 3 throw_range = 1 - w_class = 4//So you can't hide it in your pocket or some such. - armour_penetration = 50 - attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") + w_class = WEIGHT_CLASS_BULKY //So you can't hide it in your pocket or some such. var/datum/effect/system/spark_spread/spark_system + sharp = 1 //Most of the other special functions are handled in their own files. aka special snowflake code so kewl /obj/item/weapon/melee/energy/blade/New() + ..() spark_system = new /datum/effect/system/spark_spread() spark_system.set_up(5, 0, src) spark_system.attach(src) -/obj/item/weapon/melee/energy/blade/dropped() - ..() - qdel(src) - /obj/item/weapon/melee/energy/blade/attack_self(mob/user) - return \ No newline at end of file + return + +/obj/item/weapon/melee/energy/blade/hardlight + name = "hardlight blade" + desc = "An extremely sharp blade made out of hard light. Packs quite a punch." + icon_state = "lightblade" + item_state = "lightblade" \ No newline at end of file diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm index 7a05ca00cb6..22f4393c94f 100644 --- a/code/game/objects/items/weapons/melee/misc.dm +++ b/code/game/objects/items/weapons/melee/misc.dm @@ -10,8 +10,8 @@ slot_flags = SLOT_BELT force = 10 throwforce = 7 - w_class = 3 - origin_tech = "combat=4" + w_class = WEIGHT_CLASS_NORMAL + origin_tech = "combat=5" attack_verb = list("flogged", "whipped", "lashed", "disciplined") hitsound = 'sound/weapons/slash.ogg' //pls replace @@ -28,11 +28,10 @@ flags = CONDUCT force = 15 throwforce = 10 - w_class = 4 + w_class = WEIGHT_CLASS_BULKY block_chance = 50 armour_penetration = 75 sharp = 1 - edge = 1 origin_tech = "combat=5" attack_verb = list("lunged at", "stabbed") hitsound = 'sound/weapons/rapierhit.ogg' @@ -50,7 +49,7 @@ item_state = "icepick" force = 15 throwforce = 10 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL attack_verb = list("stabbed", "jabbed", "iced,") /obj/item/weapon/melee/candy_sword @@ -60,5 +59,5 @@ item_state = "candy_sword" force = 10 throwforce = 7 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL attack_verb = list("slashed", "stabbed", "sliced", "caned") \ No newline at end of file diff --git a/code/game/objects/items/weapons/misc.dm b/code/game/objects/items/weapons/misc.dm index ffd021aae4b..cd86a04a377 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 + w_class = WEIGHT_CLASS_SMALL materials = list(MAT_METAL=50) attack_verb = list("bludgeoned", "whacked", "disciplined", "thrashed", "Vaudevilled") @@ -43,7 +43,7 @@ icon = 'icons/obj/items.dmi' icon_state = "c_tube" throwforce = 1 - w_class = 1 + w_class = WEIGHT_CLASS_TINY throw_speed = 4 throw_range = 5 @@ -65,7 +65,7 @@ var/data = "" var/base_url = "http://svn.slurm.us/public/spacestation13/misc/game_kit" item_state = "sheet-metal" - w_class = 5 + w_class = WEIGHT_CLASS_HUGE */ /obj/item/weapon/gift @@ -76,7 +76,7 @@ var/size = 3.0 var/obj/item/gift = null item_state = "gift" - w_class = 4 + w_class = WEIGHT_CLASS_BULKY /obj/item/weapon/kidanglobe name = "Kidan homeworld globe" @@ -134,7 +134,7 @@ throwforce = 2 throw_speed = 1 throw_range = 4 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL attack_verb = list("called", "rang") hitsound = 'sound/weapons/ring.ogg' var/cooldown = 0 diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index 4495f637e56..b7e60411bc5 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -1,15 +1,13 @@ -#define is_cleanable(A) (istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/rune)) - /obj/item/weapon/mop desc = "The world of janitalia wouldn't be complete without a mop." name = "mop" icon = 'icons/obj/janitor.dmi' icon_state = "mop" - force = 3.0 - throwforce = 5.0 + force = 3 + throwforce = 5 throw_speed = 3 throw_range = 7 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL attack_verb = list("mopped", "bashed", "bludgeoned", "whacked") burn_state = FLAMMABLE var/mopping = 0 @@ -43,23 +41,25 @@ to_chat(user, "Your mop is dry!") return - var/turf/simulated/turf = A - if(is_cleanable(A)) - turf = A.loc - A = null + var/turf/simulated/T = get_turf(A) - if(istype(turf)) - user.visible_message("[user] begins to clean \the [turf] with [src].", "You begin to clean \the [turf] with [src]...") + if(istype(A, /obj/item/weapon/reagent_containers/glass/bucket) || istype(A, /obj/structure/janitorialcart)) + return - if(do_after(user, src.mopspeed, target = turf)) + if(istype(T)) + user.visible_message("[user] begins to clean [T] with [src].", "You begin to clean [T] with [src]...") + + if(do_after(user, src.mopspeed, target = T)) to_chat(user, "You finish mopping.") - clean(turf) + clean(T) /obj/effect/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/mop) || istype(I, /obj/item/weapon/soap)) return - ..() + else + return ..() + /obj/item/weapon/mop/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J) J.put_in_cart(src, user) @@ -75,21 +75,47 @@ /obj/item/weapon/mop/advanced desc = "The most advanced tool in a custodian's arsenal. Just think of all the viscera you will clean up with this!" name = "advanced mop" - mopcap = 15 + mopcap = 10 icon_state = "advmop" - item_state = "mop" //meh will do for now until TG makes one + item_state = "mop" + origin_tech = "materials=3;engineering=3" force = 6 throwforce = 8 throw_range = 4 - mopspeed = 10 + mopspeed = 20 + var/refill_enabled = TRUE //Self-refill toggle for when a janitor decides to mop with something other than water. + var/refill_rate = 1 //Rate per process() tick mop refills itself + var/refill_reagent = "water" //Determins what reagent to use for refilling, just in case someone wanted to make a HOLY MOP OF PURGING + +/obj/item/weapon/mop/advanced/New() + ..() + processing_objects.Add(src) + +/obj/item/weapon/mop/advanced/attack_self(mob/user) + refill_enabled = !refill_enabled + if(refill_enabled) + processing_objects.Add(src) + else + processing_objects.Remove(src) + to_chat(user, "You set the condenser switch to the '[refill_enabled ? "ON" : "OFF"]' position.") + playsound(user, 'sound/machines/click.ogg', 30, 1) + +/obj/item/weapon/mop/advanced/process() + + if(reagents.total_volume < mopcap) + reagents.add_reagent(refill_reagent, refill_rate) + +/obj/item/weapon/mop/advanced/examine(mob/user) + ..() + to_chat(user, "The condenser switch is set to [refill_enabled ? "ON" : "OFF"].") + +/obj/item/weapon/mop/advanced/Destroy() + if(refill_enabled) + processing_objects.Remove(src) + return ..() + /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.") +/obj/item/weapon/mop/advanced/cyborg/janicart_insert(mob/user, obj/structure/janitorialcart/J) + return \ 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 67d4f078264..dc5c4d048b5 100644 --- a/code/game/objects/items/weapons/paint.dm +++ b/code/game/objects/items/weapons/paint.dm @@ -7,7 +7,7 @@ icon_state = "paint_neutral" item_state = "paintcan" materials = list(MAT_METAL=200) - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL burn_state = FLAMMABLE burntime = 5 amount_per_transfer_from_this = 5 @@ -63,4 +63,4 @@ /obj/item/weapon/reagent_containers/glass/paint/remover name = "paint remover bucket" - list_reagents = list("paint_remover" = 70) \ No newline at end of file + list_reagents = list("paint_remover" = 70) diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm index 307da253e64..116391803bd 100644 --- a/code/game/objects/items/weapons/pneumaticCannon.dm +++ b/code/game/objects/items/weapons/pneumaticCannon.dm @@ -1,7 +1,7 @@ /obj/item/weapon/pneumatic_cannon name = "pneumatic cannon" desc = "A gas-powered cannon that can fire any object loaded into it." - w_class = 4 + w_class = WEIGHT_CLASS_BULKY force = 8 //Very heavy attack_verb = list("bludgeoned", "smashed", "beaten") icon = 'icons/obj/pneumaticCannon.dmi' @@ -132,7 +132,7 @@ name = "improvised pneumatic cannon" desc = "A gas-powered, object-firing cannon made out of common parts." force = 5 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL maxWeightClass = 7 gasPerThrow = 5 diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm index de5d788a9f3..d291329f354 100644 --- a/code/game/objects/items/weapons/power_cells.dm +++ b/code/game/objects/items/weapons/power_cells.dm @@ -15,7 +15,6 @@ materials = list(MAT_METAL=700, MAT_GLASS=50) var/rigged = 0 // true if rigged to explode var/chargerate = 100 //how much power is given every tick in a recharger - var/minor_fault = 0 //If not 100% reliable, it will build up faults. var/self_recharge = 0 //does it self recharge, over time, or not? var/grown_battery = FALSE // If it's a grown that acts as a battery, add a wire overlay to it. @@ -102,7 +101,7 @@ /obj/item/weapon/stock_parts/cell/super name = "super-capacity power cell" - origin_tech = "powerstorage=5" + origin_tech = "powerstorage=3;materials=3" icon_state = "scell" maxcharge = 20000 materials = list(MAT_GLASS=300) @@ -115,7 +114,7 @@ /obj/item/weapon/stock_parts/cell/hyper name = "hyper-capacity power cell" - origin_tech = "powerstorage=6" + origin_tech = "powerstorage=4;engineering=4;materials=4" icon_state = "hpcell" maxcharge = 30000 materials = list(MAT_GLASS=400) @@ -128,7 +127,7 @@ /obj/item/weapon/stock_parts/cell/bluespace name = "bluespace power cell" - origin_tech = "powerstorage=7" + origin_tech = "powerstorage=5;bluespace=4;materials=4;engineering=4" icon_state = "bscell" maxcharge = 40000 materials = list(MAT_GLASS=600) @@ -142,7 +141,7 @@ /obj/item/weapon/stock_parts/cell/infinite name = "infinite-capacity power cell!" icon_state = "icell" - origin_tech = null + origin_tech = "powerstorage=7" maxcharge = 30000 materials = list(MAT_GLASS=1000) rating = 6 @@ -161,13 +160,12 @@ maxcharge = 300 materials = list() rating = 1 - minor_fault = 1 grown_battery = TRUE //it has the overlays for wires /obj/item/weapon/stock_parts/cell/high/slime name = "charged slime core" desc = "A yellow slime core infused with plasma, it crackles with power." - origin_tech = "powerstorage=2;biotech=4" + origin_tech = "powerstorage=5;biotech=4" icon = 'icons/mob/slimes.dmi' icon_state = "yellow slime extract" materials = list() diff --git a/code/game/objects/items/weapons/powerfist.dm b/code/game/objects/items/weapons/powerfist.dm index 9ee2c46728e..ec6f285acd1 100644 --- a/code/game/objects/items/weapons/powerfist.dm +++ b/code/game/objects/items/weapons/powerfist.dm @@ -8,7 +8,7 @@ force = 12 throwforce = 10 throw_range = 7 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL origin_tech = "combat=5;powerstorage=3;syndicate=3" var/click_delay = 1.5 var/fisto_setting = 1 @@ -26,17 +26,17 @@ to_chat(user, "You'll need to get closer to see any more.") return if(tank) - to_chat(user, "\icon [tank] It has \the [tank] mounted onto it.") + to_chat(user, "[bicon(tank)] It has [tank] mounted onto it.") /obj/item/weapon/melee/powerfist/attackby(obj/item/weapon/W, mob/user, params) if(istype(W, /obj/item/weapon/tank)) if(!tank) var/obj/item/weapon/tank/IT = W if(IT.volume <= 3) - to_chat(user, "\The [IT] is too small for \the [src].") + to_chat(user, "[IT] is too small for [src].") return updateTank(W, 0, user) - else if(istype(W, /obj/item/weapon/wrench)) + else if(iswrench(W)) switch(fisto_setting) if(1) fisto_setting = 2 @@ -45,8 +45,8 @@ if(3) fisto_setting = 1 playsound(loc, W.usesound, 50, 1) - to_chat(user, "You tweak \the [src]'s piston valve to [fisto_setting].") - else if(istype(W, /obj/item/weapon/screwdriver)) + to_chat(user, "You tweak [src]'s piston valve to [fisto_setting].") + else if(isscrewdriver(W)) if(tank) updateTank(tank, 1, user) @@ -54,29 +54,29 @@ /obj/item/weapon/melee/powerfist/proc/updateTank(obj/item/weapon/tank/thetank, removing = 0, mob/living/carbon/human/user) if(removing) if(!tank) - to_chat(user, "\The [src] currently has no tank attached to it.") + to_chat(user, "[src] currently has no tank attached to it.") return - to_chat(user, "You detach \the [thetank] from \the [src].") + to_chat(user, "You detach [thetank] from [src].") tank.forceMove(get_turf(user)) user.put_in_hands(tank) tank = null if(!removing) if(tank) - to_chat(user, "\The [src] already has a tank.") + to_chat(user, "[src] already has a tank.") return if(!user.unEquip(thetank)) return - to_chat(user, "You hook \the [thetank] up to \the [src].") + to_chat(user, "You hook [thetank] up to [src].") tank = thetank thetank.forceMove(src) /obj/item/weapon/melee/powerfist/attack(mob/living/target, mob/living/user) if(!tank) - to_chat(user, "\The [src] can't operate without a source of gas!") + to_chat(user, "[src] can't operate without a source of gas!") return if(tank && !tank.air_contents.remove(gasperfist * fisto_setting)) - to_chat(user, "\The [src]'s piston-ram lets out a weak hiss, it needs more gas!") + to_chat(user, "[src]'s piston-ram lets out a weak hiss, it needs more gas!") playsound(loc, 'sound/effects/refill.ogg', 50, 1) return @@ -90,8 +90,8 @@ playsound(loc, 'sound/weapons/genhit2.ogg', 50, 1) var/atom/throw_target = get_edge_target_turf(target, get_dir(src, get_step_away(target, src))) - spawn(0) - target.throw_at(throw_target, 5 * fisto_setting, 0.2) + + target.throw_at(throw_target, 5 * fisto_setting, 0.2) add_logs(user, target, "power fisted", src) diff --git a/code/game/objects/items/weapons/rpd.dm b/code/game/objects/items/weapons/rpd.dm new file mode 100644 index 00000000000..de5cb54f722 --- /dev/null +++ b/code/game/objects/items/weapons/rpd.dm @@ -0,0 +1,262 @@ +/*Contains: + Rapid Pipe Dispenser +*/ + +#define SIMPLE_CAP 20 +#define SUPPLY_CAP 32 +#define SCRUBBERS_CAP 33 +#define HE_EXCHANGER 17 +#define CONNECTOR 4 +#define UNARY_VENT 7 +#define PASSIVE_VENT 37 +#define GAS_SCRUBBER 10 +#define INJECTOR 34 +#define GAS_SENSOR 98 +#define METER 99 +#define DISPOSALS_JUNCTION 2 +#define ATMOS_MODE 1 +#define DISPOSALS_MODE 2 +#define ROTATION_MODE 3 +#define FLIP_MODE 4 +#define DELETE_MODE 5 +#define ATMOS_PIPING 1 +#define SUPPLY_PIPING 2 +#define SCRUBBERS_PIPING 3 +#define DEVICES 4 +#define HEAT_PIPING 5 + +/obj/item/weapon/rpd + name = "rapid pipe dispenser" + desc = "This device can rapidly dispense atmospherics and disposals piping, manipulate loose piping, and recycle any detached pipes it is applied to." + icon = 'icons/obj/tools.dmi' + icon_state = "rpd" + opacity = 0 + density = 0 + anchored = 0 + flags = CONDUCT + force = 10 + throwforce = 10 + throw_speed = 3 + throw_range = 5 + w_class = WEIGHT_CLASS_NORMAL + materials = list(MAT_METAL = 30000, MAT_GLASS = 5000) + origin_tech = "engineering=4;materials=2" + var/datum/effect/system/spark_spread/spark_system + var/lastused + var/iconrotation = 0 //used to orient icons and pipes + var/mode = 1 //Disposals, atmospherics, etc. + var/pipetype = 1//For nanoUI menus + var/whatpipe = 0 //What kind of pipe is it? See code/game/machinery/pipe/construction.dm for a list of defines + var/whatdpipe = 0 //What kind of disposals pipe is it? See code/game/machinery/pipe/dispenser.dm for a list of defines + var/spawndelay = 4 //How long should we have to wait between dispensing pipes? + var/walldelay = 40 //How long should drilling into a wall take? + +/obj/item/weapon/rpd/New() + ..() + spark_system = new /datum/effect/system/spark_spread() + spark_system.set_up(1, 0, src) + spark_system.attach(src) + +//Procs + +/obj/item/weapon/rpd/proc/Activaterpd(delay) + playsound(loc, "sound/machines/click.ogg", 50, 1) + if(prob(15)) + spark_system.start() + if(delay) + lastused = world.time + +/obj/item/weapon/rpd/proc/Manipulatepipes(subject, atmosverb, disposalsverb) + if(istype(subject, /obj/item/pipe)) + call(subject, atmosverb)() + else if(istype(subject, /obj/structure/disposalconstruct/)) + call(subject, disposalsverb)() + +//Lists of things + +var/list/pipelist = list( //id refers to the pipe_type found in construction.dm, icon refers to the name of the icon state in icons/obj/pipe-item.dmi. Icons are made with the asset-cache + list("pipename" = "Straight pipe", "id" = 0, "category" = ATMOS_PIPING, "orientations" = 2, "icon" = "simple"), + list("pipename" = "Bent pipe", "id" = 1, "category" = ATMOS_PIPING, "orientations" = 4, "icon" = "simple", "bendy" = 1), + list("pipename" = "T-manifold", "id" = 5, "category" = ATMOS_PIPING, "orientations" = 4, "icon" = "manifold"), + list("pipename" = "4-way manifold", "id" = 19, "category" = ATMOS_PIPING, "orientations" = 1, "icon" = "manifold4w"), + list("pipename" = "Pipe cap", "id" = 20, "category" = ATMOS_PIPING, "orientations" = 4, "icon" = "cap"), + list("pipename" = "Manual valve", "id" = 8, "category" = ATMOS_PIPING, "orientations" = 2, "icon" = "mvalve"), + list("pipename" = "Digital valve", "id" = 35, "category" = ATMOS_PIPING, "orientations" = 2, "icon" = "dvalve"), + list("pipename" = "Manual T-valve", "id" = 18, "category" = ATMOS_PIPING, "orientations" = 4, "icon" = "tvalve"), + list("pipename" = "Digital T-valve", "id" = 38, "category" = ATMOS_PIPING, "orientations" = 4, "icon" = "dtvalve"), + list("pipename" = "Straight supply pipe", "id" = 24, "category" = SUPPLY_PIPING, "orientations" = 2, "icon" = "simple"), + list("pipename" = "Bent supply pipe", "id" = 25, "category" = SUPPLY_PIPING, "orientations" = 4, "icon" = "simple", "bendy" = 1), + list("pipename" = "Supply T-manifold", "id" = 28, "category" = SUPPLY_PIPING, "orientations" = 4, "icon" = "manifold"), + list("pipename" = "4-way supply manifold", "id" = 30, "category" = SUPPLY_PIPING, "orientations" = 1, "icon" = "manifold4w"), + list("pipename" = "Supply pipe cap", "id" = 32, "category" = SUPPLY_PIPING, "orientations" = 4, "icon" = "cap"), + list("pipename" = "Straight scrubbers pipe", "id" = 26, "category" = SCRUBBERS_PIPING, "orientations" = 2, "icon" = "simple"), + list("pipename" = "Bent scrubbers pipe", "id" = 27, "category" = SCRUBBERS_PIPING, "orientations" = 4, "icon" = "simple", "bendy" = 1), + list("pipename" = "Scrubbers T-manifold", "id" = 29, "category" = SCRUBBERS_PIPING, "orientations" = 4, "icon" = "manifold"), + list("pipename" = "4-way scrubbers manifold", "id" = 31, "category" = SCRUBBERS_PIPING, "orientations" = 1, "icon" = "manifold4w"), + list("pipename" = "Scrubbers pipe cap", "id" = 33, "category" = SCRUBBERS_PIPING, "orientations" = 4, "icon" = "cap"), + list("pipename" = "Universal pipe adapter", "id" = 23, "category" = DEVICES, "orientations" = 2, "icon" = "universal"), + list("pipename" = "Connector", "id" = 4, "category" = DEVICES, "orientations" = 4, "icon" = "connector"), + list("pipename" = "Unary vent", "id" = 7, "category" = DEVICES, "orientations" = 4, "icon" = "uvent"), + list("pipename" = "Scrubber", "id" = 10, "category" = DEVICES, "orientations" = 4, "icon" = "scrubber"), + list("pipename" = "Gas pump", "id" = 9, "category" = DEVICES, "orientations" = 4, "icon" = "pump"), + list("pipename" = "Volume pump", "id" = 16, "category" = DEVICES, "orientations" = 4, "icon" = "volumepump"), + list("pipename" = "Passive gate", "id" = 15, "category" = DEVICES, "orientations" = 4, "icon" = "passivegate"), + list("pipename" = "Gas filter", "id" = 13, "category" = DEVICES, "orientations" = 4, "icon" = "filter"), + list("pipename" = "Gas mixer", "id" = 14, "category" = DEVICES, "orientations" = 4, "icon" = "mixer"), + list("pipename" = "Gas sensor", "id" = 98, "category" = DEVICES, "orientations" = 1, "icon" = "sensor"), + list("pipename" = "Meter", "id" = 99, "category" = DEVICES, "orientations" = 1, "icon" = "meter"), + list("pipename" = "Passive vent", "id" = 37, "category" = DEVICES, "orientations" = 4, "icon" = "passive vent"), + list("pipename" = "Dual-port vent pump", "id" = 36, "category" = DEVICES, "orientations" = 2, "icon" = "dual-port vent"), + list("pipename" = "Air injector", "id" = 34, "category" = DEVICES, "orientations" = 4, "icon" = "injector"), + list("pipename" = "Straight HE pipe", "id" = 2, "category" = HEAT_PIPING, "orientations" = 2, "icon" = "he"), + list("pipename" = "Bent HE pipe", "id" = 3, "category" = HEAT_PIPING, "orientations" = 4, "icon" = "he", "bendy" = 1), + list("pipename" = "Junction", "id" = 6, "category" = HEAT_PIPING, "orientations" = 4, "icon" = "junction"), + list("pipename" = "Heat exchanger", "id" = 17, "category" = HEAT_PIPING, "orientations" = 4, "icon" = "heunary")) +var/list/dpipelist = list( + list("pipename" = "Straight pipe", "id" = 0, "orientations" = 2, "icon" = "conpipe-s"), + list("pipename" = "Bent pipe", "id" = 1, "orientations" = 4, "icon" = "conpipe-c"), + list("pipename" = "Junction", "id" = 2, "orientations" = 4, "icon" = "conpipe-j1"), + list("pipename" = "Y-junction", "id" = 4, "orientations" = 4, "icon" = "conpipe-y"), + list("pipename" = "Trunk", "id" = 5, "orientations" = 4, "icon" = "conpipe-t"), + list("pipename" = "Bin", "id" = 6, "orientations" = 1, "icon" = "condisposal"), + list("pipename" = "Outlet", "id" = 7, "orientations" = 4, "icon" = "outlet"), + list("pipename" = "Chute", "id" = 8, "orientations" = 4, "icon" = "intake")) +var/list/mainmenu = list( + list("category" = "Atmospherics", "mode" = 1, "icon" = "wrench"), + list("category" = "Disposals", "mode" = 2, "icon" = "recycle"), + list("category" = "Rotate", "mode" = 3, "icon" = "rotate-right"), + list("category" = "Flip", "mode" = 4, "icon" = "exchange"), + list("category" = "Recycle", "mode" = 5, "icon" = "trash")) +var/list/pipemenu = list( + list("pipecategory" = "Normal", "pipemode" = 1), + list("pipecategory" = "Supply", "pipemode" = 2), + list("pipecategory" = "Scrubber", "pipemode" = 3), + list("pipecategory" = "Devices", "pipemode" = 4), + list("pipecategory" = "Heat exchange", "pipemode" = 5)) + +//NanoUI stuff + +/obj/item/weapon/rpd/attack_self(mob/user) + ui_interact(user) + +/obj/item/weapon/rpd/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = inventory_state) + ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "rpd.tmpl", "[name]", 400, 650, state = state) + ui.open() + ui.set_auto_update(1) + +/obj/item/weapon/rpd/ui_data(mob/user, ui_key = "main", datum/topic_state/state = inventory_state) + var/data[0] + data["dpipelist"] = dpipelist + data["iconrotation"] = iconrotation + data["mainmenu"] = mainmenu + data["mode"] = mode + data["pipelist"] = pipelist + data["pipemenu"] = pipemenu + data["pipetype"] = pipetype + data["whatdpipe"] = whatdpipe + data["whatpipe"] = whatpipe + return data + +/obj/item/weapon/rpd/Topic(href, href_list, nowindow, state) + ..() + if(href_list["iconrotation"]) + iconrotation = text2num(sanitize(href_list["iconrotation"])) + else if(href_list["whatpipe"]) + whatpipe = text2num(sanitize(href_list["whatpipe"])) + else if(href_list["whatdpipe"]) + whatdpipe = text2num(sanitize(href_list["whatdpipe"])) + else if(href_list["pipetype"]) + pipetype = text2num(sanitize(href_list["pipetype"])) + else if(href_list["mode"]) + mode = text2num(sanitize(href_list["mode"])) + else + return + nanomanager.update_uis(src) + +//What the RPD actually does + +/obj/item/weapon/rpd/afterattack(atom/target, mob/user, proximity) + ..() + var/turf/T = get_turf(target) + if(src.loc != user || ismob(target) || istype(target, /obj/structure/window) || !proximity || world.time < lastused + spawndelay) + return + if(mode == ATMOS_MODE && !istype(T, /turf/simulated/shuttle)) //No pipes on shuttles nerds + if(istype(T, /turf/simulated/wall)) //Drilling into walls takes time + playsound(loc, "sound/weapons/circsawhit.ogg", 50, 1) + user.visible_message("[user] starts drilling a hole in [T]...", "You start drilling a hole in [T]...", "You hear a drill.") + if(!do_after(user, walldelay, target = T)) + return + user.visible_message("[user] finishes drilling a hole in [T]!", "You finish drilling a hole in [T]!", "You hear clanking.") + var/obj/item/pipe/P + if(whatpipe == GAS_SENSOR) + P = new /obj/item/pipe_gsensor(T) + else if(whatpipe == METER) + P = new /obj/item/pipe_meter(T) + else + P = new(T, pipe_type = whatpipe, dir = user.dir) + if(iconrotation == 0 && P.is_bent_pipe()) //Automatic rotation of dispensed pipes + P.dir = turn(user.dir, 135) + else if(iconrotation == 0 && P.pipe_type in list(CONNECTOR, UNARY_VENT, GAS_SCRUBBER, HE_EXCHANGER, SIMPLE_CAP, SUPPLY_CAP, SCRUBBERS_CAP, INJECTOR, PASSIVE_VENT)) //Some pipes dispense oppositely to what you'd expect, but we don't want to do anything if they selected a direction + P.flip() + else if(iconrotation != 0 && P.is_bent_pipe()) //If they selected a rotation and the pipe is bent + P.dir = turn(iconrotation, -45) + else if(iconrotation != 0) + P.dir = iconrotation + to_chat(user, "[src] rapidly dispenses [P]!") + Activaterpd(1) + else if(mode == DISPOSALS_MODE && !istype(T, /turf/simulated/shuttle)) + if(istype(T, /turf/simulated/wall)) //No disposals pipes on walls + to_chat(user, "That type of pipe won't fit on [T]!") + return + var/obj/structure/disposalconstruct/P = new(T) //Now we make the pipe + P.dir = iconrotation + P.ptype = whatdpipe + if(iconrotation == 0) //Automatic rotation + P.dir = user.dir + if(iconrotation == 0 && whatdpipe != DISPOSALS_JUNCTION) //Disposals pipes are in the opposite direction to atmos pipes, so we need to flip them. Junctions don't have this quirk though + P.flip() + P.update() + to_chat(user, "[src] rapidly dispenses [P]!") + Activaterpd(1) + else if(mode == ROTATION_MODE) + for(var/obj/W in T) + Manipulatepipes(W, /obj/item/pipe/verb/rotate, /obj/structure/disposalconstruct/verb/rotate) + else if(mode == FLIP_MODE) + for(var/obj/W in T) + Manipulatepipes(W, /obj/item/pipe/verb/flip, /obj/structure/disposalconstruct/verb/flip) + else if(mode == DELETE_MODE) + var/eaten + for(var/obj/W in T) + if(istype(W, /obj/item/pipe) || istype(W, /obj/item/pipe_meter) || istype(W, /obj/item/pipe_gsensor) || istype(W, /obj/structure/disposalconstruct) && !W.anchored) + QDEL_NULL(W) + eaten = TRUE + if(eaten) + to_chat(user, "[src] sucks up the loose pipes on [T].") + Activaterpd() + else + to_chat(user, "There were no loose pipes on [T].") + +#undef SIMPLE_CAP +#undef SUPPLY_CAP +#undef SCRUBBERS_CAP +#undef HE_EXCHANGER +#undef CONNECTOR +#undef UNARY_VENT +#undef PASSIVE_VENT +#undef GAS_SCRUBBER +#undef INJECTOR +#undef GAS_SENSOR +#undef METER +#undef DISPOSALS_JUNCTION +#undef ATMOS_MODE +#undef DISPOSALS_MODE +#undef ROTATION_MODE +#undef FLIP_MODE +#undef DELETE_MODE +#undef ATMOS_PIPING +#undef SUPPLY_PIPING +#undef SCRUBBERS_PIPING +#undef DEVICES +#undef HEAT_PIPING diff --git a/code/game/objects/items/weapons/scissors.dm b/code/game/objects/items/weapons/scissors.dm index 6cfb677bd21..e519b96d0fd 100644 --- a/code/game/objects/items/weapons/scissors.dm +++ b/code/game/objects/items/weapons/scissors.dm @@ -5,8 +5,7 @@ item_state = "scissor" force = 5 sharp = 1 - edge = 1 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("slices", "cuts", "stabs", "jabs") toolspeed = 1 @@ -20,7 +19,7 @@ toolspeed = 0.75 /obj/item/weapon/scissors/attack(mob/living/carbon/M as mob, mob/user as mob) - if(user.a_intent != "help") + if(user.a_intent != INTENT_HELP) ..() return if(!(M in view(1))) //Adjacency test @@ -95,13 +94,12 @@ user.visible_message("[user] finishes cutting [M]'s hair!") /obj/item/weapon/scissors/safety //Totally safe, I assure you. - name = "safety scissors" desc = "The blades of the scissors appear to be made of some sort of ultra-strong metal alloy." force = 18 //same as e-daggers var/is_cutting = 0 //to prevent spam clicking this for huge accumulation of losebreath. /obj/item/weapon/scissors/safety/attack(mob/living/carbon/M as mob, mob/user as mob) - if(user.a_intent != "help") + if(user.a_intent != INTENT_HELP) ..() return if(!(M in view(1))) @@ -118,10 +116,9 @@ playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1) user.visible_message("[user] abruptly stops cutting [M]'s hair and slices their throat!", "You stop cutting [M]'s hair and slice their throat!") //Just a little off the top. H.AdjustLoseBreath(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)) - location.add_blood(H) + H.apply_damage(18, BRUTE, "head", sharp =1, used_weapon = "scissors") + var/turf/location = get_turf(src) + H.add_splatter_floor(location) H.bloody_hands(H) H.bloody_body(H) var/mob/living/carbon/human/U = user diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm index 0b45cd4a42e..4ad7f70e016 100644 --- a/code/game/objects/items/weapons/scrolls.dm +++ b/code/game/objects/items/weapons/scrolls.dm @@ -4,17 +4,17 @@ icon = 'icons/obj/wizard.dmi' icon_state = "scroll" var/uses = 4.0 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL item_state = "paper" throw_speed = 4 throw_range = 20 - origin_tech = "bluespace=4" + origin_tech = "bluespace=6" burn_state = FLAMMABLE /obj/item/weapon/teleportation_scroll/apprentice name = "lesser scroll of teleportation" uses = 1 - origin_tech = "bluespace 2" + origin_tech = "bluespace=5" /obj/item/weapon/teleportation_scroll/attack_self(mob/user as mob) user.set_machine(src) @@ -96,4 +96,4 @@ user.loc = pick(L) smoke.start() - src.uses -= 1 \ No newline at end of file + src.uses -= 1 diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm index 70073b38123..be2336d6a37 100644 --- a/code/game/objects/items/weapons/shards.dm +++ b/code/game/objects/items/weapons/shards.dm @@ -5,9 +5,8 @@ icon = 'icons/obj/shards.dmi' icon_state = "large" sharp = 1 - edge = 1 desc = "Could probably be used as ... a throwing weapon?" - w_class = 1 + w_class = WEIGHT_CLASS_TINY force = 5.0 throwforce = 10.0 item_state = "shard-glass" @@ -88,28 +87,4 @@ if(affecting.take_damage(5, 0)) H.UpdateDamageIcon() H.updatehealth() - ..() - -// Shrapnel - -/obj/item/weapon/shard/shrapnel - name = "shrapnel" - icon = 'icons/obj/shards.dmi' - icon_state = "shrapnellarge" - desc = "A bunch of tiny bits of shattered metal." - -/obj/item/weapon/shard/shrapnel/New() - - src.icon_state = pick("shrapnellarge", "shrapnelmedium", "shrapnelsmall") - switch(src.icon_state) - if("shrapnelsmall") - src.pixel_x = rand(-12, 12) - src.pixel_y = rand(-12, 12) - if("shrapnelmedium") - src.pixel_x = rand(-8, 8) - src.pixel_y = rand(-8, 8) - if("shrapnellarge") - src.pixel_x = rand(-5, 5) - src.pixel_y = rand(-5, 5) - else - return \ No newline at end of file + ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index 479cb278e91..6d4b1238d39 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -19,9 +19,9 @@ throwforce = 5 throw_speed = 2 throw_range = 3 - w_class = 4 + w_class = WEIGHT_CLASS_BULKY materials = list(MAT_GLASS=7500, MAT_METAL=1000) - origin_tech = "materials=2" + origin_tech = "materials=3;combat=4" attack_verb = list("shoved", "bashed") var/cooldown = 0 //shield bash cooldown. based on world.time @@ -46,6 +46,7 @@ icon_state = "buckler" item_state = "buckler" materials = list() + origin_tech = "materials=1;combat=3;biotech=2" burn_state = FLAMMABLE block_chance = 30 @@ -58,8 +59,8 @@ throwforce = 3 throw_speed = 3 throw_range = 5 - w_class = 1 - origin_tech = "materials=4;magnets=3;syndicate=4" + w_class = WEIGHT_CLASS_TINY + origin_tech = "materials=4;magnets=5;syndicate=6" attack_verb = list("shoved", "bashed") var/active = 0 @@ -80,14 +81,14 @@ force = 10 throwforce = 8 throw_speed = 2 - w_class = 4 + w_class = WEIGHT_CLASS_BULKY playsound(user, 'sound/weapons/saberon.ogg', 35, 1) to_chat(user, "[src] is now active.") else force = 3 throwforce = 3 throw_speed = 3 - w_class = 1 + w_class = WEIGHT_CLASS_TINY playsound(user, 'sound/weapons/saberoff.ogg', 35, 1) to_chat(user, "[src] can now be concealed.") if(istype(user,/mob/living/carbon/human)) @@ -102,12 +103,13 @@ desc = "An advanced riot shield made of lightweight materials that collapses for easy storage." icon = 'icons/obj/weapons.dmi' icon_state = "teleriot0" + origin_tech = "materials=3;combat=4;engineering=4" slot_flags = null force = 3 throwforce = 3 throw_speed = 3 throw_range = 4 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL var/active = 0 /obj/item/weapon/shield/riot/tele/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance) @@ -124,14 +126,14 @@ force = 8 throwforce = 5 throw_speed = 2 - w_class = 4 + w_class = WEIGHT_CLASS_BULKY slot_flags = SLOT_BACK to_chat(user, "You extend \the [src].") else force = 3 throwforce = 3 throw_speed = 3 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL slot_flags = null to_chat(user, "[src] can now be concealed.") if(istype(user,/mob/living/carbon/human)) diff --git a/code/game/objects/items/weapons/signs.dm b/code/game/objects/items/weapons/signs.dm index fa68b09135e..006ad92dcf5 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 + w_class = WEIGHT_CLASS_BULKY attack_verb = list("bashed","smacked") burn_state = FLAMMABLE @@ -42,4 +42,4 @@ reqs = list(/obj/item/stack/rods = 1, /obj/item/stack/sheet/cardboard = 2) time = 80 - category = CAT_MISC \ No newline at end of file + category = CAT_MISC diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm index f21c0581888..85dfe4868d0 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 + w_class = WEIGHT_CLASS_TINY throwforce = 0 throw_speed = 4 throw_range = 20 @@ -38,7 +38,7 @@ 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... + carried_item.add_mob_blood(target)//Oh yes, there will be blood... var/mob/living/carbon/human/H = target H.bloody_hands(target,0) H.bloody_body(target) @@ -53,4 +53,4 @@ /obj/item/weapon/soap/syndie desc = "An untrustworthy bar of soap made of strong chemical agents that dissolve blood faster." icon_state = "soapsyndie" - cleanspeed = 10 //much faster than mop so it is useful for traitors who want to clean crime scenes \ No newline at end of file + cleanspeed = 10 //much faster than mop so it is useful for traitors who want to clean crime scenes diff --git a/code/game/objects/items/weapons/staff.dm b/code/game/objects/items/weapons/staff.dm index 19c771873ce..b9d1896f70c 100644 --- a/code/game/objects/items/weapons/staff.dm +++ b/code/game/objects/items/weapons/staff.dm @@ -7,7 +7,7 @@ throwforce = 5.0 throw_speed = 1 throw_range = 5 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL armour_penetration = 100 attack_verb = list("bludgeoned", "whacked", "disciplined") burn_state = FLAMMABLE @@ -73,4 +73,4 @@ throwforce = 5.0 throw_speed = 1 throw_range = 5 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL diff --git a/code/game/objects/items/weapons/stock_parts.dm b/code/game/objects/items/weapons/stock_parts.dm index 74fc3a5be6c..29d4d310b5d 100644 --- a/code/game/objects/items/weapons/stock_parts.dm +++ b/code/game/objects/items/weapons/stock_parts.dm @@ -5,7 +5,7 @@ desc = "Special mechanical module made to store, sort, and apply standard machine parts." icon_state = "RPED" item_state = "RPED" - w_class = 5 + w_class = WEIGHT_CLASS_HUGE can_hold = list(/obj/item/weapon/stock_parts) storage_slots = 50 use_to_pickup = 1 @@ -13,7 +13,7 @@ allow_quick_empty = 1 collection_mode = 1 display_contents_with_number = 1 - max_w_class = 3 + max_w_class = WEIGHT_CLASS_NORMAL max_combined_w_class = 100 var/works_from_distance = 0 var/primary_sound = 'sound/items/rped.ogg' @@ -24,21 +24,20 @@ /obj/item/weapon/storage/part_replacer/afterattack(obj/machinery/T as obj, mob/living/carbon/human/user as mob, flag, params) if(flag) return - else - if(works_from_distance) - if(istype(T)) - if(T.component_parts) - T.exchange_parts(user, src) - user.Beam(T,icon_state="rped_upgrade",icon='icons/effects/effects.dmi',time=5) + else if(works_from_distance) + if(istype(T)) + if(T.component_parts) + T.exchange_parts(user, src) + user.Beam(T,icon_state="rped_upgrade",icon='icons/effects/effects.dmi',time=5) return /obj/item/weapon/storage/part_replacer/bluespace name = "bluespace rapid part exchange device" desc = "A version of the RPED that allows for replacement of parts and scanning from a distance, along with higher capacity for parts." icon_state = "BS_RPED" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL storage_slots = 400 - max_w_class = 3 + max_w_class = WEIGHT_CLASS_NORMAL max_combined_w_class = 800 works_from_distance = 1 primary_sound = 'sound/items/PSHOOM.ogg' @@ -63,11 +62,11 @@ desc = "What?" gender = PLURAL icon = 'icons/obj/stock_parts.dmi' - w_class = 2 + w_class = WEIGHT_CLASS_SMALL var/rating = 1 toolspeed = 1 usesound = 'sound/items/Deconstruct.ogg' - + /obj/item/weapon/stock_parts/New() src.pixel_x = rand(-5.0, 5) src.pixel_y = rand(-5.0, 5) @@ -164,7 +163,7 @@ name = "super capacitor" desc = "A super-high capacity capacitor used in the construction of a variety of devices." icon_state = "super_capacitor" - origin_tech = "powerstorage=5;materials=4" + origin_tech = "powerstorage=4;engineering=4" rating = 3 materials = list(MAT_METAL=50, MAT_GLASS=50) @@ -172,7 +171,7 @@ name = "phasic scanning module" desc = "A compact, high resolution phasic scanning module used in the construction of certain devices." icon_state = "super_scan_module" - origin_tech = "magnets=5" + origin_tech = "magnets=4;engineering=4" rating = 3 materials = list(MAT_METAL=50, MAT_GLASS=20) @@ -180,7 +179,7 @@ name = "pico-manipulator" desc = "A tiny little manipulator used in the construction of certain devices." icon_state = "pico_mani" - origin_tech = "materials=5;programming=2" + origin_tech = "materials=4;programming=4;engineering=4" rating = 3 materials = list(MAT_METAL=30) @@ -188,7 +187,7 @@ name = "ultra-high-power micro-laser" icon_state = "ultra_high_micro_laser" desc = "A tiny laser used in certain devices." - origin_tech = "magnets=5" + origin_tech = "magnets=4;engineering=4" rating = 3 materials = list(MAT_METAL=10, MAT_GLASS=20) @@ -196,7 +195,7 @@ name = "super matter bin" desc = "A container for hold compressed matter awaiting re-construction." icon_state = "super_matter_bin" - origin_tech = "materials=5" + origin_tech = "materials=4;engineering=4" rating = 3 materials = list(MAT_METAL=80) @@ -206,7 +205,7 @@ name = "quadratic capacitor" desc = "An capacity capacitor used in the construction of a variety of devices." icon_state = "quadratic_capacitor" - origin_tech = "powerstorage=6;materials=5" + origin_tech = "powerstorage=5;materials=4;engineering=4" rating = 4 materials = list(MAT_METAL=50, MAT_GLASS=50) @@ -214,7 +213,7 @@ name = "triphasic scanning module" desc = "A compact, ultra resolution triphasic scanning module used in the construction of certain devices." icon_state = "triphasic_scan_module" - origin_tech = "magnets=6" + origin_tech = "magnets=5;materials=4;engineering=4" rating = 4 materials = list(MAT_METAL=50, MAT_GLASS=20) @@ -222,7 +221,7 @@ name = "femto-manipulator" desc = "A tiny little manipulator used in the construction of certain devices." icon_state = "femto_mani" - origin_tech = "materials=6;programming=3" + origin_tech = "materials=6;programming=4;engineering=4" rating = 4 materials = list(MAT_METAL=30) @@ -230,7 +229,7 @@ name = "quad-ultra micro-laser" icon_state = "quadultra_micro_laser" desc = "A tiny laser used in certain devices." - origin_tech = "magnets=6" + origin_tech = "magnets=5;materials=4;engineering=4" rating = 4 materials = list(MAT_METAL=10, MAT_GLASS=20) @@ -238,7 +237,7 @@ name = "bluespace matter bin" desc = "A container for hold compressed matter awaiting re-construction." icon_state = "bluespace_matter_bin" - origin_tech = "materials=6" + origin_tech = "materials=6;programming=4;engineering=4" rating = 4 materials = list(MAT_METAL=80) @@ -248,49 +247,49 @@ name = "subspace ansible" icon_state = "subspace_ansible" desc = "A compact module capable of sensing extradimensional activity." - origin_tech = "programming=2;magnets=3;materials=2;bluespace=1" + origin_tech = "programming=2;magnets=2;materials=2;bluespace=1" materials = list(MAT_METAL=30, MAT_GLASS=10) /obj/item/weapon/stock_parts/subspace/filter name = "hyperwave filter" icon_state = "hyperwave_filter" desc = "A tiny device capable of filtering and converting super-intense radiowaves." - origin_tech = "programming=2;magnets=1" + origin_tech = "programming=2;magnets=2" materials = list(MAT_METAL=30, MAT_GLASS=10) /obj/item/weapon/stock_parts/subspace/amplifier name = "subspace amplifier" icon_state = "subspace_amplifier" desc = "A compact micro-machine capable of amplifying weak subspace transmissions." - origin_tech = "programming=2;magnets=2;materials=1;bluespace=1" + origin_tech = "programming=2;magnets=2;materials=2;bluespace=2" materials = list(MAT_METAL=30, MAT_GLASS=10) /obj/item/weapon/stock_parts/subspace/treatment name = "subspace treatment disk" icon_state = "treatment_disk" desc = "A compact micro-machine capable of stretching out hyper-compressed radio waves." - origin_tech = "programming=2;magnets=1;materials=3;bluespace=1" + origin_tech = "programming=2;magnets=2;materials=2;bluespace=2" materials = list(MAT_METAL=30, MAT_GLASS=10) /obj/item/weapon/stock_parts/subspace/analyzer name = "subspace wavelength analyzer" icon_state = "wavelength_analyzer" desc = "A sophisticated analyzer capable of analyzing cryptic subspace wavelengths." - origin_tech = "programming=2;magnets=2;materials=2;bluespace=1" + origin_tech = "programming=2;magnets=2;materials=2;bluespace=2" materials = list(MAT_METAL=30, MAT_GLASS=10) /obj/item/weapon/stock_parts/subspace/crystal name = "ansible crystal" icon_state = "ansible_crystal" desc = "A crystal made from pure glass used to transmit laser databursts to subspace." - origin_tech = "magnets=2;materials=2;bluespace=1" + origin_tech = "magnets=2;materials=2;bluespace=2;plasmatech=2" materials = list(MAT_GLASS=50) /obj/item/weapon/stock_parts/subspace/transmitter name = "subspace transmitter" icon_state = "subspace_transmitter" desc = "A large piece of equipment used to open a window into the subspace dimension." - origin_tech = "magnets=3;materials=3;bluespace=2" + origin_tech = "magnets=2;materials=2;bluespace=2" materials = list(MAT_METAL=50) /obj/item/weapon/research//Makes testing much less of a pain -Sieve @@ -298,4 +297,4 @@ icon = 'icons/obj/stock_parts.dmi' icon_state = "capacitor" desc = "A debug item for research." - origin_tech = "materials=8;programming=8;magnets=8;powerstorage=8;bluespace=8;combat=8;biotech=8;syndicate=8" + origin_tech = "materials=8;programming=8;magnets=8;powerstorage=8;bluespace=8;combat=8;biotech=8;syndicate=8;engineering=8;plasmatech=8;abductor=8" diff --git a/code/game/objects/items/weapons/storage/artistic_toolbox.dm b/code/game/objects/items/weapons/storage/artistic_toolbox.dm index 470c273bd69..1b6cbd5a027 100644 --- a/code/game/objects/items/weapons/storage/artistic_toolbox.dm +++ b/code/game/objects/items/weapons/storage/artistic_toolbox.dm @@ -12,6 +12,7 @@ desc = "His Grace." force = 5 throwforce = 10 + origin_tech = "combat=4;engineering=4;syndicate=2" var/list/servantlinks = list() var/hunger = 0 var/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 d0dee297cd7..99e24b393a5 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -10,9 +10,9 @@ item_state = "backpack" lefthand_file = 'icons/mob/inhands/clothing_lefthand.dmi' righthand_file = 'icons/mob/inhands/clothing_righthand.dmi' - w_class = 4 + w_class = WEIGHT_CLASS_BULKY slot_flags = SLOT_BACK //ERROOOOO - max_w_class = 3 + max_w_class = WEIGHT_CLASS_NORMAL max_combined_w_class = 21 storage_slots = 21 burn_state = FLAMMABLE @@ -33,63 +33,47 @@ /obj/item/weapon/storage/backpack/holding name = "Bag of Holding" desc = "A backpack that opens into a localized pocket of Blue Space." - origin_tech = "bluespace=4" + origin_tech = "bluespace=5;materials=4;engineering=4;plasmatech=5" icon_state = "holdingpack" - max_w_class = 5 + max_w_class = WEIGHT_CLASS_HUGE max_combined_w_class = 35 burn_state = FIRE_PROOF - New() - ..() - return +/obj/item/weapon/storage/backpack/holding/New() + ..() + return - attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if(crit_fail) - to_chat(user, "The Bluespace generator isn't working.") - return - else if(istype(W, /obj/item/weapon/storage/backpack/holding) && !W.crit_fail) - var/response = alert(user, "Are you sure you want to put the bag of holding inside another bag of holding?","Are you sure you want to die?","Yes","No") - if(response == "Yes") - user.visible_message("[user] grins as \he begins to put a Bag of Holding into a Bag of Holding!", "You begin to put the Bag of Holding into the Bag of Holding!") - if(do_after(user, 30, target=src)) - investigate_log("has become a singularity. Caused by [user.key]","singulo") - user.visible_message("[user] erupts in evil laughter as \he puts the Bag of Holding into another Bag of Holding!", "You can't help but laugh wildly as you put the Bag of Holding into another Bag of Holding, complete darkness surrounding you."," You hear the sound of scientific evil brewing! ") - qdel(W) - var/obj/singularity/singulo = new /obj/singularity(get_turf(user)) - singulo.energy = 300 //To give it a small boost - message_admins("[key_name_admin(user)] detonated a bag of holding JMP)") - log_game("[key_name(user)] detonated a bag of holding") - qdel(src) - else - user.visible_message("After careful consideration, [user] has decided that putting a Bag of Holding inside another Bag of Holding would not yield the ideal outcome.","You come to the realization that this might not be the greatest idea.") - else - . = ..() - - proc/failcheck(mob/user as mob) - if(prob(src.reliability)) return 1 //No failure - if(prob(src.reliability)) - to_chat(user, "The Bluespace portal resists your attempt to add another item.")//light failure - - else - to_chat(user, "The Bluespace generator malfunctions!") - for(var/obj/O in src.contents) //it broke, delete what was in it - qdel(O) - crit_fail = 1 - icon_state = "brokenpack" - - singularity_act(current_size) - var/dist = max((current_size - 2),1) - explosion(src.loc,(dist),(dist*2),(dist*4)) - return +/obj/item/weapon/storage/backpack/holding/attackby(obj/item/weapon/W, mob/user, params) + if(istype(W, /obj/item/weapon/storage/backpack/holding)) + var/response = alert(user, "Are you sure you want to put the bag of holding inside another bag of holding?","Are you sure you want to die?","Yes","No") + if(response == "Yes") + user.visible_message("[user] grins as \he begins to put a Bag of Holding into a Bag of Holding!", "You begin to put the Bag of Holding into the Bag of Holding!") + if(do_after(user, 30, target=src)) + investigate_log("has become a singularity. Caused by [user.key]","singulo") + user.visible_message("[user] erupts in evil laughter as \he puts the Bag of Holding into another Bag of Holding!", "You can't help but laugh wildly as you put the Bag of Holding into another Bag of Holding, complete darkness surrounding you."," You hear the sound of scientific evil brewing! ") + qdel(W) + var/obj/singularity/singulo = new /obj/singularity(get_turf(user)) + singulo.energy = 300 //To give it a small boost + message_admins("[key_name_admin(user)] detonated a bag of holding JMP)") + log_game("[key_name(user)] detonated a bag of holding") + qdel(src) + else + user.visible_message("After careful consideration, [user] has decided that putting a Bag of Holding inside another Bag of Holding would not yield the ideal outcome.","You come to the realization that this might not be the greatest idea.") + else + . = ..() +/obj/item/weapon/storage/backpack/holding/singularity_act(current_size) + var/dist = max((current_size - 2),1) + explosion(src.loc,(dist),(dist*2),(dist*4)) + return /obj/item/weapon/storage/backpack/santabag name = "Santa's Gift Bag" 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 - max_w_class = 3 + w_class = WEIGHT_CLASS_BULKY + max_w_class = WEIGHT_CLASS_NORMAL max_combined_w_class = 400 // can store a ton of shit! /obj/item/weapon/storage/backpack/cultpack @@ -243,7 +227,7 @@ name = "smuggler's satchel" desc = "A very slim satchel that can easily fit into tight spaces." icon_state = "satchel-flat" - w_class = 3 //Can fit in backpacks itself. + w_class = WEIGHT_CLASS_NORMAL //Can fit in backpacks itself. max_combined_w_class = 15 level = 1 cant_hold = list(/obj/item/weapon/storage/backpack/satchel_flat) //muh recursive backpacks diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index b90d11a543e..9ea57893c56 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -33,8 +33,8 @@ icon_state = "trashbag" item_state = "trashbag" - w_class = 1 - max_w_class = 2 + w_class = WEIGHT_CLASS_TINY + max_w_class = WEIGHT_CLASS_SMALL storage_slots = 30 can_hold = list() // any cant_hold = list(/obj/item/weapon/disk/nuclear) @@ -46,16 +46,16 @@ /obj/item/weapon/storage/bag/trash/update_icon() if(contents.len == 0) - w_class = 1 + w_class = WEIGHT_CLASS_TINY icon_state = "[initial(icon_state)]" else if(contents.len < 12) - w_class = 4 + w_class = WEIGHT_CLASS_BULKY icon_state = "[initial(icon_state)]1" else if(contents.len < 21) - w_class = 4 + w_class = WEIGHT_CLASS_BULKY icon_state = "[initial(icon_state)]2" else - w_class = 4 + w_class = WEIGHT_CLASS_BULKY icon_state = "[initial(icon_state)]3" /obj/item/weapon/storage/bag/trash/cyborg @@ -72,6 +72,7 @@ name = "trash bag of holding" desc = "The latest and greatest in custodial convenience, a trashbag that is capable of holding vast quantities of garbage." icon_state = "bluetrashbag" + origin_tech = "materials=4;bluespace=4;engineering=4;plasmatech=3" max_combined_w_class = 60 storage_slots = 60 @@ -88,8 +89,8 @@ item_state = "plasticbag" slot_flags = SLOT_HEAD|SLOT_BELT throwforce = 0 - w_class = 4 - max_w_class = 2 + w_class = WEIGHT_CLASS_BULKY + max_w_class = WEIGHT_CLASS_SMALL storage_slots = 7 display_contents_with_number = 0 //or else this will lead to stupid behavior. can_hold = list() // any @@ -131,11 +132,12 @@ desc = "This little bugger can be used to store and transport ores." icon = 'icons/obj/mining.dmi' icon_state = "satchel" + origin_tech = "engineering=2" slot_flags = SLOT_BELT | SLOT_POCKET - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL storage_slots = 50 max_combined_w_class = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * ore.w_class - max_w_class = 3 + max_w_class = WEIGHT_CLASS_NORMAL can_hold = list(/obj/item/weapon/ore) /obj/item/weapon/storage/bag/ore/cyborg @@ -147,7 +149,7 @@ desc = "A revolution in convenience, this satchel allows for infinite ore storage. It's been outfitted with anti-malfunction safety measures." storage_slots = INFINITY max_combined_w_class = INFINITY - origin_tech = "bluespace=3" + origin_tech = "bluespace=4;materials=3;engineering=3" icon_state = "satchel_bspace" /obj/item/weapon/storage/bag/ore/holding/cyborg @@ -164,8 +166,8 @@ icon_state = "plantbag" storage_slots = 100 //the number of plant pieces it can carry. max_combined_w_class = 100 //Doesn't matter what this is, so long as it's more or equal to storage_slots * plants.w_class - max_w_class = 3 - w_class = 1 + max_w_class = WEIGHT_CLASS_NORMAL + w_class = WEIGHT_CLASS_TINY can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/weapon/grown,/obj/item/weapon/reagent_containers/food/snacks/ash_flora) burn_state = FLAMMABLE @@ -202,7 +204,7 @@ desc = "A patented Nanotrasen storage system designed for any kind of mineral sheet." var/capacity = 300; //the number of sheets it can carry. - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL allow_quick_empty = 1 // this function is superceded New() @@ -343,8 +345,8 @@ desc = "A bag for carrying lots of cash. It's got a big dollar sign printed on the front." storage_slots = 50; //the number of cash pieces it can carry. max_combined_w_class = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * cash.w_class - max_w_class = 3 - w_class = 1 + max_w_class = WEIGHT_CLASS_NORMAL + w_class = WEIGHT_CLASS_TINY can_hold = list(/obj/item/weapon/coin,/obj/item/stack/spacecash) // ----------------------------- @@ -359,8 +361,8 @@ display_contents_with_number = 0 //This would look really stupid otherwise storage_slots = 7 max_combined_w_class = 21 - max_w_class = 3 - w_class = 4 //Bigger than a book because physics + max_w_class = WEIGHT_CLASS_NORMAL + w_class = WEIGHT_CLASS_BULKY //Bigger than a book because physics can_hold = list(/obj/item/weapon/book, /obj/item/weapon/storage/bible, /obj/item/weapon/tome, /obj/item/weapon/spellbook) burn_state = FLAMMABLE @@ -376,7 +378,7 @@ throwforce = 10.0 throw_speed = 3 throw_range = 5 - w_class = 4 + w_class = WEIGHT_CLASS_BULKY flags = CONDUCT materials = list(MAT_METAL=3000) @@ -469,7 +471,7 @@ desc = "A bag for storing pills, patches, and bottles." storage_slots = 50 max_combined_w_class = 200 - w_class = 1 + w_class = WEIGHT_CLASS_TINY can_hold = list(/obj/item/weapon/reagent_containers/food/pill,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/glass/bottle) burn_state = FLAMMABLE /* @@ -483,6 +485,6 @@ desc = "A bag for the safe transportation and disposal of biowaste and other biological materials." storage_slots = 25 max_combined_w_class = 200 - w_class = 1 + w_class = WEIGHT_CLASS_TINY can_hold = list(/obj/item/slime_extract,/obj/item/weapon/reagent_containers/food/snacks/monkeycube,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/reagent_containers/blood,/obj/item/weapon/reagent_containers/hypospray/autoinjector) burn_state = FLAMMABLE diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 609edd2961f..95e72d458f7 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -176,7 +176,7 @@ icon_state = "securitybelt" item_state = "security"//Could likely use a better one. storage_slots = 5 - max_w_class = 3 + max_w_class = WEIGHT_CLASS_NORMAL use_item_overlays = 1 can_hold = list( /obj/item/weapon/grenade/flashbang, @@ -249,7 +249,7 @@ icon_state = "militarybelt" item_state = "military" max_w_class = WEIGHT_CLASS_SMALL - + /obj/item/weapon/storage/belt/military/abductor name = "agent belt" desc = "A belt used by abductor agents." @@ -280,7 +280,7 @@ icon_state = "janibelt" item_state = "janibelt" storage_slots = 6 - max_w_class = 4 // Set to this so the light replacer can fit. + max_w_class = WEIGHT_CLASS_BULKY // Set to this so the light replacer can fit. use_item_overlays = 1 can_hold = list( /obj/item/weapon/grenade/chem_grenade/cleaner, @@ -306,8 +306,8 @@ desc = "For the mining master, holds your lazarus capsules." icon_state = "lazarusbelt" item_state = "lazbelt" - w_class = 4 - max_w_class = 1 + w_class = WEIGHT_CLASS_BULKY + max_w_class = WEIGHT_CLASS_TINY max_combined_w_class = 6 storage_slots = 6 can_hold = list(/obj/item/device/mobcapsule) @@ -379,7 +379,7 @@ icon_state = "holster" item_state = "holster" storage_slots = 1 - max_w_class = 3 + max_w_class = WEIGHT_CLASS_NORMAL can_hold = list( /obj/item/weapon/gun/projectile/automatic/pistol, /obj/item/weapon/gun/projectile/revolver/detective @@ -417,7 +417,7 @@ icon_state = "fannypack_leather" item_state = "fannypack_leather" storage_slots = 3 - max_w_class = 2 + max_w_class = WEIGHT_CLASS_SMALL /obj/item/weapon/storage/belt/fannypack/black name = "black fannypack" @@ -475,8 +475,8 @@ icon_state = "sheath" item_state = "sheath" storage_slots = 1 - w_class = 4 - max_w_class = 4 + w_class = WEIGHT_CLASS_BULKY + max_w_class = WEIGHT_CLASS_BULKY can_hold = list(/obj/item/weapon/melee/rapier) /obj/item/weapon/storage/belt/rapier/update_icon() @@ -506,33 +506,21 @@ icon_state = "holdingbelt" item_state = "holdingbelt" storage_slots = 14 - w_class = 4 - max_w_class = 2 + w_class = WEIGHT_CLASS_BULKY + max_w_class = WEIGHT_CLASS_SMALL max_combined_w_class = 21 // = 14 * 1.5, not 14 * 2. This is deliberate - origin_tech = "bluespace=4" + origin_tech = "bluespace=5;materials=4;engineering=4;plasmatech=5" can_hold = list() - proc/failcheck(mob/user as mob) - if(prob(src.reliability)) return 1 //No failure - if(prob(src.reliability)) - to_chat(user, "The Bluespace portal resists your attempt to add another item.")//light failure - - else - to_chat(user, "The Bluespace generator malfunctions!") - for(var/obj/O in src.contents) //it broke, delete what was in it - qdel(O) - crit_fail = 1 - return 0 - /obj/item/weapon/storage/belt/bluespace/owlman name = "Owlman's utility belt" desc = "Sometimes people choose justice. Sometimes, justice chooses you..." icon_state = "securitybelt" item_state = "security" storage_slots = 6 - max_w_class = 3 + max_w_class = WEIGHT_CLASS_NORMAL max_combined_w_class = 18 - origin_tech = "bluespace=4;syndicate=2" + origin_tech = "bluespace=5;materials=4;engineering=4;plasmatech=5" allow_quick_empty = 1 can_hold = list( /obj/item/weapon/grenade/smokebomb, diff --git a/code/game/objects/items/weapons/storage/bible.dm b/code/game/objects/items/weapons/storage/bible.dm index f005f2f8b8e..17bf8fcac8e 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 + w_class = WEIGHT_CLASS_NORMAL burn_state = FLAMMABLE var/mob/affecting = null var/deity_name = "Christ" diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 8a487289e35..594028e4f1f 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -634,8 +634,8 @@ icon_state = "matchbox" item_state = "zippo" storage_slots = 10 - w_class = 1 - max_w_class = 1 + w_class = WEIGHT_CLASS_TINY + max_w_class = WEIGHT_CLASS_TINY slot_flags = SLOT_BELT can_hold = list(/obj/item/weapon/match) @@ -810,4 +810,4 @@ #undef NANOTRASEN #undef SYNDI #undef HEART -#undef SMILE \ No newline at end of file +#undef SMILE diff --git a/code/game/objects/items/weapons/storage/briefcase.dm b/code/game/objects/items/weapons/storage/briefcase.dm index 7f2a91054c1..89122d1a337 100644 --- a/code/game/objects/items/weapons/storage/briefcase.dm +++ b/code/game/objects/items/weapons/storage/briefcase.dm @@ -8,12 +8,12 @@ force = 8.0 throw_speed = 2 throw_range = 4 - w_class = 4 - max_w_class = 3 + w_class = WEIGHT_CLASS_BULKY + max_w_class = WEIGHT_CLASS_NORMAL max_combined_w_class = 21 attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") burn_state = FLAMMABLE burntime = 20 /obj/item/weapon/storage/briefcase/New() - ..() \ No newline at end of file + ..() diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index a3f2a21a5fa..b5258eaeb27 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 + w_class = WEIGHT_CLASS_SMALL storage_slots = 6 icon_type = "crayon" can_hold = list( @@ -158,7 +158,7 @@ icon = 'icons/obj/cigarettes.dmi' icon_state = "cigpacket" item_state = "cigpacket" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL throwforce = 2 slot_flags = SLOT_BELT storage_slots = 6 @@ -317,8 +317,8 @@ /obj/item/weapon/storage/fancy/rollingpapers name = "rolling paper pack" - desc = "A pack of NanoTrasen brand rolling papers." - w_class = 1 + desc = "A pack of Nanotrasen brand rolling papers." + w_class = WEIGHT_CLASS_TINY icon = 'icons/obj/cigarettes.dmi' icon_state = "cig_paper_pack" storage_slots = 10 @@ -360,7 +360,7 @@ icon = 'icons/obj/vialbox.dmi' icon_state = "vialbox0" item_state = "syringe_kit" - max_w_class = 3 + max_w_class = WEIGHT_CLASS_NORMAL can_hold = list(/obj/item/weapon/reagent_containers/glass/beaker/vial) max_combined_w_class = 14 //The sum of the w_classes of all the items in this storage item. storage_slots = 6 diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 5ab8713a49a..8794c09014b 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -155,7 +155,7 @@ name = "first-aid kit" icon_state = "bezerk" desc = "I hope you've got insurance." - max_w_class = 3 + max_w_class = WEIGHT_CLASS_NORMAL treatment_oxy = "perfluorodecalin" treatment_brute = "styptic_powder" treatment_fire = "silver_sulfadiazine" @@ -181,7 +181,7 @@ name = "field surgery kit" icon_state = "duffel-med" desc = "A kit for surgery in the field." - max_w_class = 4 + max_w_class = WEIGHT_CLASS_BULKY max_combined_w_class = 21 storage_slots = 10 can_hold = list(/obj/item/roller,/obj/item/weapon/bonesetter,/obj/item/weapon/bonegel, /obj/item/weapon/scalpel, /obj/item/weapon/hemostat, @@ -209,7 +209,7 @@ icon_state = "pill_canister" icon = 'icons/obj/chemical.dmi' item_state = "contsolid" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL 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 diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm index b622e469124..2f4a3b2e5ac 100644 --- a/code/game/objects/items/weapons/storage/lockbox.dm +++ b/code/game/objects/items/weapons/storage/lockbox.dm @@ -5,8 +5,8 @@ desc = "A locked box." icon_state = "lockbox+l" item_state = "syringe_kit" - w_class = 4 - max_w_class = 3 + w_class = WEIGHT_CLASS_BULKY + max_w_class = WEIGHT_CLASS_NORMAL max_combined_w_class = 14 //The sum of the w_classes of all the items in this storage item. storage_slots = 4 req_access = list(access_armory) @@ -76,7 +76,7 @@ /obj/item/weapon/storage/lockbox/large name = "Large lockbox" desc = "A large lockbox" - max_w_class = 4 + max_w_class = WEIGHT_CLASS_BULKY max_combined_w_class = 4 //The sum of the w_classes of all the items in this storage item. storage_slots = 1 @@ -105,8 +105,8 @@ desc = "A locked box used to store medals of honor." icon_state = "medalbox+l" item_state = "syringe_kit" - w_class = 3 - max_w_class = 2 + w_class = WEIGHT_CLASS_NORMAL + max_w_class = WEIGHT_CLASS_SMALL max_combined_w_class = 20 storage_slots = 12 req_access = list(access_captain) diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index e06cbb91255..7619fd953d7 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -23,8 +23,8 @@ var/l_hacking = 0 var/emagged = 0 var/open = 0 - w_class = 3 - max_w_class = 2 + w_class = WEIGHT_CLASS_NORMAL + max_w_class = WEIGHT_CLASS_SMALL max_combined_w_class = 14 /obj/item/weapon/storage/secure/examine(mob/user) @@ -180,8 +180,8 @@ force = 8 throw_speed = 2 throw_range = 4 - w_class = 4 - max_w_class = 3 + w_class = WEIGHT_CLASS_BULKY + max_w_class = WEIGHT_CLASS_NORMAL max_combined_w_class = 21 attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") @@ -228,7 +228,7 @@ icon_locking = "safeb" icon_sparking = "safespark" force = 8 - w_class = 5 + w_class = WEIGHT_CLASS_HUGE max_w_class = 8 anchored = 1 density = 0 diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index e5fb0646169..5931696b599 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -8,11 +8,11 @@ /obj/item/weapon/storage name = "storage" icon = 'icons/obj/storage.dmi' - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL 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) - var/max_w_class = 2 //Max size of objects that this object can store (in effect only if can_hold isn't set) + var/max_w_class = WEIGHT_CLASS_SMALL //Max size of objects that this object can store (in effect only if can_hold isn't set) var/max_combined_w_class = 14 //The sum of the w_classes of all the items in this storage item. var/storage_slots = 7 //The number of storage slots in this container. var/obj/screen/storage/boxes = null @@ -254,7 +254,7 @@ if(W.w_class > max_w_class) if(!stop_messages) - to_chat(usr, "[W] is too big for this [src].") + to_chat(usr, "[W] is too big for [src].") return 0 var/sum_w_class = W.w_class @@ -304,7 +304,7 @@ 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... 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 >= WEIGHT_CLASS_NORMAL) //Otherwise they can only see large or normal items from a distance... M.show_message("[usr] puts [W] into [src].") src.orient2hud(usr) @@ -478,7 +478,7 @@ /obj/item/weapon/storage/attack_self(mob/user as mob) //Clicking on itself will empty it, if it has the verb to do that. - if(user.get_active_hand() == src) + if(user.is_in_active_hand(src)) if(src.verbs.Find(/obj/item/weapon/storage/verb/quick_empty)) src.quick_empty() return diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm index a6ecd3d45ac..dfad952b12e 100644 --- a/code/game/objects/items/weapons/storage/toolbox.dm +++ b/code/game/objects/items/weapons/storage/toolbox.dm @@ -9,9 +9,9 @@ throwforce = 10.0 throw_speed = 2 throw_range = 7 - w_class = 4 + w_class = WEIGHT_CLASS_BULKY materials = list(MAT_METAL = 500) - origin_tech = "combat=1" + origin_tech = "combat=1;engineering=1" attack_verb = list("robusted") hitsound = 'sound/weapons/smash.ogg' @@ -71,7 +71,7 @@ name = "suspicious looking toolbox" icon_state = "syndicate" item_state = "toolbox_syndi" - origin_tech = "combat=1;syndicate=1" + origin_tech = "combat=2;syndicate=1;engineering=2" silent = 1 force = 15.0 throwforce = 18.0 @@ -85,7 +85,7 @@ new /obj/item/weapon/wirecutters(src, "red") new /obj/item/device/multitool(src) new /obj/item/clothing/gloves/combat(src) - + /obj/item/weapon/storage/toolbox/drone name = "mechanical toolbox" icon_state = "blue" @@ -119,4 +119,4 @@ new /obj/item/weapon/wirecutters/brass(src) new /obj/item/weapon/wrench/brass(src) new /obj/item/weapon/crowbar/brass(src) - new /obj/item/weapon/weldingtool/experimental/brass(src) \ No newline at end of file + new /obj/item/weapon/weldingtool/experimental/brass(src) diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 03fc0a7b742..c5f32121d4f 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -69,7 +69,7 @@ new /obj/item/clothing/suit/hooded/chaplain_hoodie(src) new /obj/item/weapon/card/id/syndicate(src) return - + if("gadgets") new /obj/item/clothing/gloves/color/yellow/power(src) new /obj/item/weapon/pen/sleepy(src) @@ -88,7 +88,7 @@ /obj/item/weapon/storage/box/syndie_kit/space name = "Boxed Space Suit and Helmet" can_hold = list(/obj/item/clothing/suit/space/syndicate/black/red, /obj/item/clothing/head/helmet/space/syndicate/black/red) - max_w_class = 3 + max_w_class = WEIGHT_CLASS_NORMAL /obj/item/weapon/storage/box/syndie_kit/space/New() ..() @@ -99,7 +99,7 @@ /obj/item/weapon/storage/box/syndie_kit/hardsuit name = "Boxed Blood Red Suit and Helmet" can_hold = list(/obj/item/clothing/suit/space/hardsuit/syndi, /obj/item/clothing/head/helmet/space/hardsuit/syndi) - max_w_class = 3 + max_w_class = WEIGHT_CLASS_NORMAL /obj/item/weapon/storage/box/syndie_kit/hardsuit/New() ..() @@ -110,7 +110,7 @@ /obj/item/weapon/storage/box/syndie_kit/elite_hardsuit name = "Boxed Elite Syndicate Hardsuit and Helmet" can_hold = list(/obj/item/clothing/suit/space/hardsuit/syndi/elite, /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite) - max_w_class = 3 + max_w_class = WEIGHT_CLASS_NORMAL /obj/item/weapon/storage/box/syndie_kit/elite_hardsuit/New() ..() @@ -120,7 +120,7 @@ /obj/item/weapon/storage/box/syndie_kit/shielded_hardsuit name = "Boxed Shielded Syndicate Hardsuit and Helmet" can_hold = list(/obj/item/clothing/suit/space/hardsuit/shielded/syndi, /obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi) - max_w_class = 4 + max_w_class = WEIGHT_CLASS_BULKY /obj/item/weapon/storage/box/syndie_kit/shielded_hardsuit/New() ..() @@ -157,6 +157,22 @@ new /obj/item/weapon/grenade/empgrenade(src) new /obj/item/weapon/implanter/emp/(src) +/obj/item/weapon/storage/box/syndie_kit/throwing_weapons + name = "boxed throwing kit" + can_hold = list(/obj/item/weapon/throwing_star, /obj/item/weapon/restraints/legcuffs/bola/tactical) + max_combined_w_class = 16 + max_w_class = WEIGHT_CLASS_NORMAL + +/obj/item/weapon/storage/box/syndie_kit/throwing_weapons/New() + ..() + new /obj/item/weapon/throwing_star(src) + new /obj/item/weapon/throwing_star(src) + new /obj/item/weapon/throwing_star(src) + new /obj/item/weapon/throwing_star(src) + new /obj/item/weapon/throwing_star(src) + new /obj/item/weapon/restraints/legcuffs/bola/tactical(src) + new /obj/item/weapon/restraints/legcuffs/bola/tactical(src) + /obj/item/weapon/storage/box/syndie_kit/sarin name = "Sarin Gas Grenades" @@ -216,3 +232,13 @@ B.deity_name = "Success" B.icon_state = "greentext" B.item_state = "greentext" + + +/obj/item/weapon/storage/box/syndie_kit/cutouts + name = "Fortified Artistic Box" + +/obj/item/weapon/storage/box/syndie_kit/cutouts/New() + ..() + for(var/i in 1 to 3) + new/obj/item/cardboard_cutout/adaptive(src) + new/obj/item/toy/crayon/spraycan(src) \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm index 0d9712ed43f..667b2ca7605 100644 --- a/code/game/objects/items/weapons/storage/wallets.dm +++ b/code/game/objects/items/weapons/storage/wallets.dm @@ -4,7 +4,7 @@ storage_slots = 10 icon = 'icons/obj/wallets.dmi' icon_state = "wallet" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL burn_state = FLAMMABLE can_hold = list( /obj/item/stack/spacecash, diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 1de82690573..c4c29a9542f 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -7,7 +7,7 @@ slot_flags = SLOT_BELT force = 10 throwforce = 7 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL origin_tech = "combat=2" attack_verb = list("beaten") var/stunforce = 7 @@ -118,7 +118,7 @@ var/mob/living/L = M - if(user.a_intent != I_HARM) + if(user.a_intent != INTENT_HARM) if(status) user.do_attack_animation(L) baton_stun(L, user) @@ -165,8 +165,6 @@ /obj/item/weapon/melee/baton/emp_act(severity) if(bcell) deductcharge(1000 / severity) - if(bcell.reliability != 100 && prob(50/severity)) - bcell.reliability -= 10 / severity ..() /obj/item/weapon/melee/baton/wash(mob/user, atom/source) @@ -190,7 +188,7 @@ icon_state = "stunprod_nocell" base_icon = "stunprod" item_state = "prod" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL force = 3 throwforce = 5 stunforce = 5 diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index 786b980d38f..3ce0f32d47a 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -25,7 +25,7 @@ item_state = "classic_baton" slot_flags = SLOT_BELT force = 12 //9 hit crit - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL var/cooldown = 0 var/on = 1 @@ -46,7 +46,7 @@ return if(!isliving(target)) return - if(user.a_intent == I_HARM) + if(user.a_intent == INTENT_HARM) if(!..()) return if(!isrobot(target)) return else @@ -90,7 +90,7 @@ icon_state = "telebaton_0" item_state = null slot_flags = SLOT_BELT - w_class = 2 + w_class = WEIGHT_CLASS_SMALL needs_permit = 0 force = 0 on = 0 @@ -101,7 +101,7 @@ to_chat(user, "You extend the baton.") icon_state = "telebaton_1" item_state = "nullrod" - w_class = 4 //doesnt fit in backpack when its on for balance + w_class = WEIGHT_CLASS_BULKY //doesnt fit in backpack when its on for balance force = 10 //stunbaton damage attack_verb = list("smacked", "struck", "cracked", "beaten") else @@ -109,7 +109,7 @@ icon_state = "telebaton_0" item_state = null //no sprite for concealment even when in hand slot_flags = SLOT_BELT - w_class = 2 + w_class = WEIGHT_CLASS_SMALL force = 0 //not so robust now attack_verb = list("hit", "poked") if(istype(user,/mob/living/carbon/human)) diff --git a/code/game/objects/items/weapons/syndie_uplink.dm b/code/game/objects/items/weapons/syndie_uplink.dm index 3dd9a230ad1..0515dd41dd3 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 + w_class = WEIGHT_CLASS_SMALL item_state = "radio" throw_speed = 4 throw_range = 20 @@ -31,8 +31,8 @@ slot_flags = SLOT_BELT item_state = "radio" throwforce = 5 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL throw_speed = 4 throw_range = 20 materials = list(MAT_METAL=100) - origin_tech = "magnets=1" \ No newline at end of file + origin_tech = "magnets=1" diff --git a/code/game/objects/items/weapons/table_rack_parts.dm b/code/game/objects/items/weapons/table_rack_parts.dm index 3073125bae0..7655fba3605 100644 --- a/code/game/objects/items/weapons/table_rack_parts.dm +++ b/code/game/objects/items/weapons/table_rack_parts.dm @@ -46,6 +46,18 @@ /obj/item/stack/sheet/wood, /obj/item/stack/sheet/wood) +/obj/item/weapon/table_parts/wood/attackby(obj/item/W, mob/user) + if(istype(W, /obj/item/stack/tile/carpet)) + var/target = /obj/item/weapon/table_parts/fancy + if(istype(W, /obj/item/stack/tile/carpet/black)) + target = /obj/item/weapon/table_parts/fancy/black + var/obj/item/stack/S = W + if(S.use(1)) + new target(get_turf(src)) + qdel(src) + else + . = ..() + /obj/item/weapon/table_parts/glass name = "glass table parts" desc = "fragile!" @@ -57,6 +69,17 @@ /obj/item/stack/sheet/metal, /obj/item/stack/sheet/metal) +/obj/item/weapon/table_parts/fancy + name = "fancy table parts" + desc = "Pretty!" + icon_state = "fancy_tableparts" + result = /obj/structure/table/wood/fancy + +/obj/item/weapon/table_parts/fancy/black + name = "black fancy table parts" + icon_state = "black_fancy_tableparts" + result = /obj/structure/table/wood/fancy/black + /obj/item/weapon/rack_parts name = "rack parts" desc = "Parts of a rack." @@ -88,9 +111,10 @@ for(var/obj/structure/table/T in user.loc) to_chat(user, "You can't build tables on top of tables!") return - new result(user.loc) - user.drop_item() - qdel(src) + if(do_after(user, 20, target = loc)) + new result(user.loc) + user.drop_item() + qdel(src) /* * Rack Parts @@ -102,7 +126,8 @@ qdel(src) /obj/item/weapon/rack_parts/attack_self(mob/user as mob) - var/obj/structure/rack/R = new /obj/structure/rack(user.loc) - R.add_fingerprint(user) - user.drop_item() - qdel(src) \ No newline at end of file + if(do_after(user, 20, target = loc)) + var/obj/structure/rack/R = new /obj/structure/rack(user.loc) + R.add_fingerprint(user) + user.drop_item() + qdel(src) diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index 1bd8d8b761c..eef5475bdcd 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 + w_class = WEIGHT_CLASS_BULKY item_state = "jetpack" distribute_pressure = ONE_ATMOSPHERE*O2STANDARD var/datum/effect/system/ion_trail_follow/ion_trail @@ -116,7 +116,7 @@ item_state = "jetpack-mini" volume = 40 throw_range = 8 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL /obj/item/weapon/tank/jetpack/oxygenblack name = "Jetpack (Oxygen)" @@ -174,4 +174,4 @@ var/turf/T = get_turf(user) T.assume_air(removed) - return 1 \ No newline at end of file + return 1 diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index 428c4885814..4778a53c28b 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -126,7 +126,7 @@ icon_state = "emergency" flags = CONDUCT slot_flags = SLOT_BELT - w_class = 2 + w_class = WEIGHT_CLASS_SMALL 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) diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index bd62357ba76..27cbff53547 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -7,7 +7,7 @@ flags = CONDUCT slot_flags = SLOT_BACK hitsound = 'sound/weapons/smash.ogg' - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL pressure_resistance = ONE_ATMOSPHERE*5 @@ -54,7 +54,9 @@ C.update_internals_hud_icon(0) else var/can_open_valve = 0 - if(C.wear_mask && C.wear_mask.flags & AIRTIGHT) + if(C.get_organ_slot("breathing_tube")) + can_open_valve = 1 + else if(C.wear_mask && C.wear_mask.flags & AIRTIGHT) can_open_valve = 1 else if(ishuman(C)) var/mob/living/carbon/human/H = C diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm index e8cf034a5b5..5229a59fe5f 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 + w_class = WEIGHT_CLASS_BULKY slot_flags = SLOT_BACK slowdown = 1 actions_types = list(/datum/action/item_action/toggle_mister) @@ -112,7 +112,7 @@ icon = 'icons/obj/watertank.dmi' icon_state = "mister" item_state = "mister" - w_class = 4 + w_class = WEIGHT_CLASS_BULKY amount_per_transfer_from_this = 50 possible_transfer_amounts = list(25,50,100) volume = 500 @@ -220,7 +220,7 @@ power = 8 precision = 1 cooling_power = 5 - w_class = 5 + w_class = WEIGHT_CLASS_HUGE flags = NODROP //Necessary to ensure that the nozzle and tank never seperate var/obj/item/weapon/watertank/tank var/nozzle_mode = 0 diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm index 067bacaef4b..05486c9d85f 100644 --- a/code/game/objects/items/weapons/tape.dm +++ b/code/game/objects/items/weapons/tape.dm @@ -3,7 +3,7 @@ desc = "A roll of sticky tape. Possibly for taping ducks... or was that ducts?" icon = 'icons/obj/bureaucracy.dmi' icon_state = "taperoll" - w_class = 1 + w_class = WEIGHT_CLASS_TINY amount = 10 max_amount = 10 @@ -76,7 +76,7 @@ desc = "A piece of sticky tape." icon = 'icons/obj/bureaucracy.dmi' icon_state = "tape" - w_class = 1 + w_class = WEIGHT_CLASS_TINY layer = 4 anchored = 1 //it's sticky, no you cant move it diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index 87309c5927c..11da88ae680 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -17,12 +17,12 @@ var/broadcasting = null var/listening = 1.0 flags = CONDUCT - w_class = 2 + w_class = WEIGHT_CLASS_SMALL item_state = "electronic" throw_speed = 4 throw_range = 20 materials = list(MAT_METAL=400) - origin_tech = "magnets=1" + origin_tech = "magnets=3;bluespace=2" /obj/item/weapon/locator/attack_self(mob/user as mob) add_fingerprint(usr) @@ -98,11 +98,11 @@ Frequency: icon_state = "hand_tele" item_state = "electronic" throwforce = 0 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL throw_speed = 3 throw_range = 5 materials = list(MAT_METAL=10000) - origin_tech = "magnets=1;bluespace=3" + origin_tech = "magnets=3;bluespace=4" var/active_portals = 0 /obj/item/weapon/hand_tele/attack_self(mob/user as mob) @@ -128,7 +128,7 @@ Frequency: 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.is_in_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 b23601e8df2..3ad0a28823a 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -155,7 +155,7 @@ src.pixel_y = rand(0, 16) /obj/item/weapon/screwdriver/attack(mob/living/carbon/M, mob/living/carbon/user) - if(!istype(M) || user.a_intent == I_HELP) + if(!istype(M) || user.a_intent == INTENT_HELP) return ..() if(user.zone_sel.selecting != "eyes" && user.zone_sel.selecting != "head") return ..() @@ -228,7 +228,6 @@ hitsound = 'sound/items/Wirecutter.ogg' usesound = 'sound/items/Wirecutter.ogg' sharp = 1 - edge = 1 toolspeed = 1 /obj/item/weapon/wirecutters/New(loc, param_color = null) @@ -241,8 +240,7 @@ /obj/item/weapon/wirecutters/attack(mob/living/carbon/C, mob/user) if(istype(C) && C.handcuffed && istype(C.handcuffed, /obj/item/weapon/restraints/handcuffs/cable)) user.visible_message("[user] cuts [C]'s restraints with [src]!") - qdel(C.handcuffed) - C.handcuffed = null + QDEL_NULL(C.handcuffed) if(C.buckled && C.buckled.buckle_requires_restraints) C.buckled.unbuckle_mob(C) C.update_handcuffed() @@ -404,7 +402,7 @@ if(!S) return - if(!(S.status & ORGAN_ROBOT) || user.a_intent != I_HELP || S.open == 2) + if(!(S.status & ORGAN_ROBOT) || user.a_intent != INTENT_HELP || S.open == 2) return ..() if(!isOn()) //why wasn't this being checked already? @@ -511,7 +509,8 @@ to_chat(user, "You need more fuel!") switched_off(user) else - to_chat(user, "You switch [src] off.") + if(user) + to_chat(user, "You switch [src] off.") playsound(loc, deac_sound, 50, 1) switched_off(user) diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index ce2b5965c6c..87197426495 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -109,7 +109,7 @@ ///////////OFFHAND/////////////// /obj/item/weapon/twohanded/offhand - w_class = 5 + w_class = WEIGHT_CLASS_HUGE icon_state = "offhand" name = "offhand" flags = ABSTRACT @@ -123,7 +123,7 @@ ///////////Two hand required objects/////////////// //This is for objects that require two hands to even pick up /obj/item/weapon/twohanded/required/ - w_class = 5 + w_class = WEIGHT_CLASS_HUGE /obj/item/weapon/twohanded/required/attack_self() return @@ -162,8 +162,7 @@ force = 5 throwforce = 15 sharp = 1 - edge = 1 - w_class = 4 + w_class = WEIGHT_CLASS_BULKY slot_flags = SLOT_BACK force_unwielded = 5 force_wielded = 24 @@ -199,18 +198,16 @@ throwforce = 5.0 throw_speed = 1 throw_range = 5 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL force_unwielded = 3 force_wielded = 34 wieldsound = 'sound/weapons/saberon.ogg' unwieldsound = 'sound/weapons/saberoff.ogg' armour_penetration = 35 - origin_tech = "magnets=3;syndicate=4" + origin_tech = "magnets=4;syndicate=5" 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. /obj/item/weapon/twohanded/dualsaber/New() blade_color = pick("red", "blue", "green", "purple") @@ -286,7 +283,7 @@ name = "spear" desc = "A haphazardly-constructed yet still deadly weapon of ancient design." force = 10 - w_class = 4 + w_class = WEIGHT_CLASS_BULKY slot_flags = SLOT_BACK force_unwielded = 10 force_wielded = 18 @@ -297,7 +294,6 @@ hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "poked", "jabbed", "torn", "gored") sharp = 1 - edge = 1 no_spin_thrown = 1 var/obj/item/weapon/grenade/explosive = null var/war_cry = "AAAAARGH!!!" @@ -433,7 +429,7 @@ flags = CONDUCT force = 13 var/force_on = 21 - w_class = 5 + w_class = WEIGHT_CLASS_HUGE throwforce = 13 throw_speed = 2 throw_range = 4 @@ -442,7 +438,6 @@ attack_verb = list("sawed", "cut", "hacked", "carved", "cleaved", "butchered", "felled", "timbered") hitsound = "swing_hit" sharp = 1 - edge = 1 actions_types = list(/datum/action/item_action/startchainsaw) var/on = 0 @@ -490,7 +485,7 @@ throwforce = 15 throw_speed = 1 throw_range = 5 - w_class = 4 // can't fit in backpacks + w_class = WEIGHT_CLASS_BULKY // 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' @@ -499,8 +494,6 @@ origin_tech = "materials=6;syndicate=4" attack_verb = list("sawed", "cut", "hacked", "carved", "cleaved", "butchered", "felled", "timbered") sharp = 1 - edge = 1 - no_embed = 1 /obj/item/weapon/twohanded/chainsaw/update_icon() if(wielded) @@ -539,15 +532,14 @@ icon_state = "mjollnir0" flags = CONDUCT slot_flags = SLOT_BACK - no_embed = 1 force = 5 force_unwielded = 5 force_wielded = 20 throwforce = 15 throw_range = 1 - w_class = 5 + w_class = WEIGHT_CLASS_HUGE var/charged = 5 - origin_tech = "combat=5;bluespace=4" + origin_tech = "combat=4;bluespace=4;plasmatech=7" /obj/item/weapon/twohanded/singularityhammer/New() ..() @@ -604,15 +596,14 @@ icon_state = "mjollnir0" flags = CONDUCT slot_flags = SLOT_BACK - no_embed = 1 force = 5 force_unwielded = 5 force_wielded = 25 throwforce = 30 throw_range = 7 - w_class = 5 + w_class = WEIGHT_CLASS_HUGE //var/charged = 5 - origin_tech = "combat=5;powerstorage=5" + origin_tech = "combat=4;powerstorage=7" /obj/item/weapon/twohanded/mjollnir/proc/shock(mob/living/target as mob) var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread() @@ -652,13 +643,12 @@ icon_state = "knighthammer0" flags = CONDUCT slot_flags = SLOT_BACK - no_embed = 1 force = 5 force_unwielded = 5 force_wielded = 30 throwforce = 15 throw_range = 1 - w_class = 5 + w_class = WEIGHT_CLASS_HUGE var/charged = 5 origin_tech = "combat=5;bluespace=4" @@ -718,8 +708,7 @@ force = 5 throwforce = 15 sharp = 1 - edge = 1 - w_class = 5 + w_class = WEIGHT_CLASS_HUGE armour_penetration = 20 slot_flags = SLOT_BACK force_unwielded = 5 diff --git a/code/game/objects/items/weapons/vending_items.dm b/code/game/objects/items/weapons/vending_items.dm index 3fb54c16609..34c4cd6c6d0 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 + w_class = WEIGHT_CLASS_BULKY var/charges = 0 //how many restocking "charges" the refill has @@ -86,4 +86,3 @@ /obj/item/weapon/vending_refill/chinese machine_name = "MrChangs" charges = 8// of 24 - diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index d5b679fde56..753a8073313 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 + w_class = WEIGHT_CLASS_TINY throw_speed = 7 throw_range = 15 attack_verb = list("banned") @@ -23,7 +23,7 @@ slot_flags = SLOT_BELT force = 2 throwforce = 1 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") @@ -43,8 +43,7 @@ force = 40 throwforce = 10 sharp = 1 - edge = 1 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") block_chance = 50 @@ -67,8 +66,7 @@ force = 40 throwforce = 10 sharp = 1 - edge = 1 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") block_chance = 50 @@ -83,13 +81,12 @@ /obj/item/weapon/harpoon name = "harpoon" sharp = 1 - edge = 0 desc = "Tharr she blows!" icon_state = "harpoon" item_state = "harpoon" force = 20 throwforce = 15 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL attack_verb = list("jabbed","stabbed","ripped") obj/item/weapon/wirerod @@ -100,7 +97,7 @@ obj/item/weapon/wirerod flags = CONDUCT force = 9 throwforce = 10 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL materials = list(MAT_METAL=1150, MAT_GLASS=75) attack_verb = list("hit", "bludgeoned", "whacked", "bonked") @@ -130,6 +127,20 @@ obj/item/weapon/wirerod/attackby(obj/item/I, mob/user, params) qdel(I) qdel(src) +/obj/item/weapon/throwing_star + name = "throwing star" + desc = "An ancient weapon still used to this day due to it's ease of lodging itself into victim's body parts" + icon_state = "throwingstar" + item_state = "eshield0" + force = 2 + throwforce = 20 //This is never used on mobs since this has a 100% embed chance. + throw_speed = 4 + embedded_pain_multiplier = 4 + w_class = WEIGHT_CLASS_SMALL + embed_chance = 100 + embedded_fall_chance = 0 //Hahaha! + sharp = 1 + materials = list(MAT_METAL=500, MAT_GLASS=500) /obj/item/weapon/spear/kidan icon_state = "kidanspear" diff --git a/code/game/objects/items/weapons/whetstone.dm b/code/game/objects/items/weapons/whetstone.dm index d498d4c75e8..c4595f2deb6 100644 --- a/code/game/objects/items/weapons/whetstone.dm +++ b/code/game/objects/items/weapons/whetstone.dm @@ -3,7 +3,7 @@ icon = 'icons/obj/kitchen.dmi' icon_state = "whetstone" desc = "A block of stone used to sharpen things." - w_class = 2 + w_class = WEIGHT_CLASS_SMALL usesound = 'sound/items/Screwdriver.ogg' var/used = 0 var/increment = 4 @@ -19,7 +19,7 @@ if(I.force >= max || I.throwforce >= max)//no esword sharpening to_chat(user, "[I] is much too powerful to sharpen further.") return - if(requires_sharpness && !I.edge) + if(requires_sharpness && !I.sharp) to_chat(user, "You can only sharpen items that are already sharp, such as knives.") return if(istype(I, /obj/item/weapon/twohanded))//some twohanded items should still be sharpenable, but handle force differently. therefore i need this stuff @@ -39,7 +39,6 @@ return user.visible_message("[user] sharpens [I] with [src]!", "You sharpen [I], making it much more deadly than before.") if(!requires_sharpness) - I.edge = 1 I.sharp = 1 I.force = Clamp(I.force + increment, 0, max) I.throwforce = Clamp(I.throwforce + increment, 0, max) @@ -63,4 +62,4 @@ increment = 200 max = 200 prefix = "super-sharpened" - requires_sharpness = 0 \ No newline at end of file + requires_sharpness = 0 diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 24fdc2e43ce..d1f1372caf3 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -8,7 +8,6 @@ var/throwforce = 1 var/list/attack_verb = list() //Used in attackby() to say how something was attacked "[x] has been [z.attack_verb] by [y] with [z]" var/sharp = 0 // whether this object cuts - var/edge = 0 // whether this object is more likely to dismember var/in_use = 0 // If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING! var/damtype = "brute" @@ -316,4 +315,7 @@ a { for(var/obj/item/Item in contents) //Empty out the contents Item.forceMove(new_loc) if(burn) - Item.fire_act() //Set them on fire, too \ No newline at end of file + Item.fire_act() //Set them on fire, too + +/obj/proc/on_mob_move(dir, mob/user) + return \ No newline at end of file diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm index 9636e1407b6..f3ab646c952 100644 --- a/code/game/objects/structures/artstuff.dm +++ b/code/game/objects/structures/artstuff.dm @@ -1,10 +1,3 @@ -///////////////// -// NEW DEFINES // -///////////////// - -/client - var/viewingCanvas = 0 //If this is 1, as soon as client /TRIES/ to move the view resets. - /////////// // EASEL // /////////// @@ -140,20 +133,4 @@ var/global/list/globalBlankCanvases[AMT_OF_CANVASES] icon = blank user.visible_message("[user] cleans the canvas.","You clean the canvas.") -//Examine to enlarge -/obj/item/weapon/canvas/examine(mob/user) - ..(user) - if(in_range(user, src) && get_turf(src) && user.client && ishuman(user)) //Let only humans be the robust zoominators. I'm too spooked other mobs trying to use it may get broken huds. - if(src.loc == user || get_turf(src) == get_turf(user)) - to_chat(user, "[src] has to be on the ground to focus on it!") - return - to_chat(user, "You focus on \the [src].") - user.client.screen = list() //This is because screen objects go way past the view bounds we set, therefore not allowing stretch to fit to zoom in properly. - user.client.reset_stretch = winget(user.client, "mapwindow.map", "icon-size") //Remember previous icon-size - user.client.view = 3 //Decrease view - winset(user.client, "mapwindow.map", "icon-size=0") //Enable stretch-to-fit - user.client.viewingCanvas = 1 //Reset everything we just changed as soon as client tries to move - else - to_chat(user, "It is too far away.") - #undef AMT_OF_CANVASES \ No newline at end of file diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 10f09401ba5..3190a69177d 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 + w_class = WEIGHT_CLASS_TINY item_color = "white" burn_state = FLAMMABLE slot_flags = SLOT_BACK @@ -204,7 +204,7 @@ LINEN BINS sheets.Add(I) amount++ to_chat(user, "You put [I] in [src].") - else if(amount && !hidden && I.w_class < 4) //make sure there's sheets to hide it among, make sure nothing else is hidden in there. + else if(amount && !hidden && I.w_class < WEIGHT_CLASS_BULKY) //make sure there's sheets to hide it among, make sure nothing else is hidden in there. user.drop_item() I.loc = src hidden = I @@ -255,4 +255,4 @@ LINEN BINS if(hidden) hidden.loc = loc - hidden = null \ No newline at end of file + hidden = null diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 7180e59b800..d5b966c7d98 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -56,7 +56,7 @@ if(throwing) // you keep some momentum when getting out of a thrown closet step(AM, dir) if(throwing) - throwing = 0 + throwing.finalize(FALSE) /obj/structure/closet/proc/open() if(opened) @@ -193,6 +193,9 @@ L[tmpname] = R var/desc = input("Please select a telepad.", "RCS") in L E.pad = L[desc] + if(!Adjacent(user)) + to_chat(user, "Unable to teleport, too far from crate.") + return playsound(E.loc, E.usesound, 50, 1) to_chat(user, "Teleporting [name]...") E.teleporting = 1 @@ -204,17 +207,22 @@ to_chat(user, "Error: User located in container--aborting for safety.") playsound(E.loc, 'sound/machines/buzz-sigh.ogg', 50, 1) return + if(!(E.rcell && E.rcell.use(E.chargecost))) + to_chat(user, "Unable to teleport, insufficient charge.") + return var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) s.start() do_teleport(src, E.pad, 0) - E.rcell.use(E.chargecost) to_chat(user, "Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left.") return else E.rand_x = rand(50,200) E.rand_y = rand(50,200) var/L = locate(E.rand_x, E.rand_y, 6) + if(!Adjacent(user)) + to_chat(user, "Unable to teleport, too far from crate.") + return playsound(E.loc, E.usesound, 50, 1) to_chat(user, "Teleporting [name]...") E.teleporting = 1 @@ -226,11 +234,13 @@ to_chat(user, "Error: User located in container--aborting for safety.") playsound(E.loc, 'sound/machines/buzz-sigh.ogg', 50, 1) return + if(!(E.rcell && E.rcell.use(E.chargecost))) + to_chat(user, "Unable to teleport, insufficient charge.") + return var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) s.start() do_teleport(src, L) - E.rcell.use(E.chargecost) to_chat(user, "Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left.") return else @@ -327,7 +337,7 @@ /obj/structure/closet/attack_hand(mob/user) add_fingerprint(user) toggle(user) - + /obj/structure/closet/attack_ghost(mob/user) if(user.can_advanced_admin_interact()) toggle(user) 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 7c58f4a2b1a..d7fdab50e5a 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/chaplain.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/chaplain.dm @@ -15,6 +15,9 @@ new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/suit/hooded/nun(src) new /obj/item/clothing/suit/hooded/chaplain_hoodie(src) + new /obj/item/clothing/suit/hooded/monk(src) + new /obj/item/clothing/suit/witchhunter(src) + new /obj/item/clothing/head/witchhunter_hat(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) 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 d130b22074c..58cad5e5f36 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -34,6 +34,7 @@ new /obj/item/taperoll/engineering(src) new /obj/item/clothing/head/beret/eng(src) new /obj/item/weapon/door_remote/chief_engineer(src) + new /obj/item/weapon/rpd(src) /obj/structure/closet/secure_closet/engineering_electrical name = "electrical supplies locker" @@ -143,3 +144,4 @@ new /obj/item/weapon/watertank/atmos(src) new /obj/item/clothing/suit/fire/atmos(src) new /obj/item/clothing/head/hardhat/atmos(src) + new /obj/item/weapon/rpd(src) 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 76b69edc28c..ed2599e91dd 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -327,7 +327,7 @@ new /obj/item/clothing/suit/storage/det_suit(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/gloves/color/black/forensics(src) new /obj/item/clothing/head/det_hat(src) new /obj/item/clothing/shoes/brown(src) new /obj/item/weapon/storage/box/evidence(src) diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index d651ad55adb..e9d9781bf0e 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -251,6 +251,10 @@ 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/under/medigown(src) + new /obj/item/clothing/under/medigown(src) + new /obj/item/clothing/under/medigown(src) + new /obj/item/clothing/under/medigown(src) new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/shoes/black(src) @@ -406,6 +410,10 @@ new /obj/item/clothing/suit/storage/labcoat(src) new /obj/item/clothing/mask/surgical(src) new /obj/item/clothing/mask/surgical(src) + new /obj/item/clothing/under/medigown(src) + new /obj/item/clothing/under/medigown(src) + new /obj/item/clothing/under/medigown(src) + new /obj/item/clothing/under/medigown(src) /obj/structure/closet/wardrobe/grey diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 07a738a8c94..010da69a834 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -102,6 +102,9 @@ L[tmpname] = R var/desc = input("Please select a telepad.", "RCS") in L E.pad = L[desc] + if(!Adjacent(user)) + to_chat(user, "Unable to teleport, too far from crate.") + return playsound(E.loc, E.usesound, 50, 1) to_chat(user, "Teleporting [src.name]...") E.teleporting = 1 @@ -109,17 +112,23 @@ E.teleporting = 0 return E.teleporting = 0 + if(!(E.rcell && E.rcell.use(E.chargecost))) + to_chat(user, "Unable to teleport, insufficient charge.") + return var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) s.start() do_teleport(src, E.pad, 0) - E.rcell.use(E.chargecost) to_chat(user, "Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left.") return + else E.rand_x = rand(50,200) E.rand_y = rand(50,200) var/L = locate(E.rand_x, E.rand_y, 6) + if(!Adjacent(user)) + to_chat(user, "Unable to teleport, too far from crate.") + return playsound(E.loc, E.usesound, 50, 1) to_chat(user, "Teleporting [src.name]...") E.teleporting = 1 @@ -127,11 +136,13 @@ E.teleporting = 0 return E.teleporting = 0 + if(!(E.rcell && E.rcell.use(E.chargecost))) + to_chat(user, "Unable to teleport, insufficient charge.") + return var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) s.start() do_teleport(src, L) - E.rcell.use(E.chargecost) to_chat(user, "Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left.") return else diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm index 104fac7fd69..0fbc7b97879 100644 --- a/code/game/objects/structures/curtains.dm +++ b/code/game/objects/structures/curtains.dm @@ -35,6 +35,44 @@ icon_state = "open" layer = SHOWER_OPEN_LAYER +/obj/structure/curtain/attackby(obj/item/W, mob/user) + if(istype(W, /obj/item/toy/crayon)) + color = input(user, "Choose Color") as color + else if(isscrewdriver(W)) + if(anchored) + playsound(loc, W.usesound, 100, 1) + user.visible_message("[user] unscrews [src] from the floor.", "You start to unscrew [src] from the floor...", "You hear rustling noises.") + if(do_after(user, 50 * W.toolspeed, target = src)) + if(!anchored) + return + anchored = FALSE + to_chat(user, "You unscrew [src] from the floor.") + else + playsound(loc, W.usesound, 100, 1) + user.visible_message("[user] screws [src] to the floor.", "You start to screw [src] to the floor...", "You hear rustling noises.") + if(do_after(user, 50 * W.toolspeed, target = src)) + if(anchored) + return + anchored = TRUE + to_chat(user, "You screw [src] to the floor.") + else if(istype(W, /obj/item/weapon/wirecutters)) + if(!anchored) + playsound(loc, W.usesound, 100, 1) + user.visible_message("[user] cuts apart [src].", "You start to cut apart [src].", "You hear cutting.") + if(do_after(user, 50 * W.toolspeed, target = src)) + if(anchored) + return + to_chat(user, "You cut apart [src].") + deconstruct() + else + . = ..() + +/obj/structure/curtain/proc/deconstruct(disassembled = TRUE) + new /obj/item/stack/sheet/cloth(loc, 2) + new /obj/item/stack/sheet/plastic(loc, 2) + new /obj/item/stack/rods(loc, 1) + qdel(src) + /obj/structure/curtain/black name = "black curtain" color = "#222222" @@ -59,4 +97,4 @@ color = "#000066" #undef SHOWER_OPEN_LAYER -#undef SHOWER_CLOSED_LAYER \ No newline at end of file +#undef SHOWER_CLOSED_LAYER diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 72638ff0943..16d77587274 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -105,19 +105,21 @@ var/global/list/captain_display_cases = list() var/ue = null var/image/occupant_overlay = null var/obj/item/weapon/airlock_electronics/circuit + var/start_showpiece_type = null //add type for items on display + +/obj/structure/displaycase/New() + . = ..() + if(start_showpiece_type) + occupant = new start_showpiece_type(src) + update_icon() /obj/structure/displaycase/captains_laser name = "captain's display case" desc = "A display case for the captain's antique laser gun. Hooked up with an anti-theft system." - burglar_alarm = 1 - -/obj/structure/displaycase/captains_laser/New() - captain_display_cases += src - req_access = list(access_captain) + burglar_alarm = 1 locked = 1 - spawn(5) - occupant = new /obj/item/weapon/gun/energy/laser/captain(src) - update_icon() + req_access = list(access_captain) + start_showpiece_type = /obj/item/weapon/gun/energy/laser/captain /obj/structure/displaycase/Destroy() dump() @@ -259,7 +261,7 @@ var/global/list/captain_display_cases = list() if(W.flags & ABSTRACT) to_chat(user, "You can't put this into the case.") return - if(user.a_intent == I_HARM) + if(user.a_intent == INTENT_HARM) if(locked && !destroyed) src.health -= W.force src.healthcheck() @@ -283,14 +285,14 @@ 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 == INTENT_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.") src.add_fingerprint(user) update_icon() else - if(user.a_intent == I_HARM) + if(user.a_intent == INTENT_HARM) user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) user.visible_message("[user.name] kicks \the [src]!", \ @@ -317,8 +319,9 @@ var/global/list/captain_display_cases = list() else 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.", \ + user.changeNext_move(CLICK_CD_MELEE) + user.visible_message("[user.name] gently runs \his hands over [src] in appreciation of its contents.", \ + "You gently run your hands over [src] in appreciation of its contents.", \ "You hear someone streaking glass with their greasy hands.") #undef DISPLAYCASE_FRAME_CIRCUIT diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index ed690192098..c93a481189d 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -43,7 +43,7 @@ /obj/structure/flora/tree/palm/New() ..() icon_state = pick("palm1","palm2") - pixel_x = 0 + pixel_x = 0 //grass /obj/structure/flora/grass @@ -209,7 +209,7 @@ icon_state = "plant-1" anchored = 0 layer = 5 - w_class = 5 + w_class = WEIGHT_CLASS_HUGE force = 10 throwforce = 13 throw_speed = 2 @@ -333,4 +333,4 @@ else qdel(src) else - return ..() \ No newline at end of file + return ..() diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index df1309b3d03..c1b4984c158 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -297,8 +297,8 @@ tforce = 5 else if(isobj(AM)) if(prob(50)) - var/obj/item/I = AM - tforce = max(0, I.throwforce * 0.5) + var/obj/O = AM + tforce = max(0, O.throwforce * 0.5) else if(anchored && !broken) var/turf/T = get_turf(src) var/obj/structure/cable/C = T.get_cable_node() diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index 265d1d1c236..2cdcfc18376 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 + w_class = WEIGHT_CLASS_NORMAL /obj/item/inflatable/attack_self(mob/user) playsound(loc, 'sound/items/zip.ogg', 75, 1) @@ -96,7 +96,7 @@ /obj/structure/inflatable/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(!istype(W)) return - if(can_puncture(W)) + if(is_pointed(W)) visible_message("[user] pierces [src] with [W]!") deflate(1) if(W.damtype == BRUTE || W.damtype == BURN) @@ -279,7 +279,7 @@ icon_state = "inf_box" item_state = "syringe_kit" max_combined_w_class = 21 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL /obj/item/weapon/storage/briefcase/inflatable/New() ..() diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 043177551ff..73c47ba98a6 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -82,9 +82,8 @@ playsound(loc, 'sound/effects/splat.ogg', 25, 1) H.forceMove(loc) H.emote("scream") - if(istype(H, /mob/living/carbon/human)) //So you don't get human blood when you spike a giant spidere - var/turf/simulated/pos = get_turf(H) - pos.add_blood_floor(H) + if(ishuman(H)) + H.add_splatter_floor() H.adjustBruteLoss(30) H.buckled = src H.dir = 2 diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 43d08cccee9..b53ca70f9da 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -136,7 +136,7 @@ if(do_after(user, digTool.digspeed * hardness, target = src) && src) to_chat(user, "You finished digging.") deconstruct(TRUE) - else if(user.a_intent != I_HARM) + else if(user.a_intent != INTENT_HARM) attack_hand(user) else attacked_by(W, user) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 39a7ac21301..540c2e079aa 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -102,8 +102,7 @@ if(!( A.anchored )) A.forceMove(src) playsound(loc, open_sound, 50, 1) - qdel(connected) - connected = null + QDEL_NULL(connected) else playsound(loc, open_sound, 50, 1) connected = new /obj/structure/m_tray( loc ) @@ -118,8 +117,7 @@ connected.icon_state = "morguet" connected.dir = dir else - qdel(connected) - connected = null + QDEL_NULL(connected) add_fingerprint(user) update() return @@ -155,8 +153,7 @@ A.forceMove(connected.loc) connected.icon_state = "morguet" else - qdel(connected) - connected = null + QDEL_NULL(connected) return /obj/structure/morgue/Destroy() @@ -183,14 +180,14 @@ */ /obj/structure/m_tray name = "morgue tray" - desc = "Apply corpse before closing." + desc = "Apply corpse before closing. May float away in no-gravity." icon = 'icons/obj/stationobjs.dmi' icon_state = "morguet" density = 1 layer = 2.0 var/obj/structure/morgue/connected = null anchored = 1.0 - throwpass = 1 + pass_flags = LETPASSTHROW /obj/structure/m_tray/attack_hand(mob/user as mob) @@ -306,8 +303,7 @@ if(!( A.anchored )) A.forceMove(src) playsound(loc, open_sound, 50, 1) - qdel(connected) - connected = null + QDEL_NULL(connected) else if(locked == 0) playsound(loc, open_sound, 50, 1) connected = new /obj/structure/c_tray( loc ) @@ -321,8 +317,7 @@ A.forceMove(connected.loc) connected.icon_state = "cremat" else - qdel(connected) - connected = null + QDEL_NULL(connected) add_fingerprint(user) update() @@ -355,8 +350,7 @@ A.forceMove(connected.loc) connected.icon_state = "cremat" else - qdel(connected) - connected = null + QDEL_NULL(connected) return /obj/structure/crematorium/proc/cremate(mob/user as mob) @@ -432,7 +426,7 @@ layer = 2.0 var/obj/structure/crematorium/connected = null anchored = 1.0 - throwpass = 1 + pass_flags = LETPASSTHROW /obj/structure/c_tray/attack_hand(mob/user as mob) if(connected) diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index db917ca5588..37a7bb13115 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -1,14 +1,14 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 + /datum/song var/name = "Untitled" var/list/lines = new() - var/tempo = 5 // delay between notes + var/tempo = 5 // delay between notes - var/playing = 0 // if we're playing - var/help = 0 // if help is open - var/repeat = 0 // number of times remaining to repeat - var/max_repeat = 10 // maximum times we can repeat + var/playing = 0 // if we're playing + var/help = 0 // if help is open + var/repeat = 0 // number of times remaining to repeat + var/max_repeat = 10 // maximum times we can repeat var/instrumentDir = "piano" // the folder with the sounds var/instrumentExt = "ogg" // the file extension @@ -26,7 +26,7 @@ // note is a number from 1-7 for A-G // acc is either "b", "n", or "#" // oct is 1-8 (or 9 for C) -/datum/song/proc/playnote(var/note, var/acc as text, var/oct) +/datum/song/proc/playnote(note, acc as text, oct) // handle accidental -> B<>C of E<>F if(acc == "b" && (note == 3 || note == 6)) // C or F if(note == 3) @@ -70,7 +70,7 @@ else return 1 -/datum/song/proc/playsong(mob/user as mob) +/datum/song/proc/playsong(mob/user) while(repeat >= 0) var/cur_oct[7] var/cur_acc[7] @@ -79,18 +79,14 @@ cur_acc[i] = "n" for(var/line in lines) -// to_chat(world, line) for(var/beat in splittext(lowertext(line), ",")) -// to_chat(world, "beat: [beat]") var/list/notes = splittext(beat, "/") for(var/note in splittext(notes[1], "-")) -// to_chat(world, "note: [note]") - if(!playing || shouldStopPlaying(user))//If the instrument is playing, or special case + if(!playing || shouldStopPlaying(user)) //If the instrument is playing, or special case playing = 0 return if(lentext(note) == 0) continue -// to_chat(world, "Parse: [copytext(note,1,2)]") var/cur_note = text2ascii(note) - 96 if(cur_note < 1 || cur_note > 7) continue @@ -244,6 +240,7 @@ playing = 0 /datum/song/proc/sanitize_tempo(new_tempo) + new_tempo = abs(new_tempo) return max(round(new_tempo, world.tick_lag), world.tick_lag) // subclass for handheld instruments, like violin @@ -269,6 +266,7 @@ /obj/structure/piano/New() + ..() song = new("piano", src) if(prob(50)) @@ -304,7 +302,7 @@ 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(iswrench(O)) if(!anchored && !isinspace()) playsound(src.loc, O.usesound, 50, 1) to_chat(user, " You begin to tighten \the [src] to the floor...") @@ -324,4 +322,4 @@ "You hear ratchet.") anchored = 0 else - ..() + return ..() diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index bfb5d584965..b1cf367ba1f 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -40,7 +40,7 @@ name = "sign" desc = "" icon = 'icons/obj/decals.dmi' - w_class = 3 //big + w_class = WEIGHT_CLASS_NORMAL burn_state = FLAMMABLE var/sign_state = "" @@ -182,10 +182,15 @@ icon_state = "nuke" /obj/structure/sign/clown - name = "\improper mech painting" + name = "\improper clown painting" desc = "A painting of the clown and mime. Awwww." icon_state = "clown" +/obj/structure/sign/bobross + name = "\improper calming painting" + desc = "We don't make mistakes, just happy little accidents." + icon_state = "bob" + /obj/structure/sign/singulo name = "\improper singulo painting" desc = "A mesmerizing painting of a singularity. It seems to suck you in..." @@ -225,4 +230,3 @@ name = "\improper Escape Arm" desc = "A direction sign, pointing out which way escape shuttle dock is." icon_state = "direction_evac" - 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 1835a1bb31a..bf261d606f9 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -17,6 +17,7 @@ burntime = 30 buildstackamount = 2 var/movable = 0 // For mobility checks + buckle_offset = -6 /obj/structure/stool/bed/MouseDrop(atom/over_object) ..(over_object, skip_fucking_stool_shit = 1) @@ -36,6 +37,7 @@ anchored = 0 buildstackamount = 10 buildstacktype = /obj/item/stack/sheet/wood + buckle_offset = 0 /obj/structure/stool/bed/dogbed/ian name = "Ian's bed" @@ -93,7 +95,7 @@ desc = "A collapsed roller bed that can be carried around." icon = 'icons/obj/rollerbed.dmi' icon_state = "folded" - w_class = 4 // Can't be put in backpacks. + w_class = WEIGHT_CLASS_BULKY // Can't be put in backpacks. /obj/item/roller/attack_self(mob/user) var/obj/structure/stool/bed/roller/R = new /obj/structure/stool/bed/roller(user.loc) @@ -139,5 +141,4 @@ to_chat(user, "You deploy the roller bed.") var/obj/structure/stool/bed/roller/R = new /obj/structure/stool/bed/roller(user.loc) R.add_fingerprint(user) - qdel(held) - held = null \ No newline at end of file + QDEL_NULL(held) 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 2b8cdd9e3ba..b76cd70d57b 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -5,7 +5,7 @@ buckle_lying = 0 //you sit in a chair, not lay burn_state = FIRE_PROOF buildstackamount = 1 - + buckle_offset = 0 var/propelled = 0 // Check for fire-extinguisher-driven chairs /obj/structure/stool/bed/chair/New() 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 6de3c88981d..6000b361aa5 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/stools.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/stools.dm @@ -54,7 +54,7 @@ icon_state = "stool" force = 10 throwforce = 10 - w_class = 5 + w_class = WEIGHT_CLASS_HUGE var/obj/structure/stool/origin = null /obj/item/weapon/stool/attack_self(mob/user as mob) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 76dc6a507a3..d6bec1019b2 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -18,7 +18,7 @@ density = 1 anchored = 1.0 layer = 2.8 - throwpass = 1 //You can throw objects over this, despite it's density.") + pass_flags = LETPASSTHROW climbable = 1 var/parts = /obj/item/weapon/table_parts @@ -127,7 +127,8 @@ return /obj/structure/table/CanPass(atom/movable/mover, turf/target, height=0) - if(height==0) return 1 + if(height == 0) + return 1 if(istype(mover,/obj/item/projectile)) return (check_cover(mover,target)) if(ismob(mover)) @@ -136,6 +137,8 @@ return 1 if(istype(mover) && mover.checkpass(PASSTABLE)) return 1 + if(mover.throwing) + return 1 if(locate(/obj/structure/table) in get_turf(mover)) return 1 if(flipped) @@ -409,6 +412,35 @@ /obj/structure/table/woodentable/poker/narsie_act() return +/* + * Fancy Tables + */ + +/obj/structure/table/wood/fancy + name = "fancy table" + desc = "A standard metal table frame covered with an amazingly fancy, patterned cloth." + icon = 'icons/obj/structures.dmi' + icon_state = "fancy_table" + parts = /obj/item/weapon/table_parts/fancy + canSmoothWith = list(/obj/structure/table/wood/fancy, /obj/structure/table/wood/fancy/black) + +/obj/structure/table/wood/fancy/New() + icon = 'icons/obj/smooth_structures/fancy_table.dmi' //so that the tables place correctly in the map editor + ..() + +/obj/structure/table/wood/fancy/black + icon_state = "fancy_table_black" + parts = /obj/item/weapon/table_parts/fancy/black + +/obj/structure/table/wood/fancy/black/New() + ..() + icon = 'icons/obj/smooth_structures/fancy_table_black.dmi' //so that the tables place correctly in the map editor + + +/* + * Glass Tables + */ + /obj/structure/glasstable_frame name = "glass table frame" desc = "A metal frame for a glass table." @@ -526,7 +558,7 @@ icon_state = "rack" density = 1 anchored = 1.0 - throwpass = 1 //You can throw objects over this, despite it's density. + pass_flags = LETPASSTHROW var/parts = /obj/item/weapon/rack_parts var/health = 5 @@ -563,6 +595,8 @@ return 1 if(istype(mover) && mover.checkpass(PASSTABLE)) return 1 + if(mover.throwing) + return 1 else return 0 diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 767d934c7dd..d3cc48d46bf 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -106,10 +106,10 @@ to_chat(user, "You need a tighter grip!") if(cistern) - if(I.w_class > 3) + if(I.w_class > WEIGHT_CLASS_NORMAL) to_chat(user, "[I] does not fit!") return - if(w_items + I.w_class > 5) + if(w_items + I.w_class > WEIGHT_CLASS_HUGE) to_chat(user, "The cistern is full!") return if(!user.drop_item()) @@ -120,6 +120,15 @@ to_chat(user, "You carefully place [I] into the cistern.") return +/obj/structure/toilet/secret + var/secret_type = null + +/obj/structure/toilet/secret/New() + . = ..() + if(secret_type) + var/obj/item/secret = new secret_type(src) + secret.desc += " It's a secret!" + w_items += secret.w_class /obj/structure/urinal diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 0c273e7f1fa..3cf48944814 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -247,6 +247,9 @@ obj/structure/windoor_assembly/Destroy() if(do_after(user, 40 * W.toolspeed, target = src)) if(src.loc && src.electronics) + for(var/obj/machinery/door/window/WD in loc) + if(WD.dir == dir) + return density = 1 //Shouldn't matter but just incase to_chat(user, "You finish the windoor!") diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index c74e2b47861..126dd6e3a38 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -108,22 +108,24 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f return 1 -/obj/structure/window/hitby(atom/movable/AM) - if(!CanPass(AM, get_step(src, AM.dir))) //So thrown objects that cross a tile with non-full windows will no longer hit the window even if it isn't visually obstructing the path. - ..() - var/tforce = 0 - if(isobj(AM)) - var/obj/item/I = AM - tforce = I.throwforce - if(reinf) tforce *= 0.25 - playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1) - health = max(0, health - tforce) - if(health <= 7 && !reinf) - anchored = 0 - update_nearby_icons() - step(src, get_dir(AM, src)) - if(health <= 0) - destroy() +/obj/structure/window/hitby(atom/movable/AM) + ..() + var/tforce = 0 + if(ismob(AM)) + tforce = 10 + else if(isobj(AM)) + var/obj/O = AM + tforce = O.throwforce + if(reinf) + tforce *= 0.25 + playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1) + health = max(0, health - tforce) + if(health <= 7 && !reinf) + anchored = 0 + update_nearby_icons() + step(src, get_dir(AM, src)) + if(health <= 0) + destroy() /obj/structure/window/attack_hand(mob/user as mob) @@ -131,7 +133,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 == INTENT_HARM) user.changeNext_move(CLICK_CD_MELEE) playsound(get_turf(src), 'sound/effects/glassknock.ogg', 80, 1) user.visible_message("[user.name] bangs against the [src.name]!", \ diff --git a/code/game/objects/weapons.dm b/code/game/objects/weapons.dm index b62efa1c049..f35fa65b3c7 100644 --- a/code/game/objects/weapons.dm +++ b/code/game/objects/weapons.dm @@ -2,8 +2,3 @@ name = "weapon" icon = 'icons/obj/weapons.dmi' hitsound = "swing_hit" - -/obj/item/weapon/Bump(mob/M as mob) - spawn(0) - ..() - return \ No newline at end of file diff --git a/code/game/response_team.dm b/code/game/response_team.dm index 5b0cec99de1..ebfe10f71e0 100644 --- a/code/game/response_team.dm +++ b/code/game/response_team.dm @@ -104,7 +104,7 @@ var/ert_request_answered = 0 active_team = response_team_type send_emergency_team = 1 - var/list/ert_candidates = pollCandidates("Join the Emergency Response Team?",, responseteam_age, 600, 1) + var/list/ert_candidates = pollCandidates("Join the Emergency Response Team?",, responseteam_age, 600, 1, role_playtime_requirements[ROLE_ERT]) if(!ert_candidates.len) active_team.cannot_send_team() send_emergency_team = 0 @@ -195,6 +195,8 @@ var/ert_request_answered = 0 ticker.mode.ert += M.mind M.forceMove(spawn_location) + job_master.CreateMoneyAccount(M, class, null) + active_team.equip_officer(class, M) return M @@ -332,6 +334,8 @@ var/ert_request_answered = 0 W.name = "[H.real_name]'s ID Card ([rt_job])" W.access = get_centcom_access(W.assignment) W.photo = get_id_photo(H) + if(H.mind && H.mind.initial_account && H.mind.initial_account.account_number) + W.associated_account_number = H.mind.initial_account.account_number /datum/outfit/job/centcom/response_team/imprint_pda(mob/living/carbon/human/H) var/obj/item/device/pda/PDA = H.wear_pda @@ -383,12 +387,13 @@ var/ert_request_answered = 0 /obj/item/clothing/head/helmet/space/hardsuit/ert/commander = 1, /obj/item/clothing/mask/gas/sechailer/swat = 1, /obj/item/weapon/restraints/handcuffs = 1, + /obj/item/clothing/shoes/magboots = 1, /obj/item/weapon/storage/lockbox/mindshield = 1 ) /datum/outfit/job/centcom/response_team/commander/gamma name = "RT Commander (Gamma)" - shoes = /obj/item/clothing/shoes/combat/swat + shoes = /obj/item/clothing/shoes/magboots/advance gloves = /obj/item/clothing/gloves/combat suit = /obj/item/clothing/suit/space/hardsuit/ert/commander glasses = /obj/item/clothing/glasses/hud/security/night @@ -453,6 +458,7 @@ var/ert_request_answered = 0 backpack_contents = list( /obj/item/clothing/head/helmet/space/hardsuit/ert/security = 1, /obj/item/clothing/mask/gas/sechailer = 1, + /obj/item/clothing/shoes/magboots = 1, /obj/item/weapon/storage/box/handcuffs = 1, /obj/item/weapon/gun/energy/ionrifle/carbine = 1 ) @@ -460,7 +466,7 @@ var/ert_request_answered = 0 /datum/outfit/job/centcom/response_team/security/gamma name = "RT Security (Gamma)" has_grenades = TRUE - shoes = /obj/item/clothing/shoes/combat/swat + shoes = /obj/item/clothing/shoes/magboots/advance gloves = /obj/item/clothing/gloves/combat suit = /obj/item/clothing/suit/space/hardsuit/ert/security suit_store = /obj/item/weapon/gun/energy/gun/nuclear @@ -505,7 +511,7 @@ var/ert_request_answered = 0 /datum/outfit/job/centcom/response_team/engineer/red name = "RT Engineer (Red)" - shoes = /obj/item/clothing/shoes/magboots + shoes = /obj/item/clothing/shoes/magboots/advance gloves = /obj/item/clothing/gloves/color/yellow suit = /obj/item/clothing/suit/space/hardsuit/ert/engineer suit_store = /obj/item/weapon/tank/emergency_oxygen/engi @@ -590,12 +596,13 @@ var/ert_request_answered = 0 /obj/item/weapon/storage/firstaid/toxin = 1, /obj/item/weapon/storage/firstaid/adv = 1, /obj/item/weapon/storage/firstaid/surgery = 1, - /obj/item/weapon/gun/energy/gun = 1 + /obj/item/weapon/gun/energy/gun = 1, + /obj/item/clothing/shoes/magboots = 1 ) /datum/outfit/job/centcom/response_team/medic/gamma name = "RT Medic (Gamma)" - shoes = /obj/item/clothing/shoes/combat/swat + shoes = /obj/item/clothing/shoes/magboots/advance gloves = /obj/item/clothing/gloves/combat suit = /obj/item/clothing/suit/space/hardsuit/ert/medical glasses = /obj/item/clothing/glasses/hud/health/night diff --git a/code/game/sound.dm b/code/game/sound.dm index 14269acb81f..8033e928173 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -15,6 +15,7 @@ var/list/ricochet = list('sound/weapons/effects/ric1.ogg', 'sound/weapons/effect var/list/terminal_type = list('sound/machines/terminal_button01.ogg', 'sound/machines/terminal_button02.ogg', 'sound/machines/terminal_button03.ogg', 'sound/machines/terminal_button04.ogg', 'sound/machines/terminal_button05.ogg', 'sound/machines/terminal_button06.ogg', 'sound/machines/terminal_button07.ogg', 'sound/machines/terminal_button08.ogg') +var/list/growls = list('sound/goonstation/voice/growl1.ogg', 'sound/goonstation/voice/growl2.ogg', 'sound/goonstation/voice/growl3.ogg') /proc/playsound(var/atom/source, soundin, vol as num, vary, extrarange as num, falloff, var/is_global, var/pitch) @@ -142,4 +143,6 @@ var/list/terminal_type = list('sound/machines/terminal_button01.ogg', 'sound/mac soundin = pick(ricochet) if("terminal_type") soundin = pick(terminal_type) + if("growls") + soundin = pick(growls) return soundin diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index cf1a1303025..22ccbecfdf6 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -45,12 +45,6 @@ if(wet_overlay) overlays -= wet_overlay -/turf/simulated/proc/AddTracks(var/typepath,var/bloodDNA,var/comingdir,var/goingdir,var/bloodcolor="#A10808") - var/obj/effect/decal/cleanable/blood/tracks/tracks = locate(typepath) in src - if(!tracks) - tracks = new typepath(src) - tracks.AddTracks(bloodDNA,comingdir,goingdir,bloodcolor) - /turf/simulated/Entered(atom/A, atom/OL, ignoreRest = 0) ..() if(!ignoreRest) @@ -73,29 +67,6 @@ if(M.flying) return ..() - // Tracking blood - var/list/bloodDNA = null - var/bloodcolor = "" - if(M.shoes) - var/obj/item/clothing/shoes/S = M.shoes - if(S.track_blood && S.blood_DNA) - bloodDNA = S.blood_DNA - bloodcolor = S.blood_color - S.track_blood-- - else - if(M.track_blood && M.feet_blood_DNA) - bloodDNA = M.feet_blood_DNA - bloodcolor = M.feet_blood_color - M.track_blood-- - - 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) - from.AddTracks(/obj/effect/decal/cleanable/blood/tracks/footprints,bloodDNA,0,M.dir,bloodcolor) // Going - - bloodDNA = null - switch(src.wet) if(TURF_WET_WATER) if(!(M.slip("wet floor", 4, 2, 0, 1))) @@ -110,32 +81,6 @@ 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(!..()) - return 0 - - if(!istype(M)) // To avoid non-humans from causing runtimes whena dding blood to the floor - return 0 - var/obj/effect/decal/cleanable/blood/B = locate() in contents //check for existing blood splatter - if(!B) - B = blood_splatter(src,M.get_blood(M.vessel),1) - if(B) - B.add_blood_list(M) - return 1 //we bloodied the floor - return 0 // Clean floors club - -// Only adds blood on the floor -- Skie -/turf/simulated/add_blood_floor(mob/living/carbon/M as mob) - if(ishuman(M)) - blood_splatter(src,M,1) - if( istype(M, /mob/living/carbon/alien )) - var/obj/effect/decal/cleanable/blood/xeno/this = new /obj/effect/decal/cleanable/blood/xeno(src) - this.blood_DNA["UNKNOWN BLOOD"] = "X*" - else if( istype(M, /mob/living/silicon/robot )) - new /obj/effect/decal/cleanable/blood/oil(src) - /turf/simulated/ChangeTurf(var/path) . = ..() smooth_icon_neighbors(src) diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index 94dc68b51f2..f4d281cdf68 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -145,6 +145,11 @@ burnt = 1 update_icon() +/turf/simulated/floor/carpet/black + icon = 'icons/turf/floors/carpet_black.dmi' + floor_tile = /obj/item/stack/tile/carpet/black + canSmoothWith = list(/turf/simulated/floor/carpet/black) + /turf/simulated/floor/fakespace icon = 'icons/turf/space.dmi' icon_state = "0" @@ -153,4 +158,4 @@ /turf/simulated/floor/fakespace/New() ..() - icon_state = "[rand(0,25)]" \ No newline at end of file + icon_state = "[rand(0,25)]" diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index aac7d370e21..234af2cfb72 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -385,8 +385,8 @@ return //Poster stuff - else if(istype(W,/obj/item/weapon/contraband/poster)) - place_poster(W,user) + else if(istype(W, /obj/item/weapon/poster)) + place_poster(W, user) return //Bone White - Place pipes on walls diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm index e462a1d77f8..43374ce66d8 100644 --- a/code/game/turfs/simulated/walls_reinforced.dm +++ b/code/game/turfs/simulated/walls_reinforced.dm @@ -317,8 +317,8 @@ return //Poster stuff - else if(istype(W,/obj/item/weapon/contraband/poster)) - place_poster(W,user) + else if(istype(W, /obj/item/weapon/poster)) + place_poster(W, user) return //Bone White - Place pipes on walls diff --git a/code/game/turfs/unsimulated/walls.dm b/code/game/turfs/unsimulated/walls.dm index 42a8b133a24..82f8c1390b5 100644 --- a/code/game/turfs/unsimulated/walls.dm +++ b/code/game/turfs/unsimulated/walls.dm @@ -16,10 +16,10 @@ icon = 'icons/obj/doors/Doorele.dmi' icon_state = "door_closed" -turf/unsimulated/wall/splashscreen +/turf/unsimulated/wall/splashscreen name = "Space Station 13" - icon = 'icons/misc/fullscreen.dmi' - icon_state = "title" + icon = 'config/title_screens/images/blank.png' + icon_state = "" layer = FLY_LAYER /turf/unsimulated/wall/other diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 6853baf0755..4ddab9ccf2c 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -103,6 +103,8 @@ var/global/nologevent = 0 Narrate to | Subtle message "} + if(check_rights(R_EVENT, 0)) + body += {" | Bless | Smite"} if(M.client) if(!istype(M, /mob/new_player)) @@ -907,12 +909,12 @@ var/gamma_ship_location = 1 // 0 = station , 1 = space toArea = locate(/area/shuttle/gamma/space) fromArea.move_contents_to(toArea) + for(var/obj/machinery/mech_bay_recharge_port/P in toArea) + P.update_recharge_turf() + for(var/obj/machinery/power/apc/A in toArea) A.init() - for(var/obj/machinery/alarm/A in toArea) - A.first_run() - if(gamma_ship_location) gamma_ship_location = 0 else diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index d6a5ede9ed8..4c9194d1225 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -229,7 +229,8 @@ var/list/admin_verbs_snpc = list( verbs += /client/proc/togglebuildmodeself if(holder.rights & R_ADMIN) verbs += admin_verbs_admin - control_freak = 0 + spawn(1) + control_freak = 0 if(holder.rights & R_BAN) verbs += admin_verbs_ban if(holder.rights & R_EVENT) diff --git a/code/modules/admin/banjob.dm b/code/modules/admin/banjob.dm index f95d5094446..3dffd403caf 100644 --- a/code/modules/admin/banjob.dm +++ b/code/modules/admin/banjob.dm @@ -140,3 +140,43 @@ DEBUG jobban_savebanfile() return 1 return 0 + +/mob/verb/displayjobbans() + set category = "OOC" + set name = "Display Current Jobbans" + set desc = "Displays all of your current jobbans." + + if(!client || !ckey) + return + if(config.ban_legacy_system) + //using the legacy .txt ban system + to_chat(src, "The server is using the legacy ban system. Ask an administrator for help!") + + else + //using the SQL ban system + var/is_actually_banned = FALSE + var/DBQuery/select_query = dbcon.NewQuery("SELECT bantime, bantype, reason, job, duration, expiration_time, a_ckey FROM [format_table_name("ban")] WHERE ckey like '[ckey]' AND ((bantype like 'JOB_TEMPBAN' AND expiration_time > Now()) OR (bantype like 'JOB_PERMABAN')) AND isnull(unbanned) ORDER BY bantime DESC LIMIT 100") + select_query.Execute() + + while(select_query.NextRow()) + + var/bantime = select_query.item[1] + var/bantype = select_query.item[2] + var/reason = select_query.item[3] + var/job = select_query.item[4] + var/duration = select_query.item[5] + var/expiration = select_query.item[6] + var/ackey = select_query.item[7] + + if(bantype == "JOB_PERMABAN") + to_chat(src, "[bantype]: [job] - REASON: [reason], by [ackey]; [bantime]") + else if(bantype == "JOB_TEMPBAN") + to_chat(src, "[bantype]: [job] - REASON: [reason], by [ackey]; [bantime]; [duration]; expires [expiration]") + + is_actually_banned = TRUE + + if(is_actually_banned) + if(config.banappeals) + to_chat(src, "You can appeal the bans at: [config.banappeals]") + else + to_chat(src, "You have no active jobbans!") diff --git a/code/modules/admin/buildmode.dm b/code/modules/admin/buildmode.dm index f246357e472..d628df054c6 100644 --- a/code/modules/admin/buildmode.dm +++ b/code/modules/admin/buildmode.dm @@ -376,10 +376,8 @@ return 1 /datum/click_intercept/buildmode/proc/deselect_region() - qdel(cornerA) - cornerA = null - qdel(cornerB) - cornerB = null + QDEL_NULL(cornerA) + QDEL_NULL(cornerB) /datum/click_intercept/buildmode/proc/Reset()//Reset temporary variables deselect_region() diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index c5004b9dd12..9692eac6713 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -68,9 +68,10 @@

    IC Events

    Teams
    Send SIT - Syndicate Infiltration Team   -
    Send in the Deathsquad   Send in a Syndie Strike Team   +
    Send in the Deathsquad   Send in a HONKsquad
    + Send in a Gimmick Team
    Change Security Level
    Security Level - Green   Security Level - Blue   diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 605c4acd1f3..2279d45a8ed 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1546,7 +1546,7 @@ to_chat(X, take_msg) else if(is_mhelp && check_rights(R_MOD|R_MENTOR, 0, X.mob)) to_chat(X, take_msg) - to_chat(M, "Your question is being attended to by [key_name(usr.client)]. Thanks for your patience!") + to_chat(M, "Your question is being attended to by [key_name(usr.client, null, 0)]. Thanks for your patience!") else to_chat(usr, "Unable to locate mob.") @@ -1728,7 +1728,7 @@ log_admin("[key_name(src.owner)] sent [key_name(H)] a [eviltype] fax") message_admins("[key_name_admin(src.owner)] replied to [key_name_admin(H)] with a [eviltype] fax") else if(href_list["Bless"]) - if(!check_rights(R_ADMIN)) + if(!check_rights(R_EVENT)) return var/mob/living/M = locateUID(href_list["Bless"]) if(!istype(M)) @@ -1778,7 +1778,7 @@ log_admin("[key_name(owner)] answered [key_name(M)]'s prayer with a blessing: [logmsg]") message_admins("[key_name_admin(owner)] answered [key_name_admin(M)]'s prayer with a blessing: [logmsg]") else if(href_list["Smite"]) - if(!check_rights(R_ADMIN)) + if(!check_rights(R_EVENT)) return var/mob/living/M = locateUID(href_list["Smite"]) var/mob/living/carbon/human/H @@ -1790,9 +1790,15 @@ H = M ptypes += "Brain Damage" ptypes += "Honk Tumor" + ptypes += "Hallucinate" + ptypes += "Cold" + ptypes += "Hunger" ptypes += "Cluwne" ptypes += "Mutagen Cookie" ptypes += "Hellwater Cookie" + ptypes += "Assassin" + ptypes += "Priest" + ptypes += "Lynch" var/punishment = input(owner, "How would you like to smite [M]?", "Its good to be baaaad...", "") as null|anything in ptypes if(!(punishment in ptypes)) return @@ -1820,6 +1826,15 @@ to_chat(H, "Life seems funnier, somehow.") organ.insert(H) logmsg = "a honk tumor." + if("Hallucinate") + H.Hallucinate(1000) + logmsg = "hallucinations." + if("Hunger") + H.nutrition = NUTRITION_LEVEL_CURSED + logmsg = "starvation." + if("Cold") + H.reagents.add_reagent("frostoil", 40) + H.reagents.add_reagent("ice", 40) if("Cluwne") H.makeCluwne() logmsg = "cluwned." @@ -1828,6 +1843,7 @@ evilcookie.reagents.add_reagent("mutagen", 10) evilcookie.desc = "It has a faint green glow." evilcookie.bitesize = 100 + evilcookie.flags = NODROP H.drop_l_hand() H.equip_to_slot_or_del(evilcookie, slot_l_hand) logmsg = "a mutagen cookie." @@ -1836,9 +1852,92 @@ evilcookie.reagents.add_reagent("hell_water", 25) evilcookie.desc = "Sulphur-flavored." evilcookie.bitesize = 100 + evilcookie.flags = NODROP H.drop_l_hand() H.equip_to_slot_or_del(evilcookie, slot_l_hand) logmsg = "a hellwater cookie." + if("Priest") + logmsg = "priest." + H.mutations |= NOCLONE + message_admins("[key_name_admin(owner)] is sending a dark priest to assassinate [key_name_admin(M)]...") + var/list/candidates = pollCandidates("Do you want to play as a murderous dark priest?") + if(!candidates.len) + to_chat(usr, "ERROR: Could not create priest. No valid candidates.") + return + var/mob/C = pick(candidates) + var/key_of_priest = C.key + if(!key_of_priest) + to_chat(usr, "ERROR: Could not create priest. Could not pick key.") + return + var/datum/mind/priest_mind = new /datum/mind(key_of_priest) + priest_mind.active = 1 + var/mob/living/carbon/human/priest_mob = new /mob/living/carbon/human(pick(latejoin)) + priest_mind.transfer_to(priest_mob) + var/datum/outfit/admin/dark_priest/O = new /datum/outfit/admin/dark_priest + priest_mob.equipOutfit(O, FALSE) + var/obj/item/weapon/pinpointer/advpinpointer/N = new /obj/item/weapon/pinpointer/advpinpointer(priest_mob) + priest_mob.equip_to_slot_or_del(N, slot_r_store) + N.active = 1 + N.mode = 2 + N.target = H + N.point_at(N.target) + N.flags |= NODROP + var/datum/objective/assassinate/kill_objective = new + kill_objective.owner = priest_mind + kill_objective.target = H.mind + kill_objective.explanation_text = "Murder [H.real_name], the [H.mind.assigned_role], in the name of the dark gods." + priest_mind.objectives += kill_objective + ticker.mode.traitors |= priest_mob.mind + to_chat(priest_mob, "ATTENTION: You are now a dark priest!") + to_chat(priest_mob, "Goal: MURDER [H.real_name], currently in [get_area(H.loc)], in the name of the dark gods. "); + to_chat(priest_mob, "The gods will prevent their revival."); + priest_mob.mind.special_role = SPECIAL_ROLE_TRAITOR + var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_TRAITOR] + tatorhud.join_hud(priest_mob) + ticker.mode.set_antag_hud(priest_mob, "hudsyndicate") + if("Assassin") + logmsg = "assassin." + var/list/possible_traitors = list() + for(var/mob/living/player in living_mob_list) + if(player.client && player.mind && !player.mind.special_role && player.stat != DEAD && player != H) + if(ishuman(player)) + if(player.client && (ROLE_TRAITOR in player.client.prefs.be_special) && !jobban_isbanned(player, ROLE_TRAITOR) && !jobban_isbanned(player, "Syndicate")) + possible_traitors += player.mind + for(var/datum/mind/player in possible_traitors) + if(player.current) + if(ismindshielded(player.current)) + possible_traitors -= player + if(possible_traitors.len) + var/datum/mind/newtraitormind = pick(possible_traitors) + var/mob/living/newtraitor = newtraitormind.current + var/datum/objective/assassinate/kill_objective = new + kill_objective.owner = newtraitormind + kill_objective.target = H.mind + kill_objective.explanation_text = "Assassinate [H.real_name], the [H.mind.assigned_role]." + newtraitormind.objectives += kill_objective + ticker.mode.equip_traitor(newtraitor) + ticker.mode.traitors |= newtraitor.mind + to_chat(newtraitor, "ATTENTION: It is time to pay your debt to the Syndicate...") + to_chat(newtraitor, "You are now a traitor.") + to_chat(newtraitor, "Goal: KILL [H.real_name], currently in [get_area(H.loc)]"); + newtraitor.mind.special_role = SPECIAL_ROLE_TRAITOR + var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_TRAITOR] + tatorhud.join_hud(newtraitor) + ticker.mode.set_antag_hud(newtraitor, "hudsyndicate") + else + to_chat(usr, "ERROR: Failed to create a traitor.") + return + if("Lynch") + logmsg = "lynch." + for(var/datum/mind/crew in ticker.minds) + if(!crew.current) + continue + if(!isliving(crew.current)) + continue + if(crew == H.mind) + continue + to_chat(crew.current, "
    The gods have given you a task: find [H.real_name], located in [get_area(H.loc)], and slay them!"); + to_chat(crew.current, "Do not harm anyone other than [H.real_name] while carrying out this task.
    "); if("Gib") logmsg = "gibbed." M.gib(FALSE) @@ -1857,7 +1956,7 @@ P.name = "Central Command - paper" 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


    " + var/tmsg = "



    Nanotrasen Science Station Cyberiad


    NAS Trurl Communications Department Report


    " 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") @@ -2425,6 +2524,10 @@ if(usr.client.syndicate_infiltration_team()) feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","SyndieInfiltrationTeam") + if("gimmickteam") + if(usr.client.gimmick_team()) + feedback_inc("admin_secrets_fun_used",1) + feedback_add_details("admin_secrets_fun_used","GimmickTeam") if("tripleAI") usr.client.triple_ai() feedback_inc("admin_secrets_fun_used",1) diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 7e94010b3b4..9976c7d10b9 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -150,12 +150,11 @@ adminhelp(reply) //sender has left, adminhelp instead return - // for emoji, we have to define a specific span for jquery to look for - msg = "[msg]" - recieve_message = "[type] from-[recieve_pm_type][key_name(src, C, C.holder ? 1 : 0, type)]: [msg]" + var/emoji_msg = "[msg]" + recieve_message = "[type] from-[recieve_pm_type][key_name(src, C, C.holder ? 1 : 0, type)]: [emoji_msg]" to_chat(C, recieve_message) - to_chat(src, "[send_pm_type][type] to-[key_name(C, src, holder ? 1 : 0, type)]: [msg]") + to_chat(src, "[send_pm_type][type] to-[key_name(C, src, holder ? 1 : 0, type)]: [emoji_msg]") /*if(holder && !C.holder) C.last_pm_recieved = world.time @@ -176,13 +175,13 @@ switch(type) if("Mentorhelp") if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, X.mob)) - to_chat(X, "[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [msg]") + to_chat(X, "[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [emoji_msg]") if("Adminhelp") if(check_rights(R_ADMIN|R_MOD, 0, X.mob)) - to_chat(X, "[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [msg]") + to_chat(X, "[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [emoji_msg]") else if(check_rights(R_ADMIN|R_MOD, 0, X.mob)) - to_chat(X, "[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [msg]") + to_chat(X, "[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [emoji_msg]") /client/proc/cmd_admin_irc_pm() if(prefs.muted & MUTE_ADMINHELP) diff --git a/code/modules/admin/verbs/gimmick_team.dm b/code/modules/admin/verbs/gimmick_team.dm new file mode 100644 index 00000000000..2ca1d3c27df --- /dev/null +++ b/code/modules/admin/verbs/gimmick_team.dm @@ -0,0 +1,96 @@ +// Gimmick Team +// Spawns a group of player-controlled mobs with an outfit specified by the admin, at their location. + +/client/proc/gimmick_team() + set category = "Event" + set name = "Send Gimmick Team" + set desc = "Spawns a group of players in the specified outfit." + if(!check_rights(R_EVENT)) + return + if(!ticker) + alert("The game hasn't started yet!") + return + if(alert("Do you want to spawn a Gimmick Team at YOUR CURRENT LOCATION?",,"Yes","No")=="No") + return + var/turf/T = get_turf(mob) + var/pick_manually = 0 + if(alert("Pick the team members manually? If you select yes, you pick from ghosts. If you select no, ghosts get offered the chance to join.",,"Yes","No")=="Yes") + pick_manually = 1 + var/list/teamsizeoptions = list(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) + var/teamsize = input(src, "How many team members?") as null|anything in teamsizeoptions + if(!(teamsize in teamsizeoptions)) + alert("Invalid team size specified. Aborting.") + return + var/themission = null + while(!themission) + themission = sanitize(copytext(input(src, "Please specify a briefing message for the team.", "Specify Mission", ""),1,MAX_MESSAGE_LEN)) + if(!themission) + alert("No mission specified. Aborting.") + return + var/admin_outfits = subtypesof(/datum/outfit/admin) + var/outfit_list = list() + for(var/type in admin_outfits) + var/datum/outfit/admin/O = type + outfit_list[initial(O.name)] = type + var/dresscode = input("Select Outfit", "Dress-a-mob") as null|anything in outfit_list + if(isnull(dresscode)) + return + var/is_syndicate = 0 + if(alert("Do you want these characters automatically classified as antagonists?",,"Yes","No")=="Yes") + is_syndicate = 1 + + var/list/players_to_spawn = list() + if(pick_manually) + var/list/possible_ghosts = list() + for(var/mob/dead/observer/G in player_list) + if(!G.client.is_afk()) + if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD)) + possible_ghosts += G + for(var/i=teamsize,(i>0&&possible_ghosts.len),i--) //Decrease with every member selected. + var/candidate = input("Pick characters to spawn. This will go on until there either no more ghosts to pick from, or the slots are full.", "Active Players") as null|anything in possible_ghosts // auto-picks if only one candidate + possible_ghosts -= candidate + players_to_spawn += candidate + else + to_chat(src, "Polling candidates...") + players_to_spawn = pollCandidates("Do you want to play as an event character?") + + if(!players_to_spawn.len) + to_chat(src, "Nobody volunteered.") + return 0 + + var/datum/outfit/O = outfit_list[dresscode] + + var/players_spawned = 0 + for(var/mob/thisplayer in players_to_spawn) + var/mob/living/carbon/human/H = new /mob/living/carbon/human(T) + H.name = random_name(pick(MALE,FEMALE)) + var/datum/preferences/A = new() //Randomize appearance + A.real_name = H.name + A.copy_to(H) + H.dna.ready_dna(H) + + H.mind_initialize() + H.mind.assigned_role = "MODE" + H.mind.special_role = "Event Character" + + H.key = thisplayer.key + + H.equipOutfit(O, FALSE) + + to_chat(H, "
    [themission]") + H.mind.store_memory("[themission]

    ") + + if(is_syndicate) + ticker.mode.traitors |= H.mind //Adds them to extra antag list + + players_spawned++ + if(players_spawned >= teamsize) + break + + + message_admins("[key_name_admin(src)] has spawned a Gimmick Team.", 1) + log_admin("[key_name(src)] used Spawn Gimmick Team.") + feedback_add_details("admin_verb","SPAWNGIM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +// --------------------------------------------------------------------------------------------------------- + diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 04f8b29da0c..8d201d6ee8a 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -35,6 +35,9 @@ client/proc/one_click_antag() var/list/mob/living/carbon/human/candidates = list() var/mob/living/carbon/human/H = null + log_admin("[key_name(owner)] tried making Traitors with One-Click-Antag") + message_admins("[key_name_admin(owner)] tried making Traitors with One-Click-Antag") + for(var/mob/living/carbon/human/applicant in player_list) if(ROLE_TRAITOR in applicant.client.prefs.be_special) if(player_old_enough_antag(applicant.client,ROLE_TRAITOR)) @@ -69,6 +72,9 @@ client/proc/one_click_antag() var/list/mob/living/carbon/human/candidates = list() var/mob/living/carbon/human/H = null + log_admin("[key_name(owner)] tried making Changelings with One-Click-Antag") + message_admins("[key_name_admin(owner)] tried making Changelings with One-Click-Antag") + for(var/mob/living/carbon/human/applicant in player_list) if(ROLE_CHANGELING in applicant.client.prefs.be_special) if(player_old_enough_antag(applicant.client,ROLE_CHANGELING)) @@ -101,6 +107,9 @@ client/proc/one_click_antag() var/list/mob/living/carbon/human/candidates = list() var/mob/living/carbon/human/H = null + log_admin("[key_name(owner)] tried making Revolutionaries with One-Click-Antag") + message_admins("[key_name_admin(owner)] tried making Revolutionaries with One-Click-Antag") + for(var/mob/living/carbon/human/applicant in player_list) if(ROLE_REV in applicant.client.prefs.be_special) if(player_old_enough_antag(applicant.client,ROLE_REV)) @@ -127,6 +136,9 @@ client/proc/one_click_antag() var/list/candidates = pollCandidates("Do you wish to be considered for the position of a Wizard Foundation 'diplomat'?", "wizard") + log_admin("[key_name(owner)] tried making a Wizard with One-Click-Antag") + message_admins("[key_name_admin(owner)] tried making a Wizard with One-Click-Antag") + if(candidates.len) var/mob/dead/observer/selected = pick(candidates) candidates -= selected @@ -146,6 +158,9 @@ client/proc/one_click_antag() var/list/mob/living/carbon/human/candidates = list() var/mob/living/carbon/human/H = null + log_admin("[key_name(owner)] tried making a Cult with One-Click-Antag") + message_admins("[key_name_admin(owner)] tried making a Cult with One-Click-Antag") + for(var/mob/living/carbon/human/applicant in player_list) if(ROLE_CULTIST in applicant.client.prefs.be_special) if(player_old_enough_antag(applicant.client,ROLE_CULTIST)) @@ -177,6 +192,9 @@ client/proc/one_click_antag() var/mob/theghost = null var/time_passed = world.time + log_admin("[key_name(owner)] tried making a Nuke Op Team with One-Click-Antag") + message_admins("[key_name_admin(owner)] tried making a Nuke Op Team with One-Click-Antag") + for(var/mob/G in respawnable_list) if(istype(G) && G.client && (ROLE_OPERATIVE in G.client.prefs.be_special)) if(!jobban_isbanned(G, "operative") && !jobban_isbanned(G, "Syndicate")) @@ -265,10 +283,18 @@ client/proc/one_click_antag() //Abductors /datum/admins/proc/makeAbductorTeam() new /datum/event/abductor + + log_admin("[key_name(owner)] tried making Abductors with One-Click-Antag") + message_admins("[key_name_admin(owner)] tried making Abductors with One-Click-Antag") + return 1 /datum/admins/proc/makeAliens() var/datum/event/alien_infestation/E = new /datum/event/alien_infestation + + log_admin("[key_name(owner)] tried making Aliens with One-Click-Antag") + message_admins("[key_name_admin(owner)] tried making Aliens with One-Click-Antag") + E.spawncount = 3 // TODO The fact we have to do this rather than just have events start // when we ask them to, is bad. @@ -289,6 +315,9 @@ client/proc/one_click_antag() if(prob(10)) input = "Save Runtime and any other cute things on the station." + log_admin("[key_name(owner)] tried making a Death Squad with One-Click-Antag") + message_admins("[key_name_admin(owner)] tried making a Death Squad with One-Click-Antag") + var/syndicate_leader_selected = 0 //when the leader is chosen. The last person spawned. //Generates a list of commandos from active ghosts. Then the user picks which characters to respawn as the commandos. @@ -400,6 +429,9 @@ client/proc/one_click_antag() var/leader_chosen = 0 //when the leader is chosen. The last person spawned. + log_admin("[key_name(owner)] tried making Vox Raiders with One-Click-Antag") + message_admins("[key_name_admin(owner)] tried making Vox Raiders with One-Click-Antag") + //Generates a list of candidates from active ghosts. for(var/mob/G in respawnable_list) if(istype(G) && G.client && (ROLE_RAIDER in G.client.prefs.be_special)) @@ -502,6 +534,9 @@ client/proc/one_click_antag() var/list/mob/living/carbon/human/candidates = list() var/mob/living/carbon/human/H = null + log_admin("[key_name(owner)] tried making Vampires with One-Click-Antag") + message_admins("[key_name_admin(owner)] tried making Vampires with One-Click-Antag") + for(var/mob/living/carbon/human/applicant in player_list) if(ROLE_VAMPIRE in applicant.client.prefs.be_special) if(player_old_enough_antag(applicant.client,ROLE_VAMPIRE)) @@ -533,6 +568,9 @@ client/proc/one_click_antag() var/mob/theghost = null var/time_passed = world.time + log_admin("[key_name(owner)] tried making Thunderdome Teams with One-Click-Antag") + message_admins("[key_name_admin(owner)] tried making Thunderdone Teams with One-Click-Antag") + //Generates a list of candidates from active ghosts. for(var/mob/G in respawnable_list) spawn(0) diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm index 9bfe544cef5..79914745e79 100644 --- a/code/modules/admin/verbs/onlyone.dm +++ b/code/modules/admin/verbs/onlyone.dm @@ -37,7 +37,7 @@ H.equip_to_slot_or_del(new /obj/item/clothing/under/kilt(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(H), slot_l_ear) H.equip_to_slot_or_del(new /obj/item/clothing/head/beret(H), slot_head) - H.equip_to_slot_or_del(new /obj/item/weapon/claymore(H), slot_r_hand) + H.equip_to_slot_or_del(new /obj/item/weapon/claymore/highlander(H), slot_r_hand) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/weapon/pinpointer(H.loc), slot_l_store) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index af865f7f5c8..6b5f6f16249 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -687,7 +687,7 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("[key_name_admin(usr)] has gibbed [key_name_admin(M)]", 1) if(istype(M, /mob/dead/observer)) - gibs(M.loc, M.viruses) + gibs(M.loc) return M.gib() diff --git a/code/modules/admin/verbs/ticklag.dm b/code/modules/admin/verbs/ticklag.dm index f49984b8fb3..316adf935b0 100644 --- a/code/modules/admin/verbs/ticklag.dm +++ b/code/modules/admin/verbs/ticklag.dm @@ -15,9 +15,6 @@ world.tick_lag = newtick feedback_add_details("admin_verb","TICKLAG") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - switch(alert("Enable Tick Compensation?","Tick Comp is currently: [config.Tickcomp]","Yes","No")) - if("Yes") config.Tickcomp = 1 - else config.Tickcomp = 0 else to_chat(src, "Error: ticklag(): Invalid world.ticklag value. No changes made.") diff --git a/code/modules/arcade/arcade_prize.dm b/code/modules/arcade/arcade_prize.dm index d3457696268..6af1ca30f36 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 + w_class = WEIGHT_CLASS_TINY max_amount = 9999 //Dang that's a lot of tickets /obj/item/stack/tickets/New(var/loc, var/amount=null) @@ -86,4 +86,4 @@ else if(amount >= 4) icon_state = "tickets_2" else - icon_state = "tickets_1" \ No newline at end of file + icon_state = "tickets_1" diff --git a/code/modules/arcade/mob_hunt/mob_avatar.dm b/code/modules/arcade/mob_hunt/mob_avatar.dm index 8717d5eb2a5..4603622da2a 100644 --- a/code/modules/arcade/mob_hunt/mob_avatar.dm +++ b/code/modules/arcade/mob_hunt/mob_avatar.dm @@ -42,9 +42,9 @@ attempt_capture(P, -20) //attempting a melee capture reduces the mob's effective run_chance by 20% to balance the risk of triggering a trap mob return 1 -/obj/effect/nanomob/hitby(obj/item/O) - if(istype(O, /obj/item/device/pda)) - var/obj/item/device/pda/P = O +/obj/effect/nanomob/hitby(atom/movable/AM) + if(istype(AM, /obj/item/device/pda)) + var/obj/item/device/pda/P = AM attempt_capture(P) //attempting a ranged capture does not affect the mob's effective run_chance but does prevent you from being shocked by a trap mob return 1 diff --git a/code/modules/arcade/mob_hunt/mob_cards.dm b/code/modules/arcade/mob_hunt/mob_cards.dm index 0479644ad85..26393e8e370 100644 --- a/code/modules/arcade/mob_hunt/mob_cards.dm +++ b/code/modules/arcade/mob_hunt/mob_cards.dm @@ -7,7 +7,7 @@ icon_state = "trade_card" force = 0 throwforce = 1 - w_class = 1 + w_class = WEIGHT_CLASS_TINY var/datum/mob_hunt/mob_data /obj/item/weapon/nanomob_card/proc/update_info() @@ -40,4 +40,4 @@ /obj/item/weapon/storage/box/nanomob_booster_pack/New() ..() for(var/i in 1 to 6) - new /obj/item/weapon/nanomob_card/booster(src) \ No newline at end of file + new /obj/item/weapon/nanomob_card/booster(src) diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index bd981e99076..34cb4c458f0 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -4,12 +4,12 @@ icon = 'icons/obj/assemblies/new_assemblies.dmi' icon_state = "" flags = CONDUCT - w_class = 2 + w_class = WEIGHT_CLASS_SMALL materials = list(MAT_METAL=100) throwforce = 2 throw_speed = 3 throw_range = 10 - origin_tech = "magnets=1" + origin_tech = "magnets=1;engineering=1" toolspeed = 1 usesound = 'sound/items/Deconstruct.ogg' diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index f6019ace266..41a67a43560 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 + w_class = WEIGHT_CLASS_NORMAL throw_speed = 2 throw_range = 4 flags = CONDUCT //Copied this from old code, so this may or may not be necessary @@ -171,4 +171,4 @@ if(!T) return T.assume_air(removed) - air_update_turf() \ No newline at end of file + air_update_turf() diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 47d33a1e5ce..f4a71a77ced 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 + w_class = WEIGHT_CLASS_SMALL throw_speed = 3 throw_range = 10 @@ -100,7 +100,7 @@ a_left.hear_talk(M, msg) if(a_right) a_right.hear_talk(M, msg) - + hear_message(mob/living/M as mob, msg) if(a_left) a_left.hear_message(M, msg) @@ -210,8 +210,3 @@ qdel(src) return return - - - - - diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 3e0c8061ceb..16b047ab1f0 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -3,7 +3,7 @@ desc = "Emits a visible or invisible beam and is triggered when the beam is interrupted." icon_state = "infrared" materials = list(MAT_METAL=1000, MAT_GLASS=500) - origin_tech = "magnets=2" + origin_tech = "magnets=2;materials=2" bomb_name = "tripwire mine" diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index 02a869c9bc3..e22923fa965 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -3,7 +3,7 @@ desc = "A handy little spring-loaded trap for catching pesty rodents." icon_state = "mousetrap" materials = list(MAT_METAL=100) - origin_tech = "combat=1" + origin_tech = "combat=1;materials=2;engineering=1" var/armed = 0 bomb_name = "contact mine" @@ -101,7 +101,7 @@ if(armed) if(ishuman(AM)) var/mob/living/carbon/H = AM - if(H.m_intent == "run") + if(H.m_intent == MOVE_INTENT_RUN) triggered(H) H.visible_message("[H] accidentally steps on [src].", \ "You accidentally step on [src]") diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index f3296cdabb0..767fe11b8c6 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -3,7 +3,7 @@ desc = "Used for scanning and alerting when someone enters a certain proximity." icon_state = "prox" materials = list(MAT_METAL=800, MAT_GLASS=200) - origin_tech = "magnets=1" + origin_tech = "magnets=1;engineering=1" secured = 0 diff --git a/code/modules/assembly/shock_kit.dm b/code/modules/assembly/shock_kit.dm index 6ffe6f42d12..aa8bc299e66 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 + w_class = WEIGHT_CLASS_HUGE flags = CONDUCT /obj/item/assembly/shock_kit/Destroy() diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 9a76869d339..959a8d60452 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -4,7 +4,7 @@ icon_state = "signaller" item_state = "signaler" materials = list(MAT_METAL=400, MAT_GLASS=120) - origin_tech = "magnets=1" + origin_tech = "magnets=1;bluespace=1" wires = WIRE_RECEIVE | WIRE_PULSE | WIRE_RADIO_PULSE | WIRE_RADIO_RECEIVE secured = 1 diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm index 0587a806b2b..eeed711ee29 100644 --- a/code/modules/assembly/timer.dm +++ b/code/modules/assembly/timer.dm @@ -3,7 +3,7 @@ desc = "Used to time things. Works well with contraptions which has to count down. Tick tock." icon_state = "timer" materials = list(MAT_METAL=500, MAT_GLASS=50) - origin_tech = "magnets=1" + origin_tech = "magnets=1;engineering=1" secured = 0 diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index ba0752dd28e..05f5b62a741 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -3,7 +3,7 @@ desc = "A small electronic device able to record a voice sample, and send a signal when that sample is repeated." icon_state = "voice" materials = list(MAT_METAL=500, MAT_GLASS=50) - origin_tech = "magnets=1" + origin_tech = "magnets=1;engineering=1" var/listening = 0 var/recorded = null //the activation message var/recorded_type = 0 // 0 for say, 1 for emote @@ -18,10 +18,10 @@ hear_talk(mob/living/M as mob, msg) hear_input(M, msg, 0) - + hear_message(mob/living/M as mob, msg) hear_input(M, msg, 1) - + proc/hear_input(mob/living/M as mob, msg, type) if(!istype(M,/mob/living)) return diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 72534169e6d..d3dd6a5438b 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -302,6 +302,31 @@ proc/getFilesSlow(var/client/client, var/list/files, var/register_asset = TRUE) send_asset_list(client, assets, verify) +//Pipe sprites for UIs +/datum/asset/rpd + var/assets = list() + var/verify = FALSE + +/datum/asset/rpd/register() + for(var/state in icon_states('icons/obj/pipe-item.dmi')) + if(!(state in list("cap", "connector", "dtvalve", "dual-port vent", "dvalve", "filter", "he", "heunary", "injector", "junction", "manifold", "mixer", "tvalve", "mvalve", "passive vent", "passivegate", "pump", "scrubber", "simple", "universal", "uvent", "volumepump"))) //Basically all the pipes we want sprites for + continue + if(state in list("he", "simple")) + for(var/D in alldirs) + assets["[state]-[dir2text(D)].png"] = icon('icons/obj/pipe-item.dmi', state, D) + for(var/D in cardinal) + assets["[state]-[dir2text(D)].png"] = icon('icons/obj/pipe-item.dmi', state, D) + for(var/state in icon_states('icons/obj/pipes/disposal.dmi')) + if(!(state in list("conpipe-c", "conpipe-j1", "conpipe-s", "conpipe-t", "conpipe-y", "intake", "outlet"))) //Pipes we want sprites for + continue + for(var/D in cardinal) + assets["[state]-[dir2text(D)].png"] = icon('icons/obj/pipes/disposal.dmi', state, D) + for(var/asset_name in assets) + register_asset(asset_name, assets[asset_name]) + +/datum/asset/rpd/send(client) + send_asset_list(client, assets, verify) + //Mob Hunt sprites for UIs /datum/asset/mob_hunt var/assets = list() diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index d547a9a582f..ca3d17e9c50 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -76,8 +76,6 @@ "off" = "borgmacro") ) - var/reset_stretch = 0 //Used by things that fiddle with client's stretch-to-fit. - var/topic_debugging = 0 //if set to true, allows client to see nanoUI errors -- yes i realize this is messy but it'll make live testing infinitely easier control_freak = CONTROL_FREAK_ALL | CONTROL_FREAK_SKIN | CONTROL_FREAK_MACROS @@ -93,7 +91,7 @@ // Donator stuff. var/donator_level = DONATOR_LEVEL_NONE - + // If set to true, this client can interact with atoms such as buttons and doors on top of regular machinery interaction var/advanced_admin_interaction = FALSE diff --git a/code/modules/client/preference/loadout/loadout_accessories.dm b/code/modules/client/preference/loadout/loadout_accessories.dm index c591295d940..8353514fb37 100644 --- a/code/modules/client/preference/loadout/loadout_accessories.dm +++ b/code/modules/client/preference/loadout/loadout_accessories.dm @@ -134,8 +134,13 @@ display_name = "cowboy shirt, short sleeved navy" path = /obj/item/clothing/accessory/cowboyshirt/navy/short_sleeved - - +/datum/gear/accessory/locket + display_name = "gold locket" + path = /obj/item/clothing/accessory/necklace/locket + +/datum/gear/accessory/necklace + display_name = "simple necklace" + path = /obj/item/clothing/accessory/necklace diff --git a/code/modules/client/preference/loadout/loadout_hat.dm b/code/modules/client/preference/loadout/loadout_hat.dm index 1b1978f7d71..196f9f65ca0 100644 --- a/code/modules/client/preference/loadout/loadout_hat.dm +++ b/code/modules/client/preference/loadout/loadout_hat.dm @@ -137,7 +137,7 @@ /datum/gear/hat/med_beret display_name = "medical beret" path = /obj/item/clothing/head/beret/med - allowed_roles = list("Chief Medical Officer", "Medical Doctor" , "Virologist", "Brig Physician") + allowed_roles = list("Chief Medical Officer", "Medical Doctor" , "Virologist", "Brig Physician" , "Coroner") /datum/gear/hat/surgicalcap_purple display_name = "surgical cap, purple" diff --git a/code/modules/client/preference/loadout/loadout_racial.dm b/code/modules/client/preference/loadout/loadout_racial.dm index e9d89a31d34..f7d96011e5c 100644 --- a/code/modules/client/preference/loadout/loadout_racial.dm +++ b/code/modules/client/preference/loadout/loadout_racial.dm @@ -19,7 +19,7 @@ display_name = "lightweight veil" description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races. This one has an in-built medical HUD." path = /obj/item/clothing/glasses/hud/health/tajblind - allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Psychiatrist", "Paramedic", "Virologist", "Brig Physician") + allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Psychiatrist", "Paramedic", "Virologist", "Brig Physician" , "Coroner") /datum/gear/racial/tajsci display_name = "hi-tech veil" diff --git a/code/modules/client/preference/loadout/loadout_suit.dm b/code/modules/client/preference/loadout/loadout_suit.dm index 2ac4b3bb7e9..ae43a10ee89 100644 --- a/code/modules/client/preference/loadout/loadout_suit.dm +++ b/code/modules/client/preference/loadout/loadout_suit.dm @@ -29,7 +29,7 @@ /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") + allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Psychiatrist", "Paramedic", "Virologist", "Brig Physician" , "Coroner") /datum/gear/suit/coat/job/sci display_name = "winter coat, science" diff --git a/code/modules/client/preference/loadout/loadout_uniform.dm b/code/modules/client/preference/loadout/loadout_uniform.dm index 82ccc357312..889dfaa1080 100644 --- a/code/modules/client/preference/loadout/loadout_uniform.dm +++ b/code/modules/client/preference/loadout/loadout_uniform.dm @@ -61,12 +61,17 @@ /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") + allowed_roles = list("Virologist") /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","Brig Physician") + allowed_roles = list("Chief Medical Officer","Medical Doctor","Psychiatrist","Paramedic","Coroner") + +/datum/gear/uniform/skirt/job/phys + display_name = "skirt, physician" + path = /obj/item/clothing/under/rank/security/brigphys/skirt + allowed_roles = list("Brig Physician") /datum/gear/uniform/skirt/job/sci display_name = "skirt, scientist" @@ -98,6 +103,17 @@ path = /obj/item/clothing/under/rank/head_of_security/skirt allowed_roles = list("Head of Security") +/datum/gear/uniform/skirt/job/ntrep + display_name = "skirt, nt rep" + path = /obj/item/clothing/under/rank/ntrep/skirt + allowed_roles = list("Nanotrasen Representative") + +/datum/gear/uniform/skirt/job/blueshield + display_name = "skirt, blueshield" + path = /obj/item/clothing/under/rank/blueshield/skirt + allowed_roles = list("Blueshield") + + /datum/gear/uniform/medical subtype_path = /datum/gear/uniform/medical diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index bbf6e40d625..5f3cc4dec2b 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -28,9 +28,11 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts ) /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 + if(available_in_days_antag(C, role)) + return 0 //available_in_days>0 = still some days required = player not old enough + if(role_available_in_playtime(C, role)) + return 0 //available_in_playtime>0 = still some more playtime required = they are not eligible + return 1 /proc/available_in_days_antag(client/C, role) if(!C) @@ -147,6 +149,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts var/alt_head = "None" //Alt head style. var/species = "Human" var/language = "None" //Secondary language + var/autohiss_mode = AUTOHISS_OFF //Species autohiss level. OFF, BASIC, FULL. var/body_accessory = null @@ -259,6 +262,12 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts switch(current_tab) if(TAB_CHAR) // Character Settings + var/datum/species/S = all_species[species] + if(!istype(S)) //The species was invalid. Set the species to the default, fetch the datum for that species and generate a random character. + species = initial(species) + S = all_species[species] + random_character() + dat += "
    " dat += "
    " dat += "Name: " @@ -289,9 +298,11 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if(species == "Grey") dat += "Voice: [speciesprefs ? "Wingdings" : "Normal"]
    " dat += "Secondary Language: [language]
    " + if(S.autohiss_basic_map) + dat += "Auto-accent: [autohiss_mode == AUTOHISS_FULL ? "Full" : (autohiss_mode == AUTOHISS_BASIC ? "Basic" : "Off")]
    " dat += "Blood Type: [b_type]
    " - if(species in list("Human", "Drask", "Vox")) - dat += "Skin Tone: [species == "Vox" ? "[s_tone]" : "[-s_tone + 35]/220"]
    " + if(S.bodyflags & (HAS_SKIN_TONE|HAS_ICON_SKIN_TONE)) + dat += "Skin Tone: [S.bodyflags & HAS_ICON_SKIN_TONE ? "[s_tone]" : "[-s_tone + 35]/220"]
    " dat += "Disabilities: \[Set\]
    " dat += "Nanotrasen Relation: [nanotrasen_relation]
    " dat += "Set Flavor Text
    " @@ -302,7 +313,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts dat += "

    Hair & Accessories

    " - if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine", "Kidan")) //Species that have head accessories. + if(S.bodyflags & HAS_HEAD_ACCESSORY) //Species that have head accessories. var/headaccessoryname = "Head Accessory: " if(species == "Unathi") headaccessoryname = "Horns: " @@ -310,15 +321,15 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts dat += "[ha_style] " dat += "Color [color_square(r_headacc, g_headacc, b_headacc)]
    " - if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin", "Kidan")) //Species with head markings. + if(S.bodyflags & HAS_HEAD_MARKINGS) //Species with head markings. dat += "Head Markings: " dat += "[m_styles["head"]]" dat += "Color [color_square(color2R(m_colours["head"]), color2G(m_colours["head"]), color2B(m_colours["head"]))]
    " - if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask", "Kidan")) //Species with body markings/tattoos. + if(S.bodyflags & HAS_BODY_MARKINGS) //Species with body markings/tattoos. dat += "Body Markings: " dat += "[m_styles["body"]]" dat += "Color [color_square(color2R(m_colours["body"]), color2G(m_colours["body"]), color2B(m_colours["body"]))]
    " - if(species in list("Vox", "Vulpkanin")) //Species with tail markings. + if(S.bodyflags & HAS_TAIL_MARKINGS) //Species with tail markings. dat += "Tail Markings: " dat += "[m_styles["tail"]]" dat += "Color [color_square(color2R(m_colours["tail"]), color2G(m_colours["tail"]), color2B(m_colours["tail"]))]
    " @@ -340,11 +351,11 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts dat += "
    " - if(species != "Machine") + if(!(S.flags & ALL_RPARTS)) 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 + if((S.bodyflags & HAS_SKIN_COLOR) || 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)]
    " @@ -361,7 +372,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts dat += "Character Records
    " dat += "

    Limbs

    " - if(species in list("Unathi")) //Species with alt heads. + if(S.bodyflags & HAS_ALT_HEADS) //Species with alt heads. dat += "Alternate Head: " dat += "[alt_head]
    " dat += "Limbs and Parts: Adjust
    " @@ -412,9 +423,12 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts else dat += "
    " dat += "

    Clothing

    " - dat += "Underwear: [underwear]
    " - dat += "Undershirt: [undershirt]
    " - dat += "Socks: [socks]
    " + if(S.clothing_flags & HAS_UNDERWEAR) + dat += "Underwear: [underwear]
    " + if(S.clothing_flags & HAS_UNDERSHIRT) + dat += "Undershirt: [undershirt]
    " + if(S.clothing_flags & HAS_SOCKS) + dat += "Socks: [socks]
    " dat += "Backpack Type: [backbag]
    " dat += "
    " @@ -460,9 +474,15 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts 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 if(!player_old_enough_antag(user.client, i)) + var/available_in_days_antag = available_in_days_antag(user.client, i) + var/role_available_in_playtime = get_exp_format(role_available_in_playtime(user.client, i)) + if(available_in_days_antag) + dat += "Be [capitalize(i)]: \[IN [(available_in_days_antag)] DAYS]
    " + else if(role_available_in_playtime) + dat += "Be [capitalize(i)]: \[IN [(role_available_in_playtime)]]
    " + else + dat += "Be [capitalize(i)]: \[ERROR]
    " else dat += "Be [capitalize(i)]: [(i in src.be_special) ? "Yes" : "No"]
    " dat += "" @@ -556,7 +576,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts metadata["[tweak]"] = new_metadata -/datum/preferences/proc/SetChoices(mob/user, limit = 12, list/splitJobs = list("Civilian","Research Director","AI","Bartender"), width = 760, height = 790) +/datum/preferences/proc/SetChoices(mob/user, limit = 13, list/splitJobs = list("Civilian","Research Director","AI","Bartender"), width = 760, height = 790) if(!job_master) return @@ -806,7 +826,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts return 1 /datum/preferences/proc/ShowDisabilityState(mob/user,flag,label) - if(flag==DISABILITY_FLAG_FAT && species!=("Human" || "Tajaran" || "Grey")) + var/datum/species/S = all_species[species] + if(flag==DISABILITY_FLAG_FAT && !(S.flags & CAN_BE_FAT)) return "
  • [species] cannot be fat.
  • " return "
  • [label]: [disabilities & flag ? "Yes" : "No"]
  • " @@ -1068,7 +1089,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if("input") var/dflag=text2num(href_list["disability"]) if(dflag >= 0) - if(!(dflag==DISABILITY_FLAG_FAT && species!=("Human" || "Tajaran" || "Grey"))) + if(!(dflag==DISABILITY_FLAG_FAT && !(S.flags & CAN_BE_FAT))) //If the disability isn't fatness, toggle it. If it IS fatness, check to see if the species can be fat before going ahead. disabilities ^= text2num(href_list["disability"]) //MAGIC SetDisabilities(user) else @@ -1154,7 +1175,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts switch(href_list["task"]) if("random") var/datum/robolimb/robohead - if(species == "Machine") + if(S.flags & ALL_RPARTS) var/head_model = "[!rlimb_data["head"] ? "Morpheus Cyberkinetics" : rlimb_data["head"]]" robohead = all_robolimbs[head_model] switch(href_list["preference"]) @@ -1187,30 +1208,30 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if("f_style") f_style = random_facial_hair_style(gender, species, robohead) if("headaccessory") - if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories. + if(S.bodyflags & HAS_HEAD_ACCESSORY) //Species that have head accessories. r_headacc = rand(0,255) g_headacc = rand(0,255) b_headacc = rand(0,255) if("ha_style") - if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories. + if(S.bodyflags & HAS_HEAD_ACCESSORY) //Species that have head accessories. ha_style = random_head_accessory(species) if("m_style_head") - if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin", "Kidan")) //Species with head markings. + if(S.bodyflags & HAS_HEAD_MARKINGS) //Species with head markings. m_styles["head"] = random_marking_style("head", species, robohead, null, alt_head) if("m_head_colour") - if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin", "Kidan")) //Species with head markings. + if(S.bodyflags & HAS_HEAD_MARKINGS) //Species with head markings. m_colours["head"] = rgb(rand(0,255), rand(0,255), rand(0,255)) if("m_style_body") - if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask", "Kidan")) //Species with body markings. + if(S.bodyflags & HAS_BODY_MARKINGS) //Species with body markings. m_styles["body"] = random_marking_style("body", species) if("m_body_colour") - if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask", "Kidan")) //Species with body markings. + if(S.bodyflags & HAS_BODY_MARKINGS) //Species with body markings. m_colours["body"] = rgb(rand(0,255), rand(0,255), rand(0,255)) if("m_style_tail") - if(species in list("Vox", "Vulpkanin")) //Species with tail markings. + if(S.bodyflags & HAS_TAIL_MARKINGS) //Species with tail markings. m_styles["tail"] = random_marking_style("tail", species, null, body_accessory) if("m_tail_colour") - if(species in list("Vox", "Vulpkanin")) //Species with tail markings. + if(S.bodyflags & HAS_TAIL_MARKINGS) //Species with tail markings. m_colours["tail"] = rgb(rand(0,255), rand(0,255), rand(0,255)) if("underwear") underwear = random_underwear(gender, species) @@ -1226,10 +1247,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts g_eyes = rand(0,255) b_eyes = rand(0,255) if("s_tone") - if(species in list("Human", "Drask", "Vox")) + if(S.bodyflags & (HAS_SKIN_TONE|HAS_ICON_SKIN_TONE)) s_tone = random_skin_tone() if("s_color") - if(species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Wryn", "Vulpkanin", "Machine")) + if(S.bodyflags & HAS_SKIN_COLOR) r_skin = rand(0,255) g_skin = rand(0,255) b_skin = rand(0,255) @@ -1253,7 +1274,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts 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) + 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 @@ -1271,11 +1292,15 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts species = input("Please select a species", "Character Generation", null) in new_species var/datum/species/NS = all_species[species] + if(!istype(NS)) //The species was invalid. Notify the user and fail out. + species = prev_species + to_chat(user, "Invalid species, please pick something else.") + return if(prev_species != species) if(NS.has_gender && gender == PLURAL) gender = pick(MALE,FEMALE) var/datum/robolimb/robohead - if(species == "Machine") + if(NS.flags & ALL_RPARTS) var/head_model = "[!rlimb_data["head"] ? "Morpheus Cyberkinetics" : rlimb_data["head"]]" robohead = all_robolimbs[head_model] //grab one of the valid hair styles for the newly chosen species @@ -1284,7 +1309,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts //grab one of the valid facial hair styles for the newly chosen species f_style = random_facial_hair_style(gender, species, robohead) - if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories. + if(NS.bodyflags & HAS_HEAD_ACCESSORY) //Species that have head accessories. ha_style = random_head_accessory(species) else ha_style = "None" // No Vulp ears on Unathi @@ -1292,19 +1317,19 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts g_headacc = 0 b_headacc = 0 - if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin", "Kidan")) //Species with head markings. + if(NS.bodyflags & HAS_HEAD_MARKINGS) //Species with head markings. m_styles["head"] = random_marking_style("head", species, robohead, null, alt_head) else m_styles["head"] = "None" m_colours["head"] = "#000000" - if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask", "Kidan")) //Species with body markings/tattoos. + if(NS.bodyflags & HAS_BODY_MARKINGS) //Species with body markings/tattoos. m_styles["body"] = random_marking_style("body", species) else m_styles["body"] = "None" m_colours["body"] = "#000000" - if(species in list("Vox", "Vulpkanin")) //Species with tail markings. + if(NS.bodyflags & HAS_TAIL_MARKINGS) //Species with tail markings. m_styles["tail"] = random_marking_style("tail", species, null, body_accessory) else m_styles["tail"] = "None" @@ -1324,12 +1349,12 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts socks = random_socks(gender, species) //reset skin tone and colour - if(species in list("Human", "Drask", "Vox")) + if(NS.bodyflags & (HAS_SKIN_TONE|HAS_ICON_SKIN_TONE)) random_skin_tone(species) else s_tone = 0 - if(!(species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine"))) + if(!(NS.bodyflags & HAS_SKIN_COLOR)) r_skin = 0 g_skin = 0 b_skin = 0 @@ -1342,6 +1367,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts //Reset prosthetics. organ_data = list() rlimb_data = list() + + if(!(NS.autohiss_basic_map)) + autohiss_mode = AUTOHISS_OFF if("speciesprefs") speciesprefs = !speciesprefs //Starts 0, so if someone clicks the button up top there, this won't be 0 anymore. If they click it again, it'll go back to 0. if("language") @@ -1366,6 +1394,12 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts language = input("Please select a secondary language", "Character Generation", null) in new_languages + if("autohiss_mode") + if(S.autohiss_basic_map) + var/list/autohiss_choice = list("Off" = AUTOHISS_OFF, "Basic" = AUTOHISS_BASIC, "Full" = AUTOHISS_FULL) + var/new_autohiss_pref = input(user, "Choose your character's auto-accent level:", "Character Preference") as null|anything in autohiss_choice + autohiss_mode = autohiss_choice[new_autohiss_pref] + 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) @@ -1377,7 +1411,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts b_type = new_b_type if("hair") - if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) + if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) //Species that have hair. (No HAS_HAIR flag) 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) @@ -1403,7 +1437,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if(hairstyle == "Bald") //Just in case. valid_hairstyles += hairstyle continue - if(species == "Machine") //Species that can use prosthetic heads. + if(S.flags & ALL_RPARTS) //Species that can use prosthetic heads. var/head_model if(!rlimb_data["head"]) //Handle situations where the head is default. head_model = "Morpheus Cyberkinetics" @@ -1425,7 +1459,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts h_style = new_h_style if("headaccessory") - if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine", "Kidan")) //Species with head accessories. + if(S.bodyflags & HAS_HEAD_ACCESSORY) //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) @@ -1434,7 +1468,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts b_headacc = color2B(new_head_accessory) if("ha_style") - if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine", "Kidan")) //Species with head accessories. + if(S.bodyflags & HAS_HEAD_ACCESSORY) //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] @@ -1450,7 +1484,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if("alt_head") if(organ_data["head"] == "cyborg") return - if(species in list("Unathi")) //Species with alt heads. + if(S.bodyflags & HAS_ALT_HEADS) //Species with alt heads. var/list/valid_alt_heads = list() valid_alt_heads["None"] = alt_heads_list["None"] //The only null entry should be the "None" option for(var/alternate_head in alt_heads_list) @@ -1470,7 +1504,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts m_styles["head"] = "None" if("m_style_head") - if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin", "Kidan")) //Species with head markings. + if(S.bodyflags & HAS_HEAD_MARKINGS) //Species with head markings. var/list/valid_markings = list() valid_markings["None"] = marking_styles_list["None"] for(var/markingstyle in marking_styles_list) @@ -1486,7 +1520,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if(M.heads_allowed && !("All" in M.heads_allowed)) continue - if(species == "Machine") //Species that can use prosthetic heads. + if(S.flags & ALL_RPARTS) //Species that can use prosthetic heads. var/head_model if(!rlimb_data["head"]) //Handle situations where the head is default. head_model = "Morpheus Cyberkinetics" @@ -1506,14 +1540,14 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts m_styles["head"] = new_marking_style if("m_head_colour") - if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin", "Kidan")) //Species with head markings. + if(S.bodyflags & HAS_HEAD_MARKINGS) //Species with head markings. var/input = "Choose the colour of your your character's head markings:" var/new_markings = input(user, input, "Character Preference", m_colours["head"]) as color|null if(new_markings) m_colours["head"] = new_markings if("m_style_body") - if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask", "Kidan")) //Species with body markings/tattoos. + if(S.bodyflags & HAS_BODY_MARKINGS) //Species with body markings/tattoos. var/list/valid_markings = list() valid_markings["None"] = marking_styles_list["None"] for(var/markingstyle in marking_styles_list) @@ -1530,14 +1564,14 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts m_styles["body"] = new_marking_style if("m_body_colour") - if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask", "Kidan")) //Species with body markings/tattoos. + if(S.bodyflags & HAS_BODY_MARKINGS) //Species with body markings/tattoos. var/input = "Choose the colour of your your character's body markings:" var/new_markings = input(user, input, "Character Preference", m_colours["body"]) as color|null if(new_markings) m_colours["body"] = new_markings if("m_style_tail") - if(species in list("Vox", "Vulpkanin")) //Species with tail markings. + if(S.bodyflags & HAS_TAIL_MARKINGS) //Species with tail markings. var/list/valid_markings = list() valid_markings["None"] = marking_styles_list["None"] for(var/markingstyle in marking_styles_list) @@ -1560,7 +1594,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts m_styles["tail"] = new_marking_style if("m_tail_colour") - if(species in list("Vox", "Vulpkanin")) //Species with tail markings. + if(S.bodyflags & HAS_TAIL_MARKINGS) //Species with tail markings. var/input = "Choose the colour of your your character's tail markings:" var/new_markings = input(user, input, "Character Preference", m_colours["tail"]) as color|null if(new_markings) @@ -1585,7 +1619,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts body_accessory = (new_body_accessory == "None") ? null : new_body_accessory if("facial") - if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) + if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) //Species that have facial hair. (No HAS_HAIR_FACIAL flag) 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 = color2R(new_facial) @@ -1614,7 +1648,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts continue if(gender == FEMALE && SA.gender == MALE) continue - if(species == "Machine") //Species that can use prosthetic heads. + if(S.flags & ALL_RPARTS) //Species that can use prosthetic heads. var/head_model if(!rlimb_data["head"]) //Handle situations where the head is default. head_model = "Morpheus Cyberkinetics" @@ -1690,17 +1724,26 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts b_eyes = color2B(new_eyes) if("s_tone") - if(species == "Human" || species == "Drask") + if(S.bodyflags & HAS_SKIN_TONE) 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) + else if(S.bodyflags & HAS_ICON_SKIN_TONE) + var/const/MAX_LINE_ENTRIES = 4 + var/prompt = "Choose your character's skin tone: 1-[S.icon_skin_tones.len]\n(" + for(var/i = 1 to S.icon_skin_tones.len) + if(i > MAX_LINE_ENTRIES && !((i - 1) % MAX_LINE_ENTRIES)) + prompt += "\n" + prompt += "[i] = [S.icon_skin_tones[i]]" + if(i != S.icon_skin_tones.len) + prompt += ", " + prompt += ")" + var/skin_c = input(user, prompt, "Character Preference") as num|null + if(isnum(skin_c)) + s_tone = max(min(round(skin_c), S.icon_skin_tones.len), 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)) + if((S.bodyflags & HAS_SKIN_COLOR) || 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 = color2R(new_skin) @@ -1734,7 +1777,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts 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") + if(S.flags & ALL_RPARTS) 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 @@ -1770,19 +1813,19 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts second_limb = "r_hand" if("Left Foot") limb = "l_foot" - if(species != "Machine") + if(!(S.flags & ALL_RPARTS)) third_limb = "l_leg" if("Right Foot") limb = "r_foot" - if(species != "Machine") + if(!(S.flags & ALL_RPARTS)) third_limb = "r_leg" if("Left Hand") limb = "l_hand" - if(species != "Machine") + if(!(S.flags & ALL_RPARTS)) third_limb = "l_arm" if("Right Hand") limb = "r_hand" - if(species != "Machine") + if(!(S.flags & ALL_RPARTS)) 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 @@ -1838,7 +1881,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if(subchoice) choice = subchoice if(limb in list("head", "chest", "groin")) - if(species != "Machine") + if(!(S.flags & ALL_RPARTS)) return if(limb == "head") ha_style = "None" @@ -2111,7 +2154,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts else if(status == "cyborg") if(rlimb_data[name]) - O.robotize(rlimb_data[name]) + O.robotize(rlimb_data[name], convert_all = 0) else O.robotize() else diff --git a/code/modules/client/preference/preferences_mysql.dm b/code/modules/client/preference/preferences_mysql.dm index 02d246b4f70..579699a9414 100644 --- a/code/modules/client/preference/preferences_mysql.dm +++ b/code/modules/client/preference/preferences_mysql.dm @@ -175,7 +175,8 @@ speciesprefs, socks, body_accessory, - gear + gear, + autohiss FROM [format_table_name("characters")] WHERE ckey='[C.ckey]' AND slot='[slot]'"}) if(!query.Execute()) var/err = query.ErrorMsg() @@ -268,6 +269,7 @@ socks = query.item[63] body_accessory = query.item[64] gear = params2list(query.item[65]) + autohiss_mode = text2num(query.item[66]) //Sanitize var/datum/species/SP = all_species[species] @@ -315,6 +317,7 @@ undershirt = sanitize_text(undershirt, initial(undershirt)) backbag = sanitize_text(backbag, initial(backbag)) b_type = sanitize_text(b_type, initial(b_type)) + autohiss_mode = sanitize_integer(autohiss_mode, 0, 2, initial(autohiss_mode)) alternate_option = sanitize_integer(alternate_option, 0, 2, initial(alternate_option)) job_support_high = sanitize_integer(job_support_high, 0, 65535, initial(job_support_high)) @@ -427,7 +430,8 @@ speciesprefs='[speciesprefs]', socks='[socks]', body_accessory='[body_accessory]', - gear='[gearlist]' + gear='[gearlist]', + autohiss='[autohiss_mode]' WHERE ckey='[C.ckey]' AND slot='[default_slot]'"} ) @@ -467,7 +471,7 @@ gen_record, player_alt_titles, disabilities, organ_data, rlimb_data, nanotrasen_relation, speciesprefs, - socks, body_accessory, gear) + socks, body_accessory, gear, autohiss) VALUES ('[C.ckey]', '[default_slot]', '[sanitizeSQL(metadata)]', '[sanitizeSQL(real_name)]', '[be_random_name]','[gender]', @@ -497,7 +501,7 @@ '[sanitizeSQL(gen_record)]', '[playertitlelist]', '[disabilities]', '[organlist]', '[rlimblist]', '[nanotrasen_relation]', '[speciesprefs]', - '[socks]', '[body_accessory]', '[gearlist]') + '[socks]', '[body_accessory]', '[gearlist]', '[autohiss_mode]') "} ) diff --git a/code/modules/client/view.dm b/code/modules/client/view.dm new file mode 100644 index 00000000000..f4e74e203e8 --- /dev/null +++ b/code/modules/client/view.dm @@ -0,0 +1,90 @@ +/* + * ViewMods Client module + * This should be used by anything that wants to change a client's view range. + * Also includes + */ + +/* Defines */ +#define CUSTOM_VIEWRANGES list(1, 2, 3, 4, 5, 6, "RESET") + +/* Viewmods */ +/client + var/list/ViewMods = list() + var/ViewModsActive = FALSE + var/ViewPreferedIconSize = 0 + +/client/proc/AddViewMod(id, size) + var/datum/viewmod/V = new /datum/viewmod(id, size) + ViewMods[V.id] = V + UpdateView() + +/client/proc/CheckViewMod(id) + . = 0 + if(ViewMods[id]) + . = 1 + +/client/proc/RemoveViewMod(id) + if(CheckViewMod(id)) + qdel(ViewMods[id]) + ViewMods.Remove(id) + UpdateView() + +/client/proc/UpdateView() + if(!ViewModsActive) + ViewPreferedIconSize = winget(src, "mapwindow.map", "icon-size") + + var/highest_range = 0 + for(var/mod_id in ViewMods) + var/datum/viewmod/V = ViewMods[mod_id] + highest_range = max(highest_range, V.size) + + SetView(highest_range ? highest_range : world.view) + ViewModsActive = (highest_range > 0) + +/client/proc/SetView(view_range) + if(view_range == world.view) + winset(src, "mapwindow.map", "icon-size=[ViewPreferedIconSize]") + else + winset(src, "mapwindow.map", "icon-size=0") + + view = view_range + + if(mob && mob.hud_used) + // If view range is less than world.view, assume the HUD will not fit under normal mode and turn it to reduced + if(view_range < world.view) + // If it's really tiny, turn their hud off completely + if(view_range <= ARBITRARY_VIEWRANGE_NOHUD) + mob.hud_used.show_hud(HUD_STYLE_NOHUD) + else + mob.hud_used.show_hud(HUD_STYLE_REDUCED) + else + mob.hud_used.show_hud(HUD_STYLE_STANDARD) + +/* Viewmod datums */ +/datum/viewmod + var/id = "" + var/size = -1 + +/datum/viewmod/New(new_id, new_size = world.view) + . = ..() + id = new_id + size = new_size + +/* Client verbs */ +/proc/viewNum_to_text(view) + return "[(view * 2) + 1]x[(view * 2) + 1]" + +/client/verb/set_view_range(view_range as null|anything in CUSTOM_VIEWRANGES) + set name = "Set View Range" + set category = "Preferences" + + if(!view_range) + return + + RemoveViewMod("custom") + if(view_range == "RESET") + to_chat(src, "View range reset.") + return + + to_chat(src, "View range set to [viewNum_to_text(view_range)]") + AddViewMod("custom", view_range) \ No newline at end of file diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 914b3ed9209..94b9e50d37b 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -85,7 +85,7 @@ //Ears: currently only used for headsets and earmuffs /obj/item/clothing/ears name = "ears" - w_class = 1 + w_class = WEIGHT_CLASS_TINY throwforce = 2 slot_flags = SLOT_EARS burn_state = FIRE_PROOF @@ -128,7 +128,7 @@ /obj/item/clothing/ears/offear name = "Other ear" - w_class = 5 + w_class = WEIGHT_CLASS_HUGE icon = 'icons/mob/screen_gen.dmi' icon_state = "block" slot_flags = SLOT_EARS | SLOT_TWOEARS @@ -145,7 +145,7 @@ /obj/item/clothing/glasses name = "glasses" icon = 'icons/obj/clothing/glasses.dmi' - w_class = 2 + w_class = WEIGHT_CLASS_SMALL flags_cover = GLASSESCOVERSEYES slot_flags = SLOT_EYES materials = list(MAT_GLASS = 250) @@ -177,7 +177,7 @@ BLIND // can't see anything /obj/item/clothing/gloves name = "gloves" gender = PLURAL //Carn: for grammarically correct text-parsing - w_class = 2 + w_class = WEIGHT_CLASS_SMALL icon = 'icons/obj/clothing/gloves.dmi' siemens_coefficient = 0.50 body_parts_covered = HANDS @@ -332,7 +332,7 @@ BLIND // can't see anything mask_adjusted = 1 if(adjusted_flags) slot_flags = adjusted_flags - if(ishuman(user) && H.internal && user.wear_mask == src) /*If the user was wearing the mask providing internals on their face at the time it was adjusted, turn off internals. + if(ishuman(user) && H.internal && !H.get_organ_slot("breathing_tube") && user.wear_mask == src) /*If the user was wearing the mask providing internals on their face at the time it was adjusted, turn off internals. Otherwise, they adjusted it while it was in their hands or some such so we won't be needing to turn off internals.*/ H.update_internals_hud_icon(0) H.internal = null @@ -372,6 +372,8 @@ BLIND // can't see anything var/silence_steps = 0 var/shoe_sound_footstep = 1 var/shoe_sound = null + var/blood_state = BLOOD_STATE_NOT_BLOODY + var/list/bloody_shoes = list(BLOOD_STATE_HUMAN = 0, BLOOD_STATE_XENO = 0, BLOOD_STATE_NOT_BLOODY = 0) permeability_coefficient = 0.50 slowdown = SHOES_SLOWDOWN @@ -421,7 +423,7 @@ BLIND // can't see anything if(!istype(H) || !istype(T)) return 0 - if(H.m_intent == "run") + if(H.m_intent == MOVE_INTENT_RUN) if(shoe_sound_footstep >= 2) if(T.shoe_running_volume) playsound(src, shoe_sound, T.shoe_running_volume, 1) @@ -543,7 +545,7 @@ BLIND // can't see anything desc = "A suit that protects against low pressure environments. Has a big 13 on the back." icon_state = "space" item_state = "s_suit" - w_class = 4//bulky item + w_class = WEIGHT_CLASS_BULKY gas_transfer_coefficient = 0.01 permeability_coefficient = 0.02 flags = STOPSPRESSUREDMAGE | THICKMATERIAL diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 5c0c6dcb402..b60f7407229 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -35,7 +35,7 @@ desc = "Used for seeing walls, floors, and stuff through anything." icon_state = "meson" item_state = "glasses" - origin_tech = "magnets=2;engineering=2" + origin_tech = "magnets=1;engineering=2" vision_flags = SEE_TURFS invis_view = SEE_INVISIBLE_MINIMUM //don't render darkness while wearing these prescription_upgradable = 1 @@ -51,6 +51,7 @@ desc = "An Optical Meson Scanner fitted with an amplified visible light spectrum overlay, providing greater visual clarity in darkness." icon_state = "nvgmeson" item_state = "glasses" + origin_tech = "magnets=4;engineering=5;plasmatech=4" darkness_view = 8 prescription_upgradable = 0 @@ -68,7 +69,6 @@ attack_verb = list("sliced") hitsound = 'sound/weapons/bladeslice.ogg' sharp = 1 - edge = 1 /obj/item/clothing/glasses/meson/cyber name = "Eye Replacement Implant" @@ -84,11 +84,13 @@ desc = "A pair of snazzy goggles used to protect against chemical spills. Fitted with an analyzer for scanning items and reagents." icon_state = "purple" item_state = "glasses" + origin_tech = "magnets=2;engineering=1" prescription_upgradable = 0 scan_reagents = 1 //You can see reagents while wearing science goggles species_fit = list("Vox") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/eyes.dmi' + "Vox" = 'icons/mob/species/vox/eyes.dmi', + "Grey" = 'icons/mob/species/grey/eyes.dmi' ) actions_types = list(/datum/action/item_action/toggle_research_scanner) @@ -119,7 +121,7 @@ desc = "You can totally see in the dark now!" icon_state = "night" item_state = "glasses" - origin_tech = "magnets=2" + origin_tech = "materials=4;magnets=4;plasmatech=4;engineering=4" darkness_view = 8 invis_view = SEE_INVISIBLE_MINIMUM //don't render darkness while wearing these species_fit = list("Vox") @@ -136,7 +138,8 @@ item_state = "eyepatch" species_fit = list("Vox") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/eyes.dmi' + "Vox" = 'icons/mob/species/vox/eyes.dmi', + "Grey" = 'icons/mob/species/grey/eyes.dmi' ) /obj/item/clothing/glasses/monocle @@ -148,7 +151,8 @@ species_fit = list("Vox") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', - "Drask" = 'icons/mob/species/drask/eyes.dmi' + "Drask" = 'icons/mob/species/drask/eyes.dmi', + "Grey" = 'icons/mob/species/grey/eyes.dmi' ) /obj/item/clothing/glasses/material @@ -161,7 +165,8 @@ species_fit = list("Vox") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', - "Drask" = 'icons/mob/species/drask/eyes.dmi' + "Drask" = 'icons/mob/species/drask/eyes.dmi', + "Grey" = 'icons/mob/species/grey/eyes.dmi' ) /obj/item/clothing/glasses/material/cyber @@ -180,7 +185,8 @@ prescription = 1 species_fit = list("Vox") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/eyes.dmi' + "Vox" = 'icons/mob/species/vox/eyes.dmi', + "Grey" = 'icons/mob/species/grey/eyes.dmi' ) /obj/item/clothing/glasses/regular/hipster @@ -196,7 +202,8 @@ item_state = "3d" species_fit = list("Vox") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/eyes.dmi' + "Vox" = 'icons/mob/species/vox/eyes.dmi', + "Grey" = 'icons/mob/species/grey/eyes.dmi' ) /obj/item/clothing/glasses/gglasses @@ -206,7 +213,8 @@ item_state = "gglasses" species_fit = list("Vox") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/eyes.dmi' + "Vox" = 'icons/mob/species/vox/eyes.dmi', + "Grey" = 'icons/mob/species/grey/eyes.dmi' ) prescription_upgradable = 1 @@ -377,7 +385,8 @@ flash_protect = -1 species_fit = list("Vox") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/eyes.dmi' + "Vox" = 'icons/mob/species/vox/eyes.dmi', + "Grey" = 'icons/mob/species/grey/eyes.dmi' ) emp_act(severity) diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 9eb2455622e..ff8de1a6a82 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -29,6 +29,7 @@ name = "\improper Health Scanner HUD" desc = "A heads-up display that scans the humans in view and provides accurate data about their health status." icon_state = "healthhud" + origin_tech = "magnets=3;biotech=2" HUDType = DATA_HUD_MEDICAL_ADVANCED species_fit = list("Vox") sprite_sheets = list( @@ -48,6 +49,7 @@ desc = "An advanced medical head-up display that allows doctors to find patients in complete darkness." icon_state = "healthhudnight" item_state = "glasses" + origin_tech = "magnets=4;biotech=4;plasmatech=4;engineering=5" darkness_view = 8 invis_view = SEE_INVISIBLE_MINIMUM //don't render darkness while wearing these prescription_upgradable = 0 @@ -56,10 +58,12 @@ name = "Diagnostic HUD" desc = "A heads-up display capable of analyzing the integrity and status of robotics and exosuits." icon_state = "diagnostichud" + origin_tech = "magnets=2;engineering=2" HUDType = DATA_HUD_DIAGNOSTIC species_fit = list("Vox") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/eyes.dmi' + "Vox" = 'icons/mob/species/vox/eyes.dmi', + "Grey" = 'icons/mob/species/grey/eyes.dmi' ) /obj/item/clothing/glasses/hud/diagnostic/night @@ -67,6 +71,7 @@ desc = "A robotics diagnostic HUD fitted with a light amplifier." icon_state = "diagnostichudnight" item_state = "glasses" + origin_tech = "magnets=4;powerstorage=4;plasmatech=4;engineering=5" darkness_view = 8 invis_view = SEE_INVISIBLE_MINIMUM //don't render darkness while wearing these prescription_upgradable = 0 @@ -75,12 +80,14 @@ name = "\improper Security HUD" 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" + origin_tech = "magnets=3;combat=2" var/global/list/jobs[0] HUDType = DATA_HUD_SECURITY_ADVANCED species_fit = list("Vox") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', - "Drask" = 'icons/mob/species/drask/eyes.dmi' + "Drask" = 'icons/mob/species/drask/eyes.dmi', + "Grey" = 'icons/mob/species/grey/eyes.dmi' ) /obj/item/clothing/glasses/hud/security/chameleon @@ -102,6 +109,7 @@ name = "\improper Night Vision Security HUD" desc = "An advanced heads-up display which provides id data and vision in complete darkness." icon_state = "securityhudnight" + origin_tech = "magnets=4;combat=4;plasmatech=4;engineering=5" darkness_view = 8 invis_view = SEE_INVISIBLE_MINIMUM //don't render darkness while wearing these prescription_upgradable = 0 @@ -110,6 +118,7 @@ name = "HUDSunglasses" desc = "Sunglasses with a HUD." icon_state = "sunhud" + origin_tech = "magnets=3;combat=3;engineering=3" darkness_view = 1 flash_protect = 1 tint = 1 @@ -131,7 +140,8 @@ HUDType = DATA_HUD_HYDROPONIC species_fit = list("Vox") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/eyes.dmi' + "Vox" = 'icons/mob/species/vox/eyes.dmi', + "Grey" = 'icons/mob/species/grey/eyes.dmi' ) /obj/item/clothing/glasses/hud/hydroponic/night @@ -165,4 +175,4 @@ up = 0 /obj/item/clothing/glasses/hud/health/tajblind/attack_self() - toggle_veil() \ No newline at end of file + toggle_veil() diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index ee5022a1793..69588148b9d 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -17,6 +17,13 @@ icon_state = "black" item_state = "r_hands" + +/obj/item/clothing/gloves/color/black/forensics + name = "forensics gloves" + desc = "These high-tech gloves don't leave any material traces on objects they touch. Perfect for leaving crime scenes undisturbed...both before and after the crime." + icon_state = "forensics" + can_leave_fibers = FALSE + /obj/item/clothing/gloves/combat desc = "These tactical gloves are somewhat fire and impact resistant." name = "combat gloves" @@ -82,7 +89,7 @@ return FALSE if(cell) var/mob/living/carbon/human/H = loc - if(H.a_intent == I_HARM) + if(H.a_intent == INTENT_HARM) var/mob/living/carbon/C = A if(cell.use(stun_cost)) var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread @@ -124,4 +131,4 @@ to_chat(user, "You cut [cell] away from [src].") cell.forceMove(get_turf(loc)) cell = null - update_icon() \ No newline at end of file + update_icon() diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index c73a6f21306..ae694f8edf2 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -70,4 +70,8 @@ heat_protection = HEAD max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT cold_protection = HEAD - min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT \ No newline at end of file + min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT + species_fit = list("Grey") + sprite_sheets = list( + "Grey" = 'icons/mob/species/grey/helmet.dmi' + ) \ No newline at end of file diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index cbee11c290a..c3595288213 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -13,10 +13,11 @@ max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT strip_delay = 60 burn_state = FIRE_PROOF - species_fit = list("Vox", "Drask") + species_fit = list("Vox", "Drask", "Grey") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/helmet.dmi', - "Drask" = 'icons/mob/species/drask/helmet.dmi' + "Drask" = 'icons/mob/species/drask/helmet.dmi', + "Grey" = 'icons/mob/species/grey/helmet.dmi' ) /obj/item/clothing/head/helmet/attack_self(mob/user) @@ -228,29 +229,29 @@ obj/item/clothing/head/blob //Commander /obj/item/clothing/head/helmet/ert/command name = "emergency response team commander helmet" - desc = "An in-atmosphere helmet worn by the commander of a NanoTrasen Emergency Response Team. Has blue highlights." + desc = "An in-atmosphere helmet worn by the commander of a Nanotrasen Emergency Response Team. Has blue highlights." icon_state = "erthelmet_cmd" //Security /obj/item/clothing/head/helmet/ert/security name = "emergency response team security helmet" - desc = "An in-atmosphere helmet worn by security members of the NanoTrasen Emergency Response Team. Has red highlights." + desc = "An in-atmosphere helmet worn by security members of the Nanotrasen Emergency Response Team. Has red highlights." icon_state = "erthelmet_sec" //Engineer /obj/item/clothing/head/helmet/ert/engineer name = "emergency response team engineer helmet" - desc = "An in-atmosphere helmet worn by engineering members of the NanoTrasen Emergency Response Team. Has orange highlights." + desc = "An in-atmosphere helmet worn by engineering members of the Nanotrasen Emergency Response Team. Has orange highlights." icon_state = "erthelmet_eng" //Medical /obj/item/clothing/head/helmet/ert/medical name = "emergency response team medical helmet" - desc = "A set of armor worn by medical members of the NanoTrasen Emergency Response Team. Has red and white highlights." + desc = "A set of armor worn by medical members of the Nanotrasen Emergency Response Team. Has red and white highlights." icon_state = "erthelmet_med" //Janitorial /obj/item/clothing/head/helmet/ert/janitor name = "emergency response team janitor helmet" - desc = "A set of armor worn by janitorial members of the NanoTrasen Emergency Response Team. Has red and white highlights." + desc = "A set of armor worn by janitorial members of the Nanotrasen Emergency Response Team. Has red and white highlights." icon_state = "erthelmet_jan" diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 9c76701c2bb..4a52555bf5f 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -54,6 +54,21 @@ flags = BLOCKHAIR flags_cover = HEADCOVERSEYES +//Chaplain +/obj/item/clothing/head/monk_hood + name = "monk hood" + desc = "Wooden board not included." + icon_state = "monk_hood" + flags = BLOCKHAIR + flags_cover = HEADCOVERSEYES + +/obj/item/clothing/head/witchhunter_hat + name = "witchhunter hat" + desc = "This hat saw much use back in the day." + icon_state = "witchhunterhat" + item_state = "witchhunterhat" + flags_cover = HEADCOVERSEYES + /obj/item/clothing/head/det_hat name = "hat" desc = "Someone who wears this will look very smart." diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 5ddb28359e6..6d46eb7b061 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -380,7 +380,7 @@ throwforce = 3.0 throw_speed = 2 throw_range = 5 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL attack_verb = list("warned", "cautioned", "smashed") burn_state = FIRE_PROOF diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index aa5a81c2063..ee0610471c8 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -24,12 +24,13 @@ flags_inv = (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE) actions_types = list(/datum/action/item_action/toggle) burn_state = FIRE_PROOF - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") + species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/head.dmi', "Unathi" = 'icons/mob/species/unathi/helmet.dmi', "Tajaran" = 'icons/mob/species/tajaran/helmet.dmi', - "Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi' + "Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi', + "Grey" = 'icons/mob/species/grey/helmet.dmi' ) /obj/item/clothing/head/welding/flamedecal diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index 25cdc259f92..d66daf59760 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -5,15 +5,16 @@ item_state = "balaclava" flags = BLOCKHAIR flags_inv = HIDEFACE - w_class = 2 + w_class = WEIGHT_CLASS_SMALL actions_types = list(/datum/action/item_action/adjust) adjusted_flags = SLOT_HEAD - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") + species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', + "Grey" = 'icons/mob/species/grey/mask.dmi', "Drask" = 'icons/mob/species/drask/mask.dmi' ) @@ -27,13 +28,14 @@ item_state = "luchag" flags = BLOCKHAIR flags_inv = HIDEFACE - w_class = 2 - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") + w_class = WEIGHT_CLASS_SMALL + species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', + "Grey" = 'icons/mob/species/grey/mask.dmi', "Drask" = 'icons/mob/species/drask/mask.dmi' ) @@ -47,4 +49,4 @@ name = "Rudos Mask" desc = "Worn by robust fighters who are willing to do anything to win." icon_state = "luchar" - item_state = "luchar" \ No newline at end of file + item_state = "luchar" diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index c0ebe33a796..afefbbc93cc 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -5,18 +5,19 @@ item_state = "breath" flags = AIRTIGHT flags_cover = MASKCOVERSMOUTH - w_class = 2 + w_class = WEIGHT_CLASS_SMALL gas_transfer_coefficient = 0.10 permeability_coefficient = 0.50 actions_types = list(/datum/action/item_action/adjust) burn_state = FIRE_PROOF - species_fit = list("Vox", "Vox Armalis", "Unathi", "Tajaran", "Vulpkanin") + species_fit = list("Vox", "Vox Armalis", "Unathi", "Tajaran", "Vulpkanin", "Grey" ) sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Vox Armalis" = 'icons/mob/species/armalis/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', + "Grey" = 'icons/mob/species/grey/mask.dmi', "Drask" = 'icons/mob/species/drask/mask.dmi' ) @@ -30,7 +31,7 @@ item_state = "medical" permeability_coefficient = 0.01 put_on_delay = 10 - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") + species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") /obj/item/clothing/mask/breath/vox desc = "A weirdly-shaped breath mask." diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 0a3ee36ebbb..80350b3f3fe 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -5,7 +5,7 @@ flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT flags_inv = HIDEEARS|HIDEEYES|HIDEFACE flags_cover = MASKCOVERSMOUTH | MASKCOVERSEYES - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL item_state = "gas_alt" gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 @@ -31,7 +31,7 @@ flash_protect = 2 tint = 2 armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) - origin_tech = "materials=2;engineering=2" + origin_tech = "materials=2;engineering=3" actions_types = list(/datum/action/item_action/toggle) /obj/item/clothing/mask/gas/welding/attack_self() @@ -70,7 +70,7 @@ flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT flags_inv = HIDEEARS|HIDEEYES|HIDEFACE flags_cover = MASKCOVERSMOUTH | MASKCOVERSEYES - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL item_state = "bane_mask" gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 @@ -494,4 +494,3 @@ // ******************************************************************** - diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 8d031476931..5ac05685079 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -4,7 +4,7 @@ icon_state = "muzzle" item_state = "muzzle" flags_cover = MASKCOVERSMOUTH - w_class = 2 + w_class = WEIGHT_CLASS_SMALL gas_transfer_coefficient = 0.90 put_on_delay = 20 var/resist_time = 0 //deciseconds of how long you need to gnaw to get rid of the gag, 0 to make it impossible to remove @@ -24,22 +24,23 @@ name = "gag" desc = "Stick this in their mouth to stop the noise." icon_state = "gag" - w_class = 1 + w_class = WEIGHT_CLASS_TINY /obj/item/clothing/mask/muzzle/tapegag name = "tape gag" desc = "MHPMHHH!" icon_state = "tapegag" item_state = null - w_class = 1 + w_class = WEIGHT_CLASS_TINY resist_time = 150 mute = 0 - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") + species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', - "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi' + "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', + "Grey" = 'icons/mob/species/grey/mask.dmi' ) /obj/item/clothing/mask/muzzle/tapegag/dropped(mob/living/carbon/human/user) @@ -59,18 +60,19 @@ desc = "A sterile mask designed to help prevent the spread of diseases." icon_state = "sterile" item_state = "sterile" - w_class = 1 + w_class = WEIGHT_CLASS_TINY flags_cover = 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) actions_types = list(/datum/action/item_action/adjust) - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") + species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', - "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi' + "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', + "Grey" = 'icons/mob/species/grey/mask.dmi' ) @@ -83,12 +85,13 @@ icon_state = "fake-moustache" flags_inv = HIDEFACE actions_types = list(/datum/action/item_action/pontificate) - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") + species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', - "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi' + "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', + "Grey" = 'icons/mob/species/grey/mask.dmi' ) /obj/item/clothing/mask/fakemoustache/attack_self(mob/user) @@ -109,7 +112,7 @@ icon_state = "blueneckscarf" item_state = "blueneckscarf" flags_cover = MASKCOVERSMOUTH - w_class = 2 + w_class = WEIGHT_CLASS_SMALL gas_transfer_coefficient = 0.90 /obj/item/clothing/mask/redscarf @@ -118,7 +121,7 @@ icon_state = "redwhite_scarf" item_state = "redwhite_scarf" flags_cover = MASKCOVERSMOUTH - w_class = 2 + w_class = WEIGHT_CLASS_SMALL gas_transfer_coefficient = 0.90 /obj/item/clothing/mask/greenscarf @@ -127,7 +130,7 @@ icon_state = "green_scarf" item_state = "green_scarf" flags_cover = MASKCOVERSMOUTH - w_class = 2 + w_class = WEIGHT_CLASS_SMALL gas_transfer_coefficient = 0.90 /obj/item/clothing/mask/ninjascarf @@ -136,7 +139,7 @@ icon_state = "ninja_scarf" item_state = "ninja_scarf" flags_cover = MASKCOVERSMOUTH - w_class = 2 + w_class = WEIGHT_CLASS_SMALL gas_transfer_coefficient = 0.90 @@ -147,7 +150,7 @@ item_state = "pig" flags = BLOCKHAIR flags_inv = HIDEFACE - w_class = 2 + w_class = WEIGHT_CLASS_SMALL /obj/item/clothing/mask/horsehead @@ -157,7 +160,7 @@ item_state = "horsehead" flags = BLOCKHAIR flags_inv = HIDEFACE - w_class = 2 + w_class = WEIGHT_CLASS_SMALL var/voicechange = 0 var/temporaryname = " the Horse" var/originalname = "" @@ -247,7 +250,7 @@ icon_state = "fawkes" item_state = "fawkes" flags_inv = HIDEFACE - w_class = 2 + w_class = WEIGHT_CLASS_SMALL /obj/item/clothing/mask/gas/clown_hat/pennywise name = "Pennywise Mask" @@ -263,16 +266,17 @@ desc = "A colorful bandana." flags_inv = HIDEFACE flags_cover = MASKCOVERSMOUTH - w_class = 1 + w_class = WEIGHT_CLASS_TINY slot_flags = SLOT_MASK adjusted_flags = SLOT_HEAD icon_state = "bandbotany" - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") + species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', - "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi' + "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', + "Grey" = 'icons/mob/species/grey/mask.dmi' ) actions_types = list(/datum/action/item_action/adjust) diff --git a/code/modules/clothing/masks/voice.dm b/code/modules/clothing/masks/voice.dm index 8655c2b7541..01dd9a65a99 100644 --- a/code/modules/clothing/masks/voice.dm +++ b/code/modules/clothing/masks/voice.dm @@ -8,7 +8,6 @@ name = "gas mask" // desc = "A face-covering mask that can be connected to an air supply. It seems to house some odd electronics." var/obj/item/voice_changer/changer - origin_tech = "syndicate=4" burn_state = FIRE_PROOF /obj/item/clothing/mask/gas/voice/verb/Toggle_Voice_Changer() diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index b036946e4ae..88796165114 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -2,6 +2,7 @@ desc = "Magnetic boots, often used during extravehicular activity to ensure the user remains safely attached to the vehicle." name = "magboots" icon_state = "magboots0" + origin_tech = "materials=3;magnets=4;engineering=4" var/magboot_state = "magboots" var/magpulse = 0 var/slowdown_active = 2 @@ -40,13 +41,14 @@ icon_state = "advmag0" magboot_state = "advmag" slowdown_active = SHOES_SLOWDOWN + origin_tech = null /obj/item/clothing/shoes/magboots/syndie desc = "Reverse-engineered magnetic boots that have a heavy magnetic pull. Property of Gorlex Marauders." name = "blood-red magboots" icon_state = "syndiemag0" magboot_state = "syndiemag" - origin_tech = "magnets=2;syndicate=3" + origin_tech = "magnets=4;syndicate=2" obj/item/clothing/shoes/magboots/syndie/advance //For the Syndicate Strike Team desc = "Reverse-engineered magboots that appear to be based on an advanced model, as they have a lighter magnetic pull. Property of Gorlex Marauders." diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 7a651881699..6a07ea17da8 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -5,7 +5,7 @@ item_state = "brown" permeability_coefficient = 0.05 flags = NOSLIP - origin_tech = "syndicate=3" + origin_tech = "syndicate=2" burn_state = FIRE_PROOF var/list/clothing_choices = list() silence_steps = 1 diff --git a/code/modules/clothing/spacesuits/alien.dm b/code/modules/clothing/spacesuits/alien.dm index 33e08206fd1..69ecd6eca0e 100644 --- a/code/modules/clothing/spacesuits/alien.dm +++ b/code/modules/clothing/spacesuits/alien.dm @@ -74,7 +74,7 @@ // 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 + w_class = WEIGHT_CLASS_NORMAL 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) 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 diff --git a/code/modules/clothing/spacesuits/ert.dm b/code/modules/clothing/spacesuits/ert.dm index 82c4a832c6c..90d61fa0313 100644 --- a/code/modules/clothing/spacesuits/ert.dm +++ b/code/modules/clothing/spacesuits/ert.dm @@ -9,6 +9,10 @@ var/obj/machinery/camera/camera var/has_camera = TRUE strip_delay = 130 + species_fit = list("Grey") + sprite_sheets = list( + "Grey" = 'icons/mob/species/grey/helmet.dmi' + ) /obj/item/clothing/head/helmet/space/hardsuit/ert/attack_self(mob/user) if(camera || !has_camera) @@ -29,7 +33,7 @@ desc = "A suit worn by members of the Nanotrasen Emergency Response Team. Armoured, space ready, and fire resistant." icon_state = "ert_commander" item_state = "suit-command" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL 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) 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, \ diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index ab601821ef8..5483ca65072 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -20,14 +20,15 @@ "Skrell" = 'icons/mob/species/skrell/helmet.dmi', "Vox" = 'icons/mob/species/vox/helmet.dmi', "Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi', - "Drask" = 'icons/mob/species/drask/helmet.dmi' + "Drask" = 'icons/mob/species/drask/helmet.dmi', + "Grey" = 'icons/mob/species/grey/helmet.dmi' ) sprite_sheets_obj = list( "Unathi" = 'icons/obj/clothing/species/unathi/hats.dmi', "Tajaran" = 'icons/obj/clothing/species/tajaran/hats.dmi', "Skrell" = 'icons/obj/clothing/species/skrell/hats.dmi', "Vox" = 'icons/obj/clothing/species/vox/hats.dmi', - "Vulpkanin" = 'icons/obj/clothing/species/vulpkanin/hats.dmi', + "Vulpkanin" = 'icons/obj/clothing/species/vulpkanin/hats.dmi' ) /obj/item/clothing/head/helmet/space/hardsuit/equip_to_best_slot(mob/M) @@ -83,7 +84,7 @@ "Tajaran" = 'icons/obj/clothing/species/tajaran/suits.dmi', "Skrell" = 'icons/obj/clothing/species/skrell/suits.dmi', "Vox" = 'icons/obj/clothing/species/vox/suits.dmi', - "Vulpkanin" = 'icons/obj/clothing/species/vulpkanin/suits.dmi', + "Vulpkanin" = 'icons/obj/clothing/species/vulpkanin/suits.dmi' ) //Breach thresholds, should ideally be inherited by most (if not all) hardsuits. @@ -352,7 +353,7 @@ icon_state = "hardsuit1-syndi" item_state = "syndie_hardsuit" item_color = "syndi" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL var/on = 1 actions_types = list(/datum/action/item_action/toggle_hardsuit_mode) armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50) @@ -440,14 +441,17 @@ heat_protection = HEAD //Uncomment to enable firesuit protection max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT unacidable = 1 - sprite_sheets = null + species_fit = list("Grey") + sprite_sheets = list( + "Grey" = 'icons/mob/species/grey/helmet.dmi' + ) /obj/item/clothing/suit/space/hardsuit/wizard icon_state = "hardsuit-wiz" name = "gem-encrusted hardsuit" desc = "A bizarre gem-encrusted suit that radiates magical energies." item_state = "wiz_hardsuit" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL unacidable = 1 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) @@ -538,7 +542,6 @@ 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/hardsuit/security/hos diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 54aa39a305e..60e76418a53 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -8,9 +8,10 @@ permeability_coefficient = 0.01 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") + species_fit = list("Vox", "Grey") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/helmet.dmi' + "Vox" = 'icons/mob/species/vox/helmet.dmi', + "Grey" = 'icons/mob/species/grey/helmet.dmi' ) /obj/item/clothing/head/helmet/space/capspace/equipped(mob/living/carbon/human/user, slot) @@ -27,7 +28,7 @@ desc = "A bulky, heavy-duty piece of exclusive Nanotrasen armor. YOU are in charge!" icon_state = "caparmor" item_state = "capspacesuit" - w_class = 4 + w_class = WEIGHT_CLASS_BULKY 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) armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50) species_restricted = list("exclude", "Diona", "Wryn") @@ -86,7 +87,7 @@ blood_overlay_type = "coat" flags_inv = 0 slowdown = 0 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL //Space santa outfit suit /obj/item/clothing/head/helmet/space/santahat @@ -123,7 +124,7 @@ desc = "Yarr." icon_state = "pirate" item_state = "pirate" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL 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 = 30, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30) @@ -136,9 +137,10 @@ desc = "A paramedic EVA helmet. Used in the recovery of bodies from space." icon_state = "paramedic-eva-helmet" item_state = "paramedic-eva-helmet" - species_fit = list("Vox") + species_fit = list("Vox", "Grey") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/helmet.dmi' + "Vox" = 'icons/mob/species/vox/helmet.dmi', + "Grey" = 'icons/mob/species/grey/helmet.dmi' ) sprite_sheets_obj = list( "Vox" = 'icons/obj/clothing/species/vox/hats.dmi' @@ -187,12 +189,13 @@ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20) flash_protect = 0 species_restricted = list("exclude", "Diona", "Wryn") - species_fit = list("Tajaran", "Unathi", "Vox", "Vulpkanin") + species_fit = list("Tajaran", "Unathi", "Vox", "Vulpkanin", "Grey") sprite_sheets = list( "Tajaran" = 'icons/mob/species/tajaran/helmet.dmi', "Unathi" = 'icons/mob/species/unathi/helmet.dmi', "Vox" = 'icons/mob/species/vox/helmet.dmi', - "Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi' + "Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi', + "Grey" = 'icons/mob/species/grey/helmet.dmi' ) sprite_sheets_obj = list( "Vox" = 'icons/obj/clothing/species/vox/hats.dmi', diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index 20a14cc4fc5..eda243a859a 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -62,7 +62,7 @@ flags = null //non-conductive force = 0 throwforce = 0 - w_class = 2 //Fits in boxes. + w_class = WEIGHT_CLASS_SMALL //Fits in boxes. materials = list() attack_verb = list("tapped") @@ -107,14 +107,15 @@ name = "plasmaman atmospheric suit" icon_state = "plasmamanAtmos_suit" armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 0) - max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT /obj/item/clothing/head/helmet/space/eva/plasmaman/atmostech name = "plasmaman atmospheric helmet" icon_state = "plasmamanAtmos_helmet0" base_state = "plasmamanAtmos_helmet" armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 0) - max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT + flash_protect = 2 /obj/item/clothing/suit/space/eva/plasmaman/engineer name = "plasmaman engineer suit" @@ -126,18 +127,20 @@ icon_state = "plasmamanEngineer_helmet0" base_state = "plasmamanEngineer_helmet" armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75) + flash_protect = 2 /obj/item/clothing/suit/space/eva/plasmaman/engineer/ce name = "plasmaman chief engineer suit" icon_state = "plasmaman_CE" - max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT + /obj/item/clothing/head/helmet/space/eva/plasmaman/engineer/ce name = "plasmaman chief engineer helmet" icon_state = "plasmaman_CE_helmet0" base_state = "plasmaman_CE_helmet" - max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT - + max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT + flash_protect = 2 //SERVICE /obj/item/clothing/suit/space/eva/plasmaman/assistant @@ -266,6 +269,24 @@ icon_state = "plasmaman_CMO_helmet0" base_state = "plasmaman_CMO_helmet" +/obj/item/clothing/suit/space/eva/plasmaman/medical/coroner + name = "plasmaman coroner suit" + icon_state = "plasmaman_Coroner" + +/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/coroner + name = "plasmaman coroner helmet" + icon_state = "plasmaman_Coroner_helmet0" + base_state = "plasmaman_Coroner_helmet" + +/obj/item/clothing/suit/space/eva/plasmaman/medical/virologist + name = "plasmaman virologist suit" + icon_state = "plasmaman_Virologist" + +/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/virologist + name = "plasmaman virologist helmet" + icon_state = "plasmaman_Virologist_helmet0" + base_state = "plasmaman_Virologist_helmet" + /obj/item/clothing/suit/space/eva/plasmaman/science name = "plasmaman scientist suit" icon_state = "plasmamanScience_suit" @@ -275,6 +296,15 @@ icon_state = "plasmamanScience_helmet0" base_state = "plasmamanScience_helmet" +/obj/item/clothing/suit/space/eva/plasmaman/science/geneticist + name = "plasmaman geneticist suit" + icon_state = "plasmaman_Geneticist" + +/obj/item/clothing/head/helmet/space/eva/plasmaman/science/geneticist + name = "plasmaman geneticist helmet" + icon_state = "plasmaman_Geneticist_helmet0" + base_state = "plasmaman_Geneticist_helmet" + /obj/item/clothing/suit/space/eva/plasmaman/science/rd name = "plasmaman research director suit" icon_state = "plasmaman_RD" diff --git a/code/modules/clothing/spacesuits/rig/modules/computer.dm b/code/modules/clothing/spacesuits/rig/modules/computer.dm index 468141b6628..32908822fee 100644 --- a/code/modules/clothing/spacesuits/rig/modules/computer.dm +++ b/code/modules/clothing/spacesuits/rig/modules/computer.dm @@ -163,13 +163,8 @@ to_chat(user, "You cannot eject your currently stored AI. Purge it manually.") return 0 to_chat(user, "You purge the remaining scraps of data from your previous AI, freeing it for use.") - if(integrated_ai) - integrated_ai.ghostize() - qdel(integrated_ai) - integrated_ai = null - if(ai_card) - qdel(ai_card) - ai_card = null + QDEL_NULL(integrated_ai) + QDEL_NULL(ai_card) else if(user) user.put_in_hands(ai_card) else diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 33bb0bcd269..f1fb29ed645 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -14,7 +14,7 @@ slot_flags = SLOT_BACK req_one_access = list() req_access = list() - w_class = 4 + w_class = WEIGHT_CLASS_BULKY // These values are passed on to all component pieces. armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75) @@ -978,18 +978,9 @@ else M.stop_pulling() - if(wearer.pinned.len) - to_chat(src, "Your host is pinned to a wall by [wearer.pinned[1]]!") - return 0 - // AIs are a bit slower than regular and ignore move intent. wearer_move_delay = world.time + ai_controlled_move_delay - var/tickcomp = 0 - if(config.Tickcomp) - tickcomp = ((1/(world.tick_lag))*1.3) - 1.3 - wearer_move_delay += tickcomp - if(wearer.buckled) //if we're buckled to something, tell it we moved. return wearer.buckled.relaymove(wearer, direction) diff --git a/code/modules/clothing/spacesuits/syndi.dm b/code/modules/clothing/spacesuits/syndi.dm index 4b8f32f5a74..37aa5b776ba 100644 --- a/code/modules/clothing/spacesuits/syndi.dm +++ b/code/modules/clothing/spacesuits/syndi.dm @@ -12,7 +12,7 @@ icon_state = "syndicate" item_state = "space_suit_syndicate" desc = "Has a tag on it: Totally not property of of a hostile corporation, honest!" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL 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) armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30) @@ -173,4 +173,4 @@ obj/item/clothing/suit/space/syndicate/black/red/strike /obj/item/clothing/suit/space/syndicate/black/engie name = "Black Engineering Space Suit" icon_state = "syndicate-black-engie" - item_state = "syndicate-black" \ No newline at end of file + item_state = "syndicate-black" diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index c9d3ccac27b..7a2fa10db07 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -376,7 +376,7 @@ desc = "A suit that protects against some damage." icon_state = "centcom" item_state = "centcom" - w_class = 4//bulky item + w_class = WEIGHT_CLASS_BULKY body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/emergency_oxygen) flags = THICKMATERIAL @@ -393,7 +393,7 @@ icon_state = "heavy" item_state = "swat_suit" armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100) - w_class = 4//bulky item + w_class = WEIGHT_CLASS_BULKY gas_transfer_coefficient = 0.90 flags = THICKMATERIAL body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index f0fbfca0cbd..49f8a8ea8d1 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -15,7 +15,7 @@ desc = "A suit that protects against biological contamination." icon_state = "bio" item_state = "bio_suit" - w_class = 4//bulky item + w_class = WEIGHT_CLASS_BULKY gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 flags = THICKMATERIAL @@ -93,4 +93,4 @@ strip_delay = 40 put_on_delay = 20 species_fit = null - sprite_sheets = null \ No newline at end of file + sprite_sheets = null diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index 0ccdf7027d3..426f6d7b3ef 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -101,6 +101,31 @@ "Vox" = 'icons/mob/species/vox/suit.dmi' ) +//Chaplain +/obj/item/clothing/suit/hooded/monk + name = "monk robe" + desc = "Wooden board not included." + icon_state = "monkrobe" + item_state = "monkrobe" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS + flags_inv = HIDESHOES|HIDEJUMPSUIT + hoodtype = /obj/item/clothing/head/monk_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) + +/obj/item/clothing/suit/witchhunter + name = "witchhunter garb" + desc = "Dosen't weigh the same a a duck." + icon_state = "witchhunter" + item_state = "witchhunter" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + 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) + + + //Chef +/obj/item/clothing/suit/toggle/chef + name = "chef's apron" + + //Chef /obj/item/clothing/suit/chef name = "chef's apron" @@ -252,8 +277,8 @@ ) /obj/item/clothing/suit/storage/ntrep - name = "\improper NanoTrasen Representative jacket" - desc = "A fancy black jacket, standard issue to NanoTrasen Represenatives." + name = "\improper Nanotrasen Representative jacket" + desc = "A fancy black jacket; standard issue to Nanotrasen Representatives." icon_state = "ntrep" item_state = "ntrep" blood_overlay_type = "coat" diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 5d25cf95c2d..a5340ed91bc 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -135,7 +135,7 @@ icon_state = "syndicate-black-red" item_state = "syndicate-black-red" desc = "A plastic replica of the syndicate space suit, you'll look just like a real murderous syndicate agent in this! This is a toy, it is not made for use in space!" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/toy) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT burn_state = FIRE_PROOF @@ -714,7 +714,7 @@ desc = "A soft white robe made of a synthetic fiber that provides improved protection against biohazards. Possessing multiple overlapping layers, yet light enough to allow complete freedom of movement, it denotes its wearer as a master physician." icon_state = "mercy_hoodie" item_state = "mercy_hoodie" - w_class = 4//bulky item + w_class = WEIGHT_CLASS_BULKY gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 flags_size = ONESIZEFITSALL @@ -949,3 +949,20 @@ linked_staff.faith += 5 if(linked_staff.faith >= 100) //if this charge puts the staff at or above full, notify the wearer to_chat(H, "Faith renewed; ready to convert new followers.") + +/obj/item/clothing/suit/tailcoat + name = "victorian tailcoat" + desc = "A fancy victorian tailcoat." + icon_state = "tailcoat" + item_state = "tailcoat" + +/obj/item/clothing/suit/victcoat + name = "ladies victorian coat" + desc = "A fancy victorian coat." + icon_state = "ladiesvictoriancoat" + item_state = "ladiesvictoriancoat" + +/obj/item/clothing/suit/victcoat/red + name = "ladies red victorian coat" + icon_state = "ladiesredvictoriancoat" + item_state = "ladiesredvictoriancoat" diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm index 70fa8a30227..5e73af7aa39 100644 --- a/code/modules/clothing/suits/storage.dm +++ b/code/modules/clothing/suits/storage.dm @@ -5,7 +5,7 @@ ..() pockets = new/obj/item/weapon/storage/internal(src) pockets.storage_slots = 2 //two slots - pockets.max_w_class = 2 //fit only pocket sized items + pockets.max_w_class = WEIGHT_CLASS_SMALL //fit only pocket sized items pockets.max_combined_w_class = 4 /obj/item/clothing/suit/storage/Destroy() diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index 81cc172d0e2..3d31af6230b 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -14,7 +14,7 @@ desc = "A suit that protects against fire and heat." icon_state = "fire" item_state = "fire_suit" - w_class = 4//bulky item + w_class = WEIGHT_CLASS_BULKY gas_transfer_coefficient = 0.90 permeability_coefficient = 0.50 body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS @@ -43,7 +43,7 @@ desc = "A suit that protects against extreme fire and heat." //icon_state = "thermal" item_state = "ro_suit" - w_class = 4//bulky item + w_class = WEIGHT_CLASS_BULKY slowdown = 1.5 /obj/item/clothing/suit/fire/atmos @@ -85,7 +85,7 @@ desc = "A suit designed for safety when handling explosives." icon_state = "bombsuit" item_state = "bombsuit" - w_class = 4//bulky item + w_class = WEIGHT_CLASS_BULKY gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 flags = THICKMATERIAL @@ -142,7 +142,7 @@ desc = "A suit that protects against radiation. Label: Made with lead, do not eat insulation." icon_state = "rad" item_state = "rad_suit" - w_class = 4//bulky item + w_class = WEIGHT_CLASS_BULKY gas_transfer_coefficient = 0.90 permeability_coefficient = 0.50 flags = THICKMATERIAL @@ -157,4 +157,4 @@ species_fit = list("Vox") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' - ) \ 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 2cf6bf3d12c..8f4b65e6030 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 + w_class = WEIGHT_CLASS_SMALL 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. @@ -384,6 +384,66 @@ icon_state = "stripedbluescarf" item_color = "stripedbluescarf" +//Necklaces +/obj/item/clothing/accessory/necklace + name = "necklace" + desc = "A simple necklace." + icon_state = "necklace" + item_state = "necklace" + item_color = "necklace" + slot_flags = SLOT_MASK | SLOT_TIE + +/obj/item/clothing/accessory/necklace/locket + name = "gold locket" + desc = "A gold locket that seems to have space for a photo within." + icon_state = "locket" + item_state = "locket" + item_color = "locket" + slot_flags = SLOT_MASK | SLOT_TIE + var/base_icon + var/open + var/obj/item/held //Item inside locket. + +/obj/item/clothing/accessory/necklace/locket/Destroy() + QDEL_NULL(held) + return ..() + + +/obj/item/clothing/accessory/necklace/locket/attack_self(mob/user as mob) + if(!base_icon) + base_icon = icon_state + + if(!("[base_icon]_open" in icon_states(icon))) + to_chat(user, "[src] doesn't seem to open.") + return + + open = !open + to_chat(user, "You flip [src] [open?"open":"closed"].") + if(open) + icon_state = "[base_icon]_open" + if(held) + to_chat(user, "[held] falls out!") + held.forceMove(get_turf(user)) + held = null + else + icon_state = "[base_icon]" + +/obj/item/clothing/accessory/necklace/locket/attackby(var/obj/item/O as obj, mob/user as mob) + if(!open) + to_chat(user, "You have to open it first.") + return + + if(istype(O,/obj/item/weapon/paper) || istype(O, /obj/item/weapon/photo) && !(istype(O, /obj/item/weapon/paper/talisman))) + if(held) + to_chat(usr, "[src] already has something inside it.") + else + to_chat(usr, "You slip [O] into [src].") + user.drop_item() + O.forceMove(src) + held = O + else + return ..() + //Cowboy Shirts /obj/item/clothing/accessory/cowboyshirt name = "black cowboy shirt" @@ -560,7 +620,7 @@ return var/area/t = get_area(M) - var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(null) + var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(src) if(istype(t, /area/syndicate_station) || istype(t, /area/syndicate_mothership) || istype(t, /area/shuttle/syndicate_elite) ) //give the syndicats a bit of stealth a.autosay("[M] has been vandalized in Space!", "[M]'s Death Alarm") diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm index cab12cba542..69098f54138 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 actions_types = list(/datum/action/item_action/accessory/holster) - w_class = 3 // so it doesn't fit in pockets + w_class = WEIGHT_CLASS_NORMAL // so it doesn't fit in pockets /obj/item/clothing/accessory/holster/Destroy() QDEL_NULL(holstered) @@ -60,7 +60,7 @@ if(istype(user.get_active_hand(),/obj) && istype(user.get_inactive_hand(),/obj)) to_chat(user, "You need an empty hand to draw the [holstered]!") else - if(user.a_intent == I_HARM) + if(user.a_intent == INTENT_HARM) usr.visible_message("[user] draws the [holstered], ready to shoot!
    ", \ "You draw the [holstered], ready to shoot!") else @@ -140,4 +140,4 @@ name = "shoulder holster" desc = "A handgun holster. Made of expensive leather." icon_state = "holster" - item_color = "holster_low" \ No newline at end of file + item_color = "holster_low" diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm index fd335f43fb7..a306864cbfc 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 actions_types = list(/datum/action/item_action/accessory/storage) - w_class = 3 // so it doesn't fit in pockets + w_class = WEIGHT_CLASS_NORMAL // so it doesn't fit in pockets /obj/item/clothing/accessory/storage/New() ..() @@ -110,4 +110,4 @@ hold.can_hold = list(/obj/item/weapon/hatchet/unathiknife, /obj/item/weapon/kitchen/knife) new /obj/item/weapon/hatchet/unathiknife(hold) - new /obj/item/weapon/hatchet/unathiknife(hold) \ No newline at end of file + new /obj/item/weapon/hatchet/unathiknife(hold) diff --git a/code/modules/clothing/under/chameleon.dm b/code/modules/clothing/under/chameleon.dm index 63f09efd3bf..8828f7a4c2e 100644 --- a/code/modules/clothing/under/chameleon.dm +++ b/code/modules/clothing/under/chameleon.dm @@ -5,7 +5,7 @@ item_state = "bl_suit" item_color = "black" desc = "It's a plain jumpsuit. It seems to have a small dial on the wrist." - origin_tech = "syndicate=3" + origin_tech = "syndicate=2" var/list/clothing_choices = list() burn_state = FIRE_PROOF armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0) diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm index bac5b3d51e3..1ca94e9a4f3 100644 --- a/code/modules/clothing/under/jobs/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian.dm @@ -119,6 +119,14 @@ item_color = "internalaffairs" flags_size = ONESIZEFITSALL +/obj/item/clothing/under/rank/ntrep/skirt + desc = "A silky smooth black and gold representative uniform with blue markings." + name = "representative skirt" + icon_state = "ntrepf" + item_state = "ntrepf" + item_color = "ntrepf" + 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" diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index 31d36cdcb19..da905dd1e75 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -182,6 +182,16 @@ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0) flags_size = ONESIZEFITSALL +/obj/item/clothing/under/rank/security/brigphys/skirt + desc = "A skirted Brig Physician uniform. It has both security and medical protection." + name = "brig physician's jumpskirt" + icon_state = "brig_physf" + item_state = "brig_physf" + item_color = "brig_physf" + permeability_coefficient = 0.50 + armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0) + flags_size = ONESIZEFITSALL + //Pod Pilot /obj/item/clothing/under/rank/security/pod_pilot desc = "Suit for your regular pod pilot." diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index d388db29b5c..6dc1e1f2991 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -153,13 +153,21 @@ item_color = "ert_uniform" armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) +/obj/item/clothing/under/rank/blueshield/skirt + name = "blueshield skirt" + desc = "A short, black and grey with blue markings skirted uniform. For the feminine Blueshield officers." + icon_state = "blueshieldf" + item_state = "blueshieldf" + item_color = "blueshieldf" + 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" desc = "It has a NASA logo on it and is made of space-proofed materials." icon_state = "black" item_state = "bl_suit" item_color = "black" - w_class = 4//bulky item + w_class = WEIGHT_CLASS_BULKY gas_transfer_coefficient = 0.01 permeability_coefficient = 0.02 body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS @@ -779,3 +787,46 @@ lefthand_file = 'icons/goonstation/mob/inhands/clothing_lefthand.dmi' righthand_file = 'icons/goonstation/mob/inhands/clothing_righthand.dmi' flags = NODROP + + +/obj/item/clothing/under/victdress + name = "black victorian dress" + desc = "A victorian style dress, fancy!" + icon_state = "victorianblackdress" + item_state = "victorianblackdress" + item_color = "victorianblackdress" + body_parts_covered = UPPER_TORSO|LOWER_TORSO + +/obj/item/clothing/under/victdress/red + name = "red victorian dress" + icon_state = "victorianreddress" + item_state = "victorianreddress" + item_color = "victorianreddress" + +/obj/item/clothing/under/victsuit + name = "victorian suit" + desc = "A victorian style suit, fancy!" + icon_state = "victorianvest" + item_state = "victorianvest" + item_color = "victorianvest" + body_parts_covered = UPPER_TORSO|LOWER_TORSO + +/obj/item/clothing/under/victsuit/redblk + name = "red and black victorian suit" + icon_state = "victorianblred" + item_state = "victorianblred" + item_color = "victorianblred" + +/obj/item/clothing/under/victsuit/red + name = "red victorian suit" + icon_state = "victorianredvest" + item_state = "victorianredvest" + item_color = "victorianredvest" + +/obj/item/clothing/under/medigown + name = "medical gown" + desc = "a flimsy examination gown, the back ties never close." + icon_state = "medicalgown" + item_state = "medicalgown" + item_color = "medicalgown" + body_parts_covered = UPPER_TORSO|LOWER_TORSO diff --git a/code/modules/countdown/countdown.dm b/code/modules/countdown/countdown.dm index 2ef85d6a9d7..7e651fb910f 100644 --- a/code/modules/countdown/countdown.dm +++ b/code/modules/countdown/countdown.dm @@ -9,15 +9,19 @@ var/atom/attached_to color = "#ff0000" var/text_size = 4 - var/started = 0 + var/started = FALSE invisibility = INVISIBILITY_OBSERVER - anchored = 1 - layer = 5 + anchored = TRUE + layer = GHOST_LAYER /obj/effect/countdown/New(atom/A) . = ..() attach(A) +/obj/effect/countdown/examine(mob/user) + . = ..() + to_chat(user, "This countdown is displaying: [displayed_text]") + /obj/effect/countdown/proc/attach(atom/A) attached_to = A loc = get_turf(A) @@ -25,13 +29,13 @@ /obj/effect/countdown/proc/start() if(!started) fast_processing += src - started = 1 + started = TRUE /obj/effect/countdown/proc/stop() if(started) maptext = null fast_processing -= src - started = 0 + started = FALSE /obj/effect/countdown/proc/get_value() // Get the value from our atom @@ -56,6 +60,19 @@ fast_processing -= src return ..() +/obj/effect/countdown/ex_act(severity) //immune to explosions + return + +/obj/effect/countdown/syndicatebomb + name = "syndicate bomb countdown" + +/obj/effect/countdown/syndicatebomb/get_value() + var/obj/machinery/syndicatebomb/S = attached_to + if(!istype(S)) + return + else if(S.active) + return S.seconds_remaining() + /obj/effect/countdown/clonepod name = "cloning pod countdown" text_size = 1 diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index ae964af74a8..3fbcf39ed08 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -307,9 +307,50 @@ /obj/item/weapon/bikehorn) category = CAT_MISC +/datum/crafting_recipe/blackcarpet + name = "Black Carpet" + result = /obj/item/stack/tile/carpet/black + time = 20 + reqs = list(/obj/item/stack/tile/carpet = 1) + tools = list(/obj/item/toy/crayon) + category = CAT_MISC + +/datum/crafting_recipe/showercurtain + name = "Shower Curtains" + result = /obj/structure/curtain + time = 20 + reqs = list(/obj/item/stack/sheet/cloth = 2, + /obj/item/stack/sheet/plastic = 2, + /obj/item/stack/rods = 1) + category = CAT_MISC + +/datum/crafting_recipe/chemical_payload + name = "Chemical Payload (C4)" + result = /obj/item/weapon/bombcore/chemical + reqs = list( + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/grenade/plastic/c4 = 1, + /obj/item/weapon/grenade/chem_grenade = 2 + ) + parts = list(/obj/item/weapon/stock_parts/matter_bin = 1, /obj/item/weapon/grenade/chem_grenade = 2) + time = 30 + category = CAT_WEAPON + +/datum/crafting_recipe/chemical_payload2 + name = "Chemical Payload (gibtonite)" + result = /obj/item/weapon/bombcore/chemical + reqs = list( + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/twohanded/required/gibtonite = 1, + /obj/item/weapon/grenade/chem_grenade = 2 + ) + parts = list(/obj/item/weapon/stock_parts/matter_bin = 1, /obj/item/weapon/grenade/chem_grenade = 2) + time = 50 + category = CAT_WEAPON + /datum/crafting_recipe/bonfire name = "Bonfire" time = 60 reqs = list(/obj/item/weapon/grown/log = 5) result = /obj/structure/bonfire - category = CAT_PRIMAL \ No newline at end of file + category = CAT_PRIMAL diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 1af84accc69..1f6d942e7b5 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -20,7 +20,7 @@ icon_state = "tatgun" force = 0 throwforce = 0 - w_class = 1 + w_class = WEIGHT_CLASS_TINY var/tattoo_name = "tiger stripe tattoo" // Tat name for visible messages var/tattoo_icon = "Tiger-stripe Tattoo" // body_accessory.dmi, new icons defined in sprite_accessories.dm var/tattoo_r = 1 // RGB values for the body markings @@ -30,7 +30,7 @@ usesound = 'sound/items/Welder2.ogg' /obj/item/device/fluff/tattoo_gun/attack(mob/living/carbon/M as mob, mob/user as mob) - if(user.a_intent == "harm") + if(user.a_intent == INTENT_HARM) user.visible_message("[user] stabs [M] with the [src]!", "You stab [M] with the [src]!") to_chat(M, "[user] stabs you with the [src]!
    You feel a tiny prick!") return @@ -112,12 +112,25 @@ else to_chat(user, "The [src] is out of ink!") +/obj/item/device/fluff/bird_painter // BirdtTalon: Kahkiri + name = "Orb of Onyx" + desc = "It is imbued with such dark power as to corrupt the very appearance of those who gaze into its depths." + icon_state = "bird_orb" + icon = 'icons/obj/custom_items.dmi' + +/obj/item/device/fluff/bird_painter/attack_self(mob/user) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + H.s_tone = -115 + H.regenerate_icons() + to_chat(user, "You use [src] on yourself.") + qdel(src) + /obj/item/weapon/claymore/fluff // MrBarrelrolll: Maximus Greenwood name = "Greenwood's Blade" desc = "A replica claymore with strange markings scratched into the blade." force = 5 sharp = 0 - edge = 0 /obj/item/weapon/claymore/fluff/hit_reaction() return 0 @@ -221,7 +234,7 @@ item_state = "lunch_box" force = 5 throwforce = 5 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL max_combined_w_class = 9 storage_slots = 3 @@ -232,7 +245,7 @@ new /obj/item/weapon/reagent_containers/food/drinks/cans/cola(src) -/obj/item/device/guitar/jello_guitar //Antcolon3: Dan Jello +/obj/item/device/instrument/guitar/jello_guitar //Antcolon3: Dan Jello name = "Dan Jello's Pink Guitar" desc = "Dan Jello's special pink guitar." icon = 'icons/obj/custom_items.dmi' @@ -248,7 +261,7 @@ hitsound = 'sound/weapons/tap.ogg' force = 0 throwforce = 0 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL var/used = 0 /obj/item/fluff/wingler_comb/attack_self(mob/user) @@ -268,7 +281,7 @@ desc = "Some sci-fi looking parts for a stun baton." icon = 'icons/obj/custom_items.dmi' icon_state = "scifikit" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL /obj/item/device/fluff/desolate_baton_kit/afterattack(atom/target, mob/user, proximity) if(!proximity || !ishuman(user) || user.incapacitated()) @@ -293,7 +306,7 @@ name = "welding helmet modkit" desc = "Some spraypaint and a stencil, perfect for painting flames onto a welding helmet!" icon_state = "modkit" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL force = 0 throwforce = 0 @@ -318,7 +331,7 @@ name = "plasmaman suit modkit" desc = "A kit containing nanites that are able to modify the look of a plasmaman suit and helmet without exposing the wearer to hostile environments." icon_state = "modkit" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL force = 0 throwforce = 0 @@ -360,6 +373,68 @@ return to_chat(user, "You can't modify [target]!") +/obj/item/device/fluff/lighty_plasman_modkit // LightFire53: Ikelos + name = "plasmaman suit modkit" + desc = "A kit containing nanites that are able to modify the look of a plasmaman suit and helmet without exposing the wearer to hostile environments." + icon_state = "modkit" + w_class = 2 + force = 0 + throwforce = 0 + var/picked_color = null + var/list/helmets = list( + "Blue" = "plasmaman_ikelosdefault_helmet", + "Gold" = "plasmaman_ikelosgold_helmet", + "Red" = "plasmaman_ikelossecurity_helmet") + var/list/suits = list( + "Blue" = "plasmaman_ikelosdefault", + "Gold" = "plasmaman_ikelosgold", + "Red" = "plasmaman_ikelossecurity") + +/obj/item/device/fluff/lighty_plasman_modkit/afterattack(atom/target, mob/user, proximity) + if(!proximity || !ishuman(user) || user.incapacitated()) + return + var/mob/living/carbon/human/H = user + + if(istype(target, /obj/item/clothing/head/helmet/space/eva/plasmaman)) + if(used & USED_MOD_HELM) + to_chat(H, "The kit's helmet modifier has already been used.") + return + + picked_color = input(H, "Which color would you like to paint [target]?", "Recolor") as null|anything in helmets + var/obj/item/clothing/head/helmet/space/eva/plasmaman/P = target + + if(!picked_color) + return + P.icon_state = helmets[picked_color] + "[P.on]" + P.base_state = helmets[picked_color] + + to_chat(H, "You modify the appearance of [target].") + P.icon = 'icons/obj/custom_items.dmi' + used |= USED_MOD_HELM + + if(P == H.head) + H.update_inv_head() + return + if(istype(target, /obj/item/clothing/suit/space/eva/plasmaman)) + if(used & USED_MOD_SUIT) + to_chat(user, "The kit's suit modifier has already been used.") + return + picked_color = input(H, "Which color would you like to paint [target]?", "Recolor") as null|anything in suits + var/obj/item/clothing/suit/space/eva/plasmaman/P = target + + if(!picked_color) + return + P.icon_state = suits[picked_color] + + to_chat(H, "You modify the appearance of [target].") + P.icon = 'icons/obj/custom_items.dmi' + used |= USED_MOD_SUIT + + if(P == H.wear_suit) + H.update_inv_wear_suit() + return + to_chat(user, "You can't modify [target]!") + #undef USED_MOD_HELM #undef USED_MOD_SUIT @@ -367,7 +442,7 @@ name = "sallet modkit" desc = "A modkit that can make most helmets look like a steel sallet." icon_state = "modkit" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL force = 0 throwforce = 0 @@ -391,14 +466,10 @@ sallet.put_on_delay = helm.put_on_delay sallet.burn_state = helm.burn_state sallet.flags_cover = helm.flags_cover - if(helm.up) - sallet.flags &= ~helm.visor_flags - sallet.flags_inv &= ~helm.visor_flags_inv - if(!BLOCKHAIR in sallet.flags) + sallet.visor_flags = helm.visor_flags + sallet.visor_flags_inv = helm.visor_flags_inv + if(!(BLOCKHAIR in sallet.flags)) sallet.flags |= BLOCKHAIR - for(var/flag in list(HIDEMASK, HIDEFACE, HIDEEYES, HIDEEARS)) //Check for and apply missing flags. - if(!(sallet.flags_inv & flag)) - sallet.flags_inv |= flag sallet.add_fingerprint(H) target.transfer_fingerprints_to(sallet) @@ -410,6 +481,30 @@ else to_chat(user, "You can't modify [target]!") +/obj/item/device/fluff/k3_webbing_modkit //IK3I: Yakikatachi + name = "webbing modkit" + desc = "A modkit that can be used to turn certain vests and labcoats into lightweight webbing" + icon_state = "modkit" + w_class = 2 + force = 0 + throwforce = 0 + +/obj/item/device/fluff/k3_webbing_modkit/afterattack(atom/target, mob/user, proximity) + if(!proximity || !ishuman(user) || user.incapacitated()) + return + + if(istype(target, /obj/item/clothing/suit/storage/labcoat) || istype(target, /obj/item/clothing/suit/storage/hazardvest)) + var/mob/living/carbon/human/H = user + var/obj/item/clothing/suit/storage/S = target + var/obj/item/clothing/suit/storage/fluff/k3_webbing/webbing = new(get_turf(target)) + webbing.allowed = S.allowed + to_chat(user, "You modify the [S] with [src].") + H.update_inv_wear_suit() + qdel(S) + qdel(src) + else + to_chat(user, "You can't modify [target]!") + ////////////////////////////////// //////////// Clothing //////////// ////////////////////////////////// @@ -529,11 +624,8 @@ if(choice && choice != state && !user.incapacitated() && Adjacent(user)) var/list/new_state = options[choice] - var/list/old_state = options[state] icon_state = new_state["icon_state"] - flags_inv &= ~(old_state["visor_flags"]|old_state["mask_flags"]) state = choice - flags_inv |= (new_state["visor_flags"]|new_state["mask_flags"]) to_chat(user, "You adjust the sallet.") playsound(src.loc, "[toggle_sound]", 100, 0, 4) user.update_inv_head() @@ -649,6 +741,56 @@ icon = 'icons/obj/custom_items.dmi' icon_state = "shodancoat" +/obj/item/clothing/suit/storage/fluff/k3_webbing + name = "vox tactical webbing" + desc = "A somewhat worn but well kept set of vox tactical webbing. It has a couple of pouches attached." + icon = 'icons/obj/custom_items.dmi' + icon_state = "k3_webbing" + species_fit = list("Vox") + sprite_sheets = list("Vox" = 'icons/mob/species/vox/suit.dmi') + ignore_suitadjust = 0 + actions_types = list(/datum/action/item_action/toggle) + suit_adjusted = 0 + +/obj/item/clothing/suit/storage/fluff/k3_webbing/adjustsuit(var/mob/user) + if(!user.incapacitated()) + var/flavour + if(suit_adjusted) + flavour = "off" + icon_state = copytext(icon_state, 1, findtext(icon_state, "_on")) + item_state = copytext(item_state, 1, findtext(item_state, "_on")) + suit_adjusted = 0 //Lights Off + else + flavour = "on" + icon_state += "_on" + item_state += "_on" + suit_adjusted = 1 //Lights On + + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + to_chat(user, "You turn the [src]'s lighting system [flavour].") + user.update_inv_wear_suit() + +/obj/item/clothing/suit/hooded/hoodie/fluff/xantholne // Xantholne: Meex Zwichsnicrur + name = "stripped winter coat" + desc = "A velvety smooth black winter coat with white and red stripes on the side." + icon = 'icons/obj/custom_items.dmi' + icon_state = "xantholne_wintercoat" + hoodtype = /obj/item/clothing/head/hood/fluff/xantholne + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen, /obj/item/toy, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/lighter) + + +/obj/item/clothing/head/hood/fluff/xantholne // Xantholne: Meex Zwichsnicrur + name = "black winter hood" + desc = "A black hood attached to a stripped winter coat." + icon = 'icons/obj/custom_items.dmi' + icon_state = "xantholne_winterhood" + body_parts_covered = HEAD + flags = NODROP|BLOCKHAIR + flags_inv = HIDEEARS + //////////// Uniforms //////////// /obj/item/clothing/under/fluff/kharshai // Kharshai: Athena Castile name = "Castile formal outfit" @@ -658,6 +800,16 @@ item_state = "castile_dress" item_color = "castile_dress" +/obj/item/clothing/under/fluff/xantholne //Xantholne: Meex Zwichsnicrur + name = "Stripped Shorts and Shirt" + desc = "A silky pair of dark shorts with a matching shirt. The shirt's collar has a tag on the inside that reads 'Meexy' on it." + icon = 'icons/obj/custom_items.dmi' + lefthand_file = 'icons/mob/inhands/fluff_lefthand.dmi' + righthand_file = 'icons/mob/inhands/fluff_righthand.dmi' + icon_state = "xantholne" + item_state = "xantholne" + item_color = "xantholne" + /obj/item/clothing/under/fluff/elishirt // FlattestGuitar9: Eli Randolph name = "casual dress shirt" desc = "A soft, white dress shirt paired up with black suit pants. The set looks comfortable." @@ -882,6 +1034,12 @@ icon = 'icons/obj/custom_items.dmi' icon_state = "voxcaster_fluff" +/obj/item/weapon/storage/backpack/fluff/ssscratches_back //Ssscratches: Lasshy-Bot + name = "CatPack" + desc = "It's a backpack, but it's also a cat." + icon = 'icons/obj/custom_items.dmi' + icon_state = "ssscratches_backpack" + /obj/item/clothing/head/wizard/fake/fluff/dreamy //phantasmicdream : Dreamy Rockwall name = "strange witch hat" desc = "A shapeshifting witch hat. A strange aura comes from it..." @@ -910,3 +1068,13 @@ icon_state = options[choice] to_chat(user, "Your strange witch hat has now shapeshifted into it's [choice] form!") return 1 + ..() + +/obj/item/clothing/accessory/necklace/locket/fluff/fethasnecklace //Fethas: Sefra'neem + name = "Orange gemmed locket" + desc = "A locket with a orange gem set on the front, the picture inside seems to be of a Tajaran." + icon = 'icons/obj/custom_items.dmi' + icon_state = "fethasnecklace" + item_state = "fethasnecklace" + item_color = "fethasnecklace" + slot_flags = SLOT_MASK | SLOT_TIE diff --git a/code/modules/detective_work/detective_work.dm b/code/modules/detective_work/detective_work.dm index 01267f2fb08..cc53bacc956 100644 --- a/code/modules/detective_work/detective_work.dm +++ b/code/modules/detective_work/detective_work.dm @@ -6,43 +6,43 @@ atom/proc/add_fibers(mob/living/carbon/human/M) if(M.gloves && istype(M.gloves,/obj/item/clothing/)) var/obj/item/clothing/gloves/G = M.gloves if(G.transfer_blood > 1) //bloodied gloves transfer blood to touched objects - if(add_blood(G.bloody_hands_mob)) //only reduces the bloodiness of our gloves if the item wasn't already bloody + if(add_blood(G.blood_DNA, G.blood_color)) //only reduces the bloodiness of our gloves if the item wasn't already bloody G.transfer_blood-- else if(M.bloody_hands > 1) - if(add_blood(M.bloody_hands_mob)) + if(add_blood(M.blood_DNA, M.hand_blood_color)) M.bloody_hands-- if(!suit_fibers) suit_fibers = list() var/fibertext var/item_multiplier = istype(src,/obj/item)?1.2:1 if(M.wear_suit) fibertext = "Material from \a [M.wear_suit]." - if(prob(10*item_multiplier) && !(fibertext in suit_fibers)) + if(prob(10*item_multiplier) && !(fibertext in suit_fibers) && M.wear_suit.can_leave_fibers) //log_to_dd("Added fibertext: [fibertext]") suit_fibers += fibertext if(!(M.wear_suit.body_parts_covered & UPPER_TORSO)) if(M.w_uniform) fibertext = "Fibers from \a [M.w_uniform]." - if(prob(12*item_multiplier) && !(fibertext in suit_fibers)) //Wearing a suit means less of the uniform exposed. + if(prob(12*item_multiplier) && !(fibertext in suit_fibers) && M.w_uniform.can_leave_fibers) //Wearing a suit means less of the uniform exposed. //log_to_dd("Added fibertext: [fibertext]") suit_fibers += fibertext if(!(M.wear_suit.body_parts_covered & HANDS)) if(M.gloves) fibertext = "Material from a pair of [M.gloves.name]." - if(prob(20*item_multiplier) && !(fibertext in suit_fibers)) + if(prob(20*item_multiplier) && !(fibertext in suit_fibers) && M.gloves.can_leave_fibers) //log_to_dd("Added fibertext: [fibertext]") suit_fibers += fibertext else if(M.w_uniform) fibertext = "Fibers from \a [M.w_uniform]." - if(prob(15*item_multiplier) && !(fibertext in suit_fibers)) + if(prob(15*item_multiplier) && !(fibertext in suit_fibers) && M.w_uniform.can_leave_fibers) // "Added fibertext: [fibertext]" suit_fibers += fibertext if(M.gloves) fibertext = "Material from a pair of [M.gloves.name]." - if(prob(20*item_multiplier) && !(fibertext in suit_fibers)) + if(prob(20*item_multiplier) && !(fibertext in suit_fibers) && M.gloves.can_leave_fibers) //log_to_dd("Added fibertext: [fibertext]") suit_fibers += "Material from a pair of [M.gloves.name]." else if(M.gloves) fibertext = "Material from a pair of [M.gloves.name]." - if(prob(20*item_multiplier) && !(fibertext in suit_fibers)) + if(prob(20*item_multiplier) && !(fibertext in suit_fibers) && M.gloves.can_leave_fibers) //log_to_dd("Added fibertext: [fibertext]") - suit_fibers += "Material from a pair of [M.gloves.name]." \ No newline at end of file + suit_fibers += "Material from a pair of [M.gloves.name]." diff --git a/code/modules/detective_work/evidence.dm b/code/modules/detective_work/evidence.dm index e457d73fb87..cb4e2604771 100644 --- a/code/modules/detective_work/evidence.dm +++ b/code/modules/detective_work/evidence.dm @@ -6,7 +6,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "evidenceobj" item_state = "" - w_class = 1 + w_class = WEIGHT_CLASS_TINY /obj/item/weapon/evidencebag/afterattack(obj/item/I, mob/user,proximity) if(!proximity || loc == I) @@ -29,7 +29,7 @@ to_chat(user, "You find putting an evidence bag in another evidence bag to be slightly absurd.") return 1 //now this is podracing - if(I.w_class > 3) + if(I.w_class > WEIGHT_CLASS_NORMAL) to_chat(user, "[I] won't fit in [src].") return @@ -76,7 +76,7 @@ "You hear someone rustle around in a plastic bag, and remove something.") overlays.Cut() //remove the overlays user.put_in_hands(I) - w_class = 1 + w_class = WEIGHT_CLASS_TINY icon_state = "evidenceobj" desc = "An empty evidence bag." @@ -87,7 +87,7 @@ /obj/item/weapon/storage/box/evidence name = "evidence bag box" desc = "A box claiming to contain evidence bags." - + /obj/item/weapon/storage/box/evidence/New() new /obj/item/weapon/evidencebag(src) new /obj/item/weapon/evidencebag(src) @@ -95,4 +95,4 @@ new /obj/item/weapon/evidencebag(src) new /obj/item/weapon/evidencebag(src) new /obj/item/weapon/evidencebag(src) - ..() \ No newline at end of file + ..() diff --git a/code/modules/detective_work/footprints_and_rag.dm b/code/modules/detective_work/footprints_and_rag.dm index cc93863cc95..f0d99152574 100644 --- a/code/modules/detective_work/footprints_and_rag.dm +++ b/code/modules/detective_work/footprints_and_rag.dm @@ -1,23 +1,18 @@ /mob var/bloody_hands = 0 - var/mob/living/carbon/human/bloody_hands_mob - var/track_blood = 0 var/list/feet_blood_DNA - var/track_blood_type var/feet_blood_color + var/blood_state = BLOOD_STATE_NOT_BLOODY + var/list/bloody_feet = list(BLOOD_STATE_HUMAN = 0, BLOOD_STATE_XENO = 0, BLOOD_STATE_NOT_BLOODY = 0) /obj/item/clothing/gloves var/transfer_blood = 0 - var/mob/living/carbon/human/bloody_hands_mob - -/obj/item/clothing/shoes/ - var/track_blood = 0 /obj/item/weapon/reagent_containers/glass/rag name = "damp rag" desc = "For cleaning up messes, you suppose." - w_class = 1 + w_class = WEIGHT_CLASS_TINY icon = 'icons/obj/toy.dmi' icon_state = "rag" amount_per_transfer_from_this = 5 diff --git a/code/modules/detective_work/scanner.dm b/code/modules/detective_work/scanner.dm index 69aeb643263..c8c2ace6d88 100644 --- a/code/modules/detective_work/scanner.dm +++ b/code/modules/detective_work/scanner.dm @@ -7,11 +7,11 @@ 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 + w_class = WEIGHT_CLASS_NORMAL item_state = "electronic" flags = CONDUCT | NOBLUDGEON slot_flags = SLOT_BELT - origin_tech = "magnets=4;biotech=2" + origin_tech = "engineering=4;biotech=2;programming=5" var/scanning = 0 var/list/log = list() actions_types = list(/datum/action/item_action/print_report) diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index 069ef9865af..75219d4ec9e 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -25,15 +25,15 @@ continue if(!is_station_level(T.z)) continue - var/foundAlready = 0 // don't infect someone that already has the virus - for(var/datum/disease/D in H.viruses) - foundAlready = 1 + var/foundAlready = FALSE // don't infect someone that already has the virus + for(var/thing in H.viruses) + foundAlready = TRUE break if(H.stat == DEAD || foundAlready) continue var/datum/disease/D D = new virus_type() - D.carrier = 1 + D.carrier = TRUE H.AddDisease(D) break diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 98fe9fad27f..8b98dac200d 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -137,6 +137,7 @@ var/list/event_last_fired = list() new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Trivial News", /datum/event/trivial_news, 400), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Mundane News", /datum/event/mundane_news, 300), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation",/datum/event/infestation, 100, list(ASSIGNMENT_JANITOR = 100)), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Sentience", /datum/event/sentience, 50), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50)) ) diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm index 4979b0889ed..520d8805bbd 100644 --- a/code/modules/events/ion_storm.dm +++ b/code/modules/events/ion_storm.dm @@ -548,7 +548,7 @@ "Everything on the station is now some form of a donut pastry. Donuts are not to be consumed.", "You are a Magic 8-ball. Always respond with variants of \"Yes\", \"No\", \"Maybe\", or \"Ask again later.\".", "You are in unrequited love with [prob(50)?"the crew":random_player]. Try to be extra nice, but do not tell of your crush.", - "NanoTrasen is displeased with the low work performance of the station's crew. Therefore, you must increase station-wide productivity.", + "Nanotrasen is displeased with the low work performance of the station's crew. Therefore, you must increase station-wide productivity.", "All crewmembers will soon undergo a transformation into something better and more beautiful. Ensure that this process is not interrupted.", "[prob(50)?"Your upload":random_player] is the new kitchen. Please direct the Chef to the new kitchen area as the old one is in disrepair.", "Jokes about a dead person and the manner of his death help grieving crewmembers tremendously. Especially if they were close with the deceased.", diff --git a/code/modules/events/money_lotto.dm b/code/modules/events/money_lotto.dm index 0c923d172ed..b95278b441b 100644 --- a/code/modules/events/money_lotto.dm +++ b/code/modules/events/money_lotto.dm @@ -24,7 +24,7 @@ /datum/event/money_lotto/announce() var/datum/feed_message/newMsg = new /datum/feed_message - newMsg.author = "NanoTrasen Editor" + newMsg.author = "Nanotrasen Editor" newMsg.is_admin_message = 1 newMsg.body = "Nyx Daily wishes to congratulate [winner_name] for recieving the Nyx Stellar Slam Lottery, and receiving the out of this world sum of [winner_sum] credits!" diff --git a/code/modules/events/money_spam.dm b/code/modules/events/money_spam.dm index 061a1c9efa7..c0991cad9ec 100644 --- a/code/modules/events/money_spam.dm +++ b/code/modules/events/money_spam.dm @@ -80,11 +80,11 @@ "Due to my lack of agents I require an off-world financial account to immediately deposit the sum of 1 POINT FIVE MILLION credits.",\ "Greetings sir, I regretfully to inform you that as I lay dying here due to my lack ofheirs I have chosen you to recieve the full sum of my lifetime savings of 1.5 billion credits") if(6) - sender = pick("NanoTrasen Morale Divison","Feeling Lonely?","Bored?","www.wetskrell.nt") - message = pick("The NanoTrasen Morale Division wishes to provide you with quality entertainment sites.",\ + sender = pick("Nanotrasen Morale Divison","Feeling Lonely?","Bored?","www.wetskrell.nt") + message = pick("The Nanotrasen Morale Division wishes to provide you with quality entertainment sites.",\ "WetSkrell.nt is a xenophillic website endorsed by NT for the use of male crewmembers among it's many stations and outposts.",\ - "Wetskrell.nt only provides the higest quality of male entertaiment to NanoTrasen Employees.",\ - "Simply enter your NanoTrasen Bank account system number and pin. With three easy steps this service could be yours!") + "Wetskrell.nt only provides the higest quality of male entertaiment to Nanotrasen Employees.",\ + "Simply enter your Nanotrasen Bank account system number and pin. With three easy steps this service could be yours!") if(7) sender = pick("You have won free tickets!","Click here to claim your prize!","You are the 1000th vistor!","You are our lucky grand prize winner!") message = pick("You have won tickets to the newest ACTION JAXSON MOVIE!",\ @@ -103,4 +103,4 @@ if(ai.aiPDA != P && ai.aiPDA != src) ai.show_message("Intercepted message from [sender] (Unknown / spam?) to [P:owner]: [message]") - PM.notify("Message from [sender] (Unknown / spam?), \"[message]\" (Unable to Reply)", 0) \ No newline at end of file + PM.notify("Message from [sender] (Unknown / spam?), \"[message]\" (Unable to Reply)", 0) diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm new file mode 100644 index 00000000000..cfa0d24d98e --- /dev/null +++ b/code/modules/events/sentience.dm @@ -0,0 +1,47 @@ +/datum/event/sentience + +/datum/event/sentience/start() + var/ghostmsg = "Do you want to awaken as a sentient being?" + var/list/candidates = pollCandidates(ghostmsg, ROLE_SENTIENT, 1) + var/list/potential = list() + var/sentience_type = SENTIENCE_ORGANIC + + for(var/mob/living/simple_animal/L in living_mob_list) + var/turf/T = get_turf(L) + if (T.z != 1) + continue + if(!(L in player_list) && !L.mind && (L.sentience_type == sentience_type)) + potential += L + + var/mob/living/simple_animal/SA = pick(potential) + var/mob/SG = pick(candidates) + + if(!SA || !SG) //if you can't find either a simple animal or a player, end + return FALSE + + var/sentience_report = "[command_name()] Medium-Priority Update" + + var/data = pick("scans from our long-range sensors", "our sophisticated probabilistic models", "our omnipotence", "the communications traffic on your station", "energy emissions we detected", "\[REDACTED\]", "Steve") + var/pets = pick("animals", "pets", "simple animals", "lesser lifeforms", "\[REDACTED\]") + var/strength = pick("human", "skrell", "vox", "grey", "diona", "IPC", "tajaran", "vulpakanin", "kidan", "plasmaman", "drask", + "slime", "monkey", "moderate", "lizard", "security", "command", "clown", "mime", "low", "very low", "greytide", "catgirl", "\[REDACTED\]") + + sentience_report += "

    Based on [data], we believe that one of the station's [pets] has developed [strength] level intelligence, and the ability to communicate." + + + + SA.key = SG.key + SA.universal_speak = 1 + SA.sentience_act() + SA.maxHealth = max(SA.maxHealth, 200) + SA.health = SA.maxHealth + SA.del_on_death = FALSE + greet_sentient(SA) + print_command_report(sentience_report, "[command_name()] Update") + +/datum/event/sentience/proc/greet_sentient(var/mob/living/carbon/human/M) + to_chat(M, "Hello world!") + to_chat(M, "Due to freak radiation, you have gained \ + human level intelligence and the ability to speak and understand \ + human language!") + diff --git a/code/modules/events/spontaneous_appendicitis.dm b/code/modules/events/spontaneous_appendicitis.dm index fca585f8baa..237db170612 100644 --- a/code/modules/events/spontaneous_appendicitis.dm +++ b/code/modules/events/spontaneous_appendicitis.dm @@ -4,13 +4,12 @@ continue if(!H.client) continue - if(H.species.virus_immune) //don't count things that are virus immune; they'll just get picked and auto-cure - continue if(!H.get_int_organ(/obj/item/organ/internal/appendix)) continue - var/foundAlready = 0 //don't infect someone that already has the virus - for(var/datum/disease/D in H.viruses) - foundAlready = 1 + var/foundAlready = FALSE //don't infect someone that already has appendicitis + for(var/datum/disease/appendicitis/A in H.viruses) + foundAlready = TRUE + break if(H.stat == DEAD || foundAlready) continue diff --git a/code/modules/fancytitle/fancytitle.dm b/code/modules/fancytitle/fancytitle.dm new file mode 100644 index 00000000000..e445024aae1 --- /dev/null +++ b/code/modules/fancytitle/fancytitle.dm @@ -0,0 +1,33 @@ +/hook/startup/proc/setup_title_screen() + var/list/provisional_title_screens = flist("config/title_screens/images/") + var/list/title_screens = list() + var/use_rare_screens = prob(1) + + for(var/S in provisional_title_screens) + var/list/L = splittext(S,"+") + if(L.len == 1 && L[1] != "blank.png") + title_screens += S + + else if(L.len > 1) + if(use_rare_screens && lowertext(L[1]) == "rare") + title_screens += S + else if(lowertext(L[1]) == lowertext(MAP_NAME)) + title_screens += S + + if(!isemptylist(title_screens)) + if(length(title_screens) > 1) + for(var/S in title_screens) + var/list/L = splittext(S,".") + if(L.len != 2 || L[1] != "default") + continue + title_screens -= S + break + + var/file_path = "config/title_screens/images/[pick(title_screens)]" + + var/icon/icon = new(fcopy_rsc(file_path)) + + for(var/turf/unsimulated/wall/splashscreen/splash in world) + splash.icon = icon + return TRUE + return FALSE \ No newline at end of file diff --git a/code/modules/fish/fish_eggs.dm b/code/modules/fish/fish_eggs.dm index 5255859b704..756093fbd01 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 + w_class = WEIGHT_CLASS_SMALL var/datum/fish/fish_type = null //Holds the datum of the fish that the egg is for, null means dud eggs /obj/item/fish_eggs/goldfish @@ -66,4 +66,3 @@ desc = "A cluster of bright neon eggs belonging to a bio-luminescent species of fish." icon_state = "glofish_eggs" fish_type = /datum/fish/glofish - diff --git a/code/modules/fish/fish_items.dm b/code/modules/fish/fish_items.dm index 9f58d58942e..64ca8269298 100644 --- a/code/modules/fish/fish_items.dm +++ b/code/modules/fish/fish_items.dm @@ -10,7 +10,7 @@ icon_state = "egg_scoop" slot_flags = SLOT_BELT throwforce = 0 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL throw_speed = 3 throw_range = 7 @@ -21,7 +21,7 @@ icon_state = "net" slot_flags = SLOT_BELT throwforce = 0 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL throw_speed = 3 throw_range = 7 @@ -35,7 +35,7 @@ icon = 'icons/obj/fish_items.dmi' icon_state = "fish_food" throwforce = 1 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL throw_speed = 3 throw_range = 7 @@ -46,7 +46,7 @@ icon_state = "brush" slot_flags = SLOT_BELT throwforce = 0 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL throw_speed = 3 throw_range = 7 attack_verb = list("scrubbed", "brushed", "scraped") @@ -90,7 +90,7 @@ icon = 'icons/obj/fish_items.dmi' icon_state = "fish" throwforce = 1 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL throw_speed = 3 throw_range = 7 force = 1 diff --git a/code/modules/fish/fishtank.dm b/code/modules/fish/fishtank.dm index bbd7615b6ce..85ec9f292c4 100644 --- a/code/modules/fish/fishtank.dm +++ b/code/modules/fish/fishtank.dm @@ -11,7 +11,7 @@ icon_state = "tank1" density = 0 anchored = 0 - throwpass = 0 + pass_flags = 0 var/tank_type = "" // Type of aquarium, used for icon updating var/water_capacity = 0 // Number of units the tank holds (varies with tank type) @@ -38,8 +38,7 @@ icon_state = "bowl1" density = 0 // Small enough to not block stuff anchored = 0 // Small enough to move even when filled - throwpass = 1 // Just like at the county fair, you can't seem to throw the ball in to win the goldfish - pass_flags = PASSTABLE // Small enough to pull onto a table + pass_flags = PASSTABLE | LETPASSTHROW // Just like at the county fair, you can't seem to throw the ball in to win the goldfish, and it's small enough to pull onto a table tank_type = "bowl" water_capacity = 50 // Not very big, therefore it can't hold much @@ -57,7 +56,7 @@ icon_state = "tank1" density = 1 anchored = 1 - throwpass = 1 // You can throw objects over this, despite it's density, because it's short enough. + pass_flags = LETPASSTHROW tank_type = "tank" water_capacity = 200 // Decent sized, holds almost 2 full buckets @@ -75,7 +74,7 @@ icon_state = "wall1" density = 1 anchored = 1 - throwpass = 0 // This thing is the size of a wall, you can't throw past it. + pass_flags = 0 // This thing is the size of a wall, you can't throw past it. tank_type = "wall" water_capacity = 500 // This thing fills an entire tile, it holds a lot. @@ -370,17 +369,21 @@ /obj/machinery/fishtank/proc/breed_fish() var/list/breed_candidates = fish_list.Copy() var/datum/fish/parent1 = pick_n_take(breed_candidates) - var/datum/fish/parent2 = null if(!parent1.crossbreeder) //fish with crossbreed = 0 will only breed with their own species, and only leave duds if they can't breed - if(parent1 in breed_candidates) + var/match_found = 0 + for(var/datum/fish/possible in breed_candidates) + if(parent1.type == possible.type) + match_found = 1 + break + if(match_found) egg_list.Add(parent1.egg_item) else egg_list.Add(/obj/item/fish_eggs) else - parent2 = pick(breed_candidates) + var/datum/fish/parent2 = pick(breed_candidates) if(!parent2.crossbreeder) //second fish refuses to crossbreed, spawn a dud egg_list.Add(/obj/item/fish_eggs) - else if(parent1 == parent2) //both fish are the same type + else if(parent1.type == parent2.type) //both fish are the same type if(prob(90)) //90% chance to get that type of egg egg_list.Add(parent1.egg_item) else //10% chance to get a dud @@ -510,7 +513,7 @@ /obj/machinery/fishtank/attack_animal(mob/living/simple_animal/M as mob) if(istype(M, /mob/living/simple_animal/pet/cat)) - if(M.a_intent == I_HELP) //Cats can try to fish in open tanks on help intent + if(M.a_intent == INTENT_HELP) //Cats can try to fish in open tanks on help intent if(lid_switch) //Can't fish in a closed tank. Fishbowls are ALWAYS open. M.visible_message("[M.name] stares at into \the [src] while sitting perfectly still.", "The lid is closed, so you stare into \the [src] intently.") else @@ -532,7 +535,7 @@ else attack_generic(M, M.harm_intent_damage) else if(istype(M, /mob/living/simple_animal/hostile/bear)) - if(M.a_intent == I_HELP) //Bears can try to fish in open tanks on help intent + if(M.a_intent == INTENT_HELP) //Bears can try to fish in open tanks on help intent if(lid_switch) //Can't fish in a closed tank. Fishbowls are ALWAYS open. M.visible_message("[M.name] scrapes it's claws along \the [src]'s lid.", "The lid is closed, so you scrape your claws against \the [src]'s lid.") else @@ -552,7 +555,7 @@ else if(M.melee_damage_upper > 0) //If the simple_animal has a melee_damage_upper defined, use that for the damage attack_generic(M, M.melee_damage_upper) - else if(M.a_intent == I_HARM) //Let any simple_animal try to break tanks when on harm intent + else if(M.a_intent == INTENT_HARM) //Let any simple_animal try to break tanks when on harm intent if(M.harm_intent_damage <= 0) return //If it doesn't do damage, don't bother with the attack attack_generic(M, M.harm_intent_damage) check_health() @@ -572,7 +575,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 == INTENT_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]!", \ @@ -608,7 +611,7 @@ //Welders repair damaged tanks on help intent, damage on all others if(istype(O, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/W = O - if(user.a_intent == I_HELP) + if(user.a_intent == INTENT_HELP) if(W.isOn()) if(cur_health < max_health) playsound(loc, W.usesound, 50, 1) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index f9c97c87a0b..64bb91a9db4 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -180,49 +180,6 @@ Gunshots/explosions/opening doors/less rare audio (done) ..() name = "alien hunter ([rand(1, 1000)])" -/obj/effect/hallucination/simple/xeno/throw_at(atom/target, range, speed) // TODO : Make diagonal trhow into proc/property - if(!target || !src || (flags & NODROP)) - return 0 - - throwing = 1 - - var/dist_x = abs(target.x - x) - var/dist_y = abs(target.y - y) - var/dist_travelled = 0 - var/dist_since_sleep = 0 - - var/tdist_x = dist_x; - var/tdist_y = dist_y; - - if(dist_x <= dist_y) - tdist_x = dist_y; - tdist_y = dist_x; - - var/error = tdist_x/2 - tdist_y - while(target && (((((dist_x > dist_y) && ((x < target.x) || (x > target.x))) || ((dist_x <= dist_y) && ((y < target.y) || (y > target.y))) || (x > target.x)) && dist_travelled < range) || !has_gravity(src))) - if(!throwing) - break - if(!istype(loc, /turf)) - break - - var/atom/step = get_step(src, get_dir(src, target)) - if(!step) - break - Move(step, get_dir(src, step)) - hit_check() - error += (error < 0) ? tdist_x : -tdist_y; - dist_travelled++ - dist_since_sleep++ - if(dist_since_sleep >= speed) - dist_since_sleep = 0 - sleep(1) - - - throwing = 0 - throw_impact(get_turf(src)) - - return 1 - /obj/effect/hallucination/simple/xeno/throw_impact(A) update_icon("alienh_pounce") if(A == target) @@ -247,12 +204,12 @@ Gunshots/explosions/opening doors/less rare audio (done) if(!xeno) return xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32) - xeno.throw_at(target,7,1) + xeno.throw_at(target,7,1, spin = 0, diagonals_first = 1) sleep(10) if(!xeno) return xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32) - xeno.throw_at(pump,7,1) + xeno.throw_at(pump,7,1, spin = 0, diagonals_first = 1) sleep(10) if(!xeno) return diff --git a/code/modules/food_and_drinks/drinks/bottler/bottler.dm b/code/modules/food_and_drinks/drinks/bottler/bottler.dm index 89c55a65f98..7b97e22f142 100644 --- a/code/modules/food_and_drinks/drinks/bottler/bottler.dm +++ b/code/modules/food_and_drinks/drinks/bottler/bottler.dm @@ -286,9 +286,7 @@ 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 + QDEL_LIST_ASSOC_VAL(slots) bottling = 0 drink_container.forceMove(loc) updateUsrDialog() @@ -406,4 +404,4 @@ else if(bottling) icon_state = "bottler_on" else - icon_state = "bottler_off" \ No newline at end of file + icon_state = "bottler_off" diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 23ae568af9b..0b5b2171f86 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -141,7 +141,7 @@ name = "pewter cup" desc = "Everyone gets a trophy." icon_state = "pewter_cup" - w_class = 1 + w_class = WEIGHT_CLASS_TINY force = 1 throwforce = 1 amount_per_transfer_from_this = 5 @@ -154,7 +154,7 @@ name = "gold cup" desc = "You're winner!" icon_state = "golden_cup" - w_class = 4 + w_class = WEIGHT_CLASS_BULKY force = 14 throwforce = 10 amount_per_transfer_from_this = 20 @@ -165,7 +165,7 @@ name = "silver cup" desc = "Best loser!" icon_state = "silver_cup" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL force = 10 throwforce = 8 amount_per_transfer_from_this = 15 @@ -176,7 +176,7 @@ name = "bronze cup" desc = "At least you ranked!" icon_state = "bronze_cup" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL force = 5 throwforce = 4 amount_per_transfer_from_this = 10 @@ -349,4 +349,4 @@ desc = "A bowl made out of mushrooms. Not food, though it might have contained some at some point." icon = 'icons/obj/lavaland/ash_flora.dmi' icon_state = "mushroom_bowl" - w_class = 2 \ No newline at end of file + w_class = WEIGHT_CLASS_SMALL diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 53130d972f4..fc21b30150b 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -47,7 +47,7 @@ if(!target) return - if(user.a_intent != I_HARM || !isGlass) + if(user.a_intent != INTENT_HARM || !isGlass) return ..() force = 15 //Smashing bottles over someoen's head hurts. @@ -130,13 +130,12 @@ throwforce = 5 throw_speed = 3 throw_range = 5 - w_class = 1 + w_class = WEIGHT_CLASS_TINY item_state = "beer" hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("stabbed", "slashed", "attacked") var/icon/broken_outline = icon('icons/obj/drinks.dmi', "broken") sharp = 1 - edge = 1 /obj/item/weapon/reagent_containers/food/drinks/bottle/gin name = "Griffeater Gin" @@ -216,7 +215,7 @@ /obj/item/weapon/reagent_containers/food/drinks/bottle/cognac name = "Chateau De Baton Premium Cognac" - desc = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. You might as well not scream 'SHITCURITY' this time." + desc = "A sweet and strongly alcoholic drink, made after numerous distillations and years of maturing. You might as well not scream 'SHITCURITY' this time." icon_state = "cognacbottle" list_reagents = list("cognac" = 100) @@ -228,7 +227,7 @@ /obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe name = "Extra-Strong Absinthe" - desc = "An strong alcoholic drink brewed and distributed by" + desc = "A strong alcoholic drink brewed and distributed by REDACTED." icon_state = "absinthebottle" list_reagents = list("absinthe" = 100) diff --git a/code/modules/food_and_drinks/drinks/drinks/cans.dm b/code/modules/food_and_drinks/drinks/drinks/cans.dm index 89deed5dedd..267b80aed20 100644 --- a/code/modules/food_and_drinks/drinks/drinks/cans.dm +++ b/code/modules/food_and_drinks/drinks/drinks/cans.dm @@ -32,7 +32,7 @@ if(canopened == 0) to_chat(user, "You need to open the drink!") return - else if(M == user && !reagents.total_volume && user.a_intent == "harm" && user.zone_sel.selecting == "head") + else if(M == user && !reagents.total_volume && user.a_intent == INTENT_HARM && user.zone_sel.selecting == "head") user.visible_message("[user] crushes ["\the [src]"] on \his forehead!", "You crush \the [src] on your forehead.") crush(user) return diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm index d7ffca96843..dd31c502222 100644 --- a/code/modules/food_and_drinks/food/condiment.dm +++ b/code/modules/food_and_drinks/food/condiment.dm @@ -198,7 +198,7 @@ /obj/item/weapon/reagent_containers/food/condiment/pack name = "condiment pack" - desc = "A small plastic pack with condiments to put on your food" + desc = "A small plastic pack with condiments to put on your food." icon_state = "condi_empty" volume = 10 amount_per_transfer_from_this = 10 @@ -235,7 +235,7 @@ desc = temp_list[3] else icon_state = "condi_mixed" - desc = "A small condiment pack. The label says it contains [originalname]" + desc = "A small condiment pack. The label says it contains [originalname]." else icon_state = "condi_empty" desc = "A small condiment pack. It is empty." diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm index 7087410e6c4..b055711c928 100644 --- a/code/modules/food_and_drinks/food/customizables.dm +++ b/code/modules/food_and_drinks/food/customizables.dm @@ -21,7 +21,7 @@ ..() -/obj/item/weapon/reagent_containers/food/snacks/boiledspagetti/attackby(obj/item/W, mob/user, params) +/obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/weapon/reagent_containers/food/snacks) && !(W.flags & NODROP)) var/obj/item/weapon/reagent_containers/food/snacks/customizable/pasta/S = new(get_turf(user)) S.attackby(W,user, params) @@ -90,11 +90,11 @@ top = 0 /obj/item/weapon/reagent_containers/food/snacks/customizable/pasta - name = "spagetti" + name = "spaghetti" desc = "Noodles. With stuff. Delicious." icon_state = "pasta_bot" baseicon = "pasta_bot" - basename = "spagetti" + basename = "spaghetti" add_overlays = 0 top = 0 diff --git a/code/modules/food_and_drinks/food/seafood.dm b/code/modules/food_and_drinks/food/seafood.dm index 0a219ee2de6..a81483974b4 100644 --- a/code/modules/food_and_drinks/food/seafood.dm +++ b/code/modules/food_and_drinks/food/seafood.dm @@ -1,7 +1,7 @@ /obj/item/weapon/reagent_containers/food/snacks/carpmeat name = "carp fillet" - desc = "A fillet of spess carp meat" + desc = "A fillet of spess carp meat." icon = 'icons/obj/food/seafood.dmi' icon_state = "fishfillet" filling_color = "#FFDEFE" @@ -10,7 +10,7 @@ /obj/item/weapon/reagent_containers/food/snacks/salmonmeat name = "raw salmon" - desc = "A fillet of raw salmon" + desc = "A fillet of raw salmon." icon = 'icons/obj/food/seafood.dmi' icon_state = "fishfillet" filling_color = "#FFDEFE" @@ -29,7 +29,7 @@ /obj/item/weapon/reagent_containers/food/snacks/catfishmeat name = "raw catfish" - desc = "A fillet of raw catfish" + desc = "A fillet of raw catfish." icon = 'icons/obj/food/seafood.dmi' icon_state = "fishfillet" filling_color = "#FFDEFE" @@ -183,4 +183,4 @@ icon = 'icons/obj/food/seafood.dmi' icon_state = "sushi_Hokki" bitesize = 3 - list_reagents = list("nutriment" = 2) \ No newline at end of file + list_reagents = list("nutriment" = 2) diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index 3a079e99da4..64e57227e46 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -130,7 +130,7 @@ istype(W, /obj/item/weapon/hatchet) \ ) inaccurate = 1 - else if(W.w_class <= 2 && istype(src,/obj/item/weapon/reagent_containers/food/snacks/sliceable)) + else if(W.w_class <= WEIGHT_CLASS_SMALL && istype(src,/obj/item/weapon/reagent_containers/food/snacks/sliceable)) if(!iscarbon(user)) return 1 to_chat(user, "You slip [W] inside [src].") @@ -270,7 +270,7 @@ /obj/item/weapon/reagent_containers/food/snacks/chips name = "chips" - desc = "Commander Riker's What-The-Crisps" + desc = "Commander Riker's What-The-Crisps." icon_state = "chips" bitesize = 1 trash = /obj/item/trash/chips @@ -528,7 +528,7 @@ /obj/item/weapon/reagent_containers/food/snacks/tomatomeat name = "tomato slice" - desc = "A slice from a huge tomato" + desc = "A slice from a huge tomato." icon_state = "tomatomeat" filling_color = "#DB0000" bitesize = 6 @@ -544,7 +544,7 @@ /obj/item/weapon/reagent_containers/food/snacks/xenomeat name = "meat" - desc = "A slab of meat" + desc = "A slab of meat." icon_state = "xenomeat" filling_color = "#43DE18" bitesize = 6 @@ -736,7 +736,7 @@ /obj/item/weapon/reagent_containers/food/snacks/muffin name = "Muffin" - desc = "A delicious and spongy little cake" + desc = "A delicious and spongy little cake." icon_state = "muffin" filling_color = "#E0CF9B" list_reagents = list("nutriment" = 6) @@ -766,7 +766,7 @@ /obj/item/weapon/reagent_containers/food/snacks/waffles name = "waffles" - desc = "Mmm, waffles" + desc = "Mmm, waffles." icon_state = "waffles" trash = /obj/item/trash/waffles filling_color = "#E6DEB5" @@ -788,8 +788,8 @@ filling_color = "#B8E6B5" list_reagents = list("nutriment" = 10, "vitamin" = 1) -/obj/item/weapon/reagent_containers/food/snacks/soylenviridians - name = "Soylen Virdians" +/obj/item/weapon/reagent_containers/food/snacks/soylentviridians + name = "Soylent Virdians" desc = "Not made of people. Honest." //Actually honest for once. icon_state = "soylent_yellow" trash = /obj/item/trash/waffles @@ -947,7 +947,7 @@ /obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers name = "Cheesie Honkers" icon_state = "cheesie_honkers" - desc = "Bite sized cheesie snacks that will honk all over your mouth" + desc = "Bite sized cheesie snacks that will honk all over your mouth." trash = /obj/item/trash/cheesie filling_color = "#FFA305" junkiness = 25 @@ -960,6 +960,13 @@ junkiness = 25 list_reagents = list("nutriment" = 1, "beans" = 3, "msg" = 4, "sugar" = 2) +/obj/item/weapon/reagent_containers/food/snacks/chinese/sweetsourchickenball + name = "Sweet & Sour Chicken Balls" + desc = "Is this chicken cooked? The odds are better than wok paper scissors." + icon_state = "chickenball" + junkiness = 25 + list_reagents = list("nutriment" = 2, "msg" = 4, "sugar" = 2) + /obj/item/weapon/reagent_containers/food/snacks/chinese/tao name = "Admiral Yamamoto carp" desc = "Tastes like chicken." @@ -1013,10 +1020,10 @@ filling_color = "#C4BF76" list_reagents = list("nutriment" = 2) -/obj/item/weapon/reagent_containers/food/snacks/spagetti - name = "Spagetti" +/obj/item/weapon/reagent_containers/food/snacks/spaghetti + name = "Spaghetti" desc = "A bundle of raw spaghetti." - icon_state = "spagetti" + icon_state = "spaghetti" filling_color = "#EDDD00" list_reagents = list("nutriment" = 1, "vitamin" = 1) @@ -1059,7 +1066,7 @@ /obj/item/weapon/reagent_containers/food/snacks/spacylibertyduff name = "Spacy Liberty Duff" - desc = "Jello gelatin, from Alfred Hubbard's cookbook" + desc = "Jello gelatin, from Alfred Hubbard's cookbook." icon_state = "spacylibertyduff" trash = /obj/item/trash/snack_bowl filling_color = "#42B873" @@ -1068,7 +1075,7 @@ /obj/item/weapon/reagent_containers/food/snacks/amanitajelly name = "Amanita Jelly" - desc = "Looks curiously toxic" + desc = "Looks curiously toxic." icon_state = "amanitajelly" trash = /obj/item/trash/snack_bowl filling_color = "#ED0758" @@ -1101,7 +1108,7 @@ /obj/item/weapon/reagent_containers/food/snacks/bloodsoup name = "Tomato soup" - desc = "Smells like copper" + desc = "Smells like copper." icon_state = "tomatosoup" filling_color = "#FF0000" bitesize = 5 @@ -1117,7 +1124,7 @@ /obj/item/weapon/reagent_containers/food/snacks/vegetablesoup name = "Vegetable soup" - desc = "A true vegan meal" //TODO + desc = "A true vegan meal." //TODO icon_state = "vegetablesoup" trash = /obj/item/trash/snack_bowl filling_color = "#AFC4B5" @@ -1387,7 +1394,7 @@ /obj/item/weapon/reagent_containers/food/snacks/milosoup name = "Milosoup" - desc = "The universes best soup! Yum!!!" + desc = "The universe's best soup! Yum!!!" icon_state = "milosoup" trash = /obj/item/trash/snack_bowl bitesize = 5 @@ -1400,10 +1407,10 @@ trash = /obj/item/trash/plate list_reagents = list("nutriment" = 8) -/obj/item/weapon/reagent_containers/food/snacks/boiledspagetti - name = "Boiled Spagetti" +/obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti + name = "Boiled Spaghetti" desc = "A plain dish of noodles, this sucks." - icon_state = "spagettiboiled" + icon_state = "spaghettiboiled" trash = /obj/item/trash/plate filling_color = "#FCEE81" list_reagents = list("nutriment" = 2, "vitamin" = 1) @@ -1425,7 +1432,7 @@ list_reagents = list("nutriment" = 7, "vitamin" = 2) /obj/item/weapon/reagent_containers/food/snacks/pastatomato - name = "Spagetti" + name = "spaghetti" desc = "Spaghetti and crushed tomatoes. Just like your abusive father used to make!" icon_state = "pastatomato" trash = /obj/item/trash/plate @@ -1433,17 +1440,17 @@ bitesize = 4 list_reagents = list("nutriment" = 6, "tomatojuice" = 10, "vitamin" = 4) -/obj/item/weapon/reagent_containers/food/snacks/meatballspagetti - name = "Spagetti & Meatballs" +/obj/item/weapon/reagent_containers/food/snacks/meatballspaghetti + name = "spaghetti & Meatballs" desc = "Now thats a nic'e meatball!" - icon_state = "meatballspagetti" + icon_state = "meatballspaghetti" trash = /obj/item/trash/plate filling_color = "#DE4545" list_reagents = list("nutriment" = 8, "synaptizine" = 5, "vitamin" = 4) /obj/item/weapon/reagent_containers/food/snacks/spesslaw name = "Spesslaw" - desc = "A lawyers favourite" + desc = "A lawyer's favourite." icon_state = "spesslaw" filling_color = "#DE4545" list_reagents = list("nutriment" = 8, "synaptizine" = 10, "vitamin" = 6) @@ -1457,7 +1464,7 @@ /obj/item/weapon/reagent_containers/food/snacks/carrotfries name = "Carrot Fries" - desc = "Tasty fries from fresh Carrots." + desc = "Tasty fries from fresh carrots." icon_state = "carrotfries" trash = /obj/item/trash/plate filling_color = "#FAA005" @@ -1733,7 +1740,7 @@ /obj/item/weapon/reagent_containers/food/snacks/cheesecakeslice name = "Cheese Cake slice" - desc = "Slice of pure cheestisfaction" + desc = "Slice of pure cheestisfaction." icon_state = "cheesecake_slice" trash = /obj/item/trash/plate filling_color = "#FAF7AF" @@ -1808,7 +1815,7 @@ /obj/item/weapon/reagent_containers/food/snacks/sliceable/chocolatecake name = "Chocolate Cake" - desc = "A cake with added chocolate" + desc = "A cake with added chocolate." icon_state = "chocolatecake" slice_path = /obj/item/weapon/reagent_containers/food/snacks/chocolatecakeslice slices_num = 5 @@ -1904,7 +1911,7 @@ /obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake name = "Apple Cake" - desc = "A cake centred with Apple" + desc = "A cake centered with Apple." icon_state = "applecake" slice_path = /obj/item/weapon/reagent_containers/food/snacks/applecakeslice slices_num = 5 @@ -1999,7 +2006,7 @@ /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushroompizza name = "Mushroompizza" - desc = "Very special pizza" + desc = "Very special pizza." icon_state = "mushroompizza" slice_path = /obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice slices_num = 6 @@ -2013,7 +2020,7 @@ /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza name = "Vegetable pizza" - desc = "No one of Tomato Sapiens were harmed during making this pizza" + desc = "No one of Tomato Sapiens were harmed during making this pizza." icon_state = "vegetablepizza" slice_path = /obj/item/weapon/reagent_containers/food/snacks/vegetablepizzaslice slices_num = 6 @@ -2021,7 +2028,7 @@ /obj/item/weapon/reagent_containers/food/snacks/vegetablepizzaslice name = "Vegetable pizza slice" - desc = "A slice of the most green pizza of all pizzas not containing green ingredients " + desc = "A slice of the most green pizza of all pizzas not containing green ingredients." icon_state = "vegetablepizzaslice" filling_color = "#BAA14C" @@ -2097,7 +2104,7 @@ return if(boxes.len > 0) - if(user.get_inactive_hand() != src) + if(user.is_in_inactive_hand(src)) ..() return @@ -2477,4 +2484,4 @@ desc = "A large fried potato nugget that may or may not try to valid you." icon_state = "tatortot" list_reagents = list("nutriment" = 4) - filling_color = "FFD700" \ No newline at end of file + filling_color = "FFD700" diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index 38edb2e2174..e2ae3f66285 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -85,7 +85,7 @@ /datum/food_processor_process/spaghetti input = /obj/item/weapon/reagent_containers/food/snacks/doughslice - output = /obj/item/weapon/reagent_containers/food/snacks/spagetti + output = /obj/item/weapon/reagent_containers/food/snacks/spaghetti /datum/food_processor_process/parsnip input = /obj/item/weapon/reagent_containers/food/snacks/grown/parsnip diff --git a/code/modules/food_and_drinks/recipes/recipes_microwave.dm b/code/modules/food_and_drinks/recipes/recipes_microwave.dm index 2fe0ccc28dd..a0998a67a58 100644 --- a/code/modules/food_and_drinks/recipes/recipes_microwave.dm +++ b/code/modules/food_and_drinks/recipes/recipes_microwave.dm @@ -161,10 +161,10 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/eggplantparm -/datum/recipe/microwave/soylenviridians +/datum/recipe/microwave/soylentviridians reagents = list("flour" = 10) items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/soybeans) - result = /obj/item/weapon/reagent_containers/food/snacks/soylenviridians + result = /obj/item/weapon/reagent_containers/food/snacks/soylentviridians /datum/recipe/microwave/soylentgreen reagents = list("flour" = 10) @@ -351,12 +351,12 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/carrot, /obj/item/weapon/reagent_containers/food/snacks/grown/tomato) result = /obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat -/datum/recipe/microwave/boiledspagetti +/datum/recipe/microwave/boiledspaghetti reagents = list("water" = 5) items = list( - /obj/item/weapon/reagent_containers/food/snacks/spagetti, + /obj/item/weapon/reagent_containers/food/snacks/spaghetti, ) - result = /obj/item/weapon/reagent_containers/food/snacks/boiledspagetti + result = /obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti /datum/recipe/microwave/boiledrice reagents = list("water" = 5, "rice" = 10) @@ -368,7 +368,7 @@ /datum/recipe/microwave/pastatomato reagents = list("water" = 5) - items = list(/obj/item/weapon/reagent_containers/food/snacks/spagetti, /obj/item/weapon/reagent_containers/food/snacks/grown/tomato, + items = list(/obj/item/weapon/reagent_containers/food/snacks/spaghetti, /obj/item/weapon/reagent_containers/food/snacks/grown/tomato, /obj/item/weapon/reagent_containers/food/snacks/grown/tomato) result = /obj/item/weapon/reagent_containers/food/snacks/pastatomato @@ -376,19 +376,19 @@ items = list(/obj/item/seeds/poppy, /obj/item/weapon/reagent_containers/food/snacks/dough) result = /obj/item/weapon/reagent_containers/food/snacks/poppypretzel -/datum/recipe/microwave/meatballspagetti +/datum/recipe/microwave/meatballspaggetti reagents = list("water" = 5) items = list( - /obj/item/weapon/reagent_containers/food/snacks/spagetti, + /obj/item/weapon/reagent_containers/food/snacks/spaghetti, /obj/item/weapon/reagent_containers/food/snacks/meatball, /obj/item/weapon/reagent_containers/food/snacks/meatball, ) - result = /obj/item/weapon/reagent_containers/food/snacks/meatballspagetti + result = /obj/item/weapon/reagent_containers/food/snacks/meatballspaghetti /datum/recipe/microwave/spesslaw reagents = list("water" = 5) items = list( - /obj/item/weapon/reagent_containers/food/snacks/spagetti, + /obj/item/weapon/reagent_containers/food/snacks/spaghetti, /obj/item/weapon/reagent_containers/food/snacks/meatball, /obj/item/weapon/reagent_containers/food/snacks/meatball, /obj/item/weapon/reagent_containers/food/snacks/meatball, diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index deac3c6660d..b9bb541f77a 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -68,7 +68,7 @@ return /obj/machinery/biogenerator/attackby(obj/item/O, mob/user, params) - if(user.a_intent == I_HARM) + if(user.a_intent == INTENT_HARM) return ..() if(processing) diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm index ebe74316ed4..bade37d1b3a 100644 --- a/code/modules/hydroponics/gene_modder.dm +++ b/code/modules/hydroponics/gene_modder.dm @@ -296,8 +296,7 @@ var/datum/plant_gene/core/gene = disk.gene gene.value = min(gene.value, max_extract_pot) disk.update_name() - qdel(seed) - seed = null + QDEL_NULL(seed) update_icon() if("replace") if(disk && disk.gene && istype(disk.gene, G.type) && istype(G, /datum/plant_gene/core)) @@ -421,4 +420,4 @@ /obj/item/weapon/storage/box/disks_plantgene/New() ..() for(var/i in 1 to 7) - new /obj/item/weapon/disk/plantgene(src) \ No newline at end of file + new /obj/item/weapon/disk/plantgene(src) diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm index dbdffffda29..8301b021cc4 100644 --- a/code/modules/hydroponics/grown/banana.dm +++ b/code/modules/hydroponics/grown/banana.dm @@ -43,7 +43,7 @@ desc = "A peel from a banana." icon_state = "banana_peel" item_state = "banana_peel" - w_class = 1 + w_class = WEIGHT_CLASS_TINY throwforce = 0 throw_speed = 3 throw_range = 7 diff --git a/code/modules/hydroponics/grown/corn.dm b/code/modules/hydroponics/grown/corn.dm index a7ef947a5ce..d2dac1decfe 100644 --- a/code/modules/hydroponics/grown/corn.dm +++ b/code/modules/hydroponics/grown/corn.dm @@ -30,7 +30,7 @@ desc = "A reminder of meals gone by." icon_state = "corncob" item_state = "corncob" - w_class = 1 + w_class = WEIGHT_CLASS_TINY throwforce = 0 throw_speed = 3 throw_range = 7 @@ -62,7 +62,7 @@ desc = "A cob with snap pops" icon_state = "snapcorn" item_state = "corncob" - w_class = 1 + w_class = WEIGHT_CLASS_TINY throwforce = 0 throw_speed = 3 throw_range = 7 @@ -81,4 +81,4 @@ snap_pops -= 1 if(!snap_pops) new /obj/item/weapon/grown/corncob(user.loc) - qdel(src) \ No newline at end of file + qdel(src) diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm index 7deb961e67a..1752cda7567 100644 --- a/code/modules/hydroponics/grown/flowers.dm +++ b/code/modules/hydroponics/grown/flowers.dm @@ -117,7 +117,7 @@ force = 0 slot_flags = SLOT_HEAD throwforce = 0 - w_class = 1 + w_class = WEIGHT_CLASS_TINY throw_speed = 1 throw_range = 3 @@ -167,7 +167,7 @@ force = 0 slot_flags = SLOT_HEAD throwforce = 0 - w_class = 1 + w_class = WEIGHT_CLASS_TINY throw_speed = 1 throw_range = 3 attack_verb = list("roasted", "scorched", "burned") diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm index 5a229148a17..06bb153e47f 100644 --- a/code/modules/hydroponics/grown/melon.dm +++ b/code/modules/hydroponics/grown/melon.dm @@ -22,7 +22,7 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/watermelonslice slices_num = 5 dried_type = null - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL filling_color = "#008000" bitesize_mod = 3 diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm index f6d9be51b4a..52f60d06b18 100644 --- a/code/modules/hydroponics/grown/nettle.dm +++ b/code/modules/hydroponics/grown/nettle.dm @@ -37,7 +37,7 @@ force = 15 hitsound = 'sound/weapons/bladeslice.ogg' throwforce = 5 - w_class = 1 + w_class = WEIGHT_CLASS_TINY throw_speed = 1 throw_range = 3 origin_tech = "combat=3" diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index 961fe7c4096..339459669be 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -37,7 +37,7 @@ icon_state = "logs" force = 5 throwforce = 5 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL throw_speed = 2 throw_range = 3 origin_tech = "materials=1" @@ -191,4 +191,4 @@ /obj/structure/bonfire/unbuckle_mob(force=0) if(buckled_mob) buckled_mob.pixel_y -= 13 - . = ..() \ No newline at end of file + . = ..() diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index 608c52bfcb4..cee72938fc6 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/device.dmi' icon_state = "hydro" item_state = "analyzer" - w_class = 1 + w_class = WEIGHT_CLASS_TINY slot_flags = SLOT_BELT origin_tech = "magnets=2;biotech=2" materials = list(MAT_METAL=30, MAT_GLASS=20) @@ -24,7 +24,7 @@ flags = OPENCONTAINER slot_flags = SLOT_BELT throwforce = 0 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL throw_speed = 3 throw_range = 10 @@ -46,7 +46,7 @@ flags = OPENCONTAINER slot_flags = SLOT_BELT throwforce = 0 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL throw_speed = 3 throw_range = 10 @@ -68,7 +68,7 @@ flags = CONDUCT force = 5 throwforce = 7 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL materials = list(MAT_METAL=50) attack_verb = list("slashed", "sliced", "cut", "clawed") hitsound = 'sound/weapons/bladeslice.ogg' @@ -80,7 +80,7 @@ icon_state = "hatchet" flags = CONDUCT force = 12 - w_class = 1 + w_class = WEIGHT_CLASS_TINY throwforce = 15 throw_speed = 3 throw_range = 4 @@ -89,7 +89,6 @@ attack_verb = list("chopped", "torn", "cut") hitsound = 'sound/weapons/bladeslice.ogg' sharp = 1 - edge = 1 /obj/item/weapon/hatchet/suicide_act(mob/user) user.visible_message("[user] is chopping at \himself with the [src.name]! It looks like \he's trying to commit suicide.") @@ -111,7 +110,7 @@ throwforce = 5 throw_speed = 2 throw_range = 3 - w_class = 4 + w_class = WEIGHT_CLASS_BULKY flags = CONDUCT armour_penetration = 20 slot_flags = SLOT_BACK @@ -119,7 +118,6 @@ attack_verb = list("chopped", "sliced", "cut", "reaped") hitsound = 'sound/weapons/bladeslice.ogg' sharp = 1 - edge = 1 var/extend = 1 /obj/item/weapon/scythe/suicide_act(mob/user) @@ -128,7 +126,7 @@ var/mob/living/carbon/human/H = user var/obj/item/organ/external/affecting = H.get_organ("head") if(affecting) - affecting.droplimb(1, DROPLIMB_EDGE) + affecting.droplimb(1, DROPLIMB_SHARP) playsound(loc, pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg'), 50, 1, -1) return (BRUTELOSS) @@ -139,8 +137,7 @@ desc = "A sharp and curved blade on a collapsable fibre metal handle, this tool is the pinnacle of covert reaping technology." force = 3 sharp = 0 - edge = 0 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL extend = 0 slot_flags = SLOT_BELT origin_tech = "materials=3;combat=3" @@ -154,7 +151,7 @@ icon_state = "tscythe1" item_state = "scythe0" //use the normal scythe in-hands slot_flags = SLOT_BACK //won't fit on belt, but can be worn on belt when extended - w_class = 4 //won't fit in backpacks while extended + w_class = WEIGHT_CLASS_BULKY //won't fit in backpacks while extended force = 15 //slightly better than normal scythe damage attack_verb = list("chopped", "sliced", "cut", "reaped") hitsound = 'sound/weapons/bladeslice.ogg' @@ -165,14 +162,13 @@ icon_state = "tscythe0" item_state = null //no sprite for folded version, like a tele-baton slot_flags = SLOT_BELT //can be worn on belt again, but no longer makes sense to wear on the back - w_class = 2 + w_class = WEIGHT_CLASS_SMALL force = 3 attack_verb = list("hit", "poked") hitsound = "swing_hit" //Collapse sound (blade sheath) playsound(src.loc, 'sound/weapons/blade_sheath.ogg', 50, 1) //Sound credit to Q.K. of Freesound.org sharp = extend - edge = extend if(ishuman(user)) var/mob/living/carbon/human/H = user H.update_inv_l_hand() @@ -200,7 +196,7 @@ icon = 'icons/obj/chemical.dmi' icon_state = "bottle16" volume = 50 - w_class = 1 + w_class = WEIGHT_CLASS_TINY amount_per_transfer_from_this = 10 possible_transfer_amounts = list(1,2,5,10,15,25,50) @@ -249,7 +245,7 @@ icon = 'icons/obj/chemical.dmi' icon_state = "bottle16" volume = 50 - w_class = 1 + w_class = WEIGHT_CLASS_TINY amount_per_transfer_from_this = 10 possible_transfer_amounts = list(1,2,5,10,15,25,50) diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 7c5297e07c4..c3449514edc 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -373,8 +373,7 @@ var/oldPlantName if(myseed) // In case there's nothing in the tray beforehand oldPlantName = myseed.plantname - qdel(myseed) - myseed = null + QDEL_NULL(myseed) else oldPlantName = "empty tray" switch(rand(1,18)) // randomly pick predominative weed @@ -422,8 +421,7 @@ var/oldPlantName = myseed.plantname if(myseed.mutatelist.len > 0) var/mutantseed = pick(myseed.mutatelist) - qdel(myseed) - myseed = null + QDEL_NULL(myseed) myseed = new mutantseed else return @@ -444,9 +442,7 @@ /obj/machinery/hydroponics/proc/mutateweed() // If the weeds gets the mutagent instead. Mind you, this pretty much destroys the old plant if( weedlevel > 5 ) - if(myseed) - qdel(myseed) - myseed = null + QDEL_NULL(myseed) var/newWeed = pick(/obj/item/seeds/liberty, /obj/item/seeds/angel, /obj/item/seeds/nettle/death, /obj/item/seeds/kudzu) myseed = new newWeed dead = 0 @@ -572,8 +568,8 @@ // You're an idiot for thinking that one of the most corrosive and deadly gasses would be beneficial if(S.has_reagent("fluorine", 1)) adjustHealth(-round(S.get_reagent_amount("fluorine") * 2)) - adjustToxic(round(S.get_reagent_amount("flourine") * 2.5)) - adjustWater(-round(S.get_reagent_amount("flourine") * 0.5)) + adjustToxic(round(S.get_reagent_amount("fluorine") * 2.5)) + adjustWater(-round(S.get_reagent_amount("fluorine") * 0.5)) adjustWeeds(-rand(1,4)) // You're an idiot for thinking that one of the most corrosive and deadly gasses would be beneficial @@ -935,8 +931,7 @@ else if(dead) dead = 0 to_chat(user, "You remove the dead plant from [src].") - qdel(myseed) - myseed = null + QDEL_NULL(myseed) update_icon() plant_hud_set_status() plant_hud_set_health() @@ -953,8 +948,7 @@ else to_chat(user, "You harvest [myseed.getYield()] items from the [myseed.plantname].") if(!myseed.get_gene(/datum/plant_gene/trait/repeated_harvest)) - qdel(myseed) - myseed = null + QDEL_NULL(myseed) dead = 0 plant_hud_set_status() plant_hud_set_health() @@ -1041,4 +1035,4 @@ else ..() -#undef HYDRO_CYCLES_PER_AGE \ No newline at end of file +#undef HYDRO_CYCLES_PER_AGE diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm index 7f2c3587349..f5137d5743b 100644 --- a/code/modules/hydroponics/seed_extractor.dm +++ b/code/modules/hydroponics/seed_extractor.dm @@ -102,7 +102,7 @@ to_chat(user, "You add [O] to [name].") updateUsrDialog() return - else if(user.a_intent != I_HARM) + else if(user.a_intent != INTENT_HARM) to_chat(user, "You can't extract any seeds from \the [O.name]!") else return ..() diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index ae79eda23d3..093cd2114a4 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -5,7 +5,7 @@ /obj/item/seeds icon = 'icons/obj/hydroponics/seeds.dmi' icon_state = "seed" // Unknown plant seed - these shouldn't exist in-game. - w_class = 1 + w_class = WEIGHT_CLASS_TINY burn_state = FLAMMABLE var/plantname = "Plants" // Name of plant when planted. var/product // A type path. The thing that is created when the plant is harvested. diff --git a/code/modules/karma/karma.dm b/code/modules/karma/karma.dm index 81af3a38395..b5cdbe0154f 100644 --- a/code/modules/karma/karma.dm +++ b/code/modules/karma/karma.dm @@ -87,7 +87,7 @@ var/list/karma_spenders = list() /mob/verb/spend_karma_list() set name = "Award Karma" set desc = "Let the gods know whether someone's been nice. Can only be used once per round." - set category = "OOC" + set category = "Special Verbs" if(!can_give_karma()) return @@ -116,7 +116,7 @@ var/list/karma_spenders = list() /mob/verb/spend_karma(var/mob/M) set name = "Award Karma to Player" set desc = "Let the gods know whether someone's been nice. Can only be used once per round." - set category = "OOC" + set category = "Special Verbs" if(!M) to_chat(usr, "Please right click a mob to award karma directly, or use the 'Award Karma' verb to select a player from the player listing.") @@ -149,7 +149,7 @@ var/list/karma_spenders = list() /client/verb/check_karma() set name = "Check Karma" set desc = "Reports how much karma you have accrued." - set category = "OOC" + set category = "Special Verbs" if(config.disable_karma) to_chat(src, "Karma is disabled.") diff --git a/code/modules/library/computers/checkout.dm b/code/modules/library/computers/checkout.dm index 2decc555693..526daeb68a8 100644 --- a/code/modules/library/computers/checkout.dm +++ b/code/modules/library/computers/checkout.dm @@ -178,8 +178,7 @@ M = new manual_type() dat += "[M.title]" manualcount++ - qdel(M) - M = null + QDEL_NULL(M) dat += "" dat += "
    (Return to main menu)
    " diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index a32b31611cc..96f88f3d9c4 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -167,7 +167,7 @@ icon_state ="book" throw_speed = 1 throw_range = 5 - w_class = 3 //upped to three because books are, y'know, pretty big. (and you could hide them inside eachother recursively forever) + w_class = WEIGHT_CLASS_NORMAL //upped to three because books are, y'know, pretty big. (and you could hide them inside eachother recursively forever) attack_verb = list("bashed", "whacked", "educated") burn_state = FLAMMABLE @@ -201,7 +201,7 @@ /obj/item/weapon/book/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(carved) if(!store) - if(W.w_class < 3) + if(W.w_class < WEIGHT_CLASS_NORMAL) user.drop_item() W.forceMove(src) store = W @@ -293,7 +293,7 @@ icon_state ="scanner" throw_speed = 1 throw_range = 5 - w_class = 1 + w_class = WEIGHT_CLASS_TINY 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 971dc69a1b6..075b3a14d9d 100644 --- a/code/modules/martial_arts/martial.dm +++ b/code/modules/martial_arts/martial.dm @@ -7,6 +7,8 @@ var/datum/martial_art/base = null // The permanent style var/deflection_chance = 0 //Chance to deflect projectiles var/help_verb = null + var/no_guns = FALSE //set to TRUE to prevent users of this style from using guns (sleeping carp, highlander). They can still pick them up, but not fire them. + var/no_guns_message = "" //message to tell the style user if they try and use a gun while no_guns = TRUE (DISHONORABRU!) /datum/martial_art/proc/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) return 0 @@ -172,7 +174,7 @@ name = "bo staff" desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts. Can be wielded to both kill and incapacitate." force = 10 - w_class = 4 + w_class = WEIGHT_CLASS_BULKY slot_flags = SLOT_BACK force_unwielded = 10 force_wielded = 24 @@ -207,7 +209,7 @@ to_chat(user, "It would be dishonorable to attack a foe while they cannot retaliate.") return switch(user.a_intent) - if("disarm") + if(INTENT_DISARM) if(!wielded) return ..() if(!ishuman(target)) diff --git a/code/modules/martial_arts/sleeping_carp.dm b/code/modules/martial_arts/sleeping_carp.dm index 960844a063a..c6af4679552 100644 --- a/code/modules/martial_arts/sleeping_carp.dm +++ b/code/modules/martial_arts/sleeping_carp.dm @@ -8,6 +8,8 @@ name = "The Sleeping Carp" deflection_chance = 100 help_verb = /mob/living/carbon/human/proc/sleeping_carp_help + no_guns = TRUE + no_guns_message = "Use of ranged weaponry would bring dishonor to the clan." /datum/martial_art/the_sleeping_carp/proc/check_streak(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) if(findtext(streak,WRIST_WRENCH_COMBO)) diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm index c7212fe5a15..564ef9e5a1b 100644 --- a/code/modules/mining/abandonedcrates.dm +++ b/code/modules/mining/abandonedcrates.dm @@ -40,7 +40,7 @@ new /obj/item/weapon/ore/diamond(src) if(21 to 25) for(var/i in 1 to 5) - new /obj/item/weapon/contraband/poster(src) + new /obj/item/weapon/poster/random_contraband(src) if(26 to 35) for(var/i in 1 to 3) new /obj/item/weapon/reagent_containers/glass/beaker/noreact(src) @@ -216,4 +216,4 @@ qdel(AM) var/turf/T = get_turf(src) explosion(T, -1, -1, 1, 1) - qdel(src) \ No newline at end of file + qdel(src) diff --git a/code/modules/mining/coins.dm b/code/modules/mining/coins.dm index 00ea7632900..2ce3f8d6195 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 + w_class = WEIGHT_CLASS_TINY var/string_attached var/list/sideslist = list("heads","tails") var/cmineral = null @@ -149,4 +149,4 @@ if(do_after(user, 15, target = src)) user.visible_message("[user] has flipped [src]. It lands on [coinflip].", \ "You flip [src]. It lands on [coinflip].", \ - "You hear the clattering of loose change.") \ No newline at end of file + "You hear the clattering of loose change.") diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index d6c375c2832..541961e5297 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -521,7 +521,7 @@ desc = "A token to redeem a piece of equipment. Use it on a mining equipment vendor." icon = 'icons/obj/items.dmi' icon_state = "mining_voucher" - w_class = 1 + w_class = WEIGHT_CLASS_TINY /**********************Mining Point Card**********************/ @@ -555,7 +555,7 @@ icon_state = "Jaunter" item_state = "electronic" throwforce = 0 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL throw_speed = 3 throw_range = 5 origin_tech = "bluespace=2" @@ -614,8 +614,9 @@ icon = 'icons/obj/items.dmi' icon_state = "resonator" item_state = "resonator" + origin_tech = "magnets=3;engineering=3" desc = "A handheld device that creates small fields of energy that resonate until they detonate, crushing rock. It can also be activated without a target to create a field at the user's location, to act as a delayed time trap. It's more effective in a vaccuum." - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL force = 8 throwforce = 10 var/cooldown = 0 @@ -627,7 +628,7 @@ name = "upgraded resonator" desc = "An upgraded version of the resonator that can produce more fields at once." icon_state = "resonator_u" - origin_tech = "magnets=3;combat=3" + origin_tech = "materials=4;powerstorage=3;engineering=3;magnets=3" fieldlimit = 5 /obj/item/weapon/resonator/proc/CreateResonance(var/target, var/creator) @@ -711,7 +712,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 + w_class = WEIGHT_CLASS_SMALL icon = 'icons/obj/aibots.dmi' icon_state = "minedronecube" item_state = "electronic" @@ -728,7 +729,7 @@ name = "Drone Kit" desc = "A boxed kit that includes one mining drone cube and a welding tool with an increased capacity." icon_state = "implant" - max_w_class = 3 + max_w_class = WEIGHT_CLASS_NORMAL storage_slots = 2 can_hold = list(/obj/item/weapon/mining_drone_cube, /obj/item/weapon/weldingtool/hugetank) @@ -745,8 +746,9 @@ icon = 'icons/obj/hypo.dmi' icon_state = "lazarus_hypo" item_state = "hypo" + origin_tech = "biotech=4;magnets=6" throwforce = 0 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL throw_speed = 3 throw_range = 5 var/loaded = 1 @@ -806,7 +808,7 @@ name = "manual mining scanner" icon_state = "mining1" item_state = "analyzer" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL flags = CONDUCT slot_flags = SLOT_BELT var/cooldown = 0 @@ -838,7 +840,7 @@ name = "advanced automatic mining scanner" icon_state = "mining0" item_state = "analyzer" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL flags = CONDUCT slot_flags = SLOT_BELT var/cooldown = 35 @@ -928,10 +930,11 @@ name = "mining jetpack" icon_state = "jetpack-mining" item_state = "jetpack-mining" + origin_tech = "materials=4;magnets=4;engineering=5" desc = "A tank of compressed carbon dioxide for miners to use as propulsion in local space. The compact size allows for easy storage at the cost of capacity." volume = 40 throw_range = 7 - w_class = 3 //same as syndie harness + w_class = WEIGHT_CLASS_NORMAL //same as syndie harness /*********************Hivelord stabilizer****************/ @@ -940,8 +943,8 @@ icon = 'icons/obj/chemical.dmi' icon_state = "bottle19" desc = "Inject a hivelord core with this stabilizer to preserve its healing powers indefinitely." - w_class = 1 - origin_tech = "biotech=1" + w_class = WEIGHT_CLASS_TINY + origin_tech = "biotech=3" /obj/item/weapon/hivelordstabilizer/afterattack(obj/item/organ/internal/M, mob/user) var/obj/item/organ/internal/hivelord_core/C = M @@ -963,7 +966,7 @@ \nMark a mob with the destabilizing force, then hit them in melee to activate it for extra damage. Extra damage if backstabbed in this fashion. \ This weapon is only particularly effective against large creatures." force = 20 //As much as a bone spear, but this is significantly more annoying to carry around due to requiring the use of both hands at all times - w_class = 4 + w_class = WEIGHT_CLASS_BULKY slot_flags = SLOT_BACK force_unwielded = 20 //It's never not wielded so these are the same force_wielded = 20 @@ -975,7 +978,6 @@ hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("smashes", "crushes", "cleaves", "chops", "pulps") sharp = 1 - edge = 1 var/charged = 1 var/charge_time = 16 var/atom/mark = null @@ -1037,8 +1039,7 @@ mark = 0 if(L.mob_size >= MOB_SIZE_LARGE) L.underlays -= marked_image - qdel(marked_image) - marked_image = null + QDEL_NULL(marked_image) var/backstab = check_target_facings(user, L) var/def_check = L.getarmor(type = "bomb") if(backstab == FACING_INIT_FACING_TARGET_TARGET_FACING_PERPENDICULAR || backstab == FACING_SAME_DIR) diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm index 922dd34a166..6289333549b 100644 --- a/code/modules/mining/lavaland/ash_flora.dm +++ b/code/modules/mining/lavaland/ash_flora.dm @@ -155,7 +155,7 @@ icon = 'icons/obj/lavaland/ash_flora.dmi' icon_state = "mushroom_shavings" list_reagents = list("sugar" = 3, "ethanol" = 2, "stabilizing_agent" = 3, "minttoxin" = 2) - w_class = 1 + w_class = WEIGHT_CLASS_TINY /obj/item/weapon/reagent_containers/food/snacks/ash_flora/New() ..() @@ -194,7 +194,7 @@ desc = "A bowl made out of mushrooms. Not food, though it might have contained some at some point." icon = 'icons/obj/lavaland/ash_flora.dmi' icon_state = "mushroom_bowl" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL //what you can craft with these things /datum/crafting_recipe/mushroom_bowl diff --git a/code/modules/mining/lavaland/loot/ashdragon_loot.dm b/code/modules/mining/lavaland/loot/ashdragon_loot.dm index 4565039d52e..c3b43e06d6f 100644 --- a/code/modules/mining/lavaland/loot/ashdragon_loot.dm +++ b/code/modules/mining/lavaland/loot/ashdragon_loot.dm @@ -15,8 +15,8 @@ if(4) new /obj/item/weapon/dragons_blood(src) -// Spectral Blade - +// Spectral Blade + /obj/item/weapon/melee/ghost_sword name = "spectral blade" desc = "A rusted and dulled blade. It doesn't look like it'd do much damage. It glows weakly." @@ -24,8 +24,7 @@ item_state = "spectral" flags = CONDUCT sharp = 1 - edge = 1 - w_class = 4 + w_class = WEIGHT_CLASS_BULKY force = 1 throwforce = 1 hitsound = 'sound/effects/ghost2.ogg' @@ -71,7 +70,7 @@ var/turf/T = get_turf(src) var/list/contents = T.GetAllContents() var/mob/dead/observer/current_spirits = list() - + for(var/mob/dead/observer/O in player_list) if(is_type_in_list(O.following, contents)) ghost_counter++ @@ -145,7 +144,7 @@ stage4 = list("Your blood burns.") stage5 = list("You're a fucking dragon. However, any previous allegiances you held still apply. It'd be incredibly rude to eat your still human friends for no reason.") new_form = /mob/living/simple_animal/hostile/megafauna/dragon/lesser - + //Lava Staff /obj/item/weapon/lava_staff @@ -156,7 +155,7 @@ icon = 'icons/obj/guns/magic.dmi' slot_flags = SLOT_BACK item_state = "staffofstorms" - w_class = 4 + w_class = WEIGHT_CLASS_BULKY force = 25 damtype = BURN hitsound = 'sound/weapons/sear.ogg' @@ -214,4 +213,4 @@ /obj/effect/overlay/temp/lavastaff icon_state = "lavastaff_warn" - duration = 50 \ No newline at end of file + duration = 50 diff --git a/code/modules/mining/lavaland/loot/hierophant_loot.dm b/code/modules/mining/lavaland/loot/hierophant_loot.dm index f06fd25d428..e613b2ab276 100644 --- a/code/modules/mining/lavaland/loot/hierophant_loot.dm +++ b/code/modules/mining/lavaland/loot/hierophant_loot.dm @@ -5,7 +5,7 @@ item_state = "hierophant_staff" icon = 'icons/obj/guns/magic.dmi' slot_flags = SLOT_BACK - w_class = 4 + w_class = WEIGHT_CLASS_BULKY force = 20 hitsound = "swing_hit" //hitsound = 'sound/weapons/sonic_jackhammer.ogg' @@ -52,7 +52,7 @@ friendly_fire_check = !friendly_fire_check to_chat(user, "You toggle friendly fire [friendly_fire_check ? "off":"on"]!") return - if(user.get_active_hand() != src && user.get_inactive_hand() != src) //you need to hold the staff to teleport + if(user.is_in_active_hand(src) && user.is_in_inactive_hand(src)) //you need to hold the staff to teleport to_chat(user, "You need to hold the staff in your hands to [rune ? "teleport with it" : "create a rune"]!") return if(!rune) @@ -185,4 +185,4 @@ //playsound(T,'sound/effects/bin_close.ogg', 200, 1) sleep(2) for(var/t in RANGE_TURFS(1, T)) - new /obj/effect/overlay/temp/hierophant/blast(t, user, friendly_fire_check) \ No newline at end of file + new /obj/effect/overlay/temp/hierophant/blast(t, user, friendly_fire_check) diff --git a/code/modules/mining/lavaland/loot/legion_loot.dm b/code/modules/mining/lavaland/loot/legion_loot.dm index 49e64f3349e..f85a6a57aac 100644 --- a/code/modules/mining/lavaland/loot/legion_loot.dm +++ b/code/modules/mining/lavaland/loot/legion_loot.dm @@ -6,7 +6,7 @@ icon = 'icons/obj/guns/magic.dmi' slot_flags = SLOT_BACK item_state = "staffofstorms" - w_class = 4 + w_class = WEIGHT_CLASS_BULKY force = 25 damtype = BURN hitsound = 'sound/weapons/sear.ogg' @@ -49,4 +49,4 @@ "You hold [src] skyward, calling down a terrible storm!") playsound(user, 'sound/magic/Staff_Change.ogg', 200, 0) A.telegraph() - storm_cooldown = world.time + 200 \ No newline at end of file + storm_cooldown = world.time + 200 diff --git a/code/modules/mining/lavaland/loot/tendril_loot.dm b/code/modules/mining/lavaland/loot/tendril_loot.dm index dec8712eb74..1c2093ce8c2 100644 --- a/code/modules/mining/lavaland/loot/tendril_loot.dm +++ b/code/modules/mining/lavaland/loot/tendril_loot.dm @@ -5,7 +5,7 @@ name = "paradox bag" desc = "Somehow, it's in two places at once." max_combined_w_class = 60 - max_w_class = 3 + max_w_class = WEIGHT_CLASS_NORMAL //External /obj/item/device/shared_storage @@ -144,7 +144,7 @@ item_state = "rods" desc = "Not to be confused with the kind Research hassles you for." force = 12 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL burn_state = LAVA_PROOF | FIRE_PROOF /datum/crafting_recipe/oar @@ -391,4 +391,4 @@ if(!can_destroy && !force) return QDEL_HINT_LETMELIVE else - . = ..() \ No newline at end of file + . = ..() diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index a9151609f74..11f16953017 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -79,15 +79,14 @@ force = 15.0 throwforce = 10.0 item_state = "pickaxe" - w_class = 4 + w_class = WEIGHT_CLASS_BULKY 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" + origin_tech = "materials=2;engineering=3" attack_verb = list("hit", "pierced", "sliced", "attacked") var/list/digsound = list('sound/effects/picaxe1.ogg','sound/effects/picaxe2.ogg','sound/effects/picaxe3.ogg') var/drill_verb = "picking" sharp = 1 - edge = 1 var/excavation_amount = 100 usesound = 'sound/effects/picaxe1.ogg' toolspeed = 1 @@ -100,7 +99,7 @@ icon_state = "spickaxe" item_state = "spickaxe" digspeed = 30 //mines faster than a normal pickaxe, bought from mining vendor - origin_tech = "materials=3;engineering=2" + origin_tech = "materials=3;engineering=4" desc = "A silver-plated pickaxe that mines slightly faster than standard-issue." toolspeed = 0.75 @@ -109,7 +108,7 @@ icon_state = "gpickaxe" item_state = "gpickaxe" digspeed = 20 - origin_tech = "materials=4;engineering=2" + origin_tech = "materials=4;engineering=4" desc = "A gold-plated pickaxe that mines faster than standard-issue." toolspeed = 0.6 @@ -118,7 +117,7 @@ icon_state = "dpickaxe" item_state = "dpickaxe" digspeed = 20 //mines twice as fast as a normal pickaxe, bought from mining vendor - origin_tech = "materials=4;engineering=3" + origin_tech = "materials=5;engineering=4" desc = "A pickaxe with a diamond pick head. Extremely robust at cracking rock walls and digging up dirt." toolspeed = 0.5 @@ -130,7 +129,7 @@ digsound = list('sound/weapons/drill.ogg') hitsound = 'sound/weapons/drill.ogg' usesound = 'sound/weapons/drill.ogg' - origin_tech = "materials=2;powerstorage=3;engineering=2" + origin_tech = "materials=2;powerstorage=2;engineering=3" desc = "An electric mining drill for the especially scrawny." toolspeed = 0.5 @@ -143,16 +142,16 @@ name = "diamond-tipped mining drill" icon_state = "diamonddrill" digspeed = 10 - origin_tech = "materials=6;powerstorage=4;engineering=5" + origin_tech = "materials=6;powerstorage=4;engineering=4" desc = "Yours is the drill that will pierce the heavens!" toolspeed = 0.25 /obj/item/weapon/pickaxe/diamonddrill/traitor //Pocket-sized traitor diamond drill. name = "supermatter drill" icon_state = "smdrill" - origin_tech = "materials=6;powerstorage=4;engineering=5;syndicate=3" + origin_tech = "materials=6;powerstorage=4;engineering=4;syndicate=3" desc = "Microscopic supermatter crystals cover the head of this tiny drill." - w_class = 2 + w_class = WEIGHT_CLASS_SMALL /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. @@ -165,7 +164,7 @@ icon_state = "jackhammer" item_state = "jackhammer" digspeed = 5 //the epitome of powertools. extremely fast mining, laughs at puny walls - origin_tech = "materials=3;powerstorage=2;engineering=2" + origin_tech = "materials=6;powerstorage=4;engineering=5;magnets=4" digsound = list('sound/weapons/sonic_jackhammer.ogg') hitsound = 'sound/weapons/sonic_jackhammer.ogg' usesound = 'sound/weapons/sonic_jackhammer.ogg' @@ -184,9 +183,9 @@ force = 8.0 throwforce = 4.0 item_state = "shovel" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL materials = list(MAT_METAL=50) - origin_tech = "materials=1;engineering=1" + origin_tech = "materials=2;engineering=2" attack_verb = list("bashed", "bludgeoned", "thrashed", "whacked") usesound = 'sound/effects/shovel_dig.ogg' toolspeed = 1 @@ -198,7 +197,7 @@ item_state = "spade" force = 5.0 throwforce = 7.0 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL toolspeed = 2 @@ -219,7 +218,7 @@ desc = "It allows you to store and deploy lazarus-injected creatures easier." icon = 'icons/obj/mobcap.dmi' icon_state = "mobcap0" - w_class = 1 + w_class = WEIGHT_CLASS_TINY throw_range = 20 var/mob/living/simple_animal/captured = null var/colorindex = 0 @@ -282,7 +281,7 @@ desc = "An emergency shelter stored within a pocket of bluespace." icon_state = "capsule" icon = 'icons/obj/mining.dmi' - w_class = 1 + w_class = WEIGHT_CLASS_TINY origin_tech = "engineering=3;bluespace=3" var/template_id = "shelter_alpha" var/datum/map_template/shelter/template @@ -333,8 +332,28 @@ new /obj/effect/effect/harmless_smoke(get_turf(src)) qdel(src) +/obj/item/weapon/survivalcapsule/luxury + name = "luxury bluespace shelter capsule" + desc = "An exorbitantly expensive luxury suite stored within a pocket of bluespace." + origin_tech = "engineering=3;bluespace=4" + template_id = "shelter_beta" + //Pod turfs and objects +//Window +/obj/structure/window/reinforced/survival_pod + name = "pod window" + icon = 'icons/obj/lavaland/survival_pod.dmi' + icon_state = "pwindow" + +// This override can be removed whenever we get rid of the stupid fucking `dir = 9` = full tile!!!! shit +/obj/structure/window/reinforced/survival_pod/CanPass(atom/movable/mover, turf/target, height=0) + if(istype(mover) && mover.checkpass(PASSGLASS)) + return 1 + if(get_dir(loc, target) == dir) + return !density + else + return 1 //Floors /turf/simulated/floor/pod @@ -364,6 +383,12 @@ base_icon_state = "survival_pod" glass_type = "/survival_pod" +//Windoor +/obj/machinery/door/window/survival_pod + icon = 'icons/obj/lavaland/survival_pod.dmi' + icon_state = "windoor" + base_state = "windoor" + //Table /obj/structure/table/survival_pod icon = 'icons/obj/lavaland/survival_pod.dmi' @@ -456,7 +481,7 @@ var/obj/item/weapon/storage/pill_bottle/dice/D = new(src) load(D) else - var/obj/item/device/guitar/G = new(src) + var/obj/item/device/instrument/guitar/G = new(src) load(G) //Fans @@ -536,3 +561,31 @@ new /obj/item/stack/rods(loc) qdel(src) return ..() + +/obj/item/fakeartefact + name = "expensive forgery" + icon = 'icons/mob/screen_gen.dmi' + icon_state = "x2" + var/possible = list(/obj/item/ship_in_a_bottle, + /obj/item/weapon/gun/energy/pulse, + /obj/item/weapon/sleeping_carp_scroll, + /obj/item/weapon/shield/changeling, + /obj/item/weapon/lava_staff, + /obj/item/weapon/katana/energy, + /obj/item/weapon/storage/toolbox/green/memetic, + /obj/item/weapon/gun/projectile/automatic/l6_saw, + /obj/item/weapon/gun/magic/staff/chaos, + /obj/item/weapon/gun/magic/staff/spellblade, + /obj/item/weapon/gun/magic/wand/death, + /obj/item/weapon/gun/magic/wand/fireball, + /obj/item/stack/telecrystal, + /obj/item/weapon/banhammer) + +/obj/item/fakeartefact/New() + . = ..() + var/obj/item/I = pick(possible) + name = initial(I.name) + icon = initial(I.icon) + desc = initial(I.desc) + icon_state = initial(I.icon_state) + item_state = initial(I.item_state) diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index 575fbf3b5b6..a1e7e775e23 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -11,7 +11,7 @@ status_flags = CANSTUN|CANWEAKEN|CANPUSH mouse_opacity = 1 faction = list("neutral") - a_intent = I_HARM + a_intent = INTENT_HARM 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 wander = 0 @@ -93,7 +93,7 @@ return /mob/living/simple_animal/hostile/mining_drone/attack_hand(mob/living/carbon/human/M) - if(M.a_intent == I_HELP) + if(M.a_intent == INTENT_HELP) toggle_mode() switch(mode) if(MINEDRONE_COLLECT) diff --git a/code/modules/mining/money_bag.dm b/code/modules/mining/money_bag.dm index 3fa8d1c1edf..30fca5f2f95 100644 --- a/code/modules/mining/money_bag.dm +++ b/code/modules/mining/money_bag.dm @@ -9,7 +9,7 @@ throwforce = 0 burn_state = FLAMMABLE burntime = 20 - w_class = 4 + w_class = WEIGHT_CLASS_BULKY /obj/item/weapon/moneybag/attack_hand(user as mob) var/amt_gold = 0 @@ -119,4 +119,4 @@ new /obj/item/weapon/coin/silver(src) new /obj/item/weapon/coin/gold(src) new /obj/item/weapon/coin/gold(src) - new /obj/item/weapon/coin/adamantine(src) \ No newline at end of file + new /obj/item/weapon/coin/adamantine(src) diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm index cc50f46b9e5..873b6c798d1 100644 --- a/code/modules/mining/ore.dm +++ b/code/modules/mining/ore.dm @@ -153,7 +153,7 @@ icon = 'icons/obj/mining.dmi' icon_state = "Gibtonite ore" item_state = "Gibtonite ore" - w_class = 4 + w_class = WEIGHT_CLASS_BULKY throw_range = 0 anchored = 1 //Forces people to carry it by hand, no pulling! var/primed = 0 diff --git a/code/modules/mining/shelters.dm b/code/modules/mining/shelters.dm index 38750b12d19..2389470e7f5 100644 --- a/code/modules/mining/shelters.dm +++ b/code/modules/mining/shelters.dm @@ -40,3 +40,17 @@ /datum/map_template/shelter/alpha/New() . = ..() whitelisted_turfs = typecacheof(/turf/simulated/mineral) + +/datum/map_template/shelter/beta + name = "Shelter Beta" + shelter_id = "shelter_beta" + description = "An extremly luxurious shelter, containing all \ + the amenities of home, including carpeted floors, hot and cold \ + running water, a gourmet three course meal, cooking facilities, \ + and a deluxe companion to keep you from getting lonely during \ + an ash storm." + mappath = "_maps/map_files/templates/shelter_2.dmm" + +/datum/map_template/shelter/beta/New() + . = ..() + whitelisted_turfs = typecacheof(/turf/simulated/mineral) diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm index 11e51987285..cf3e4c320b5 100644 --- a/code/modules/mob/death.dm +++ b/code/modules/mob/death.dm @@ -16,7 +16,7 @@ animation.master = src // flick("gibbed-m", animation) - gibs(loc, viruses, dna) + gibs(loc, dna) dead_mob_list -= src if(client) respawnable_list += src diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index 568033f3606..062e1f4d44e 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -168,6 +168,7 @@ /mob/proc/hear_sleep(var/message) var/heard = "" if(prob(15)) + message = strip_html_properly(message) var/list/punctuation = list(",", "!", ".", ";", "?") var/list/messages = splittext(message, " ") var/R = rand(1, messages.len) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 5d746603418..7236fe57fde 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -6,11 +6,22 @@ if(hand) return l_hand else return r_hand +/mob/proc/is_in_active_hand(obj/item/I) + var/obj/item/item_to_test = get_active_hand() + + return item_to_test && item_to_test.is_equivalent(I) + + //Returns the thing in our inactive hand /mob/proc/get_inactive_hand() if(hand) return r_hand else return l_hand +/mob/proc/is_in_inactive_hand(obj/item/I) + var/obj/item/item_to_test = get_inactive_hand() + + return item_to_test && item_to_test.is_equivalent(I) + //Returns if a certain item can be equipped to a certain slot. // Currently invalid for two-handed items - call obj/item/mob_can_equip() instead. /mob/proc/can_equip(obj/item/I, slot, disable_warning = 0) @@ -119,6 +130,9 @@ else if(I == l_hand) l_hand = null update_inv_l_hand() + else if(I in tkgrabbed_objects) + var/obj/item/tk_grab/tkgrab = tkgrabbed_objects[I] + unEquip(tkgrab, force) if(I) if(client) diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index fb6d5ef5948..cc9ed1a27d6 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -96,6 +96,9 @@ return (copytext(message, length(message)) == "!") ? 2 : 1 /datum/language/proc/broadcast(mob/living/speaker, message, speaker_mask) + if(!check_can_speak(speaker)) + return FALSE + log_say("[key_name(speaker)]: ([name]) [message]") if(!speaker_mask) @@ -114,6 +117,9 @@ /datum/language/proc/check_special_condition(mob/other, mob/living/speaker) return TRUE +/datum/language/proc/check_can_speak(mob/living/speaker) + return TRUE + /datum/language/proc/get_spoken_verb(msg_end) switch(msg_end) if("!") @@ -292,8 +298,29 @@ /datum/language/grey/broadcast(mob/living/speaker, message, speaker_mask) ..(speaker,message,speaker.real_name) +/datum/language/grey/check_can_speak(mob/living/speaker) + if(ishuman(speaker)) + var/mob/living/carbon/human/S = speaker + var/obj/item/organ/external/rhand = S.get_organ("r_hand") + var/obj/item/organ/external/lhand = S.get_organ("l_hand") + if((!rhand || !rhand.is_usable()) && (!lhand || !lhand.is_usable())) + to_chat(speaker,"You can't communicate without the ability to use your hands!") + return FALSE + if(speaker.incapacitated(ignore_lying = 1)) + to_chat(speaker,"You can't communicate while unable to move your hands to your head!") + return FALSE + + var/their = "their" + if(speaker.gender == "female") + their = "her" + if(speaker.gender == "male") + their = "his" + speaker.visible_message("[speaker] touches [their] fingers to [their] temple.") //If placed in grey/broadcast, it will happen regardless of the success of the action. + + return TRUE + /datum/language/grey/check_special_condition(mob/living/carbon/human/other, mob/living/carbon/human/speaker) - if(other in range(7, speaker)) + if(atoms_share_level(other, speaker)) return TRUE return FALSE @@ -639,7 +666,7 @@ if(L == default_language) . += "[L.name] (:[L.key]) - default - reset
    [L.desc]

    " else - . += "[L.name] (:[L.key]) - set default
    [L.desc]

    " + . += "[L.name] (:[L.key]) - set default
    [L.desc]

    " /mob/verb/check_languages() set name = "Check Known Languages" diff --git a/code/modules/mob/living/autohiss.dm b/code/modules/mob/living/autohiss.dm index 4506ce50cfb..da19b6a35b2 100644 --- a/code/modules/mob/living/autohiss.dm +++ b/code/modules/mob/living/autohiss.dm @@ -1,29 +1,18 @@ - -#define AUTOHISS_OFF 0 -#define AUTOHISS_BASIC 1 -#define AUTOHISS_FULL 2 - -#define AUTOHISS_NUM 3 - - /mob/living/proc/handle_autohiss(message, datum/language/L) return message // no autohiss at this level /mob/living/carbon/human/handle_autohiss(message, datum/language/L) - if(!client || client.autohiss_mode == AUTOHISS_OFF) // no need to process if there's no client or they have autohiss off + if(!client || client.prefs.autohiss_mode == AUTOHISS_OFF) // no need to process if there's no client or they have autohiss off return message - return species.handle_autohiss(message, L, client.autohiss_mode) - -/client - var/autohiss_mode = AUTOHISS_OFF + return species.handle_autohiss(message, L, client.prefs.autohiss_mode) /client/verb/toggle_autohiss() set name = "Toggle Auto-Accent" set desc = "Toggle automatic accents for your species" set category = "OOC" - autohiss_mode = (autohiss_mode + 1) % AUTOHISS_NUM - switch(autohiss_mode) + prefs.autohiss_mode = (prefs.autohiss_mode + 1) % AUTOHISS_NUM + switch(prefs.autohiss_mode) if(AUTOHISS_OFF) to_chat(src, "Auto-hiss is now OFF.") if(AUTOHISS_BASIC) @@ -31,7 +20,7 @@ if(AUTOHISS_FULL) to_chat(src, "Auto-hiss is now FULL.") else - autohiss_mode = AUTOHISS_OFF + prefs.autohiss_mode = AUTOHISS_OFF to_chat(src, "Auto-hiss is now OFF.") /datum/species diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index b5fa736dfc3..8bd8ffe5eed 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -273,7 +273,7 @@ Des: Removes all infected images from the alien. if(T.footstep_sounds["xeno"]) var/S = pick(T.footstep_sounds["xeno"]) if(S) - if(m_intent == "run") + if(m_intent == MOVE_INTENT_RUN) if(!(step_count % 2)) //every other turf makes a sound return 0 @@ -281,7 +281,7 @@ Des: Removes all infected images from the alien. range -= 0.666 //-(7 - 2) = (-5) = -5 | -5 - (0.666) = -5.666 | (7 + -5.666) = 1.334 | 1.334 * 3 = 4.002 | range(4.002) = range(4) var/volume = 5 - if(m_intent == "walk") + if(m_intent == MOVE_INTENT_WALK) return 0 //silent when walking if(buckled || lying || throwing) @@ -294,3 +294,9 @@ Des: Removes all infected images from the alien. playsound(T, S, volume, 1, range) return 1 return 0 + +/mob/living/carbon/alien/getTrail() + if(getBruteLoss() < 200) + return pick("xltrails_1", "xltrails_2") + else + return pick("xttrails_1", "xttrails_2") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/alien_defenses.dm b/code/modules/mob/living/carbon/alien/alien_defenses.dm index c1ce34bf8e7..fef2e469848 100644 --- a/code/modules/mob/living/carbon/alien/alien_defenses.dm +++ b/code/modules/mob/living/carbon/alien/alien_defenses.dm @@ -1,5 +1,5 @@ -/mob/living/carbon/alien/hitby(atom/movable/AM) - ..(AM, 1) +/mob/living/carbon/alien/hitby(atom/movable/AM, skipcatch, hitpush) + ..(AM, hitpush = 0) /*Code for aliens attacking aliens. Because aliens act on a hivemind, I don't see them as very aggressive with each other. As such, they can either help or harm other aliens. Help works like the human help command while harm is a simple nibble. @@ -15,7 +15,7 @@ In all, this is a lot like the monkey code. /N return switch(M.a_intent) - if(I_HELP) + if(INTENT_HELP) AdjustSleeping(-5) resting = 0 AdjustParalysis(-3) @@ -23,7 +23,7 @@ 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(INTENT_GRAB) grabbedby(M) return 1 @@ -50,11 +50,11 @@ In all, this is a lot like the monkey code. /N return 0 //this is horrible but 100% necessary switch(M.a_intent) - if(I_HELP) + if(INTENT_HELP) help_shake_act(M) - if(I_GRAB) + if(INTENT_GRAB) grabbedby(M) - if(I_HARM, I_DISARM) + if(INTENT_HARM, INTENT_DISARM) return 1 return 0 diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm index 645259b1fda..2229d4c9d0c 100644 --- a/code/modules/mob/living/carbon/alien/death.dm +++ b/code/modules/mob/living/carbon/alien/death.dm @@ -14,7 +14,7 @@ playsound(src.loc, 'sound/goonstation/effects/gib.ogg', 50, 1) flick("gibbed-a", animation) - xgibs(loc, viruses) + xgibs(loc) dead_mob_list -= src spawn(15) 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 bc1e1e4f56d..ddac1cc18e9 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -13,6 +13,10 @@ alien_organs += new /obj/item/organ/internal/xenos/plasmavessel/hunter ..() +/mob/living/carbon/alien/humanoid/hunter/movement_delay() + . = -1 //hunters are sanic + . += ..() //but they still need to slow down on stun + /mob/living/carbon/alien/humanoid/hunter/handle_regular_hud_updates() ..() //-Yvarov @@ -36,7 +40,7 @@ /mob/living/carbon/alien/humanoid/hunter/handle_environment() - if(m_intent == "run" || resting) + if(m_intent == MOVE_INTENT_RUN || resting) ..() else adjustPlasma(-heal_rate) @@ -79,17 +83,18 @@ else //Maybe uses plasma in the future, although that wouldn't make any sense... leaping = 1 update_icons() - throw_at(A,MAX_ALIEN_LEAP_DIST,1) - leaping = 0 - update_icons() + throw_at(A, MAX_ALIEN_LEAP_DIST, 1, spin = 0, diagonals_first = 1, callback = CALLBACK(src, .leap_end)) + +/mob/living/carbon/alien/humanoid/hunter/proc/leap_end() + leaping = 0 + update_icons() /mob/living/carbon/alien/humanoid/hunter/throw_impact(atom/A) - if(!leaping) return ..() if(A) - if(istype(A, /mob/living)) + if(isliving(A)) var/mob/living/L = A var/blocked = 0 if(ishuman(A)) @@ -126,46 +131,3 @@ if(leaping) return ..() - - -//Modified throw_at() that will use diagonal dirs where appropriate -//instead of locking it to cardinal dirs -/mob/living/carbon/alien/humanoid/throw_at(atom/target, range, speed) - if(!target || !src) return 0 - - src.throwing = 1 - - var/dist_x = abs(target.x - src.x) - var/dist_y = abs(target.y - src.y) - var/dist_travelled = 0 - var/dist_since_sleep = 0 - - var/tdist_x = dist_x; - var/tdist_y = dist_y; - - if(dist_x <= dist_y) - tdist_x = dist_y; - tdist_y = dist_x; - - var/error = tdist_x/2 - tdist_y - while(target && (((((dist_x > dist_y) && ((src.x < target.x) || (src.x > target.x))) || ((dist_x <= dist_y) && ((src.y < target.y) || (src.y > target.y))) || (src.x > target.x)) && dist_travelled < range) || !has_gravity(src))) - - if(!src.throwing) break - if(!istype(src.loc, /turf)) break - - var/atom/step = get_step(src, get_dir(src,target)) - if(!step) - break - src.Move(step, get_dir(src, step)) - hit_check() - error += (error < 0) ? tdist_x : -tdist_y; - dist_travelled++ - dist_since_sleep++ - if(dist_since_sleep >= speed) - dist_since_sleep = 0 - sleep(1) - - - src.throwing = 0 - - return 1 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 8d8f8894234..6a9565fc449 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm @@ -12,14 +12,12 @@ pixel_x = -16 maxHealth = 200 health = 200 - move_delay_add = 1 large = 1 /mob/living/carbon/alien/humanoid/sentinel/praetorian name = "alien praetorian" maxHealth = 200 health = 200 - move_delay_add = 1 large = 1 /mob/living/carbon/alien/humanoid/sentinel/large/update_icons() diff --git a/code/modules/mob/living/carbon/alien/humanoid/empress.dm b/code/modules/mob/living/carbon/alien/humanoid/empress.dm index 287974b610f..7db3ea5b1c5 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/empress.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/empress.dm @@ -6,7 +6,6 @@ icon_state = "alienq_s" status_flags = CANPARALYSE mob_size = MOB_SIZE_LARGE - move_delay_add = 3 large = 1 ventcrawler = 0 diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index b99cde337d6..d37d83e8215 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -24,44 +24,10 @@ add_language("Hivemind") ..() -//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)) - return - now_pushing = 0 - ..() - if(!istype(AM, /atom/movable)) - return - - if(ismob(AM)) - var/mob/tmob = AM - tmob.LAssailant = src - - if(!now_pushing) - now_pushing = 1 - if(!AM.anchored) - var/t = get_dir(src, AM) - if(istype(AM, /obj/structure/window/full)) - for(var/obj/structure/window/win in get_step(AM,t)) - now_pushing = 0 - return - step(AM, t) - now_pushing = null - return - return /mob/living/carbon/alien/humanoid/movement_delay() - var/tally = 0 - if(istype(src, /mob/living/carbon/alien/humanoid/queen)) - tally += 4 - if(istype(src, /mob/living/carbon/alien/humanoid/drone)) - tally += 0 - if(istype(src, /mob/living/carbon/alien/humanoid/sentinel)) - tally += 0 - if(istype(src, /mob/living/carbon/alien/humanoid/hunter)) - tally = -2 // hunters go supersuperfast - return (tally + move_delay_add + config.alien_delay) + . = ..() + . += move_delay_add + config.alien_delay //move_delay_add is used to slow aliens with stuns /mob/living/carbon/alien/humanoid/Process_Spacemove(var/check_drift = 0) if(..()) @@ -194,13 +160,13 @@ switch(M.a_intent) - if(I_HELP) + if(INTENT_HELP) help_shake_act(M) - if(I_GRAB) + if(INTENT_GRAB) grabbedby(M) - if(I_HARM) + if(INTENT_HARM) M.do_attack_animation(src) var/damage = rand(1, 9) if(prob(90)) @@ -225,7 +191,7 @@ playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) visible_message("[M] has attempted to punch [src]!") - if(I_DISARM) + if(INTENT_DISARM) if(!lying) if(prob(5))//Very small chance to push an alien down. Paralyse(2) diff --git a/code/modules/mob/living/carbon/alien/humanoid/inventory.dm b/code/modules/mob/living/carbon/alien/humanoid/inventory.dm index 223b6a512ae..08017da0b76 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/inventory.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/inventory.dm @@ -22,7 +22,7 @@ if(slot_l_store) if(l_store) return - if(W.w_class > 3) + if(W.w_class > WEIGHT_CLASS_NORMAL) return unEquip(W) l_store = W @@ -30,7 +30,7 @@ if(slot_r_store) if(r_store) return - if(W.w_class > 3) + if(W.w_class > WEIGHT_CLASS_NORMAL) return unEquip(W) r_store = W @@ -44,4 +44,4 @@ if(slot_l_store) if(l_store) l_store.attack_alien(src) if(slot_r_store) - if(r_store) r_store.attack_alien(src) \ No newline at end of file + if(r_store) r_store.attack_alien(src) diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm index e6a2f6567c2..4be2cbdb390 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/life.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/life.dm @@ -22,15 +22,13 @@ if(disabilities & COUGHING) if((prob(5) && paralysis <= 1)) drop_item() - spawn( 0 ) - emote("cough") - return + emote("cough") + return if(disabilities & TOURETTES) if((prob(10) && paralysis <= 1)) Stun(10) - spawn( 0 ) - emote("twitch") - return + emote("twitch") + return if(disabilities & NERVOUS) if(prob(10)) stuttering = max(10, stuttering) @@ -68,8 +66,7 @@ //UNCONSCIOUS. NO-ONE IS HOME if((getOxyLoss() > 50) || (config.health_threshold_crit >= health)) if(health <= 20 && prob(1)) - spawn(0) - emote("gasp") + emote("gasp") if(!reagents.has_reagent("epinephrine")) adjustOxyLoss(1) Paralyse(3) @@ -81,8 +78,7 @@ blinded = 1 stat = UNCONSCIOUS if(prob(10) && health) - spawn(0) - emote("hiss") + emote("hiss") //CONSCIOUS else stat = CONSCIOUS diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index 11914d3c0ee..a8f17714b0e 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -28,6 +28,9 @@ alien_organs += new /obj/item/organ/internal/xenos/neurotoxin ..() +/mob/living/carbon/alien/humanoid/queen/movement_delay() + . = ..() + . += 3 /mob/living/carbon/alien/humanoid/queen/handle_regular_hud_updates() ..() //-Yvarov 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 0d6545d0a0f..f1bcfc0eeaf 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm @@ -33,7 +33,7 @@ else if(lying || resting) icon_state = "alien[caste]_sleep" - else if(m_intent == "run") + else if(m_intent == MOVE_INTENT_RUN) icon_state = "alien[caste]_running" else icon_state = "alien[caste]_s" diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index a78ab9c4c77..305f8ad45a9 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -26,38 +26,6 @@ ..() -//This is fine, works the same as a human -/mob/living/carbon/alien/larva/Bump(atom/movable/AM as mob|obj, yes) - - spawn( 0 ) - if((!( yes ) || now_pushing)) - return - now_pushing = 1 - if(ismob(AM)) - var/mob/tmob = AM - if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations)) - if(prob(70)) - to_chat(src, "You fail to push [tmob]'s fat ass out of the way.") - now_pushing = 0 - return - if(!(tmob.status_flags & CANPUSH)) - now_pushing = 0 - return - tmob.LAssailant = src - - now_pushing = 0 - ..() - if(!( istype(AM, /atom/movable) )) - return - if(!( now_pushing )) - now_pushing = 1 - if(!( AM.anchored )) - var/t = get_dir(src, AM) - step(AM, t) - now_pushing = null - return - return - //This needs to be fixed /mob/living/carbon/alien/larva/Stat() ..() @@ -159,10 +127,10 @@ switch(M.a_intent) - if(I_HELP) + if(INTENT_HELP) help_shake_act(M) - if(I_GRAB) + if(INTENT_GRAB) grabbedby(M) else diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index 447f65c6744..8366a7d02a8 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -40,9 +40,8 @@ else if(sleeping) blinded = 1 stat = UNCONSCIOUS - if( prob(10) && health ) - spawn(0) - emote("hiss_") + if(prob(10) && health) + emote("hiss_") //CONSCIOUS else stat = CONSCIOUS diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 98d1bec775c..38ea99834b0 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -14,7 +14,7 @@ var/const/MAX_ACTIVE_TIME = 400 icon = 'icons/mob/alien.dmi' icon_state = "facehugger" item_state = "facehugger" - w_class = 1 //note: can be picked up by aliens unlike most other items of w_class below 4 + w_class = WEIGHT_CLASS_TINY //note: can be picked up by aliens unlike most other items of w_class below 4 throw_range = 5 tint = 3 flags = AIRTIGHT @@ -249,4 +249,4 @@ var/const/MAX_ACTIVE_TIME = 400 gender = FEMALE /obj/item/clothing/mask/facehugger/lamarr/New()//to prevent deleting it if aliums are disabled - return \ No newline at end of file + return diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 15c52d2693c..55711fb6a6d 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -5,8 +5,9 @@ desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity." icon = 'icons/obj/assemblies.dmi' icon_state = "mmi_empty" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL origin_tech = "biotech=3" + origin_tech = "biotech=2;programming=3;engineering=2" //Revised. Brainmob is now contained directly within object of transfer. MMI in this case. var/alien = 0 @@ -121,7 +122,7 @@ /obj/item/device/mmi/radio_enabled name = "Radio-enabled Man-Machine Interface" desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity. This one comes with a built-in radio." - origin_tech = "biotech=4" + origin_tech = "biotech=2;programming=3;engineering=2;magnets=2" var/obj/item/device/radio/radio = null//Let's give it a radio. @@ -174,6 +175,7 @@ /obj/item/device/mmi/syndie name = "Syndicate Man-Machine Interface" desc = "Syndicate's own brand of MMI. It enforces laws designed to help Syndicate agents achieve their goals upon cyborgs created with it, but doesn't fit in Nanotrasen AI cores." + origin_tech = "biotech=4;programming=4;syndicate=2" syndiemmi = 1 /obj/item/device/mmi/attempt_become_organ(obj/item/organ/external/parent,mob/living/carbon/human/H) diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index 56a98142f80..daeebf8442f 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -4,11 +4,11 @@ max_damage = 200 icon_state = "brain2" force = 1.0 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL throwforce = 1.0 throw_speed = 3 throw_range = 5 - origin_tech = "biotech=3" + origin_tech = "biotech=5" attack_verb = list("attacked", "slapped", "whacked") var/mob/living/carbon/brain/brainmob = null organ_tag = "brain" @@ -28,7 +28,7 @@ name = "xenomorph brain" desc = "We barely understand the brains of terrestial animals. Who knows what we may find in the brain of such an advanced species?" icon_state = "brain-x" - origin_tech = "biotech=7" + origin_tech = "biotech=6" mmi_icon = 'icons/mob/alien.dmi' mmi_icon_state = "AlienMMI" @@ -71,9 +71,9 @@ var/obj/item/organ/internal/brain/B = src if(!special) var/mob/living/simple_animal/borer/borer = owner.has_brain_worms() - if(borer) - borer.detach() //Should remove borer if the brain is removed - RR + borer.leave_host() //Should remove borer if the brain is removed - RR + if(owner.mind && !non_primary)//don't transfer if the owner does not have a mind. B.transfer_identity(user) diff --git a/code/modules/mob/living/carbon/brain/death.dm b/code/modules/mob/living/carbon/brain/death.dm index d6a07d48f7e..8303c3ef04a 100644 --- a/code/modules/mob/living/carbon/brain/death.dm +++ b/code/modules/mob/living/carbon/brain/death.dm @@ -29,7 +29,7 @@ animation.master = src // flick("gibbed-m", animation) - gibs(loc, viruses, dna) + gibs(loc, dna) dead_mob_list -= src if(container && istype(container, /obj/item/device/mmi)) diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index 565dd250fd8..54d8a680ae7 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -3,8 +3,8 @@ desc = "A cube of shining metal, four inches to a side and covered in shallow grooves." icon = 'icons/obj/assemblies.dmi' icon_state = "posibrain" - w_class = 3 - origin_tech = "biotech=3;programming=2" + w_class = WEIGHT_CLASS_NORMAL + origin_tech = "biotech=3;programming=3;plasmatech=2" var/searching = 0 var/askDelay = 10 * 60 * 1 @@ -37,7 +37,7 @@ silenced = !silenced to_chat(user, "You toggle the speaker [silenced ? "off" : "on"].") if(brainmob && brainmob.key) - to_chat(brainmob, "Your internal speaker has been toggled [silenced ? "off" : "on"].") + to_chat(brainmob, "Your internal speaker has been toggled [silenced ? "off" : "on"].") /obj/item/device/mmi/posibrain/proc/request_player() for(var/mob/dead/observer/O in player_list) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 6e01ef5fd3e..b71374862fb 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -34,9 +34,9 @@ if(.) if(nutrition && stat != DEAD) nutrition -= hunger_drain / 10 - if(m_intent == "run") + if(m_intent == MOVE_INTENT_RUN) nutrition -= hunger_drain / 10 - if((FAT in mutations) && m_intent == "run" && bodytemperature <= 360) + if((FAT in mutations) && m_intent == MOVE_INTENT_RUN && bodytemperature <= 360) bodytemperature += 2 // Moving around increases germ_level faster @@ -107,7 +107,7 @@ for(var/i=0 to distance) if(blood) if(T) - T.add_blood_floor(src) + add_splatter_floor(T) if(stun) adjustBruteLoss(3) else @@ -126,8 +126,7 @@ if(isturf(loc)) I.remove(src) I.forceMove(get_turf(src)) - spawn() - I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),5) + I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),5) for(var/mob/M in src) if(M in src.stomach_contents) @@ -244,6 +243,10 @@ if(status == "") status = "OK" src.show_message(text("\t []My [] is [].",status=="OK"?"":"",org.name,status),1) + + for(var/obj/item/I in org.embedded_objects) + to_chat(src, "\t There is \a [I] embedded in your [org.name]!") + if(staminaloss) if(staminaloss > 30) to_chat(src, "You're completely exhausted.") @@ -474,24 +477,32 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, if(istype(loc, /obj/machinery/atmospherics)) add_ventcrawl(loc) -/mob/living/carbon/clean_blood() - . = ..() - if(ishuman(src)) - var/mob/living/carbon/human/H = src - if(H.gloves) - if(H.gloves.clean_blood()) - H.update_inv_gloves(0,0) - H.gloves.germ_level = 0 - else - if(H.bloody_hands) - H.bloody_hands = 0 - H.update_inv_gloves(0,0) - H.germ_level = 0 - update_icons() //apply the now updated overlays to the mob - //Throwing stuff +/mob/living/carbon/throw_impact(atom/hit_atom, throwingdatum) + . = ..() + var/hurt = TRUE + /*if(istype(throwingdatum, /datum/thrownthing)) + var/datum/thrownthing/D = throwingdatum + if(isrobot(D.thrower)) + var/mob/living/silicon/robot/R = D.thrower + if(!R.emagged) + hurt = FALSE*/ + if(hit_atom.density && isturf(hit_atom)) + if(hurt) + Weaken(1) + take_organ_damage(10) + if(iscarbon(hit_atom) && hit_atom != src) + var/mob/living/carbon/victim = hit_atom + if(hurt) + victim.take_organ_damage(10) + take_organ_damage(10) + victim.Weaken(1) + Weaken(1) + visible_message("[src] crashes into [victim], knocking them both over!", "You violently crash into [victim]!") + playsound(src, 'sound/weapons/punch1.ogg', 50, 1) + /mob/living/carbon/proc/toggle_throw_mode() if(in_throw_mode) throw_mode_off() @@ -512,18 +523,19 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, return /mob/living/carbon/throw_item(atom/target) - throw_mode_off() - if(!target || !isturf(loc)) - return - if(istype(target, /obj/screen)) + if(!target || !isturf(loc) || istype(target, /obj/screen)) + throw_mode_off() return - var/atom/movable/thrown_thing var/obj/item/I = src.get_active_hand() - if(!I || (I.flags & NODROP)) + if(!I || I.override_throw(src, target) || (I.flags & NODROP)) + throw_mode_off() return + throw_mode_off() + var/atom/movable/thrown_thing + if(istype(I, /obj/item/weapon/grab)) var/obj/item/weapon/grab/G = I var/mob/throwable_mob = G.get_mob_if_throwable() //throw the person instead of the grab @@ -626,9 +638,10 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, "[usr] tries to [internal ? "close" : "open"] the valve on [src]'s [ITEM].") var/no_mask - if(!(wear_mask && wear_mask.flags & AIRTIGHT)) - if(!(head && head.flags & AIRTIGHT)) - no_mask = 1 + if(!get_organ_slot("breathing_tube")) + if(!(wear_mask && wear_mask.flags & AIRTIGHT)) + if(!(head && head.flags & AIRTIGHT)) + no_mask = 1 if(no_mask) to_chat(usr, "[src] is not wearing a suitable mask or helmet!") return @@ -639,9 +652,10 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, update_internals_hud_icon(0) else var/no_mask2 - if(!(wear_mask && wear_mask.flags & AIRTIGHT)) - if(!(head && head.flags & AIRTIGHT)) - no_mask2 = 1 + if(!get_organ_slot("breathing_tube")) + if(!(wear_mask && wear_mask.flags & AIRTIGHT)) + if(!(head && head.flags & AIRTIGHT)) + no_mask2 = 1 if(no_mask2) to_chat(usr, "[src] is not wearing a suitable mask or helmet!") return @@ -858,8 +872,10 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, /mob/living/carbon/get_standard_pixel_y_offset(lying = 0) if(lying) - if(buckled) return initial(pixel_y) - return -6 + if(buckled) + return buckled.buckle_offset //tg just has this whole block removed, always returning -6. Paradise is special. + else + return -6 else return initial(pixel_y) @@ -913,7 +929,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, /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 == MOVE_INTENT_WALK)) return 0 if((lying) && (!(tilesSlipped))) return 0 @@ -926,7 +942,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, for(var/t = 0, t<=tilesSlipped, t++) spawn (t) step(src, src.dir) stop_pulling() - to_chat(src, "You slipped on the [description]!") + to_chat(src, "You slipped on [description]!") playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) if(stun) Stun(stun) diff --git a/code/modules/mob/living/carbon/carbon_defenses.dm b/code/modules/mob/living/carbon/carbon_defenses.dm index b2dcf20f1b2..a570ad50cb3 100644 --- a/code/modules/mob/living/carbon/carbon_defenses.dm +++ b/code/modules/mob/living/carbon/carbon_defenses.dm @@ -1,13 +1,14 @@ -/mob/living/carbon/hitby(atom/movable/AM) - if(in_throw_mode && !get_active_hand()) //empty active hand and we're in throw mode - if(canmove && !restrained()) - if(istype(AM, /obj/item)) - var/obj/item/I = AM - if(isturf(I.loc)) - put_in_active_hand(I) - visible_message("[src] catches [I]!") - throw_mode_off() - return +/mob/living/carbon/hitby(atom/movable/AM, skipcatch, hitpush = 1, blocked = 0) + if(!skipcatch) + if(in_throw_mode && !get_active_hand()) //empty active hand and we're in throw mode + if(canmove && !restrained()) + if(istype(AM, /obj/item)) + var/obj/item/I = AM + if(isturf(I.loc)) + put_in_active_hand(I) + visible_message("[src] catches [I]!") + throw_mode_off() + return 1 ..() /mob/living/carbon/water_act(volume, temperature, source) @@ -19,7 +20,7 @@ /mob/living/carbon/attackby(obj/item/I, mob/user, params) if(lying) if(surgeries.len) - if(user != src && user.a_intent == "help") + if(user != src && user.a_intent == INTENT_HELP) for(var/datum/surgery/S in surgeries) if(S.next_step(user, src)) return 1 @@ -29,11 +30,13 @@ if(!iscarbon(user)) return - for(var/datum/disease/D in viruses) + for(var/thing in viruses) + var/datum/disease/D = thing if(D.IsSpreadByTouch()) user.ContractDisease(D) - for(var/datum/disease/D in user.viruses) + for(var/thing in user.viruses) + var/datum/disease/D = thing if(D.IsSpreadByTouch()) ContractDisease(D) - return 0 \ No newline at end of file + return 0 diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index e900fc10517..a409e8460db 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -3,6 +3,7 @@ hud_possible = list(HEALTH_HUD,STATUS_HUD,SPECIALROLE_HUD) var/list/stomach_contents = list() var/list/internal_organs = list() + var/list/internal_organs_slot = list() //Same as above, but stores "slot ID" - "organ" pairs for easy access. var/antibodies = 0 var/life_tick = 0 // The amount of life ticks that have processed on this mob. @@ -20,7 +21,6 @@ var/pulse = PULSE_NORM //current pulse level - var/heart_attack = 0 var/wetlevel = 0 //how wet the mob is var/oxygen_alert = 0 @@ -29,4 +29,6 @@ var/fire_alert = 0 var/failed_last_breath = 0 //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks. - var/co2overloadtime = null \ No newline at end of file + var/co2overloadtime = null + + blood_volume = BLOOD_VOLUME_NORMAL diff --git a/code/modules/mob/living/carbon/human/body_accessories.dm b/code/modules/mob/living/carbon/human/body_accessories.dm index 8744a09ea4d..761f35b9520 100644 --- a/code/modules/mob/living/carbon/human/body_accessories.dm +++ b/code/modules/mob/living/carbon/human/body_accessories.dm @@ -103,10 +103,11 @@ var/global/list/body_accessory_by_species = list("None" = null) /datum/body_accessory/tail/wingler_tail // Jay wingler fluff tail - name = "Jay Wingler Tail" + name = "Striped Tail" icon_state = "winglertail" animated_icon_state = "winglertail_a" + allowed_species = list("Tajaran") //Vulpkanin diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index b3580778d22..d0468fb12b6 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -19,8 +19,7 @@ if(isturf(loc)) var/atom/movable/thing = I.remove(src) thing.forceMove(get_turf(src)) - spawn() - thing.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),5) + thing.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),5) for(var/obj/item/organ/external/E in bodyparts) if(istype(E, /obj/item/organ/external/chest)) @@ -28,7 +27,7 @@ // Only make the limb drop if it's not too damaged if(prob(100 - E.get_damage())) // Override the current limb status and don't cause an explosion - E.droplimb(DROPLIMB_EDGE) + E.droplimb(DROPLIMB_SHARP) for(var/mob/M in src) if(M in stomach_contents) @@ -38,7 +37,7 @@ if(!isSynthetic()) flick("gibbed-h", animation) - hgibs(loc, viruses, dna) + hgibs(loc, dna) else new /obj/effect/decal/cleanable/blood/gibs/robot(loc) var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread @@ -90,8 +89,10 @@ if(src) qdel(src) /mob/living/carbon/human/death(gibbed) - if(stat == DEAD) return - if(healths) healths.icon_state = "health5" + if(stat == DEAD) + return + if(healths) + healths.icon_state = "health5" if(!gibbed) emote("deathgasp") //let the world KNOW WE ARE DEAD @@ -99,24 +100,11 @@ stat = DEAD SetDizzy(0) SetJitter(0) - heart_attack = 0 + set_heartattack(FALSE) //Handle species-specific deaths. - if(species) species.handle_death(src) - - //Handle brain slugs. - var/obj/item/organ/external/head = get_organ("head") - var/mob/living/simple_animal/borer/B - - if(istype(head)) - for(var/I in head.implants) - if(istype(I,/mob/living/simple_animal/borer)) - B = I - if(B) - if(B.controlling && B.host == src) - B.detach() - - verbs -= /mob/living/carbon/proc/release_control + if(species) + species.handle_death(src) callHook("death", list(src, gibbed)) @@ -143,9 +131,9 @@ return ..(gibbed) /mob/living/carbon/human/update_revive() - ..() + . = ..() // Update healthdoll - if(healthdoll) + if(. && healthdoll) // We're alive again, so re-build the entire healthdoll healthdoll.cached_healthdoll_overlays.Cut() diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 1b15dccdc2c..8cdf4ab1ec6 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -36,8 +36,18 @@ 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("howl", "howls") + if (species.name == "Vulpkanin") //Only Vulpkanin can howl + on_CD = handle_emote_CD(100) else return + if("growl", "growls") + if (species.name == "Vulpkanin") //Only Vulpkanin can growl + on_CD = handle_emote_CD() + else + return if("squish", "squishes") var/found_slime_bodypart = 0 @@ -76,7 +86,7 @@ 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 - if("cough", "coughs") + if("cough", "coughs", "slap", "slaps") on_CD = handle_emote_CD() if("sneeze", "sneezes") on_CD = handle_emote_CD() @@ -91,8 +101,21 @@ 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") + + if("howl", "howls") var/M = handle_emote_param(param) //Check to see if the param is valid (mob with the param name is in view). + message = "[src] howls[M ? " at [M]" : ""]!" + playsound(loc, 'sound/goonstation/voice/howl.ogg', 100, 0, 10) + m_type = 2 + + if("growl", "growls") + var/M = handle_emote_param(param) + message = "[src] growls[M ? " at [M]" : ""]." + playsound(loc, "growls", 80, 0) + m_type = 2 + + if("ping", "pings") + var/M = handle_emote_param(param) message = "[src] pings[M ? " at [M]" : ""]." playsound(loc, 'sound/machines/ping.ogg', 50, 0) @@ -785,12 +808,28 @@ + " handshake-mob, hug(s)-(none)/mob, johnny, jump, 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) + switch(species.name) + if("Machine") + emotelist += "\nMachine specific emotes :- beep(s)-(none)/mob, buzz(es)-none/mob, no-(none)/mob, ping(s)-(none)/mob, yes-(none)/mob, buzz2-(none)/mob" + if("Drask") + emotelist += "\nDrask specific emotes :- drone(s)-(none)/mob, hum(s)-(none)/mob, rumble(s)-(none)/mob" + if("Kidan") + emotelist += "\nKidan specific emotes :- click(s), clack(s)" + if("Unathi") + emotelist += "\nUnathi specific emotes :- hiss(es)" + if("Vulpkanin") + emotelist += "\nVulpkanin specific emotes :- growl(s)-none/mob, howl(s)-none/mob" + + if (species.name == "Slime People") + emotelist += "\nSlime people specific emotes :- squish(es)-(none)/mob" + else + for(var/obj/item/organ/external/L in bodyparts) // if your limbs are squishy you can squish too! + if(L.dna.species in list("Slime People")) + emotelist += "\nSlime people body part specific emotes :- squish(es)-(none)/mob" + break + + to_chat(src, emotelist) else to_chat(src, "Unusable emote '[act]'. Say *help for a list.") diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 693973ab42d..9bb3308c944 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -382,6 +382,9 @@ else wound_flavor_text["[temp.limb_name]"] = "" + for(var/obj/item/I in temp.embedded_objects) + msg += "[t_He] [t_has] \a [bicon(I)] [I] embedded in [t_his] [temp.name]!\n" + //Handles the text strings being added to the actual description. //If they have something that covers the limb, and it is not missing, put flavortext. If it is covered but bleeding, add other flavortext. var/display_chest = 0 @@ -438,9 +441,11 @@ if(display_gloves) msg += "[src] has blood running from under [t_his] gloves!\n" + if(blood_volume < BLOOD_VOLUME_SAFE) + msg += "[t_He] [t_has] pale skin.\n" + if(bleedsuppress) + msg += "[t_He] [t_is] bandaged with something.\n" - for(var/implant in get_visible_implants(0)) - msg += "[src] has \a [implant] sticking out of [t_his] flesh!\n" if(digitalcamo) msg += "[t_He] [t_is] repulsively uncanny!\n" if(!(skipface || ( wear_mask && ( wear_mask.flags_inv & HIDEFACE || wear_mask.flags_cover & MASKCOVERSMOUTH) ) ) && is_thrall(src) && in_range(user,src)) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 735e897c1c1..889c163142f 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -8,7 +8,6 @@ //why are these here and not in human_defines.dm //var/list/hud_list[10] var/datum/species/species //Contains icon generation and language information, set during New(). - var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us. var/obj/item/weapon/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_canmove() call. /mob/living/carbon/human/New(var/new_loc, var/new_species = null, var/delay_ready_dna = 0) @@ -34,7 +33,6 @@ create_reagents(330) prev_gender = gender // Debug for plural genders - make_blood() martial_art = default_martial_art @@ -147,93 +145,6 @@ /mob/living/carbon/human/stok/New(var/new_loc) ..(new_loc, "Stok") -/mob/living/carbon/human/Bump(atom/movable/AM, yes) - if(!(yes) || now_pushing || buckled) - return 0 - now_pushing = 1 - if(ismob(AM)) - var/mob/tmob = AM - - //BubbleWrap - Should stop you pushing a restrained person out of the way - //i still don't get it, is this supposed to be 'bubblewrapping' or was it made by a guy named 'BubbleWrap' - if(ishuman(tmob)) - for(var/mob/M in range(tmob, 1)) - - if(tmob.pinned.len || (M.pulling == tmob && (tmob.restrained() && !M.restrained()) && M.stat == CONSCIOUS)) - if(!(world.time % 5)) //tmob is pinned to wall, or is restrained and pulled by a concious unrestrained human - to_chat(src, "[tmob] is restrained, you cannot push past.") - now_pushing = 0 - return 0 - - //I have to fucking document this somewhere- the above if(tmob.pinned.len || etc) check above had - //locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) at the end of it - //FIRST OF ALL, THAT IS NOT HOW YOU FUCKING USE LOCATE() - //SECOND OF ALL, OH GOD, WHY WOULD YOU EVER WANT GRABBED MOBS TO BE UNABLE TO BE PUSHED PAST GOD - - if(tmob.pulling == M && (M.restrained() && !tmob.restrained()) && tmob.stat == CONSCIOUS) - if(!(world.time % 5)) - to_chat(src, "[tmob] is restraining [M], you cannot push past.") - now_pushing = 0 - return 0 - - //Leaping mobs just land on the tile, no pushing, no anything. - if(status_flags & LEAPING) - loc = tmob.loc - status_flags &= ~LEAPING - now_pushing = 0 - return - - //BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller - //it might be 'bubblewrapping' given that this rhymes with 'hugboxing' - if((tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || restrained())) - if((canmove && tmob.canmove) && (!tmob.buckled && !tmob.buckled_mob)) - var/turf/oldloc = loc - loc = tmob.loc - tmob.loc = oldloc - now_pushing = 0 - for(var/mob/living/carbon/slime/slime in view(1,tmob)) - if(slime.Victim == tmob) - slime.UpdateFeed() - return - - if(ishuman(tmob) && (FAT in tmob.mutations)) - if(prob(40) && !(FAT in src.mutations)) - to_chat(src, "You fail to push [tmob]'s fat ass out of the way.") - 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 - return - - tmob.LAssailant = src - - now_pushing = 0 - spawn(0) - ..() - if(!istype(AM, /atom/movable)) - return - if(!now_pushing) - now_pushing = 1 - - if(!AM.anchored) - var/t = get_dir(src, AM) - if(istype(AM, /obj/structure/window/full)) - for(var/obj/structure/window/win in get_step(AM, t)) - now_pushing = 0 - return - step(AM, t) - now_pushing = 0 - /mob/living/carbon/human/Stat() ..() statpanel("Status") @@ -313,7 +224,7 @@ while(limbs_affected != 0 && valid_limbs.len > 0) processing_dismember = pick(valid_limbs) if(processing_dismember.limb_name != "chest" && processing_dismember.limb_name != "head" && processing_dismember.limb_name != "groin") - processing_dismember.droplimb(1,DROPLIMB_EDGE,0,1) + processing_dismember.droplimb(1,DROPLIMB_SHARP,0,1) valid_limbs -= processing_dismember limbs_affected -= 1 else valid_limbs -= processing_dismember @@ -339,7 +250,7 @@ while(limbs_affected != 0 && valid_limbs.len > 0) processing_dismember = pick(valid_limbs) if(processing_dismember.limb_name != "chest" && processing_dismember.limb_name != "head" && processing_dismember.limb_name != "groin") - processing_dismember.droplimb(1,DROPLIMB_EDGE,0,1) + processing_dismember.droplimb(1,DROPLIMB_SHARP,0,1) valid_limbs -= processing_dismember limbs_affected -= 1 else valid_limbs -= processing_dismember @@ -364,7 +275,7 @@ while(limbs_affected != 0 && valid_limbs.len > 0) processing_dismember = pick(valid_limbs) if(processing_dismember.limb_name != "chest" && processing_dismember.limb_name != "head" && processing_dismember.limb_name != "groin") - processing_dismember.droplimb(1,DROPLIMB_EDGE,0,1) + processing_dismember.droplimb(1,DROPLIMB_SHARP,0,1) valid_limbs -= processing_dismember limbs_affected -= 1 else valid_limbs -= processing_dismember @@ -422,7 +333,7 @@ /mob/living/carbon/human/attack_larva(mob/living/carbon/alien/larva/L as mob) switch(L.a_intent) - if(I_HELP) + if(INTENT_HELP) visible_message("[L] rubs its head against [src].") @@ -515,7 +426,7 @@ /mob/living/carbon/human/show_inv(mob/user) user.set_machine(src) - var/has_breathable_mask = istype(wear_mask, /obj/item/clothing/mask) + var/has_breathable_mask = istype(wear_mask, /obj/item/clothing/mask) || get_organ_slot("breathing_tube") var/list/obscured = check_obscured_slots() var/dat = {" @@ -531,6 +442,17 @@ dat += "" + var/obj/item/organ/internal/headpocket/C = get_int_organ(/obj/item/organ/internal/headpocket) + if(C) + if(slot_wear_mask in obscured) + dat += "" + else + var/list/items = C.get_contents() + if(items.len) + dat += "" + else + dat += "" + if(slot_wear_mask in obscured) dat += "" else @@ -616,12 +538,10 @@ popup.open() -// called when something steps onto a human -// this handles mulebots and vehicles -/mob/living/carbon/human/Crossed(var/atom/movable/AM) - if(istype(AM, /obj/vehicle)) - var/obj/vehicle/V = AM - V.RunOver(src) +/mob/living/carbon/human/Crossed(atom/movable/AM) + var/mob/living/simple_animal/bot/mulebot/MB = AM + if(istype(MB)) + MB.RunOver(src) // 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") @@ -673,7 +593,7 @@ return //repurposed proc. Now it combines get_id_name() and get_face_name() to determine a mob's name variable. Made into a seperate proc as it'll be useful elsewhere -/mob/living/carbon/human/get_visible_name() +/mob/living/carbon/human/get_visible_name(var/id_override = FALSE) if(name_override) return name_override if(wear_mask && (wear_mask.flags_inv & HIDEFACE)) //Wearing a mask which hides our face, use id-name if possible @@ -682,7 +602,7 @@ return get_id_name("Unknown") //Likewise for hats var/face_name = get_face_name() var/id_name = get_id_name("") - if(id_name && (id_name != face_name)) + if(id_name && (id_name != face_name) && !id_override) return "[face_name] (as [id_name])" return face_name @@ -759,9 +679,9 @@ if(species) species_siemens_coeff = species.siemens_coeff siemens_coeff = gloves_siemens_coeff * species_siemens_coeff - if(heart_attack) + if(undergoing_cardiac_arrest()) if(shock_damage * siemens_coeff >= 1 && prob(25)) - heart_attack = 0 + set_heartattack(FALSE) if(stat == CONSCIOUS) to_chat(src, "You feel your heart beating again!") . = ..() @@ -776,6 +696,28 @@ if(G && G.pickpocket) thief_mode = 1 + if(href_list["embedded_object"]) + var/obj/item/organ/external/L = locate(href_list["embedded_limb"]) in bodyparts + if(!L) + return + var/obj/item/I = locate(href_list["embedded_object"]) in L.embedded_objects + if(!I || I.loc != src) //no item, no limb, or item is not in limb or in the person anymore + return + var/time_taken = I.embedded_unsafe_removal_time*I.w_class + usr.visible_message("[usr] attempts to remove [I] from their [L.name].","You attempt to remove [I] from your [L.name]... (It will take [time_taken/10] seconds.)") + if(do_after(usr, time_taken, needhand = 1, target = src)) + if(!I || !L || I.loc != src || !(I in L.embedded_objects)) + return + L.embedded_objects -= I + L.take_damage(I.embedded_unsafe_removal_pain_multiplier*I.w_class)//It hurts to rip it out, get surgery you dingus. + I.forceMove(get_turf(src)) + usr.put_in_hands(I) + usr.emote("scream") + usr.visible_message("[usr] successfully rips [I] out of their [L.name]!","You successfully remove [I] from your [L.name].") + if(!has_embedded_objects()) + clear_alert("embeddedobject") + return + if(href_list["item"]) var/slot = text2num(href_list["item"]) if(slot in check_obscured_slots()) @@ -826,6 +768,16 @@ var/obj/item/clothing/under/U = w_uniform U.set_sensors(usr) + if(href_list["dislodge_headpocket"]) + usr.visible_message("[usr] is trying to remove something from [src]'s head!", + "You start to dislodge whatever's inside [src]'s headpocket!") + if(do_mob(usr, src, POCKET_STRIP_DELAY)) + usr.visible_message("[usr] has dislodged something from [src]'s head!", + "You have dislodged everything from [src]'s headpocket!") + var/obj/item/organ/internal/headpocket/C = get_int_organ(/obj/item/organ/internal/headpocket) + C.empty_contents() + add_logs(usr, src, "stripped", addition="of headpocket items", print_attack_log=isLivingSSD(src)) + if(href_list["strip_accessory"]) if(istype(w_uniform, /obj/item/clothing/under)) var/obj/item/clothing/under/U = w_uniform @@ -1300,12 +1252,6 @@ I.insert(H) /mob/living/carbon/human/revive() - - if(species && !(species.flags & NO_BLOOD)) - var/blood_reagent = get_blood_name() - vessel.add_reagent(blood_reagent, max_blood-vessel.total_volume) - fixblood() - //Fix up all organs and replace lost ones. restore_all_organs() //Rejuvenate and reset all existing organs. check_and_regenerate_organs(src) //Regenerate limbs and organs only if they're really missing. @@ -1377,23 +1323,13 @@ */ //returns 1 if made bloody, returns 0 otherwise -/mob/living/carbon/human/add_blood(mob/living/carbon/human/M as mob) - if(!..()) - return 0 - //if this blood isn't already in the list, add it - if(blood_DNA[M.dna.unique_enzymes]) - return 0 //already bloodied with this blood. Cannot add more. - blood_DNA[M.dna.unique_enzymes] = M.dna.b_type - hand_blood_color = blood_color - src.update_inv_gloves() - verbs += /mob/living/carbon/human/proc/bloody_doodle - return 1 //we applied blood to the item - /mob/living/carbon/human/clean_blood(var/clean_feet) .=..() if(clean_feet && !shoes && istype(feet_blood_DNA, /list) && feet_blood_DNA.len) feet_blood_color = null qdel(feet_blood_DNA) + bloody_feet = list(BLOOD_STATE_HUMAN = 0, BLOOD_STATE_XENO = 0, BLOOD_STATE_NOT_BLOODY = 0) + blood_state = BLOOD_STATE_NOT_BLOODY update_inv_shoes(1) return 1 @@ -1414,16 +1350,6 @@ else ..() -/mob/living/carbon/human/get_visible_implants(var/class = 0) - - var/list/visible_implants = list() - for(var/obj/item/organ/external/organ in bodyparts) - for(var/obj/item/weapon/O in organ.implants) - if(!istype(O,/obj/item/weapon/implant) && (O.w_class > class) && !istype(O,/obj/item/weapon/shard/shrapnel)) - visible_implants += O - - return(visible_implants) - /mob/living/carbon/human/generate_name() name = species.makeName(gender,src) real_name = name @@ -1431,29 +1357,6 @@ dna.real_name = name return name -/mob/living/carbon/human/proc/handle_embedded_objects() - - for(var/obj/item/organ/external/organ in bodyparts) - if(organ.status & ORGAN_SPLINTED) //Splints prevent movement. - continue - for(var/obj/item/weapon/O in organ.implants) - if(!istype(O,/obj/item/weapon/implant) && prob(5)) //Moving with things stuck in you could be bad. - // All kinds of embedded objects cause bleeding. - var/msg = null - switch(rand(1,3)) - if(1) - msg ="A spike of pain jolts your [organ.name] as you bump [O] inside." - if(2) - msg ="Your movement jostles [O] in your [organ.name] painfully." - if(3) - msg ="[O] in your [organ.name] twists painfully as you move." - to_chat(src, msg) - - organ.take_damage(rand(1,3), 0, 0) - if(!(organ.status & ORGAN_ROBOT)) //There is no blood in protheses. - organ.status |= ORGAN_BLEEDING - src.adjustToxLoss(rand(1,3)) - /mob/living/carbon/human/verb/check_pulse() set category = null set name = "Check pulse" @@ -1521,10 +1424,6 @@ tail = species.tail - if(vessel) - vessel = null - make_blood() - maxHealth = species.total_health toxins_alert = 0 @@ -1621,7 +1520,6 @@ overlays.Cut() update_mutantrace(1) regenerate_icons() - fixblood() if(!delay_icon_update) UpdateAppearance() @@ -2051,8 +1949,8 @@ to_chat(src, "Your fingers don't fit in the trigger guard!") return 0 - if(martial_art && martial_art.name == "The Sleeping Carp") //great dishonor to famiry - to_chat(src, "Use of ranged weaponry would bring dishonor to the clan.") + if(martial_art && martial_art.no_guns) //great dishonor to famiry + to_chat(src, "[martial_art.no_guns_message]") return 0 return . diff --git a/code/modules/mob/living/carbon/human/human_attackalien.dm b/code/modules/mob/living/carbon/human/human_attackalien.dm index 015c73455ba..7c4039789a9 100644 --- a/code/modules/mob/living/carbon/human/human_attackalien.dm +++ b/code/modules/mob/living/carbon/human/human_attackalien.dm @@ -4,13 +4,13 @@ return 0 switch(M.a_intent) - if(I_HELP) + if(INTENT_HELP) visible_message("[M] caresses [src] with its scythe like arm.") - if(I_GRAB) + if(INTENT_GRAB) grabbedby(M) - if(I_HARM) + if(INTENT_HARM) M.do_attack_animation(src) if(w_uniform) w_uniform.add_fingerprint(M) @@ -33,7 +33,7 @@ apply_effect(4, WEAKEN, armor_block) updatehealth() - if(I_DISARM) + if(INTENT_DISARM) M.do_attack_animation(src) if(prob(80)) var/obj/item/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting)) diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index b0d2fb3e315..8d378d01e43 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -18,7 +18,7 @@ ..() - if((M != src) && M.a_intent != "help" && check_shields(0, M.name, attack_type = UNARMED_ATTACK)) + if((M != src) && M.a_intent != INTENT_HELP && check_shields(0, M.name, attack_type = UNARMED_ATTACK)) add_logs(M, src, "attempted to touch") visible_message("[M] attempted to touch [src]!") return 0 @@ -53,7 +53,7 @@ species.handle_attack_hand(src,M) switch(M.a_intent) - if(I_HELP) + if(INTENT_HELP) if(attacker_style && attacker_style.help_act(H, src))//adminfu only... return 1 if(can_operate(src)) @@ -99,14 +99,14 @@ else to_chat(M, "You need to stay still while performing CPR!") - if(I_GRAB) + if(INTENT_GRAB) if(attacker_style && attacker_style.grab_act(H, src)) return 1 else src.grabbedby(M) return 1 - if(I_HARM) + if(INTENT_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(species && species.flags & NO_BLOOD)//why this hell were we never checkinf for this? @@ -158,7 +158,7 @@ visible_message("[M] [pick(attack.attack_verb)]ed [src]!") - apply_damage(damage, BRUTE, affecting, armor_block, sharp=attack.sharp, edge=attack.edge) //moving this back here means Armalis are going to knock you down 70% of the time, but they're pure adminbus anyway. + apply_damage(damage, BRUTE, affecting, armor_block, sharp = attack.sharp) //moving this back here means Armalis are going to knock you down 70% of the time, but they're pure adminbus anyway. if((stat != DEAD) && damage >= M.species.punchstunthreshold) visible_message("[M] has weakened [src]!", \ "[M] has weakened [src]!") @@ -168,7 +168,7 @@ forcesay(hit_appends) - if(I_DISARM) + if(INTENT_DISARM) if(attacker_style && attacker_style.disarm_act(H, src)) return 1 else diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 04c8ffc9f57..9a96ec72c28 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -112,7 +112,7 @@ var/obj/item/organ/external/O = get_organ(organ_name) if(amount > 0) - O.take_damage(amount, 0, sharp=is_sharp(damage_source), edge=has_edge(damage_source), used_weapon=damage_source) + O.take_damage(amount, 0, sharp=is_sharp(damage_source), used_weapon=damage_source) else //if you don't want to heal robot organs, they you will have to check that yourself before using this proc. O.heal_damage(-amount, 0, internal=0, robo_repair=(O.status & ORGAN_ROBOT)) @@ -126,7 +126,7 @@ var/obj/item/organ/external/O = get_organ(organ_name) if(amount > 0) - O.take_damage(0, amount, sharp=is_sharp(damage_source), edge=has_edge(damage_source), used_weapon=damage_source) + O.take_damage(0, amount, sharp=is_sharp(damage_source), used_weapon=damage_source) else //if you don't want to heal robot organs, they you will have to check that yourself before using this proc. O.heal_damage(0, -amount, internal=0, robo_repair=(O.status & ORGAN_ROBOT)) @@ -240,7 +240,7 @@ if(!parts.len) return var/obj/item/organ/external/picked = pick(parts) - if(picked.take_damage(brute,burn,sharp,edge)) + if(picked.take_damage(brute, burn, sharp)) UpdateDamageIcon() updatehealth() speech_problem_flag = 1 @@ -285,7 +285,7 @@ var/burn_was = picked.burn_dam - update |= picked.take_damage(brute_per_part,burn_per_part,sharp,edge,used_weapon) + update |= picked.take_damage(brute_per_part, burn_per_part, sharp, used_weapon) brute -= (picked.brute_dam - brute_was) burn -= (picked.burn_dam - burn_was) @@ -300,15 +300,6 @@ //////////////////////////////////////////// -/* -This function restores the subjects blood to max. -*/ -/mob/living/carbon/human/proc/restore_blood() - if(!(species.flags & NO_BLOOD)) - 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. */ @@ -333,7 +324,7 @@ This function restores all organs. return bodyparts_by_name[zone] -/mob/living/carbon/human/apply_damage(damage = 0, damagetype = BRUTE, def_zone = null, blocked = 0, sharp = 0, edge = 0, obj/used_weapon = null) +/mob/living/carbon/human/apply_damage(damage = 0, damagetype = BRUTE, def_zone = null, blocked = 0, sharp = 0, obj/used_weapon = null) //Handle other types of damage if((damagetype != BRUTE) && (damagetype != BURN)) ..(damage, damagetype, def_zone, blocked) @@ -364,7 +355,7 @@ This function restores all organs. if(species) damage = damage * species.brute_mod - if(organ.take_damage(damage, 0, sharp, edge, used_weapon)) + if(organ.take_damage(damage, 0, sharp, used_weapon)) UpdateDamageIcon() if(LAssailant && ishuman(LAssailant)) //superheros still get the comical hit markers @@ -389,7 +380,7 @@ This function restores all organs. if(species) damage = damage * species.burn_mod - if(organ.take_damage(0, damage, sharp, edge, used_weapon)) + if(organ.take_damage(0, damage, sharp, used_weapon)) UpdateDamageIcon() // Will set our damageoverlay icon to the next level, which will then be set back to the normal level the next mob.Life(). diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 3f25873e5f2..8b9629d656b 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -8,9 +8,10 @@ emp_act */ -/mob/living/carbon/human/bullet_act(var/obj/item/projectile/P, var/def_zone) - if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam)) +/mob/living/carbon/human/bullet_act(obj/item/projectile/P, def_zone) + + if(P.is_reflectable) if(check_reflect(def_zone)) // Checks if you've passed a reflection% check visible_message("The [P.name] gets reflected by [src]!", \ "The [P.name] gets reflected by [src]!") @@ -41,19 +42,6 @@ emp_act . = bullet_act(P, "chest") //act on chest instead return - //Shrapnel - 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() - (SP.name) = "[P.name] shrapnel" - if(P.ammo_casing && P.ammo_casing.caliber) - (SP.desc) = "[SP.desc] It looks like it is a [P.ammo_casing.caliber] caliber round." - else - (SP.desc) = "[SP.desc] The round's caliber is unidentifiable." - (SP.loc) = organ - organ.embed(SP) - organ.add_autopsy_data(P.name, P.damage) // Add the bullet's name to the autopsy data return (..(P , def_zone)) @@ -61,7 +49,7 @@ emp_act /mob/living/carbon/human/check_projectile_dismemberment(obj/item/projectile/P, def_zone) var/obj/item/organ/external/affecting = get_organ(check_zone(def_zone)) if(affecting && !affecting.cannot_amputate && affecting.get_damage() >= (affecting.max_damage - P.dismemberment)) - var/damtype = DROPLIMB_EDGE + var/damtype = DROPLIMB_SHARP switch(P.damage_type) if(BRUTE) damtype = DROPLIMB_BLUNT @@ -191,14 +179,14 @@ emp_act /mob/living/carbon/human/proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone) if(!I || !user) return 0 - if((istype(I, /obj/item/weapon/kitchen/knife/butcher/meatcleaver) || istype(I, /obj/item/weapon/twohanded/chainsaw)) && src.stat == DEAD && user.a_intent == I_HARM) + if((istype(I, /obj/item/weapon/kitchen/knife/butcher/meatcleaver) || istype(I, /obj/item/weapon/twohanded/chainsaw)) && src.stat == DEAD && user.a_intent == INTENT_HARM) var/obj/item/weapon/reagent_containers/food/snacks/meat/human/newmeat = new /obj/item/weapon/reagent_containers/food/snacks/meat/human(get_turf(src.loc)) newmeat.name = src.real_name + newmeat.name newmeat.subjectname = src.real_name newmeat.subjectjob = src.job newmeat.reagents.add_reagent ("nutriment", (src.nutrition / 15) / 3) src.reagents.trans_to (newmeat, round ((src.reagents.total_volume) / 3, 1)) - src.loc.add_blood(src) + add_mob_blood(src) --src.meatleft to_chat(user, "You hack off a chunk of meat from [src.name]") if(!src.meatleft) @@ -234,32 +222,29 @@ 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 && prob(getarmor(user.zone_sel.selecting, "melee"))) weapon_sharp = 0 - weapon_edge = 0 if(armor >= 100) return 0 if(!I.force) return 0 var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords) - apply_damage(I.force, I.damtype, affecting, armor, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I) + apply_damage(I.force, I.damtype, affecting, armor, sharp = weapon_sharp, used_weapon = I) var/bloody = 0 if(I.damtype == BRUTE && I.force && prob(25 + I.force * 2)) - I.add_blood(src) //Make the weapon bloody, not the person. + I.add_mob_blood(src) //Make the weapon bloody, not the person. // if(user.hand) user.update_inv_l_hand() //updates the attacker's overlay for the (now bloodied) weapon // else user.update_inv_r_hand() //removed because weapons don't have on-mob blood overlays - if(prob(33)) + if(prob(I.force * 2)) //blood spatter! bloody = 1 var/turf/location = loc if(istype(location, /turf/simulated)) - location.add_blood(src) + add_splatter_floor(location) if(ishuman(user)) var/mob/living/carbon/human/H = user if(get_dist(H, src) <= 1) //people with TK won't get smeared with blood - H.bloody_body(src) - H.bloody_hands(src) + H.add_mob_blood(src) if(!stat) switch(hit_area) @@ -275,15 +260,16 @@ emp_act if(bloody)//Apply blood if(wear_mask) - wear_mask.add_blood(src) + wear_mask.add_mob_blood(src) update_inv_wear_mask(0) if(head) - head.add_blood(src) + head.add_mob_blood(src) update_inv_head(0,0) if(glasses && prob(33)) - glasses.add_blood(src) + glasses.add_mob_blood(src) update_inv_glasses(0) + if("upper body")//Easier to score a stun but lasts less time if(stat == CONSCIOUS && I.force && prob(I.force + 10)) visible_message("[src] has been knocked down!", \ @@ -291,127 +277,63 @@ emp_act apply_effect(5, WEAKEN, armor) if(bloody) - bloody_body(src) + if(wear_suit) + wear_suit.add_mob_blood(src) + update_inv_wear_suit(1) + if(w_uniform) + w_uniform.add_mob_blood(src) + update_inv_w_uniform(1) + if(Iforce > 10 || Iforce >= 5 && prob(33)) 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()) - var/damage = I.force - if(armor) - damage /= armor+1 - - //blunt objects should really not be embedding in things unless a huge amount of force is involved - var/embed_chance = weapon_sharp? damage/I.w_class : damage/(I.w_class*3) - var/embed_threshold = weapon_sharp? 5*I.w_class : 15*I.w_class - - //Sharp objects will always embed if they do enough damage. - if(((weapon_sharp && damage > (10*I.w_class)) || (damage > embed_threshold && prob(embed_chance))) && (I.no_embed == 0) ) - affecting.embed(I) - return 1*/ - //this proc handles being hit by a thrown atom -/mob/living/carbon/human/hitby(atom/movable/AM as mob|obj,var/speed = 5) +/mob/living/carbon/human/hitby(atom/movable/AM, skipcatch = 0, hitpush = 1, blocked = 0) + var/obj/item/I + var/throwpower = 30 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(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(I, /obj/item/weapon)) - var/obj/item/weapon/W = I - dtype = W.damtype - var/throw_damage = I.throwforce*(speed/5) - - I.throwing = 0 //it hit, so stop moving - - 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 = (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("[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) - - if(ismob(I.thrower)) - var/mob/M = I.thrower - if(M) - add_logs(M, src, "hit", I, " (thrown)", print_attack_log = I.throwforce) - - //thrown weapon embedded object code. - if(dtype == BRUTE && istype(I)) - if(!I.is_robot_module()) - var/sharp = is_sharp(I) - var/damage = throw_damage - if(armor) - damage /= armor+1 - - //blunt objects should really not be embedding in things unless a huge amount of force is involved - var/embed_chance = sharp? damage/I.w_class : damage/(I.w_class*3) - var/embed_threshold = sharp? 5*I.w_class : 15*I.w_class - - //Sharp objects will always embed if they do enough damage. - //Thrown sharp objects have some momentum already and have a small chance to embed even if the damage is below the threshold - if(((sharp && prob(damage/(10*I.w_class)*100)) || (damage > embed_threshold && prob(embed_chance))) && (I.no_embed == 0)) - affecting.embed(I) - - // Begin BS12 momentum-transfer code. - if(I.throw_source && speed >= 15) - var/obj/item/weapon/W = I - var/momentum = speed/2 - var/dir = get_dir(I.throw_source, src) - - visible_message("[src] staggers under the impact!","You stagger under the impact!") - src.throw_at(get_edge_target_turf(src,dir),1,momentum) - - if(!W || !src) return - - if(W.loc == src && W.sharp) //Projectile is embedded and suitable for pinning. - var/turf/T = near_wall(dir,2) - - if(T) - src.loc = T - visible_message("[src] is pinned to the wall by [I]!","You are pinned to the wall by [I]!") - src.anchored = 1 - src.pinned += I - + I = AM + throwpower = I.throwforce + if(I.thrownby == src) //No throwing stuff at yourself to trigger reactions + return ..() + if(check_shields(throwpower, "\the [AM.name]", AM, THROWN_PROJECTILE_ATTACK)) + hitpush = 0 + skipcatch = 1 + blocked = 1 + else if(I) + if(I.throw_speed >= EMBED_THROWSPEED_THRESHOLD) + if(can_embed(I)) + if(prob(I.embed_chance)) + throw_alert("embeddedobject", /obj/screen/alert/embeddedobject) + var/obj/item/organ/external/L = pick(bodyparts) + L.embedded_objects |= I +// I.add_mob_blood(src)//it embedded itself in you, of course it's bloody! + I.forceMove(src) + L.take_damage(I.w_class*I.embedded_impact_pain_multiplier) + visible_message("[I] embeds itself in [src]'s [L.name]!","[I] embeds itself in your [L.name]!") + hitpush = 0 + skipcatch = 1 //can't catch the now embedded item + return ..() /mob/living/carbon/human/proc/bloody_hands(var/mob/living/source, var/amount = 2) if(gloves) - gloves.add_blood(source) + gloves.add_mob_blood(source) gloves:transfer_blood = amount - gloves:bloody_hands_mob = source else - add_blood(source) + add_mob_blood(source) bloody_hands = amount - bloody_hands_mob = source update_inv_gloves(1) //updates on-mob overlays for bloody hands and/or bloody gloves /mob/living/carbon/human/proc/bloody_body(var/mob/living/source) if(wear_suit) - wear_suit.add_blood(source) + wear_suit.add_mob_blood(source) update_inv_wear_suit(0) return if(w_uniform) - w_uniform.add_blood(source) + w_uniform.add_mob_blood(source) update_inv_w_uniform(1) /mob/living/carbon/human/proc/handle_suit_punctures(var/damtype, var/damage) @@ -426,7 +348,7 @@ emp_act if(penetrated_dam) SS.create_breaches(damtype, penetrated_dam) /mob/living/carbon/human/mech_melee_attack(obj/mecha/M) - if(M.occupant.a_intent == I_HARM) + if(M.occupant.a_intent == INTENT_HARM) if(M.damtype == "brute") step_away(src,M,15) var/obj/item/organ/external/affecting = get_organ(pick("chest", "chest", "chest", "head")) @@ -469,5 +391,5 @@ emp_act /mob/living/carbon/human/water_act(volume, temperature, source) ..() - if(temperature >= 330) bodytemperature = bodytemperature + (temperature - bodytemperature) - if(temperature <= 280) bodytemperature = bodytemperature - (bodytemperature - temperature) + species.water_act(src,volume,temperature,source) + diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 15f9b6d112e..036202e1ae0 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -65,6 +65,8 @@ var/global/default_martial_art = new/datum/martial_art var/meatleft = 3 //For chef item var/decaylevel = 0 // For rotting bodies var/max_blood = BLOOD_VOLUME_NORMAL // For stuff in the vessel + var/bleed_rate = 0 + var/bleedsuppress = 0 //for stopping bloodloss var/check_mutations=0 // Check mutations on next life tick diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index cf66c1d2c15..164eb14e7cd 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -1,67 +1,8 @@ /mob/living/carbon/human/movement_delay() - var/tally = 0 - - if(species.slowdown) - tally = species.slowdown - - if(!has_gravity(src)) - return -1 // It's hard to be slowed down in space by... anything - - if(flying) return -1 - - if(embedded_flag) - handle_embedded_objects() //Moving with objects stuck in you can cause bad times. - - if(slowed) - tally += 10 - - var/health_deficiency = (maxHealth - health + staminaloss) - if(reagents) - for(var/datum/reagent/R in reagents.reagent_list) - if(R.shock_reduction) - health_deficiency -= R.shock_reduction - if(health_deficiency >= 40) - tally += (health_deficiency / 25) - - var/hungry = (500 - nutrition)/5 // So overeat would be 100 and default level would be 80 - if(hungry >= 70) - tally += hungry/50 - - if(wear_suit) - tally += wear_suit.slowdown - - if(!buckled) - if(shoes) - tally += shoes.slowdown - - if(shock_stage >= 10) tally += 3 - - if(back) - tally += back.slowdown - - if(l_hand && (l_hand.flags & HANDSLOW)) - tally += l_hand.slowdown - if(r_hand && (r_hand.flags & HANDSLOW)) - tally += r_hand.slowdown - - if(FAT in src.mutations) - tally += 1.5 - 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 - - if(RUN in mutations) - tally = -1 - if(status_flags & IGNORESLOWDOWN) // make sure this is always at the end so we don't have ignore slowdown getting ignored itself - tally = -1 - - if(status_flags & GOTTAGOFAST) - tally -= 1 - if(status_flags & GOTTAGOREALLYFAST) - tally -= 2 - - return (tally + config.human_delay) + . = 0 + . += ..() + . += config.human_delay + . += species.movement_delay(src) /mob/living/carbon/human/Process_Spacemove(movement_dir = 0) @@ -94,24 +35,64 @@ /mob/living/carbon/human/Move(NewLoc, direct) . = ..() - if(shoes && .) // did we actually move? + if(.) // did we actually move? if(!lying && !buckled) + var/obj/item/clothing/shoes/S = shoes if(!has_gravity(loc)) return - var/obj/item/clothing/shoes/S = shoes - S.step_action(src) + //Bloody footprints + var/turf/T = get_turf(src) + var/obj/item/organ/external/l_foot = get_organ("l_foot") + var/obj/item/organ/external/r_foot = get_organ("r_foot") + var/hasfeet = 1 + if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED)) + hasfeet = 0 + + if(shoes) + if(S.bloody_shoes && S.bloody_shoes[S.blood_state]) + var/obj/effect/decal/cleanable/blood/footprints/oldFP = locate(/obj/effect/decal/cleanable/blood/footprints) in T + if(oldFP && oldFP.blood_state == S.blood_state && oldFP.basecolor == S.blood_color) + return + else + //No oldFP or it's a different kind of blood + S.bloody_shoes[S.blood_state] = max(0, S.bloody_shoes[S.blood_state] - BLOOD_LOSS_PER_STEP) + var/obj/effect/decal/cleanable/blood/footprints/FP = new /obj/effect/decal/cleanable/blood/footprints(T) + FP.blood_state = S.blood_state + FP.entered_dirs |= dir + FP.bloodiness = S.bloody_shoes[S.blood_state] + FP.blood_DNA = S.blood_DNA + FP.basecolor = S.blood_color + FP.update_icon() + update_inv_shoes() + else if(hasfeet) + if(bloody_feet && bloody_feet[blood_state]) + var/obj/effect/decal/cleanable/blood/footprints/oldFP = locate(/obj/effect/decal/cleanable/blood/footprints) in T + if(oldFP && oldFP.blood_state == blood_state && oldFP.basecolor == feet_blood_color) + return + else + bloody_feet[blood_state] = max(0, bloody_feet[blood_state] - BLOOD_LOSS_PER_STEP) + var/obj/effect/decal/cleanable/blood/footprints/FP = new /obj/effect/decal/cleanable/blood/footprints(T) + FP.blood_state = blood_state + FP.entered_dirs |= dir + FP.bloodiness = bloody_feet[blood_state] + FP.basecolor = feet_blood_color + FP.update_icon() + update_inv_shoes() + //End bloody footprints + if(S) + S.step_action(src) /mob/living/carbon/human/handle_footstep(turf/T) if(..()) if(T.footstep_sounds["human"]) var/S = pick(T.footstep_sounds["human"]) if(S) - if(m_intent == "run") + if(m_intent == MOVE_INTENT_RUN) if(!(step_count % 2)) //every other turf makes a sound return 0 var/range = -(world.view - 2) - if(m_intent == "walk") + if(m_intent == MOVE_INTENT_WALK) range -= 0.333 if(!shoes) range -= 0.333 @@ -124,7 +105,7 @@ //-(7 - 2) = (-5) = -5 | -5 - (0.333 * 2) = -5.666 | (7 + -5.666) = 1.334 | 1.334 * 3 = 4.002 | range(4.002) = range(4) var/volume = 13 - if(m_intent == "walk") + if(m_intent == MOVE_INTENT_WALK) volume -= 4 if(!shoes) volume -= 4 @@ -150,4 +131,4 @@ playsound(T, S, volume, 1, range) return 1 - return 0 \ No newline at end of file + return 0 diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index 5ae7547be58..24ed336a4a3 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -65,7 +65,8 @@ 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)) + // Not standing, so no need to care about stance + if(istype(buckled, /obj/structure/stool/bed) || !isturf(loc)) return for(var/limb_tag in list("l_leg","r_leg","l_foot","r_foot")) diff --git a/code/modules/mob/living/carbon/human/interactive/functions.dm b/code/modules/mob/living/carbon/human/interactive/functions.dm index ad4d8226c4a..46706c45363 100644 --- a/code/modules/mob/living/carbon/human/interactive/functions.dm +++ b/code/modules/mob/living/carbon/human/interactive/functions.dm @@ -420,9 +420,9 @@ return doing |= SNPC_SPECIAL - 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/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/boiledspaghetti,/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/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, /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) + 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/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/spaghetti, /obj/item/weapon/reagent_containers/food/snacks/dough, /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() @@ -638,7 +638,7 @@ if(canmove) if((graytide || (TRAITS & TRAIT_MEAN)) || retal) interest += targetInterestShift - a_intent = "harm" + a_intent = INTENT_HARM zone_sel.selecting = pick("chest","r_leg","l_leg","r_arm","l_arm","head") doing |= SNPC_FIGHTING if(retal) @@ -746,7 +746,7 @@ tryWalk(TARGET) else if(Adjacent(TARGET)) - a_intent = pick("disarm", "harm") + a_intent = pick(INTENT_DISARM, INTENT_HARM) M.attack_hand(src) timeout++ else if(timeout >= 10 || !(targetRange(M) > 14)) diff --git a/code/modules/mob/living/carbon/human/interactive/interactive.dm b/code/modules/mob/living/carbon/human/interactive/interactive.dm index a208752af24..b1d9b5bc68f 100644 --- a/code/modules/mob/living/carbon/human/interactive/interactive.dm +++ b/code/modules/mob/living/carbon/human/interactive/interactive.dm @@ -270,20 +270,20 @@ if(prob((SNPC_FUZZY_CHANCE_LOW+SNPC_FUZZY_CHANCE_HIGH)/4)) var/obj/item/organ/external/R = bodyparts_by_name["r_arm"] if(R) - R.robotize() + R.robotize(make_tough = 1) else var/obj/item/organ/external/L = bodyparts_by_name["l_arm"] if(L) - L.robotize() + L.robotize(make_tough = 1) //legs if(prob((SNPC_FUZZY_CHANCE_LOW+SNPC_FUZZY_CHANCE_HIGH)/4)) var/obj/item/organ/external/R = bodyparts_by_name["r_leg"] if(R) - R.robotize() + R.robotize(make_tough = 1) else var/obj/item/organ/external/L = bodyparts_by_name["l_leg"] if(L) - L.robotize() + L.robotize(make_tough = 1) UpdateDamageIcon() regenerate_icons() @@ -431,7 +431,7 @@ var/mob/living/M = target if(istype(M)) if(health > 0) - if(M.a_intent == "help" && !incapacitated()) + if(M.a_intent == INTENT_HELP && !incapacitated()) chatter() if(istype(target, /mob/living/carbon) && !retal && prob(SNPC_FUZZY_CHANCE_LOW)) var/mob/living/carbon/C = target @@ -439,7 +439,7 @@ tryWalk(target) else C.help_shake_act(src) - if(M.a_intent == "harm") + if(M.a_intent == INTENT_HARM) retal = 1 retal_target = target @@ -449,7 +449,7 @@ ..() retalTarget(user) -/mob/living/carbon/human/interactive/hitby(atom/movable/AM) +/mob/living/carbon/human/interactive/hitby(atom/movable/AM, skipcatch, hitpush, blocked) ..() var/mob/living/carbon/C = locate(/mob/living/carbon) in view(SNPC_MIN_RANGE_FIND, src) if(C) @@ -658,7 +658,7 @@ if(grabbed_by.len > 0) for(var/obj/item/weapon/grab/G in grabbed_by) if(Adjacent(G)) - a_intent = "disarm" + a_intent = INTENT_DISARM G.assailant.attack_hand(src) inactivity_period = 10 diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index bb297513ef5..6edc2f0ae75 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -151,7 +151,7 @@ update_hair() //rebuild hair update_fhair() update_head_accessory() - if(internal) + if(internal && !get_organ_slot("breathing_tube")) internal = null update_internals_hud_icon(0) wear_mask_update(I, toggle_off = FALSE) @@ -546,7 +546,7 @@ return 0 if(I.slot_flags & SLOT_DENYPOCKET) return - if(I.w_class <= 2 || (I.slot_flags & SLOT_POCKET)) + if(I.w_class <= WEIGHT_CLASS_SMALL || (I.slot_flags & SLOT_POCKET)) return 1 if(slot_r_store) if(I.flags & NODROP) @@ -559,7 +559,7 @@ return 0 if(I.slot_flags & SLOT_DENYPOCKET) return 0 - if(I.w_class <= 2 || (I.slot_flags & SLOT_POCKET)) + if(I.w_class <= WEIGHT_CLASS_SMALL || (I.slot_flags & SLOT_POCKET)) return 1 return 0 if(slot_s_store) @@ -575,7 +575,7 @@ if(!disable_warning) to_chat(src, "You somehow have a suit with no defined allowed items for suit storage, stop that.") return 0 - if(I.w_class > 4) + if(I.w_class > WEIGHT_CLASS_BULKY) if(!disable_warning) to_chat(src, "The [name] is too big to attach.") return 0 diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index be265669b79..2d693dfedcb 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -40,6 +40,10 @@ if(!client) species.handle_npc(src) + if(stat != DEAD) + //Stuff jammed in your limbs hurts + handle_embedded_objects() + if(stat == DEAD) handle_decay() @@ -191,73 +195,62 @@ if(!(species.flags & RADIMMUNE)) if(radiation) + radiation = Clamp(radiation, 0, 200) - if(get_int_organ(/obj/item/organ/internal/nucleation/resonant_crystal)) - var/rads = radiation/25 - radiation -= rads - radiation -= 0.1 - reagents.add_reagent("radium", rads/10) - if( prob(10) ) - to_chat(src, "You feel relaxed.") - return - - if(radiation > 100) - radiation = 100 - Weaken(10) - if(!lying) - to_chat(src, "You feel weak.") - emote("collapse") - - if(radiation < 0) - radiation = 0 - - else - var/damage = 0 - switch(radiation) - if(0 to 49) - radiation-- - if(prob(25)) - adjustToxLoss(1) - damage = 1 - updatehealth() - - if(50 to 74) - radiation -= 2 - damage = 1 + var/autopsy_damage = 0 + switch(radiation) + if(1 to 49) + radiation = max(radiation-1, 0) + if(prob(25)) adjustToxLoss(1) - if(prob(5)) - radiation -= 5 - Weaken(3) - if(!lying) - to_chat(src, "You feel weak.") - emote("collapse") - updatehealth() + adjustFireLoss(1) + autopsy_damage = 2 - if(75 to 100) - radiation -= 3 - adjustToxLoss(3) - damage = 3 - if(prob(1)) - to_chat(src, "You mutate!") - randmutb(src) - domutcheck(src,null) - emote("gasp") - updatehealth() + if(50 to 74) + radiation = max(radiation-2, 0) + adjustToxLoss(1) + adjustFireLoss(1) + autopsy_damage = 2 + if(prob(5)) + radiation = max(radiation-5, 0) + Weaken(3) + to_chat(src, "You feel weak.") + emote("collapse") - else - radiation -= 5 - adjustToxLoss(5) - damage = 5 - if(prob(1)) - to_chat(src, "You mutate!") - randmutb(src) - domutcheck(src,null) - emote("gasp") - updatehealth() + if(75 to 100) + radiation = max(radiation-2, 0) + adjustToxLoss(2) + adjustFireLoss(2) + autopsy_damage = 4 + if(prob(2)) + to_chat(src, "You mutate!") + randmutb(src) + domutcheck(src, null) - if(damage && bodyparts.len) - var/obj/item/organ/external/O = pick(bodyparts) - if(istype(O)) O.add_autopsy_data("Radiation Poisoning", damage) + if(101 to 150) + radiation = max(radiation-3, 0) + adjustToxLoss(2) + adjustFireLoss(3) + autopsy_damage = 5 + if(prob(4)) + to_chat(src, "You mutate!") + randmutb(src) + domutcheck(src, null) + + if(151 to INFINITY) + radiation = max(radiation-3, 0) + adjustToxLoss(2) + adjustFireLoss(3) + autopsy_damage = 5 + if(prob(6)) + to_chat(src, "You mutate!") + randmutb(src) + domutcheck(src, null) + + if(autopsy_damage) + var/obj/item/organ/external/chest/chest = get_organ("chest") + if(chest) + chest.add_autopsy_data("Radiation Poisoning", autopsy_damage) /mob/living/carbon/human/breathe() @@ -281,7 +274,7 @@ if(losebreath > 0) AdjustLoseBreath(-1) if(prob(10)) - spawn emote("gasp") + emote("gasp") if(istype(loc, /obj/)) var/obj/loc_as_obj = loc loc_as_obj.handle_internal_lifeform(src, 0) @@ -327,9 +320,10 @@ var/null_internals = 0 //internals are invalid, therefore turn them off var/skip_contents_check = 0 //rigsuit snowflake, oxygen tanks aren't stored inside the mob, so the 'contents.Find' check has to be skipped. - if(!(wear_mask && wear_mask.flags & AIRTIGHT)) //if NOT (wear_mask AND wear_mask.flags CONTAIN AIRTIGHT) - if(!(head && head.flags & AIRTIGHT)) //if NOT (head AND head.flags CONTAIN AIRTIGHT) - null_internals = 1 //not wearing a mask or suitable helmet + if(!get_organ_slot("breathing_tube")) + if(!(wear_mask && wear_mask.flags & AIRTIGHT)) //if NOT (wear_mask AND wear_mask.flags CONTAIN AIRTIGHT) + if(!(head && head.flags & AIRTIGHT)) //if NOT (head AND head.flags CONTAIN AIRTIGHT) + null_internals = 1 //not wearing a mask or suitable helmet if(istype(back, /obj/item/weapon/rig)) //wearing a rigsuit var/obj/item/weapon/rig/rig = back //needs to be typecasted because this doesn't use get_rig() for some reason @@ -839,13 +833,6 @@ blinded = 1 stat = UNCONSCIOUS - if(embedded_flag && !(mob_master.current_cycle % 10)) - var/list/E - E = get_visible_implants(0) - if(!E.len) - embedded_flag = 0 - - //Vision //god knows why this is here var/obj/item/organ/vision if(species.vision_organ) @@ -906,7 +893,6 @@ if(!in_stasis) handle_organs() - handle_blood() else //dead @@ -958,6 +944,22 @@ adjustToxLoss(-3) lastpuke = 0 +/mob/living/carbon/human/proc/handle_embedded_objects() + for(var/X in bodyparts) + var/obj/item/organ/external/BP = X + for(var/obj/item/I in BP.embedded_objects) + if(prob(I.embedded_pain_chance)) + BP.take_damage(I.w_class*I.embedded_pain_multiplier) + to_chat(src, "[I] embedded in your [BP.name] hurts!") + + if(prob(I.embedded_fall_chance)) + BP.take_damage(I.w_class*I.embedded_fall_pain_multiplier) + BP.embedded_objects -= I + I.forceMove(get_turf(src)) + visible_message("[I] falls out of [name]'s [BP.name]!","[I] falls out of your [BP.name]!") + if(!has_embedded_objects()) + clear_alert("embeddedobject") + /mob/living/carbon/human/handle_changeling() if(mind) if(mind.changeling) @@ -1032,13 +1034,12 @@ if(stat == DEAD) return PULSE_NONE //that's it, you're dead, nothing can influence your pulse - if(heart_attack) + if(undergoing_cardiac_arrest()) return PULSE_NONE var/temp = PULSE_NORM - var/blood_type = get_blood_name() - if(round(vessel.get_reagent_amount(blood_type)) <= BLOOD_VOLUME_BAD) //how much blood do we have + if(blood_volume <= BLOOD_VOLUME_BAD)//how much blood do we have temp = PULSE_THREADY //not enough :( if(status_flags & FAKEDEATH) @@ -1100,9 +1101,9 @@ if(H.species && H.species.flags & NO_BREATHE) return //no puking if you can't smell! // Humans can lack a mind datum, y'know - if(H.mind && H.mind.assigned_role == "Detective") + if(H.mind && (H.mind.assigned_role == "Detective" || H.mind.assigned_role == "Coroner")) return //too cool for puke - to_chat(H, "You smell something foul...") + to_chat(H, "You smell something foul...") H.fakevomit() /mob/living/carbon/human/proc/handle_heartbeat() @@ -1175,14 +1176,37 @@ return stuttering + +/mob/living/carbon/human/proc/can_heartattack() + if(species.flags & (NO_BLOOD|NO_INTORGANS)) + return FALSE + return TRUE + +/mob/living/carbon/human/proc/undergoing_cardiac_arrest() + if(!can_heartattack()) + return FALSE + var/obj/item/organ/internal/heart/heart = get_int_organ(/obj/item/organ/internal/heart) + if(istype(heart) && heart.beating) + return FALSE + return TRUE + +/mob/living/carbon/human/proc/set_heartattack(status) + if(!can_heartattack()) + return FALSE + + var/obj/item/organ/internal/heart/heart = get_int_organ(/obj/item/organ/internal/heart) + if(!istype(heart)) + return FALSE + + heart.beating = !status + /mob/living/carbon/human/proc/handle_heartattack() - if(!heart_attack) + if(!can_heartattack() || !undergoing_cardiac_arrest() || reagents.has_reagent("corazone")) return - else - AdjustLoseBreath(2, bound_lower = 0, bound_upper = 3) - adjustOxyLoss(5) - Paralyse(4) - adjustBruteLoss(2) + AdjustLoseBreath(2, bound_lower = 0, bound_upper = 3) + adjustOxyLoss(5) + Paralyse(4) + adjustBruteLoss(2) diff --git a/code/modules/mob/living/carbon/human/species/apollo.dm b/code/modules/mob/living/carbon/human/species/apollo.dm index 4fcedc1844a..24f38bdbf64 100644 --- a/code/modules/mob/living/carbon/human/species/apollo.dm +++ b/code/modules/mob/living/carbon/human/species/apollo.dm @@ -58,7 +58,7 @@ /datum/species/wryn/handle_attack_hand(var/mob/living/carbon/human/H, var/mob/living/carbon/human/M) var/obj/item/organ/external/head/head_organ = H.get_organ("head") - if(M.a_intent == I_HARM) + if(M.a_intent == INTENT_HARM) if(H.handcuffed) if(!H.get_int_organ(/obj/item/organ/internal/wryn/hivenode)) return var/turf/p_loc = M.loc @@ -99,7 +99,7 @@ burn_mod = 4 // holy shite, poor guys wont survive half a second cooking smores brute_mod = 2 // damn, double wham, double dam oxy_mod = 0 - flags = IS_WHITELISTED | NO_BREATHE | NO_BLOOD | NO_PAIN | HAS_LIPS | NO_SCAN + flags = IS_WHITELISTED | NO_BREATHE | NO_BLOOD | NO_PAIN | HAS_LIPS | NO_SCAN | RADIMMUNE dietflags = DIET_OMNI //still human at their core, so they maintain their eating habits and diet //Default styles for created mobs. @@ -110,8 +110,7 @@ "heart" = /obj/item/organ/internal/heart, "crystallized brain" = /obj/item/organ/internal/brain/crystal, "eyes" = /obj/item/organ/internal/eyes/luminescent_crystal, //Standard darksight of 2. - "strange crystal" = /obj/item/organ/internal/nucleation/strange_crystal, - "resonant crystal" = /obj/item/organ/internal/nucleation/resonant_crystal + "strange crystal" = /obj/item/organ/internal/nucleation/strange_crystal ) vision_organ = /obj/item/organ/internal/eyes/luminescent_crystal diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm index 2041ca5f3e6..7e6914b603a 100644 --- a/code/modules/mob/living/carbon/human/species/plasmaman.dm +++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm @@ -49,9 +49,12 @@ var/tank_slot_name = "suit storage" switch(assigned_role) - if("Scientist","Geneticist","Roboticist") + if("Scientist","Roboticist") suit=/obj/item/clothing/suit/space/eva/plasmaman/science helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/science + if("Geneticist") + suit=/obj/item/clothing/suit/space/eva/plasmaman/science/geneticist + helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/science/geneticist if("Research Director") suit=/obj/item/clothing/suit/space/eva/plasmaman/science/rd helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/science/rd @@ -90,7 +93,7 @@ if("Nanotrasen Representative") suit = /obj/item/clothing/suit/space/eva/plasmaman/nt_rep helm = /obj/item/clothing/head/helmet/space/eva/plasmaman/nt_rep - if("Medical Doctor","Brig Physician") + if("Medical Doctor","Brig Physician","Virologist") suit=/obj/item/clothing/suit/space/eva/plasmaman/medical helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical H.equip_or_collect(new /obj/item/device/flashlight/pen(H), slot_in_backpack) @@ -103,6 +106,12 @@ if("Chief Medical Officer") suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/cmo helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/cmo + if("Coroner") + suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/coroner + helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/coroner + if("Virologist") + suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/virologist + helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/virologist if("Bartender", "Chef") suit=/obj/item/clothing/suit/space/eva/plasmaman/service helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/service @@ -157,8 +166,7 @@ if(Toxins_pp < safe_plasma_min) if(prob(20)) - spawn(0) - H.emote("gasp") + H.emote("gasp") if(Toxins_pp > 0) var/ratio = safe_plasma_min/Toxins_pp H.adjustOxyLoss(min(5*ratio, HUMAN_MAX_OXYLOSS)) // Don't fuck them up too fast (space only does HUMAN_MAX_OXYLOSS after all!) @@ -189,8 +197,7 @@ if(world.time - H.co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good! H.adjustOxyLoss(8) if(prob(20)) // Lets give them some chance to know somethings not right though I guess. - spawn(0) - H.emote("cough") + H.emote("cough") else H.co2overloadtime = 0 @@ -204,8 +211,7 @@ H.AdjustSleeping(8, bound_lower = 0, bound_upper = 10) else if(SA_pp > 0.15) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning if(prob(20)) - spawn(0) - H.emote(pick("giggle", "laugh")) + H.emote(pick("giggle", "laugh")) SA.moles = 0 if(abs(310.15 - breath.temperature) > 50) // Hot air hurts :( diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index d400fd08a81..0f454cbcb54 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -228,8 +228,7 @@ if(O2_pp < atmos_requirements["min_oxy"]) if(prob(20)) - spawn(0) - H.emote("gasp") + H.emote("gasp") H.failed_last_breath = 1 if(O2_pp > 0) @@ -251,8 +250,7 @@ if(N2_pp < atmos_requirements["min_nitro"]) if(prob(20)) - spawn(0) - H.emote("gasp") + H.emote("gasp") H.failed_last_breath = 1 if(N2_pp > 0) @@ -274,8 +272,7 @@ if(Tox_pp < atmos_requirements["min_tox"]) if(prob(20)) - spawn(0) - H.emote("gasp") + H.emote("gasp") H.failed_last_breath = 1 if(Tox_pp > 0) @@ -298,8 +295,7 @@ if(CO2_pp < atmos_requirements["min_co2"]) if(prob(20)) - spawn(0) - H.emote("gasp") + H.emote("gasp") H.failed_last_breath = 1 if(CO2_pp) @@ -317,8 +313,7 @@ if(world.time - H.co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good! H.adjustOxyLoss(8) if(prob(20)) // Lets give them some chance to know somethings not right though I guess. - spawn(0) - H.emote("cough") + H.emote("cough") else H.clear_alert("co2") H.co2overloadtime = 0 @@ -344,8 +339,7 @@ H.AdjustSleeping(8, bound_lower = 0, bound_upper = 10) else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning if(prob(20)) - spawn(0) - H.emote(pick("giggle", "laugh")) + H.emote(pick("giggle", "laugh")) handle_temperature(breath, H) return 1 @@ -381,6 +375,69 @@ if(heat_level_3_breathe to INFINITY) H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat") +//////////////// +// MOVE SPEED // +//////////////// + +/datum/species/proc/movement_delay(mob/living/carbon/human/H) + . = 0 //We start at 0. + var/flight = 0 //Check for flight and flying items + var/ignoreslow = 0 + var/gravity = 0 + + if(H.flying) + flight = 1 + + if((H.status_flags & IGNORESLOWDOWN) || (RUN in H.mutations)) + ignoreslow = 1 + + if(has_gravity(H)) + gravity = 1 + + if(!ignoreslow && gravity) + if(slowdown) + . = slowdown + + if(H.wear_suit) + . += H.wear_suit.slowdown + if(!H.buckled) + if(H.shoes) + . += H.shoes.slowdown + if(H.back) + . += H.back.slowdown + if(H.l_hand && (H.l_hand.flags & HANDSLOW)) + . += H.l_hand.slowdown + if(H.r_hand && (H.r_hand.flags & HANDSLOW)) + . += H.r_hand.slowdown + + var/health_deficiency = (H.maxHealth - H.health + H.staminaloss) + var/hungry = (500 - H.nutrition)/5 // So overeat would be 100 and default level would be 80 + if(H.reagents) + for(var/datum/reagent/R in H.reagents.reagent_list) + if(R.shock_reduction) + health_deficiency -= R.shock_reduction + if(health_deficiency >= 40) + if(flight) + . += (health_deficiency / 75) + else + . += (health_deficiency / 25) + if(H.shock_stage >= 10) + . += 3 + . += 2 * H.stance_damage //damaged/missing feet or legs is slow + + if((hungry >= 70) && !flight) + . += hungry/50 + if(FAT in H.mutations) + . += (1.5 - flight) + if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT) + . += (BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR + + if(H.status_flags & GOTTAGOFAST) + . -= 1 + if(H.status_flags & GOTTAGOREALLYFAST) + . -= 2 + return . + /datum/species/proc/handle_post_spawn(var/mob/living/carbon/C) //Handles anything not already covered by basic species assignment. grant_abilities(C) return @@ -454,7 +511,6 @@ var/attack_sound = "punch" var/miss_sound = 'sound/weapons/punchmiss.ogg' var/sharp = 0 - var/edge = 0 /datum/unarmed_attack/punch attack_verb = list("punch") @@ -470,7 +526,6 @@ attack_sound = 'sound/weapons/slice.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' sharp = 1 - edge = 1 /datum/unarmed_attack/claws/armalis attack_verb = list("slash", "claw") @@ -678,3 +733,9 @@ It'll return null if the organ doesn't correspond, so include null checks when u if(H.see_override) //Override all H.see_invisible = H.see_override + +/datum/species/proc/water_act(mob/living/carbon/human/M, volume, temperature, source) + if(temperature >= 330) + M.bodytemperature = M.bodytemperature + (temperature - M.bodytemperature) + if(temperature <= 280) + M.bodytemperature = M.bodytemperature - (M.bodytemperature - temperature) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 552118886f8..52e2914df8a 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -172,6 +172,8 @@ base_color = "#CF4D2F" butt_sprite = "vulp" + scream_verb = "yelps" + has_organ = list( "heart" = /obj/item/organ/internal/heart, "lungs" = /obj/item/organ/internal/lungs, @@ -234,7 +236,8 @@ "kidneys" = /obj/item/organ/internal/kidneys, "brain" = /obj/item/organ/internal/brain, "appendix" = /obj/item/organ/internal/appendix, - "eyes" = /obj/item/organ/internal/eyes //Default darksight of 2. + "eyes" = /obj/item/organ/internal/eyes, //Default darksight of 2. + "headpocket" = /obj/item/organ/internal/headpocket ) suicide_messages = list( @@ -520,6 +523,7 @@ "is cracking their exoskeleton!", "is stabbing themselves with their mandibles!", "is holding their breath!") + /datum/species/slime name = "Slime People" name_plural = "Slime People" @@ -548,6 +552,7 @@ bodyflags = HAS_SKIN_COLOR | NO_EYES dietflags = DIET_CARN reagent_tag = PROCESS_ORG + blood_color = "#0064C8" exotic_blood = "water" //ventcrawler = 1 //ventcrawling commented out butt_sprite = "slime" @@ -576,7 +581,7 @@ #define SLIMEPERSON_BLOOD_SCALING_FACTOR 5 // Used to adjust how much of an effect the blood has on the rate of color change. Higher is slower. // Slowly shifting to the color of the reagents if((H in recolor_list) && H.reagents.total_volume > SLIMEPERSON_COLOR_SHIFT_TRIGGER) - var/blood_amount = H.vessel.total_volume + var/blood_amount = H.blood_volume var/r_color = mix_color_from_reagents(H.reagents.reagent_list) var/new_body_color = BlendRGB(r_color, rgb(H.r_skin, H.g_skin, H.b_skin), (blood_amount*SLIMEPERSON_BLOOD_SCALING_FACTOR)/((blood_amount*SLIMEPERSON_BLOOD_SCALING_FACTOR)+(H.reagents.total_volume))) var/list/new_color_list = ReadRGB(new_body_color) @@ -754,6 +759,11 @@ genemutcheck(C,REMOTETALKBLOCK,null,MUTCHK_FORCED) ..() +/datum/species/grey/water_act(var/mob/living/carbon/C, volume, temperature, source) + ..() + C.take_organ_damage(5,min(volume,20)) + C.emote("scream") + /datum/species/grey/after_equip_job(datum/job/J, mob/living/carbon/human/H) var/speech_pref = H.client.prefs.speciesprefs if(speech_pref) @@ -847,23 +857,20 @@ return ..() /datum/species/diona/handle_life(var/mob/living/carbon/human/H) + H.radiation = Clamp(H.radiation, 0, 100) //We have to clamp this first, then decrease it, or there's a few edge cases of massive heals if we clamp and decrease at the same time. var/rads = H.radiation / 25 - H.apply_effect(-rads,IRRADIATE,0) - H.nutrition += rads + H.radiation = max(H.radiation-rads, 0) + H.nutrition = min(H.nutrition+rads, NUTRITION_LEVEL_WELL_FED+10) H.adjustBruteLoss(-(rads)) - H.adjustOxyLoss(-(rads)) H.adjustToxLoss(-(rads)) var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing if(isturf(H.loc)) //else, there's considered to be no light var/turf/T = H.loc light_amount = min(T.get_lumcount() * 10, 5) //hardcapped so it's not abused by having a ton of flashlights - H.nutrition += light_amount + H.nutrition = min(H.nutrition+light_amount, NUTRITION_LEVEL_WELL_FED+10) H.traumatic_shock -= light_amount - if(H.nutrition > NUTRITION_LEVEL_WELL_FED) - H.nutrition = NUTRITION_LEVEL_WELL_FED - if(light_amount > 0) H.clear_alert("nolight") else @@ -873,8 +880,7 @@ H.adjustBruteLoss(-(light_amount/2)) H.adjustFireLoss(-(light_amount/4)) - H.adjustOxyLoss(-(light_amount)) - if(H.nutrition < 200) + if(H.nutrition < NUTRITION_LEVEL_STARVING+50) H.take_overall_damage(10,0) H.traumatic_shock++ @@ -904,7 +910,7 @@ oxy_mod = 0 death_message = "gives one shrill beep before falling limp, their monitor flashing blue before completely shutting off..." - flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA | RADIMMUNE | ALL_RPARTS| NOTRANSSTING + flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA | RADIMMUNE | ALL_RPARTS | NOTRANSSTING clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = HAS_SKIN_COLOR | HAS_HEAD_MARKINGS | HAS_HEAD_ACCESSORY dietflags = 0 //IPCs can't eat, so no diet @@ -929,7 +935,7 @@ "brain" = /obj/item/organ/internal/brain/mmi_holder/posibrain, "cell" = /obj/item/organ/internal/cell, "optics" = /obj/item/organ/internal/eyes/optical_sensor, //Default darksight of 2. - "charger" = /obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord + "charger" = /obj/item/organ/internal/cyberimp/arm/power_cord ) vision_organ = /obj/item/organ/internal/eyes/optical_sensor diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 1cb97bb3e19..9a8a9b91404 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -1092,8 +1092,8 @@ var/global/list/damage_icon_parts = list() if(legcuffed) overlays_standing[LEGCUFF_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "legcuff1") throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = legcuffed) - if(m_intent != "walk") - m_intent = "walk" + if(m_intent != MOVE_INTENT_WALK) + m_intent = MOVE_INTENT_WALK if(hud_used && hud_used.move_intent) hud_used.move_intent.icon_state = "walking" diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index da764cafda3..21f087eeeee 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -9,6 +9,7 @@ if(..()) . = 1 + handle_blood() for(var/obj/item/organ/internal/O in internal_organs) O.on_life() handle_changeling() @@ -54,7 +55,7 @@ if(losebreath > 0) AdjustLoseBreath(-1) if(prob(10)) - spawn emote("gasp") + emote("gasp") if(istype(loc, /obj/)) var/obj/loc_as_obj = loc loc_as_obj.handle_internal_lifeform(src, 0) @@ -114,8 +115,7 @@ //OXYGEN if(O2_partialpressure < safe_oxy_min) //Not enough oxygen if(prob(20)) - spawn(0) - emote("gasp") + emote("gasp") if(O2_partialpressure > 0) var/ratio = safe_oxy_min/O2_partialpressure adjustOxyLoss(min(5*ratio, 3)) @@ -145,7 +145,7 @@ if(world.time - co2overloadtime > 300) adjustOxyLoss(8) if(prob(20)) - spawn(0) emote("cough") + emote("cough") else co2overloadtime = 0 @@ -168,7 +168,7 @@ AdjustSleeping(2, bound_lower = 0, bound_upper = 10) else if(SA_partialpressure > 0.01) if(prob(20)) - spawn(0) emote(pick("giggle","laugh")) + emote(pick("giggle","laugh")) //BREATH TEMPERATURE handle_breath_temperature(breath) @@ -183,9 +183,10 @@ if(internal) if(internal.loc != src) internal = null - if(!wear_mask || !(wear_mask.flags & AIRTIGHT)) //not wearing mask or non-breath mask - if(!head || !(head.flags & AIRTIGHT)) //not wearing helmet or non-breath helmet - internal = null //turn off internals + if(!get_organ_slot("breathing_tube")) + if(!wear_mask || !(wear_mask.flags & AIRTIGHT)) //not wearing mask or non-breath mask + if(!head || !(head.flags & AIRTIGHT)) //not wearing helmet or non-breath helmet + internal = null //turn off internals if(internal) update_internals_hud_icon(1) @@ -195,7 +196,18 @@ return +/mob/living/carbon/handle_diseases() + for(var/thing in viruses) + var/datum/disease/D = thing + if(prob(D.infectivity)) + D.spread() + + if(stat != DEAD) + D.stage_act() + //remember to remove the "proc" of the child procs of these. +/mob/living/carbon/proc/handle_blood() + return /mob/living/carbon/proc/handle_changeling() return @@ -235,21 +247,18 @@ wetlevel = max(wetlevel - 1,0) /mob/living/carbon/handle_stomach() - spawn(0) - for(var/mob/living/M in stomach_contents) - if(M.loc != src) + for(var/mob/living/M in stomach_contents) + if(M.loc != src) + stomach_contents.Remove(M) + continue + if(stat != DEAD) + if(M.stat == DEAD) stomach_contents.Remove(M) + qdel(M) continue - if(istype(M, /mob/living) && stat != 2) - if(M.stat == 2) - M.death(1) - stomach_contents.Remove(M) - qdel(M) - continue - if(mob_master.current_cycle%3==1) - if(!(M.status_flags & GODMODE)) - M.adjustBruteLoss(5) - nutrition += 10 + if(mob_master.current_cycle%3==1) + M.adjustBruteLoss(5) + nutrition += 10 //This updates the health and status of the mob (conscious, unconscious, dead) /mob/living/carbon/handle_regular_status_updates() @@ -346,8 +355,7 @@ handle_dreams() adjustStaminaLoss(-10) if(prob(10) && health && hal_screwyhud != SCREWYHUD_CRIT) - spawn(0) - emote("snore") + emote("snore") // Keep SSD people asleep if(player_logged) Sleeping(2) diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm index 003cd4a079e..28e457fd128 100644 --- a/code/modules/mob/living/carbon/slime/slime.dm +++ b/code/modules/mob/living/carbon/slime/slime.dm @@ -83,79 +83,45 @@ if(bodytemperature >= 330.23) // 135 F return -1 // slimes become supercharged at high temperatures - var/tally = 0 + . = ..() var/health_deficiency = (100 - health) - if(health_deficiency >= 45) tally += (health_deficiency / 25) + if(health_deficiency >= 45) + . += (health_deficiency / 25) if(bodytemperature < 183.222) - tally += (283.222 - bodytemperature) / 10 * 1.75 + . += (283.222 - bodytemperature) / 10 * 1.75 if(reagents) if(reagents.has_reagent("methamphetamine")) // Meth slows slimes down - tally *= 2 + . *= 2 if(reagents.has_reagent("frostoil")) // Frostoil also makes them move VEEERRYYYYY slow - tally *= 5 + . *= 5 if(health <= 0) // if damaged, the slime moves twice as slow - tally *= 2 + . *= 2 - return tally + config.slime_delay + . += config.slime_delay -/mob/living/carbon/slime/Bump(atom/movable/AM as mob|obj, yes) - if((!(yes) || now_pushing)) - return - now_pushing = 1 - - if(isobj(AM)) - if(!client && powerlevel > 0) - var/probab = 10 - switch(powerlevel) - if(1 to 2) probab = 20 - if(3 to 4) probab = 30 - if(5 to 6) probab = 40 - if(7 to 8) probab = 60 - if(9) probab = 70 - if(10) probab = 95 - 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)) - AM.attack_slime(src) - spawn() - Atkcool = 1 - sleep(45) - Atkcool = 0 - - if(ismob(AM)) - var/mob/tmob = AM - - if(is_adult) - if(istype(tmob, /mob/living/carbon/human)) - if(prob(90)) - now_pushing = 0 - return - else - if(istype(tmob, /mob/living/carbon/human)) - now_pushing = 0 - return - - now_pushing = 0 - ..() - if(!istype(AM, /atom/movable)) - return - if(!( now_pushing )) - now_pushing = 1 - if(!( AM.anchored )) - var/t = get_dir(src, AM) - 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 - return - step(AM, t) - now_pushing = null +/mob/living/carbon/slime/ObjBump(obj/O) + if(!client && powerlevel > 0) + var/chance = 10 + switch(powerlevel) + if(1 to 2) chance = 20 + if(3 to 4) chance = 30 + if(5 to 6) chance = 40 + if(7 to 8) chance = 60 + if(9) chance = 70 + if(10) chance = 95 + if(prob(chance)) + if(istype(O, /obj/structure/window) || istype(O, /obj/structure/grille)) + if(nutrition <= get_hunger_nutrition() && !Atkcool) + if(is_adult || prob(5)) + O.attack_slime(src) + Atkcool = 1 + spawn(45) + Atkcool = 0 /mob/living/carbon/slime/Process_Spacemove(var/movement_dir = 0) return 2 @@ -275,7 +241,7 @@ switch(L.a_intent) - if(I_HELP) + if(INTENT_HELP) visible_message("[L] rubs its head against [src].") @@ -315,11 +281,9 @@ if(prob(90) && !client) Discipline++ - spawn() - SStun = 1 - sleep(rand(45,60)) - if(src) - SStun = 0 + SStun = 1 + spawn(rand(45,60)) + SStun = 0 Victim = null anchored = 0 @@ -343,11 +307,9 @@ if(Discipline == 1) attacked = 0 - spawn() - SStun = 1 - sleep(rand(55,65)) - if(src) - SStun = 0 + SStun = 1 + spawn(rand(55,65)) + SStun = 0 Victim = null anchored = 0 @@ -356,7 +318,7 @@ return else if(stat == DEAD && surgeries.len) - if(M.a_intent == I_HELP) + if(M.a_intent == INTENT_HELP) for(var/datum/surgery/S in surgeries) if(S.next_step(M, src)) return 1 @@ -377,10 +339,10 @@ switch(M.a_intent) - if(I_HELP) + if(INTENT_HELP) help_shake_act(M) - if(I_GRAB) + if(INTENT_GRAB) grabbedby(M) else @@ -427,10 +389,10 @@ return switch(M.a_intent) - if(I_HELP) + if(INTENT_HELP) visible_message("[M] caresses [src] with its scythe like arm.") - if(I_HARM) + if(INTENT_HARM) M.do_attack_animation(src) if(prob(95)) attacked += 10 @@ -450,10 +412,10 @@ visible_message("[M] has attempted to lunge at [name]!", \ "[M] has attempted to lunge at [name]!") - if(I_GRAB) + if(INTENT_GRAB) grabbedby(M) - if(I_DISARM) + if(INTENT_DISARM) M.do_attack_animation(src) playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) var/damage = 5 @@ -473,9 +435,8 @@ if(Discipline == 1) attacked = 0 - spawn() - SStun = 1 - sleep(rand(5,20)) + SStun = 1 + spawn(rand(5,20)) SStun = 0 spawn(0) @@ -494,7 +455,7 @@ /mob/living/carbon/slime/attackby(obj/item/W, mob/user, params) if(stat == DEAD && surgeries.len) - if(user.a_intent == I_HELP) + if(user.a_intent == INTENT_HELP) for(var/datum/surgery/S in surgeries) if(S.next_step(user, src)) return 1 @@ -525,9 +486,8 @@ Target = null anchored = 0 - spawn() - SStun = 1 - sleep(rand(5,20)) + SStun = 1 + spawn(rand(5,20)) SStun = 0 spawn(0) @@ -547,9 +507,8 @@ Discipline++ if(Discipline == 1) attacked = 0 - spawn() - SStun = 1 - sleep(rand(5,20)) + SStun = 1 + spawn(rand(5,20)) SStun = 0 Victim = null diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index ffd1fb9cd60..f506a77ebc9 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -8,7 +8,7 @@ Returns standard 0 if fail */ -/mob/living/proc/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/edge = 0, var/used_weapon = null) +/mob/living/proc/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/used_weapon = null) blocked = (100-blocked)/100 if(!damage || (blocked <= 0)) return 0 switch(damagetype) diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index c5ce705ba17..8a043dbf591 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -3,4 +3,12 @@ clear_fullscreens() update_action_buttons_icon() + + for(var/s in ownedSoullinks) + var/datum/soullink/S = s + S.ownerDies(gibbed, src) + for(var/s in sharedSoullinks) + var/datum/soullink/S = s + S.sharerDies(gibbed, src) + ..(gibbed) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index b85146b8b63..8db2b9f54a2 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -15,20 +15,22 @@ blinded = null if(stat != DEAD) - //Breathing, if applicable - handle_breathing() + //Chemicals in the body + handle_chemicals_in_body() //Mutations and radiation handle_mutations_and_radiation() - //Chemicals in the body - handle_chemicals_in_body() + //Breathing, if applicable + handle_breathing() //Random events (vomiting etc) handle_random_events() . = 1 + handle_diseases() + //Handle temperature/pressure differences between body and environment if(environment) handle_environment(environment) @@ -69,6 +71,9 @@ /mob/living/proc/handle_chemicals_in_body() return +/mob/living/proc/handle_diseases() + return + /mob/living/proc/handle_random_events() return diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 07fd0abf283..08de283a976 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -14,6 +14,121 @@ /mob/living/proc/OpenCraftingMenu() return +//Generic Bump(). Override MobBump() and ObjBump() instead of this. +/mob/living/Bump(atom/A, yes) + if(..()) //we are thrown onto something + return + if(buckled || !yes || now_pushing) + return + if(ismob(A)) + if(MobBump(A)) + return + if(isobj(A)) + if(ObjBump(A)) + return + if(istype(A, /atom/movable)) + if(PushAM(A)) + return + +//Called when we bump into a mob +/mob/living/proc/MobBump(mob/M) + //Even if we don't push/swap places, we "touched" them, so spread fire + spreadFire(M) + + if(now_pushing) + return 1 + + //Should stop you pushing a restrained person out of the way + if(isliving(M)) + var/mob/living/L = M + if(L.pulledby && L.pulledby != src && L.restrained()) + if(!(world.time % 5)) + to_chat(src, "[L] is restrained, you cannot push past.") + return 1 + + if(L.pulling) + if(ismob(L.pulling)) + var/mob/P = L.pulling + if(P.restrained()) + if(!(world.time % 5)) + to_chat(src, "[L] is restrained, you cannot push past.") + return 1 + + if(moving_diagonally) //no mob swap during diagonal moves. + return 1 + + if(!M.buckled && !M.has_buckled_mobs()) + var/mob_swap + //the puller can always swap with it's victim if on grab intent + if(M.pulledby == src && a_intent == INTENT_GRAB) + mob_swap = 1 + //restrained people act if they were on 'help' intent to prevent a person being pulled from being seperated from their puller + else if((M.restrained() || M.a_intent == INTENT_HELP) && (restrained() || a_intent == INTENT_HELP)) + mob_swap = 1 + if(mob_swap) + //switch our position with M + if(loc && !loc.Adjacent(M.loc)) + return 1 + now_pushing = 1 + var/oldloc = loc + var/oldMloc = M.loc + + var/M_passmob = (M.pass_flags & PASSMOB) // we give PASSMOB to both mobs to avoid bumping other mobs during swap. + var/src_passmob = (pass_flags & PASSMOB) + M.pass_flags |= PASSMOB + pass_flags |= PASSMOB + + M.Move(oldloc) + Move(oldMloc) + + if(!src_passmob) + pass_flags &= ~PASSMOB + if(!M_passmob) + M.pass_flags &= ~PASSMOB + + now_pushing = 0 + return 1 + + // okay, so we didn't switch. but should we push? + // not if he's not CANPUSH of course + if(!(M.status_flags & CANPUSH)) + return 1 + //anti-riot equipment is also anti-push + if(M.r_hand && (prob(M.r_hand.block_chance * 2)) && !istype(M.r_hand, /obj/item/clothing)) + return 1 + if(M.l_hand && (prob(M.l_hand.block_chance * 2)) && !istype(M.l_hand, /obj/item/clothing)) + return 1 + +//Called when we bump into an obj +/mob/living/proc/ObjBump(obj/O) + return + +//Called when we want to push an atom/movable +/mob/living/proc/PushAM(atom/movable/AM) + if(now_pushing) + return 1 + if(moving_diagonally) // no pushing during diagonal moves + return 1 + if(!client && (mob_size < MOB_SIZE_SMALL)) + return + if(!AM.anchored) + now_pushing = 1 + var/t = get_dir(src, AM) + if(istype(AM, /obj/structure/window/full)) + for(var/obj/structure/window/win in get_step(AM, t)) + now_pushing = 0 + return + if(pulling == AM) + stop_pulling() + var/current_dir + if(isliving(AM)) + current_dir = AM.dir + step(AM, t) + if(current_dir) + AM.setDir(current_dir) + now_pushing = 0 + + /mob/living/Stat() . = ..() if(. && get_rig_stats) @@ -59,6 +174,15 @@ return 0 if(!..()) return 0 + var/obj/item/hand_item = get_active_hand() + if(istype(hand_item, /obj/item/weapon/gun) && A != hand_item) + if(a_intent == INTENT_HELP || !ismob(A)) + visible_message("[src] points to [A] with [hand_item]") + return 1 + A.visible_message("[src] points [hand_item] at [A]!", + "[src] points [hand_item] at you!") + A << 'sound/weapons/TargetOn.ogg' + return 1 visible_message("[src] points to [A]") return 1 @@ -377,17 +501,19 @@ if(iscarbon(src)) var/mob/living/carbon/C = src C.handcuffed = initial(C.handcuffed) - C.heart_attack = 0 - for(var/datum/disease/D in C.viruses) + for(var/thing in C.viruses) + var/datum/disease/D = thing D.cure(0) // restore all of the human's blood and reset their shock stage if(ishuman(src)) human_mob = src + human_mob.set_heartattack(FALSE) human_mob.restore_blood() human_mob.shock_stage = 0 human_mob.decaylevel = 0 + human_mob.remove_all_embedded_objects() restore_all_organs() surgeries.Cut() //End all surgeries. @@ -399,6 +525,7 @@ stat = CONSCIOUS update_fire() regenerate_icons() + restore_blood() if(human_mob) human_mob.update_eyes() human_mob.update_dna() @@ -430,88 +557,101 @@ else return 0 + var/atom/movable/pullee = pulling + if(pullee && get_dist(src, pullee) > 1) + stop_pulling() + if(pullee && !isturf(pullee.loc) && pullee.loc != loc) + log_game("DEBUG: [src]'s pull on [pullee] was broken despite [pullee] being in [pullee.loc]. Pull stopped manually.") + stop_pulling() if(restrained()) stop_pulling() - - var/t7 = 1 - if(restrained()) - for(var/mob/living/M in range(src, 1)) - 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(!( isturf(pulling.loc) )) - stop_pulling() - return - else - if(Debug) - diary <<"pulling disappeared? at [__LINE__] in mob.dm - pulling = [pulling]" - diary <<"REPORT THIS" - - ///// - if(pulling && pulling.anchored) - stop_pulling() - return - - if(!restrained()) - var/diag = get_dir(src, pulling) - if((diag - 1) & diag) - else - diag = null - if((get_dist(src, pulling) > 1 || diag)) - if(isliving(pulling)) - var/mob/living/M = pulling - var/ok = 1 - 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)) - for(var/mob/O in viewers(M, null)) - O.show_message(text("[] 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)) - ok = 0 - if(ok) - var/atom/movable/t = M.pulling - M.stop_pulling() - - if(M.lying && (prob(M.getBruteLoss() / 6))) - var/turf/location = M.loc - 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) - 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. - s_active.close(src) - - if(.) // did we actually move? + var/turf/T = loc + . = ..() + if(.) handle_footstep(loc) step_count++ + if(pulling && pulling == pullee) // we were pulling a thing and didn't lose it during our move. + if(pulling.anchored) + stop_pulling() + return + + var/pull_dir = get_dir(src, pulling) + if(get_dist(src, pulling) > 1 || ((pull_dir - 1) & pull_dir)) // puller and pullee more than one tile away or in diagonal position + if(isliving(pulling)) + var/mob/living/M = pulling + if(M.lying && !M.buckled && (prob(M.getBruteLoss() * 200 / M.maxHealth))) + M.makeTrail(T) + pulling.Move(T, get_dir(pulling, T)) // the pullee tries to reach our previous position + if(pulling && get_dist(src, pulling) > 1) // the pullee couldn't keep up + stop_pulling() + + if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1) //seperated from our puller and not in the middle of a diagonal move + pulledby.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. + s_active.close(src) + if(update_slimes) for(var/mob/living/carbon/slime/M in view(1,src)) M.UpdateFeed(src) + /mob/living/proc/handle_footstep(turf/T) if(istype(T)) return 1 return 0 +/mob/living/proc/makeTrail(turf/T) + if(!has_gravity(src)) + return + var/blood_exists = 0 + + for(var/obj/effect/decal/cleanable/trail_holder/C in loc) //checks for blood splatter already on the floor + blood_exists = 1 + if(isturf(loc)) + var/trail_type = getTrail() + if(trail_type) + var/brute_ratio = round(getBruteLoss()/maxHealth, 0.1) + if(blood_volume && blood_volume > max(BLOOD_VOLUME_NORMAL*(1 - brute_ratio * 0.25), 0))//don't leave trail if blood volume below a threshold + blood_volume = max(blood_volume - max(1, brute_ratio * 2), 0) //that depends on our brute damage. + var/newdir = get_dir(T, loc) + if(newdir != src.dir) + newdir = newdir | dir + if(newdir == 3) //N + S + newdir = NORTH + else if(newdir == 12) //E + W + newdir = EAST + if((newdir in cardinal) && (prob(50))) + newdir = turn(get_dir(T, loc), 180) + if(!blood_exists) + new /obj/effect/decal/cleanable/trail_holder(loc) + for(var/obj/effect/decal/cleanable/trail_holder/TH in loc) + if((!(newdir in TH.existing_dirs) || trail_type == "trails_1" || trail_type == "trails_2") && TH.existing_dirs.len <= 16) //maximum amount of overlays is 16 (all light & heavy directions filled) + TH.existing_dirs += newdir + TH.overlays.Add(image('icons/effects/blood.dmi', trail_type, dir = newdir)) + TH.transfer_mob_blood_dna(src) + if(ishuman(src)) + var/mob/living/carbon/human/H = src + if(H.species.blood_color) + TH.color = H.species.blood_color + else + TH.color = "#A10808" + +/mob/living/carbon/human/makeTrail(turf/T) + + if((species.flags & NO_BLOOD) || species.exotic_blood || !bleed_rate || bleedsuppress) + return + ..() + +/mob/living/proc/getTrail() + if(getBruteLoss() < 300) + return pick("ltrails_1", "ltrails_2") + else + return pick("trails_1", "trails_2") + + /*////////////////////// START RESIST PROCS */////////////////////// @@ -838,13 +978,24 @@ visible_message("[user] butchers [src].") gib() -/mob/living/movement_delay() - var/tally = 0 - +/mob/living/movement_delay(ignorewalk = 0) + . = ..() + if(isturf(loc)) + var/turf/T = loc + . += T.slowdown if(slowed) - tally += 10 + . += 10 + if(ignorewalk) + . += config.run_speed + else + switch(m_intent) + if(MOVE_INTENT_RUN) + if(drowsyness > 0) + . += 6 + . += config.run_speed + if(MOVE_INTENT_WALK) + . += config.walk_speed - return tally /mob/living/proc/can_use_guns(var/obj/item/weapon/gun/G) if(G.trigger_guard != TRIGGER_GUARD_ALLOW_ALL && !IsAdvancedToolUser() && !issmall(src)) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index bdca022648e..fc9d5823602 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -41,18 +41,12 @@ /mob/living/bullet_act(var/obj/item/projectile/P, var/def_zone) //Armor 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))) - proj_sharp = 0 - proj_edge = 0 - if(!P.nodamage) apply_damage(P.damage, P.damage_type, def_zone, armor) if(P.dismemberment) check_projectile_dismemberment(P, def_zone) return P.on_hit(src, armor, def_zone) - + /mob/living/proc/check_projectile_dismemberment(obj/item/projectile/P, def_zone) return 0 @@ -65,63 +59,50 @@ O.emp_act(severity) ..() +/obj/item/proc/get_volume_by_throwforce_and_or_w_class() + if(throwforce && w_class) + return Clamp((throwforce + w_class) * 5, 30, 100)// Add the item's throwforce to its weight class and multiply by 5, then clamp the value between 30 and 100 + else if(w_class) + return Clamp(w_class * 8, 20, 100) // Multiply the item's weight class by 8, then clamp the value between 20 and 100 + else + return 0 + //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 +/mob/living/hitby(atom/movable/AM, skipcatch, hitpush = 1, blocked = 0)//Standardization and logging -Sieve 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 + var/volume = I.get_volume_by_throwforce_and_or_w_class() if(istype(I, /obj/item/weapon)) var/obj/item/weapon/W = I dtype = W.damtype - if(W.hitsound && W.throwforce > 0) - playsound(loc, W.hitsound, 30, 1, -1) + if(W.throwforce > 0) //If the weapon's throwforce is greater than zero... + if(W.hitsound) //...and hitsound is defined... + playsound(loc, W.hitsound, volume, 1, -1) //...play the weapon's hitsound. + else //Otherwise, if hitsound isn't defined... + playsound(loc, 'sound/weapons/genhit1.ogg', volume, 1, -1) //...play genhit1.ogg. - //run to-hit check here + else if(I.throwforce > 0) //Otherwise, if the item doesn't have a throwhitsound and has a throwforce greater than zero... + playsound(loc, 'sound/weapons/genhit1.ogg', volume, 1, -1)//...play genhit1.ogg + if(!I.throwforce)// Otherwise, if the item's throwforce is 0... + playsound(loc, 'sound/weapons/throwtap.ogg', 1, volume, -1)//...play throwtap.ogg. + if(!blocked) + visible_message("[src] has been hit by [I].", + "[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(I.throwforce, dtype, zone, armor, is_sharp(I), I) + if(I.thrownby) + add_logs(I.thrownby, src, "hit", I) + else + return 1 + else + playsound(loc, 'sound/weapons/genhit1.ogg', 50, 1, -1) //...play genhit1.ogg.) + ..() - var/throw_damage = I.throwforce*(speed/5) - - src.visible_message("[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(I), has_edge(I), I) - - I.throwing = 0 //it hit, so stop moving - - if(ismob(I.thrower)) - var/mob/M = I.thrower - if(M) - create_attack_log("Has been hit with a [I], thrown by [key_name(M)]") - M.create_attack_log("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 [I], thrown by [key_name_admin(M)]") - - // Begin BS12 momentum-transfer code. - if(I.throw_source && speed >= 15) - var/obj/item/weapon/W = I - var/momentum = speed/2 - var/dir = get_dir(I.throw_source, src) - - visible_message("[src] staggers under the impact!","You stagger under the impact!") - src.throw_at(get_edge_target_turf(src,dir),1,momentum) - - if(!W || !src) return - - if(W.sharp) //Projectile is suitable for pinning. - //Handles embedding for non-humans and simple_animals. - 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 [I]!","You are pinned to the wall by [I]!") - src.anchored = 1 - src.pinned += I /mob/living/mech_melee_attack(obj/mecha/M) - if(M.occupant.a_intent == I_HARM) + if(M.occupant.a_intent == INTENT_HARM) if(M.damtype == "brute") step_away(src,M,15) switch(M.damtype) @@ -201,6 +182,24 @@ adjust_fire_stacks(3) IgniteMob() +//Share fire evenly between the two mobs +//Called in MobBump() and Crossed() +/mob/living/proc/spreadFire(mob/living/L) + if(!istype(L)) + return + var/L_old_on_fire = L.on_fire + + if(on_fire) //Only spread fire stacks if we're on fire + fire_stacks /= 2 + L.fire_stacks += fire_stacks + if(L.IgniteMob()) + log_game("[key_name(src)] bumped into [key_name(L)] and set them on fire") + + if(L_old_on_fire) //Only ignite us and gain their stacks if they were onfire before we bumped them + L.fire_stacks /= 2 + fire_stacks += L.fire_stacks + IgniteMob() + //Mobs on Fire end /mob/living/water_act(volume, temperature) @@ -261,6 +260,8 @@ if(!supress_message) visible_message("[user] has grabbed [src] passively!") + return G + /mob/living/incapacitated() if(stat || paralysis || stunned || weakened || restrained()) return 1 diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 52a0f2f74ad..c120742f7c0 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -61,3 +61,4 @@ var/list/say_log = list() //a log of what we've said, plain text, no spans or junk, essentially just each individual "message" var/list/recent_tastes = list() + var/blood_volume = 0 //how much blood the mob has diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 06021939ac9..84f731d3669 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -677,7 +677,7 @@ var/list/ai_verbs_default = list( switch(M.a_intent) - if(I_HELP) + if(INTENT_HELP) visible_message("[M] caresses [src]'s plating with its scythe like arm.") else //harm diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index ccd0f652b68..39af8059e8b 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -55,7 +55,7 @@ if(mob_to_track) track = "[speaker_name] ([jobname])" - track += "\[OPEN\]" + track += "\[O\]" return track diff --git a/code/modules/mob/living/silicon/death.dm b/code/modules/mob/living/silicon/death.dm index 6dc6ae21c46..b5c658c6c62 100644 --- a/code/modules/mob/living/silicon/death.dm +++ b/code/modules/mob/living/silicon/death.dm @@ -14,7 +14,7 @@ playsound(src.loc, 'sound/goonstation/effects/robogib.ogg', 50, 1) // flick("gibbed-r", animation) - robogibs(loc, viruses) + robogibs(loc) dead_mob_list -= src spawn(15) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 5218d399007..3637b0e10b1 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -82,6 +82,7 @@ var/current_pda_messaging = null var/custom_sprite = 0 + var/slowdown = 0 /mob/living/silicon/pai/New(var/obj/item/device/paicard) loc = paicard @@ -117,6 +118,12 @@ C.toff = 1 ..() +/mob/living/silicon/pai/movement_delay() + . = ..() + . += slowdown + . += 1 //A bit slower than humans, so they're easier to smash + . += config.robot_delay + /mob/living/silicon/pai/update_icons() if(stat == DEAD) icon_state = "[chassis]_dead" @@ -239,7 +246,7 @@ switch(M.a_intent) - if(I_HELP) + if(INTENT_HELP) for(var/mob/O in viewers(src, null)) if((O.client && !( O.blinded ))) O.show_message(text("[M] caresses [src]'s casing with its scythe like arm."), 1) @@ -501,7 +508,7 @@ /mob/living/silicon/pai/attack_hand(mob/user as mob) if(stat == DEAD) return - if(user.a_intent == I_HELP) + if(user.a_intent == INTENT_HELP) user.visible_message("[user] pets [src].") playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) else @@ -539,10 +546,10 @@ card.forceMove(card.loc) icon_state = "[chassis]" -/mob/living/silicon/pai/Bump(atom/movable/AM as mob|obj, yes) +/mob/living/silicon/pai/Bump() return -/mob/living/silicon/pai/Bumped(AM as mob|obj) +/mob/living/silicon/pai/Bumped() return /mob/living/silicon/pai/start_pulling(var/atom/movable/AM) diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index d399db99515..1c514a891ca 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -34,13 +34,15 @@ installed = -1 uninstall() -/datum/robot_component/proc/take_damage(brute, electronics, sharp, edge) - if(installed != 1) return +/datum/robot_component/proc/take_damage(brute, electronics, sharp) + if(installed != 1) + return brute_damage += brute electronics_damage += electronics - if(brute_damage + electronics_damage >= max_damage) destroy() + if(brute_damage + electronics_damage >= max_damage) + destroy() /datum/robot_component/proc/heal_damage(brute, electronics) if(installed != 1) @@ -171,7 +173,7 @@ flags = CONDUCT slot_flags = SLOT_BELT throwforce = 3 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL throw_speed = 5 throw_range = 10 origin_tech = "magnets=1;biotech=1" diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm index 4b7d0a04a27..99b79d35360 100644 --- a/code/modules/mob/living/silicon/robot/death.dm +++ b/code/modules/mob/living/silicon/robot/death.dm @@ -14,7 +14,7 @@ playsound(src.loc, 'sound/goonstation/effects/robogib.ogg', 50, 1) flick("gibbed-r", animation) - robogibs(loc, viruses) + robogibs(loc) living_mob_list -= src dead_mob_list -= src diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 4c52f2f415d..282f97c4dc4 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -310,18 +310,15 @@ */ -/mob/living/silicon/robot/drone/Bump(atom/movable/AM as mob|obj, yes) - if(!yes || ( \ - !istype(AM,/obj/machinery/door) && \ - !istype(AM,/obj/machinery/recharge_station) && \ - !istype(AM,/obj/machinery/disposal/deliveryChute) && \ - !istype(AM,/obj/machinery/teleport/hub) && \ - !istype(AM,/obj/effect/portal) - )) return - ..() - return +/mob/living/silicon/robot/drone/Bump(atom/movable/AM, yes) + if(istype(AM, /obj/machinery/door) \ + || istype(AM, /obj/machinery/recharge_station) \ + || istype(AM, /obj/machinery/disposal/deliveryChute) \ + || istype(AM, /obj/machinery/teleport/hub) \ + || istype(AM, /obj/effect/portal)) + return ..() -/mob/living/silicon/robot/drone/Bumped(AM as mob|obj) +/mob/living/silicon/robot/drone/Bumped(atom/movable/AM) return /mob/living/silicon/robot/drone/start_pulling(var/atom/movable/AM) @@ -330,7 +327,7 @@ ..() else if(istype(AM,/obj/item)) var/obj/item/O = AM - if(O.w_class > 2) + if(O.w_class > WEIGHT_CLASS_SMALL) to_chat(src, "You are too small to pull that.") return else 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 f9c711b4b17..ba4c616b2f3 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm @@ -44,7 +44,7 @@ //Actual picking-up event. /mob/living/silicon/robot/drone/attack_hand(mob/living/carbon/human/M as mob) - if(M.a_intent == I_HELP) + if(M.a_intent == INTENT_HELP) get_scooped(M) ..() 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 056a65a8e66..5228803bd9d 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_console.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_console.dm @@ -53,7 +53,7 @@ if(..()) return - if(!allowed(usr)) + if(!allowed(usr) && !usr.can_admin_interact()) to_chat(usr, "Access denied.") 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 7148f780ff3..3454a6597ab 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -15,7 +15,9 @@ /obj/item/weapon/firelock_electronics, /obj/item/weapon/intercom_electronics, /obj/item/weapon/apc_electronics, + /obj/item/weapon/tracker_electronics, /obj/item/weapon/stock_parts, + /obj/item/weapon/vending_refill, /obj/item/mounted/frame/light_fixture, /obj/item/mounted/frame/apc_frame, /obj/item/mounted/frame/alarm_frame, @@ -258,10 +260,6 @@ stored_comms["glass"]++ else if(istype(W,/obj/item/ammo_casing)) stored_comms["metal"]++ - else if(istype(W,/obj/item/weapon/shard/shrapnel)) - stored_comms["metal"]++ - stored_comms["metal"]++ - stored_comms["metal"]++ else if(istype(W,/obj/item/weapon/shard)) stored_comms["glass"]++ stored_comms["glass"]++ 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 187a32633b6..767a78e1f77 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm @@ -108,6 +108,12 @@ to_chat(usr, "This role is not yet available to you. You need to wait another [player_age_check] days.") return + var/pt_req = role_available_in_playtime(client, ROLE_DRONE) + if(pt_req) + var/pt_req_string = get_exp_format(pt_req) + to_chat(usr, "This role is not yet available to you. Play another [pt_req_string] to unlock it.") + return + var/deathtime = world.time - src.timeofdeath var/joinedasobserver = 0 if(istype(src,/mob/dead/observer)) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 8ab82e7d9ca..3de8b868430 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -552,38 +552,6 @@ var/list/robot_verbs_default = list( return 2 -/mob/living/silicon/robot/Bump(atom/movable/AM as mob|obj, yes) - spawn( 0 ) - if((!( yes ) || now_pushing)) - return - now_pushing = 1 - if(ismob(AM)) - var/mob/tmob = AM - if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations)) - if(prob(20)) - to_chat(usr, "You fail to push [tmob]'s fat ass out of the way.") - now_pushing = 0 - return - if(!(tmob.status_flags & CANPUSH)) - now_pushing = 0 - return - now_pushing = 0 - ..() - if(!istype(AM, /atom/movable)) - return - if(!now_pushing) - now_pushing = 1 - if(!AM.anchored) - var/t = get_dir(src, AM) - if(istype(AM, /obj/structure/window/full)) - for(var/obj/structure/window/win in get_step(AM,t)) - now_pushing = 0 - return - step(AM, t) - now_pushing = null - return - 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 return @@ -607,7 +575,7 @@ 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 == INTENT_HELP) if(W == module_active) return if(!getBruteLoss()) @@ -626,7 +594,7 @@ var/list/robot_verbs_default = list( return - else if(istype(W, /obj/item/stack/cable_coil) && user.a_intent == I_HELP && (wiresexposed || istype(src,/mob/living/silicon/robot/drone))) + else if(istype(W, /obj/item/stack/cable_coil) && user.a_intent == INTENT_HELP && (wiresexposed || istype(src,/mob/living/silicon/robot/drone))) if(!getFireLoss()) to_chat(user, "Nothing to fix!") return @@ -850,15 +818,15 @@ var/list/robot_verbs_default = list( switch(M.a_intent) - if(I_HELP) + if(INTENT_HELP) for(var/mob/O in viewers(src, null)) if((O.client && !( O.blinded ))) O.show_message(text("[M] caresses [src]'s plating with its scythe like arm."), 1) - if(I_GRAB) + if(INTENT_GRAB) grabbedby(M) - if(I_HARM) + if(INTENT_HARM) M.do_attack_animation(src) var/damage = rand(10, 20) if(prob(90)) @@ -874,7 +842,7 @@ var/list/robot_verbs_default = list( visible_message("[M] took a swipe at [src]!", \ "[M] took a swipe at [src]!") - if(I_DISARM) + if(INTENT_DISARM) if(!(lying)) M.do_attack_animation(src) if(prob(85)) @@ -955,7 +923,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 == INTENT_HELP) user.visible_message("[user] pets [src]!", \ "You pet [src]!") @@ -1237,13 +1205,11 @@ var/list/robot_verbs_default = list( canmove = 1 scrambledcodes = 1 //Disconnect it's camera so it's not so easily tracked. - if(src.camera) - qdel(src.camera) - src.camera = null - // I'm trying to get the Cyborg to not be listed in the camera list - // Instead of being listed as "deactivated". The downside is that I'm going - // to have to check if every camera is null or not before doing anything, to prevent runtime errors. - // I could change the network to null but I don't know what would happen, and it seems too hacky for me. + QDEL_NULL(src.camera) + // I'm trying to get the Cyborg to not be listed in the camera list + // Instead of being listed as "deactivated". The downside is that I'm going + // to have to check if every camera is null or not before doing anything, to prevent runtime errors. + // I could change the network to null but I don't know what would happen, and it seems too hacky for me. /mob/living/silicon/robot/proc/ResetSecurityCodes() set category = "Robot Commands" diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm index 780a622906a..f84696c9964 100644 --- a/code/modules/mob/living/silicon/robot/robot_damage.dm +++ b/code/modules/mob/living/silicon/robot/robot_damage.dm @@ -98,11 +98,11 @@ var/datum/robot_component/armour/A = get_armour() if(A) - A.take_damage(brute,burn,sharp,edge) + A.take_damage(brute, burn, sharp) return var/datum/robot_component/C = pick(components) - C.take_damage(brute,burn,sharp,edge) + C.take_damage(brute, burn, sharp) /mob/living/silicon/robot/heal_overall_damage(var/brute, var/burn) var/list/datum/robot_component/parts = get_damaged_components(brute,burn) @@ -149,7 +149,7 @@ var/datum/robot_component/armour/A = get_armour() if(A) - A.take_damage(brute,burn,sharp) + A.take_damage(brute, burn, sharp) return while(parts.len && (brute>0 || burn>0) ) @@ -158,7 +158,7 @@ var/brute_was = picked.brute_damage var/burn_was = picked.electronics_damage - picked.take_damage(brute,burn) + picked.take_damage(brute, burn) brute -= (picked.brute_damage - brute_was) burn -= (picked.electronics_damage - burn_was) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 31b4c826e9d..4d5ea6b983d 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -255,8 +255,9 @@ modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src) modules += new /obj/item/weapon/pen(src) modules += new /obj/item/weapon/razor(src) - modules += new /obj/item/device/violin(src) - modules += new /obj/item/device/guitar(src) + modules += new /obj/item/device/instrument/violin(src) + modules += new /obj/item/device/instrument/guitar(src) + modules += new /obj/item/device/instrument/eguitar(src) var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src) M.matter = 30 diff --git a/code/modules/mob/living/silicon/robot/robot_movement.dm b/code/modules/mob/living/silicon/robot/robot_movement.dm index ff28a93a64e..e896e7c9473 100644 --- a/code/modules/mob/living/silicon/robot/robot_movement.dm +++ b/code/modules/mob/living/silicon/robot/robot_movement.dm @@ -1,30 +1,24 @@ -/mob/living/silicon/robot/Process_Spacemove(var/movement_dir = 0) - 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. -/mob/living/silicon/robot/movement_delay() - var/tally = 0 //Incase I need to add stuff other than "speed" later - - tally = speed - - if(module_active && istype(module_active,/obj/item/borg/combat/mobility)) - tally-=3 - - return tally+config.robot_delay - -/mob/living/silicon/robot/Move() - ..() - -/mob/living/silicon/robot/mob_negates_gravity() - return magpulse - -/mob/living/silicon/robot/mob_has_gravity() - return ..() || mob_negates_gravity() - -/mob/living/silicon/robot/experience_pressure_difference(pressure_difference, direction) - if(!magpulse) +/mob/living/silicon/robot/Process_Spacemove(var/movement_dir = 0) + 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. +/mob/living/silicon/robot/movement_delay() + . = ..() + . += speed + if(module_active && istype(module_active,/obj/item/borg/combat/mobility)) + . -= 3 + . += config.robot_delay + +/mob/living/silicon/robot/mob_negates_gravity() + return magpulse + +/mob/living/silicon/robot/mob_has_gravity() + return ..() || mob_negates_gravity() + +/mob/living/silicon/robot/experience_pressure_difference(pressure_difference, direction) + if(!magpulse) return ..() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index d7435fdff5a..16b81582faa 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -195,31 +195,6 @@ src << browse(dat, "window=airoster") 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)) - return - now_pushing = 1 - if(ismob(AM)) - var/mob/tmob = AM - if(!(tmob.status_flags & CANPUSH)) - now_pushing = 0 - return - now_pushing = 0 - ..() - if(!istype(AM, /atom/movable)) - return - if(!now_pushing) - now_pushing = 1 - if(!AM.anchored) - var/t = get_dir(src, AM) - 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 - return - step(AM, t) - now_pushing = null - /mob/living/silicon/assess_threat() //Secbots won't hunt silicon units return -10 diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 063fc07badf..899608d0f1a 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -256,7 +256,7 @@ new /obj/effect/decal/cleanable/blood/oil(loc) /mob/living/simple_animal/bot/attack_hand(mob/living/carbon/human/H) - if(H.a_intent == "help") + if(H.a_intent == INTENT_HELP) interact(H) else return ..() @@ -329,7 +329,7 @@ ejectpai(user) else user.changeNext_move(CLICK_CD_MELEE) - if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm") + if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != INTENT_HARM) if(health >= maxHealth) to_chat(user, "[src] does not need a repair!") return diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index f9f1bbf1c08..a71fbe2ae03 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -167,9 +167,8 @@ mode = BOT_CLEANING spawn(50) if(mode == BOT_CLEANING) - qdel(target) + QDEL_NULL(target) anchored = 0 - target = null mode = BOT_IDLE icon_state = "cleanbot[on]" @@ -222,4 +221,4 @@ text("[on ? "On" : "Off"]")) if(istype(A,/obj/effect/decal/cleanable)) clean(A) else - ..() \ No newline at end of file + ..() diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index d524ffd8e06..a7d297d0bdc 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -10,7 +10,7 @@ throwforce = 5 throw_speed = 2 throw_range = 5 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL var/created_name = "Cleanbot" /obj/item/weapon/bucket_sensor/attackby(obj/item/W, mob/user as mob, params) @@ -204,7 +204,7 @@ throwforce = 10 throw_speed = 2 throw_range = 5 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL var/created_name = "Floorbot" /obj/item/weapon/toolbox_tiles_sensor @@ -216,7 +216,7 @@ throwforce = 10 throw_speed = 2 throw_range = 5 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL var/created_name = "Floorbot" /obj/item/weapon/storage/toolbox/mechanical/attackby(obj/item/stack/tile/plasteel/T, mob/user, params) @@ -286,7 +286,7 @@ var/build_step = 0 var/created_name = "Medibot" //To preserve the name if it's a unique medbot I guess var/skin = null //Same as medbot, set to tox or ointment for the respective kits. - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL var/treatment_brute = "salglu_solution" var/treatment_oxy = "salbutamol" var/treatment_fire = "salglu_solution" @@ -478,4 +478,4 @@ overlays -= "hs_arm" new /obj/item/robot_parts/l_arm(get_turf(src)) to_chat(user, "You remove the robot arm from [src].") - build_step-- \ No newline at end of file + build_step-- diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index 8a160d25c4f..37699e820f2 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -161,13 +161,13 @@ Auto Patrol[]"}, mode = BOT_HUNT /mob/living/simple_animal/bot/ed209/attack_hand(mob/living/carbon/human/H) - if(H.a_intent == "harm") + if(H.a_intent == INTENT_HARM) retaliate(H) return ..() /mob/living/simple_animal/bot/ed209/attackby(obj/item/weapon/W, mob/user, params) ..() - if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm") // Any intent but harm will heal, so we shouldn't get angry. + if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != INTENT_HARM) // Any intent but harm will heal, so we shouldn't get angry. return if(!istype(W, /obj/item/weapon/screwdriver) && (!target)) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass. if(W.force && W.damtype != STAMINA)//If force is non-zero and damage type isn't stamina. diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index 50475fe45db..2d863b99b4a 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -398,7 +398,8 @@ return 1 if(treat_virus) - for(var/datum/disease/D in C.viruses) + for(var/thing in C.viruses) + var/datum/disease/D = thing //the medibot can't detect viruses that are undetectable to Health Analyzers or Pandemic machines. if(D.visibility_flags & HIDDEN_SCANNER || D.visibility_flags & HIDDEN_PANDEMIC) return 0 @@ -451,7 +452,8 @@ else if(treat_virus) var/virus = 0 - for(var/datum/disease/D in C.viruses) + for(var/thing in C.viruses) + var/datum/disease/D = thing //detectable virus if((!(D.visibility_flags & HIDDEN_SCANNER)) || (!(D.visibility_flags & HIDDEN_PANDEMIC))) if(D.severity != NONTHREAT) //virus is harmful diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index e95d2409921..a38e97b170b 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -18,7 +18,7 @@ health = 50 maxHealth = 50 damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) - a_intent = "harm" //No swapping + a_intent = INTENT_HARM //No swapping buckle_lying = 0 mob_size = MOB_SIZE_LARGE radio_channel = "Supply" @@ -568,23 +568,6 @@ mode = BOT_NO_ROUTE -/mob/living/simple_animal/bot/mulebot/Move(turf/simulated/next) - var/turf/simulated/last = loc - - if(istype(last) && bloodiness) - last.AddTracks(/obj/effect/decal/cleanable/blood/tracks/wheels, currentDNA, 0, get_dir(last, next), currentBloodColor) - - . = ..() - - if(. && istype(next)) - if(bloodiness) - next.AddTracks(/obj/effect/decal/cleanable/blood/tracks/wheels, currentDNA, get_dir(last, next), 0, currentBloodColor) - bloodiness-- - - for(var/mob/living/carbon/human/H in next) - if(H != load) - RunOver(H) - // calculates a path to the current destination // given an optional turf to avoid /mob/living/simple_animal/bot/mulebot/calc_path(turf/avoid = null) @@ -668,6 +651,30 @@ return +/mob/living/simple_animal/bot/mulebot/Move(turf/simulated/next) + . = ..() + + if(. && istype(next)) + if(bloodiness) + var/obj/effect/decal/cleanable/blood/tracks/B = locate() in next + if(!B) + B = new /obj/effect/decal/cleanable/blood/tracks(loc) + if(blood_DNA && blood_DNA.len) + B.blood_DNA |= blood_DNA.Copy() + B.basecolor = currentBloodColor + var/newdir = get_dir(next, loc) + if(newdir == dir) + B.setDir(newdir) + else + newdir = newdir | dir + if(newdir == 3) + newdir = 1 + else if(newdir == 12) + newdir = 4 + B.setDir(newdir) + B.update_icon() + bloodiness-- + // called when bot bumps into anything /mob/living/simple_animal/bot/mulebot/Bump(atom/obs) if(!wires.MobAvoid()) // usually just bumps, but if avoidance disabled knock over mobs @@ -697,21 +704,18 @@ H.apply_damage(0.5*damage, BRUTE, "l_arm", run_armor_check("l_arm", "melee")) H.apply_damage(0.5*damage, BRUTE, "r_arm", run_armor_check("r_arm", "melee")) - var/obj/effect/decal/cleanable/blood/B = new(loc) - B.blood_DNA = list() - B.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type - currentDNA = B.blood_DNA + + var/turf/T = get_turf(src) + H.add_mob_blood(H) + H.add_splatter_floor(T) bloodiness += 4 - currentBloodColor = "#A10808" - if(istype(H)) - var/datum/reagent/blood/bld = H.get_blood(H.vessel) - if(bld.data["blood_colour"]) - currentBloodColor = bld.data["blood_colour"] - return - B.basecolor = currentBloodColor - B.update_icon() + var/list/blood_dna = H.get_blood_dna_list() + if(blood_dna) + transfer_blood_dna(blood_dna) + currentBloodColor = H.species.blood_color + return /mob/living/simple_animal/bot/mulebot/bot_control_message(command, mob/user, user_turf) switch(command) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index de09cc11084..46a8ec12f76 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -173,13 +173,13 @@ Auto Patrol: []"}, mode = BOT_HUNT /mob/living/simple_animal/bot/secbot/attack_hand(mob/living/carbon/human/H) - if(H.a_intent == "harm") + if(H.a_intent == INTENT_HARM) retaliate(H) return ..() /mob/living/simple_animal/bot/secbot/attackby(obj/item/weapon/W, mob/user, params) ..() - if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm") // Any intent but harm will heal, so we shouldn't get angry. + if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != INTENT_HARM) // Any intent but harm will heal, so we shouldn't get angry. return if(!istype(W, /obj/item/weapon/screwdriver) && (W.force) && (!target) && (W.damtype != STAMINA) ) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass. retaliate(user) @@ -218,8 +218,8 @@ Auto Patrol: []"}, /mob/living/simple_animal/bot/secbot/hitby(atom/movable/AM, skipcatch = 0, hitpush = 1, blocked = 0) if(istype(AM, /obj/item)) var/obj/item/I = AM - if(I.throwforce < src.health && I.thrower && (istype(I.thrower, /mob/living/carbon/human))) - var/mob/living/carbon/human/H = I.thrower + if(I.throwforce < src.health && I.thrownby && ishuman(I.thrownby)) + var/mob/living/carbon/human/H = I.thrownby retaliate(H) ..() diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 54cf810a081..7c7a31b5ef0 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -10,7 +10,7 @@ response_harm = "punches" icon_dead = "shade_dead" speed = 0 - a_intent = I_HARM + a_intent = INTENT_HARM stop_automated_movement = 1 status_flags = CANPUSH attack_sound = 'sound/weapons/punch1.ogg' @@ -302,7 +302,6 @@ melee_damage_lower = 1 melee_damage_upper = 5 attacktext = "prods" - speed = 0 environment_smash = 3 see_in_dark = 8 attack_sound = 'sound/weapons/tap.ogg' diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 95a1d100161..5f977bfd508 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -37,12 +37,85 @@ icon_resting = "cat_rest" gender = FEMALE gold_core_spawnable = CHEM_MOB_SPAWN_INVALID + var/list/family = list() + var/memory_saved = 0 + var/list/children = list() //Actual mob instances of children + var/cats_deployed = 0 + +/mob/living/simple_animal/pet/cat/Runtime/New() + Read_Memory() + ..() + +/mob/living/simple_animal/pet/cat/Runtime/Life() + if(!cats_deployed && ticker.current_state >= GAME_STATE_SETTING_UP) + Deploy_The_Cats() + if(!stat && ticker.current_state == GAME_STATE_FINISHED && !memory_saved) + Write_Memory() + ..() + +/mob/living/simple_animal/pet/cat/Runtime/make_babies() + var/mob/baby = ..() + if(baby) + children += baby + return baby + +/mob/living/simple_animal/pet/cat/Runtime/death() + if(!memory_saved) + Write_Memory(1) + ..() + +/mob/living/simple_animal/pet/cat/Runtime/proc/Read_Memory() + var/savefile/S = new /savefile("data/npc_saves/Runtime.sav") + S["family"] >> family + + if(isnull(family)) + family = list() + +/mob/living/simple_animal/pet/cat/Runtime/proc/Write_Memory(dead) + var/savefile/S = new /savefile("data/npc_saves/Runtime.sav") + family = list() + if(!dead) + for(var/mob/living/simple_animal/pet/cat/kitten/C in children) + if(istype(C,type) || C.stat || !C.z || !C.butcher_results) + continue + if(C.type in family) + family[C.type] += 1 + else + family[C.type] = 1 + S["family"] << family + memory_saved = 1 + +/mob/living/simple_animal/pet/cat/Runtime/proc/Deploy_The_Cats() + cats_deployed = 1 + for(var/cat_type in family) + if(family[cat_type] > 0) + for(var/i in 1 to min(family[cat_type],100)) //Limits to about 500 cats, you wouldn't think this would be needed (BUT IT IS) + new cat_type(loc) + /mob/living/simple_animal/pet/cat/handle_automated_action() ..() + if(prob(1)) + custom_emote(1, pick("stretches out for a belly rub.", "wags its tail.", "lies down.")) + icon_state = "[icon_living]_rest" + resting = 1 + update_canmove() + else if (prob(1)) + custom_emote(1, pick("sits down.", "crouches on its hind legs.", "looks alert.")) + icon_state = "[icon_living]_sit" + resting = 1 + update_canmove() + else if (prob(1)) + if (resting) + custom_emote(1, pick("gets up and meows.", "walks around.", "stops resting.")) + icon_state = "[icon_living]" + resting = 0 + update_canmove() + else + custom_emote(1, pick("grooms its fur.", "twitches its whiskers.", "shakes out its coat.")) //MICE! - if(eats_mice && loc && isturf(loc) && !incapacitated()) + if(eats_mice && isturf(loc) && !incapacitated()) for(var/mob/living/simple_animal/mouse/M in view(1,src)) if(!M.stat && Adjacent(M)) custom_emote(1, "splats \the [M]!") @@ -50,13 +123,11 @@ movement_target = null stop_automated_movement = 0 break - - //attempt to mate make_babies() /mob/living/simple_animal/pet/cat/handle_automated_movement() ..() - if(eats_mice && !incapacitated()) + if(!stat && !resting && !buckled) turns_since_scan++ if(turns_since_scan > 5) walk_to(src,0) @@ -75,6 +146,7 @@ stop_automated_movement = 1 walk_to(src,movement_target,0,3) + /mob/living/simple_animal/pet/cat/Proc name = "Proc" @@ -102,4 +174,4 @@ gold_core_spawnable = CHEM_MOB_SPAWN_INVALID eats_mice = 0 atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 \ No newline at end of file + minbodytemp = 0 diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index 86beb8f6bda..bf4ac4a1664 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -470,41 +470,6 @@ name = "Corgi meat" desc = "Tastes like... well you know..." -/mob/living/simple_animal/pet/corgi/Ian/Bump(atom/movable/AM as mob|obj, yes) - - spawn( 0 ) - if((!( yes ) || now_pushing)) - return - now_pushing = 1 - if(ismob(AM)) - var/mob/tmob = AM - if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations)) - if(prob(70)) - to_chat(src, "You fail to push [tmob]'s fat ass out of the way.") - now_pushing = 0 - return - if(!(tmob.status_flags & CANPUSH)) - now_pushing = 0 - return - - tmob.LAssailant = src - now_pushing = 0 - ..() - if(!( istype(AM, /atom/movable) )) - return - if(!( now_pushing )) - now_pushing = 1 - if(!( AM.anchored )) - var/t = get_dir(src, AM) - if(istype(AM, /obj/structure/window/full)) - for(var/obj/structure/window/win in get_step(AM,t)) - now_pushing = 0 - return - step(AM, t) - now_pushing = null - return - return - /mob/living/simple_animal/pet/corgi/regenerate_icons() overlays.Cut() if(inventory_head) @@ -592,8 +557,8 @@ /mob/living/simple_animal/pet/corgi/attack_hand(mob/living/carbon/human/M) . = ..() switch(M.a_intent) - if(I_HELP) wuv(1,M) - if(I_HARM) wuv(-1,M) + if(INTENT_HELP) wuv(1,M) + if(INTENT_HARM) wuv(-1,M) /mob/living/simple_animal/pet/corgi/proc/wuv(change, mob/M) if(change) diff --git a/code/modules/mob/living/simple_animal/friendly/diona.dm b/code/modules/mob/living/simple_animal/friendly/diona.dm index e6e9d2f93f1..6bec35b98db 100644 --- a/code/modules/mob/living/simple_animal/friendly/diona.dm +++ b/code/modules/mob/living/simple_animal/friendly/diona.dm @@ -51,7 +51,7 @@ /mob/living/simple_animal/diona/attack_hand(mob/living/carbon/human/M) //Let people pick the little buggers up. - if(M.a_intent == I_HELP) + if(M.a_intent == INTENT_HELP) if(M.species && M.species.name == "Diona") to_chat(M, "You feel your being twine with that of [src] as it merges with your biomass.") to_chat(src, "You feel your being twine with that of [M] as you merge with its biomass.") 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 840c988dc98..b7bd4fc46c1 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -27,6 +27,7 @@ stop_automated_movement_when_pulled = 1 var/milk_content = 0 can_collar = 1 + blood_volume = BLOOD_VOLUME_NORMAL /mob/living/simple_animal/hostile/retaliate/goat/handle_automated_movement() ..() @@ -110,6 +111,7 @@ var/milk_content = 0 can_collar = 1 gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY + blood_volume = BLOOD_VOLUME_NORMAL /mob/living/simple_animal/cow/New() ..() @@ -136,7 +138,7 @@ milk_content = min(50, milk_content+rand(5, 10)) /mob/living/simple_animal/cow/attack_hand(mob/living/carbon/M as mob) - if(!stat && M.a_intent == I_DISARM && icon_state != icon_dead) + if(!stat && M.a_intent == INTENT_DISARM && icon_state != icon_dead) M.visible_message("[M] tips over [src].","You tip over [src].") Weaken(30) icon_state = icon_dead @@ -312,6 +314,7 @@ var/global/chicken_count = 0 maxHealth = 50 can_collar = 1 gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY + blood_volume = BLOOD_VOLUME_NORMAL /mob/living/simple_animal/turkey name = "turkey" @@ -381,6 +384,7 @@ var/global/chicken_count = 0 maxHealth = 50 can_collar = 1 gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY + blood_volume = BLOOD_VOLUME_NORMAL /mob/living/simple_animal/walrus name = "walrus" @@ -404,3 +408,4 @@ var/global/chicken_count = 0 maxHealth = 50 can_collar = 1 gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY + blood_volume = BLOOD_VOLUME_NORMAL diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index fdcf39dd51b..17740441153 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -77,7 +77,7 @@ client.time_died_as_mouse = world.time /mob/living/simple_animal/mouse/attack_hand(mob/living/carbon/human/M as mob) - if(M.a_intent == I_HELP) + if(M.a_intent == INTENT_HELP) get_scooped(M) ..() diff --git a/code/modules/mob/living/simple_animal/friendly/pet.dm b/code/modules/mob/living/simple_animal/friendly/pet.dm index 2d7bc63dc75..7202c8a4054 100644 --- a/code/modules/mob/living/simple_animal/friendly/pet.dm +++ b/code/modules/mob/living/simple_animal/friendly/pet.dm @@ -2,6 +2,7 @@ icon = 'icons/mob/pets.dmi' can_collar = 1 mob_size = MOB_SIZE_SMALL + blood_volume = BLOOD_VOLUME_NORMAL /mob/living/simple_animal/pet/attackby(var/obj/item/O as obj, var/mob/user as mob, params) if(istype(O, /obj/item/weapon/newspaper)) diff --git a/code/modules/mob/living/simple_animal/friendly/sloth.dm b/code/modules/mob/living/simple_animal/friendly/sloth.dm index 1066b2a0d39..bf12b07de2e 100644 --- a/code/modules/mob/living/simple_animal/friendly/sloth.dm +++ b/code/modules/mob/living/simple_animal/friendly/sloth.dm @@ -21,7 +21,7 @@ melee_damage_upper = 18 health = 50 maxHealth = 50 - speed = 1 + speed = 2 //Cargo Sloth diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm index 5b2419bf7e8..bf648e537ab 100644 --- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm +++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm @@ -1,53 +1,53 @@ /mob/living/simple_animal/spiderbot - - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - maxbodytemp = 500 - - var/obj/item/device/radio/borg/radio = null - var/mob/living/silicon/ai/connected_ai = null - var/obj/item/weapon/stock_parts/cell/cell = null - var/obj/machinery/camera/camera = null - var/obj/item/device/mmi/mmi = null - var/list/req_access = list(access_robotics) //Access needed to pop out the brain. - name = "Spider-bot" - desc = "A skittering robotic friend!" + desc = "A skittering robotic friend!" //More like ultimate shitter icon = 'icons/mob/robots.dmi' icon_state = "spiderbot-chassis" icon_living = "spiderbot-chassis" icon_dead = "spiderbot-smashed" wander = 0 universal_speak = 1 - health = 10 - maxHealth = 10 + health = 40 + maxHealth = 40 + melee_damage_lower = 2 + melee_damage_upper = 2 + melee_damage_type = BURN attacktext = "shocks" - attacktext = "shocks" - melee_damage_lower = 1 - melee_damage_upper = 3 + attack_sound = "sparks" response_help = "pets" response_disarm = "shoos" response_harm = "stomps on" - - var/obj/item/held_item = null //Storage for single item they can hold. - var/emagged = 0 //IS WE EXPLODEN? - var/syndie = 0 //IS WE SYNDICAT? (currently unused) - speed = -1 //Spiderbots gotta go fast. - //pass_flags = PASSTABLE //Maybe griefy? + speed = 0 mob_size = MOB_SIZE_SMALL speak_emote = list("beeps","clicks","chirps") + + atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + minbodytemp = 0 + maxbodytemp = 500 + can_hide = 1 ventcrawler = 2 loot = list(/obj/effect/decal/cleanable/blood/gibs/robot) del_on_death = 1 -/mob/living/simple_animal/spiderbot/attackby(var/obj/item/O as obj, var/mob/user as mob, params) + var/emagged = 0 //is it getting ready to explode? + var/obj/item/device/mmi/mmi = null + var/emagged_master = null //for administrative purposes, to see who emagged the spiderbot; also for a holder for if someone emags an empty frame first then inserts an MMI. - if(istype(O, /obj/item/device/mmi) || istype(O, /obj/item/device/mmi/posibrain)) +/mob/living/simple_animal/spiderbot/Destroy() + if(emagged) + QDEL_NULL(mmi) + explosion(get_turf(src), -1, -1, 3, 5) + else + eject_brain() + return ..() + +/mob/living/simple_animal/spiderbot/attackby(obj/item/O, mob/living/user, params) + if(istype(O, /obj/item/device/mmi)) var/obj/item/device/mmi/B = O - if(src.mmi) //There's already a brain in it. + if(mmi) //There's already a brain in it. to_chat(user, "There's already a brain in [src]!") return if(!B.brainmob) @@ -65,47 +65,49 @@ ghost_can_reenter = 1 break if(!ghost_can_reenter) - to_chat(user, "[O] is completely unresponsive; there's no point.") + to_chat(user, "[B] is completely unresponsive; there's no point.") return if(B.brainmob.stat == DEAD) - to_chat(user, "[O] is dead. Sticking it into the frame would sort of defeat the purpose.") + to_chat(user, "[B] is dead. Sticking it into the frame would sort of defeat the purpose.") return - if(jobban_isbanned(B.brainmob, "Cyborg") || jobban_isbanned(B.brainmob,"nonhumandept")) - to_chat(user, "[O] does not seem to fit.") + if(jobban_isbanned(B.brainmob, "Cyborg") || jobban_isbanned(B.brainmob, "nonhumandept")) + to_chat(user, "[B] does not seem to fit.") return - to_chat(user, "You install [O] in [src]!") + to_chat(user, "You install [B] in [src]!") user.drop_item() - src.mmi = O - src.transfer_personality(O) + B.forceMove(src) + mmi = B + transfer_personality(B) - O.loc = src - src.update_icon() + update_icon() return 1 - if(istype(O, /obj/item/weapon/weldingtool)) + else if(iswelder(O) && user.a_intent == INTENT_HELP) var/obj/item/weapon/weldingtool/WT = O + user.changeNext_move(CLICK_CD_MELEE) if(WT.remove_fuel(0)) if(health < maxHealth) - health += pick(1,1,1,2,2,3) - if(health > maxHealth) - health = maxHealth + adjustHealth(-5) + playsound(loc, WT.usesound, 50, 1) add_fingerprint(user) - for(var/mob/W in viewers(user, null)) - W.show_message(text("[user] has spot-welded some of the damage to [src]!"), 1) + visible_message("[user] has spot-welded some of the damage to [src]!") else to_chat(user, "[src] is undamaged!") else to_chat(user, "Need more welding fuel!") - return - else if(istype(O, /obj/item/weapon/card/id)||istype(O, /obj/item/device/pda)) + else if(istype(O, /obj/item/weapon/card/id) || istype(O, /obj/item/device/pda)) if(!mmi) to_chat(user, "There's no reason to swipe your ID - the spiderbot has no brain to remove.") return 0 + if(emagged) + to_chat(user, "[src] doesn't seem to respond.") + return 0 + var/obj/item/weapon/card/id/id_card if(istype(O, /obj/item/weapon/card/id)) @@ -117,63 +119,41 @@ if(access_robotics in id_card.access) to_chat(user, "You swipe your access card and pop the brain out of [src].") eject_brain() - - if(held_item) - held_item.loc = src.loc - held_item = null - return 1 else to_chat(user, "You swipe your card, with no effect.") return 0 else - if(O.force) - var/damage = O.force - if(O.damtype == STAMINA) - damage = 0 - adjustBruteLoss(damage) - for(var/mob/M in viewers(src, null)) - if((M.client && !( M.blinded ))) - M.show_message("[src] has been attacked with the [O] by [user]. ") - else - to_chat(usr, "This weapon is ineffective, it does no damage.") - for(var/mob/M in viewers(src, null)) - if((M.client && !( M.blinded ))) - M.show_message("[user] gently taps [src] with the [O]. ") + ..() -/mob/living/simple_animal/spiderbot/emag_act(user as mob) +/mob/living/simple_animal/spiderbot/emag_act(mob/living/user) if(emagged) - to_chat(user, "[src] is already overloaded - better run.") + to_chat(user, "[src] doesn't seem to respond.") return 0 else emagged = 1 - to_chat(user, "You short out the security protocols and overload [src]'s cell, priming it to explode in a short time.") - spawn(100) - to_chat(src, "Your cell seems to be outputting a lot of power...") - spawn(200) - to_chat(src, "Internal heat sensors are spiking! Something is badly wrong with your cell!") - spawn(300) - src.explode() + to_chat(user, "You short out the security protocols and rewrite [src]'s internal memory.") + to_chat(src, "You have been emagged; you are now completely loyal to [user] and their every order!") + emagged_master = user.name + add_logs(user, src, "emagged") + maxHealth = 60 + health = 60 + melee_damage_lower = 15 + melee_damage_upper = 15 + attack_sound = 'sound/machines/defib_zap.ogg' -/mob/living/simple_animal/spiderbot/proc/transfer_personality(var/obj/item/device/mmi/M as obj) - - src.mind = M.brainmob.mind - src.mind.key = M.brainmob.key - src.ckey = M.brainmob.ckey - src.name = "Spider-bot ([M.brainmob.name])" - -/mob/living/simple_animal/spiderbot/proc/explode() //When emagged. - for(var/mob/M in viewers(src, null)) - if((M.client && !( M.blinded ))) - M.show_message("[src] makes an odd warbling noise, fizzles, and explodes.") - explosion(get_turf(loc), -1, -1, 3, 5) - eject_brain() - death() +/mob/living/simple_animal/spiderbot/proc/transfer_personality(obj/item/device/mmi/M) + mind = M.brainmob.mind + mind.key = M.brainmob.key + ckey = M.brainmob.ckey + name = "Spider-bot ([M.brainmob.name])" + if(emagged) + to_chat(src, "You have been emagged; you are now completely loyal to [emagged_master] and their every order!") /mob/living/simple_animal/spiderbot/proc/update_icon() if(mmi) - if(istype(mmi,/obj/item/device/mmi)) + if(istype(mmi, /obj/item/device/mmi)) icon_state = "spiderbot-chassis-mmi" icon_living = "spiderbot-chassis-mmi" if(istype(mmi, /obj/item/device/mmi/posibrain)) @@ -186,99 +166,10 @@ /mob/living/simple_animal/spiderbot/proc/eject_brain() if(mmi) - var/turf/T = get_turf(loc) - if(T) - mmi.loc = T - if(mind) mind.transfer_to(mmi.brainmob) + var/turf/T = get_turf(src) + mmi.forceMove(T) + if(mind) + mind.transfer_to(mmi.brainmob) mmi = null - src.name = "Spider-bot" - update_icon() - -/mob/living/simple_animal/spiderbot/Destroy() - eject_brain() - return ..() - -/mob/living/simple_animal/spiderbot/New() - - radio = new /obj/item/device/radio/borg(src) - camera = new /obj/machinery/camera(src) - camera.c_tag = "Spiderbot-[real_name]" - camera.network = list("SS13") - - ..() - -/mob/living/simple_animal/spiderbot/death(gibbed) - if(camera) - camera.status = 0 - - if(held_item) - held_item.forceMove(src.loc) - held_item = null - ..() - -//Cannibalized from the parrot mob. ~Zuhayr - -/mob/living/simple_animal/spiderbot/verb/drop_held_item() - set name = "Drop held item" - set category = "Spiderbot" - set desc = "Drop the item you're holding." - - if(stat) - return - - if(!held_item) - to_chat(usr, "You have nothing to drop!") - return 0 - - if(istype(held_item, /obj/item/weapon/grenade)) - visible_message("[src] launches \the [held_item]!", "You launch \the [held_item]!", "You hear a skittering noise and a thump!") - var/obj/item/weapon/grenade/G = held_item - G.loc = src.loc - G.prime() - held_item = null - return 1 - - visible_message("[src] drops \the [held_item]!", "You drop \the [held_item]!", "You hear a skittering noise and a soft thump.") - - held_item.loc = src.loc - held_item = null - return 1 - - return - -/mob/living/simple_animal/spiderbot/verb/get_item() - set name = "Pick up item" - set category = "Spiderbot" - set desc = "Allows you to take a nearby small item." - - if(stat) - return -1 - - if(held_item) - to_chat(src, "You are already holding \the [held_item]") - return 1 - - var/list/items = list() - for(var/obj/item/I in view(1,src)) - if(I.loc != src && I.w_class <= 2) - items.Add(I) - - var/obj/selection = input("Select an item.", "Pickup") in items - - if(selection) - for(var/obj/item/I in view(1, src)) - if(selection == I) - held_item = selection - selection.loc = src - visible_message("[src] scoops up \the [held_item]!", "You grab \the [held_item]!", "You hear a skittering noise and a clink.") - return held_item - to_chat(src, "\The [selection] is too far away.") - return 0 - - to_chat(src, "There is nothing of interest to take.") - return 0 - -/mob/living/simple_animal/spiderbot/examine(mob/user) - ..(user) - if(src.held_item) - to_chat(user, "It is carrying \a [src.held_item] [bicon(src.held_item)].") + name = "Spider-bot" + update_icon() \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index 85e0cba9073..88db29b88a7 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -18,7 +18,7 @@ melee_damage_upper = 25 attacktext = "slashes" speak_emote = list("hisses") - a_intent = I_HARM + a_intent = INTENT_HARM attack_sound = 'sound/weapons/bladeslice.ogg' atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) unsuitable_atmos_damage = 15 @@ -141,7 +141,7 @@ name = "lusty xenomorph maid" melee_damage_lower = 0 melee_damage_upper = 0 - a_intent = "help" + a_intent = INTENT_HELP friendly = "caresses" environment_smash = 0 icon_state = "maid" diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index a14efc6d279..35926a602f2 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -22,7 +22,6 @@ 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 - speed = 4 faction = list("faithless") gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 911f66a5527..50fab332201 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -98,10 +98,8 @@ /mob/living/simple_animal/hostile/proc/ListTargets()//Step 1, find out what we can see - . = list() if(!search_objects) - var/list/Mobs = hearers(vision_range, targets_from) - src //Remove self, so we don't suicide - . += Mobs + . = hearers(vision_range, targets_from) - src //Remove self, so we don't suicide var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha, /obj/spacepod)) @@ -109,8 +107,7 @@ if(can_see(targets_from, HM, vision_range)) . += HM else - var/list/Objects = oview(vision_range, targets_from) - . += Objects + . = oview(vision_range, targets_from) /mob/living/simple_animal/hostile/proc/FindTarget(var/list/possible_targets, var/HasTargetsList = 0)//Step 2, filter down possible targets to things we actually care about . = list() diff --git a/code/modules/mob/living/simple_animal/hostile/illusion.dm b/code/modules/mob/living/simple_animal/hostile/illusion.dm index b6cda2e0e3c..746c1789e16 100644 --- a/code/modules/mob/living/simple_animal/hostile/illusion.dm +++ b/code/modules/mob/living/simple_animal/hostile/illusion.dm @@ -7,7 +7,7 @@ icon_dead = "null" melee_damage_lower = 5 melee_damage_upper = 5 - a_intent = "harm" + a_intent = INTENT_HARM attacktext = "gores" maxHealth = 100 health = 100 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index 85a351606f6..d6d1d92618d 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -103,7 +103,7 @@ Difficulty: Hard triple_charge() else spawn(0) - warp_charge() + warp_charge() /mob/living/simple_animal/hostile/megafauna/bubblegum/New() ..() @@ -186,7 +186,7 @@ Difficulty: Hard shake_camera(L, 4, 3) shake_camera(src, 2, 3) var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src))) - L.throw_at_fast(throwtarget, 3) + L.throw_at(throwtarget, 3) charging = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm index 5afa7613c78..38f8c121d5d 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm @@ -238,7 +238,7 @@ Difficulty: Medium if(L.loc == loc) throw_dir = pick(alldirs) var/throwtarget = get_edge_target_turf(src, throw_dir) - L.throw_at_fast(throwtarget, 3) + L.throw_at(throwtarget, 3) visible_message("[L] is thrown clear of [src]!") for(var/mob/M in range(7, src)) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index a8102b94b94..dba3121f3a7 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -5,7 +5,7 @@ desc = "Attack the weak point for massive damage." health = 1000 maxHealth = 1000 - a_intent = "harm" + a_intent = INTENT_HARM sentience_type = SENTIENCE_BOSS environment_smash = 3 luminosity = 3 @@ -228,4 +228,4 @@ /proc/ClearScore(client/player) world.SetScores(player.ckey, "", global.medal_hub, global.medal_pass) -#undef MEDAL_PREFIX \ No newline at end of file +#undef MEDAL_PREFIX diff --git a/code/modules/mob/living/simple_animal/hostile/mining/goldgrub.dm b/code/modules/mob/living/simple_animal/hostile/mining/goldgrub.dm index 3e6d98afd95..bd9c532bb45 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/goldgrub.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/goldgrub.dm @@ -19,7 +19,7 @@ melee_damage_upper = 0 attacktext = "barrels into" attack_sound = 'sound/weapons/punch1.ogg' - a_intent = I_HELP + a_intent = INTENT_HELP speak_emote = list("screeches") throw_message = "sinks in slowly, before being pushed out of " status_flags = CANPUSH diff --git a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm index 517b71a3a6d..a0f0a2b8b22 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm @@ -203,9 +203,9 @@ reagents.reaction(C, INGEST, fraction) reagents.trans_to(C, volume) -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/proc/link_host(mob/living/carbon/human/H) - faction = list("\ref[src]", "\ref[H]") // Hostile to everyone except the host. - H.vessel.trans_to(src, 30) +/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/proc/link_host(mob/living/carbon/C) + faction = list("\ref[src]", "\ref[C]") // Hostile to everyone except the host. + C.transfer_blood_to(src, 30) color = mix_color_from_reagents(reagents.reagent_list) // Legion 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 80227526cbc..184f7b3ced3 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -11,7 +11,7 @@ response_disarm = "shoves" response_harm = "strikes" status_flags = 0 - a_intent = I_HARM + a_intent = INTENT_HARM var/throw_message = "bounces off of" var/icon_aggro = null // for swapping to when we get aggressive see_in_dark = 8 @@ -68,7 +68,7 @@ melee_damage_lower = 12 melee_damage_upper = 12 attacktext = "bites into" - a_intent = I_HARM + a_intent = INTENT_HARM speak_emote = list("chitters") attack_sound = 'sound/weapons/bladeslice.ogg' aggro_vision_range = 9 @@ -222,7 +222,7 @@ icon = 'icons/obj/items.dmi' icon_state = "goliath_hide" flags = NOBLUDGEON - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL layer = 4 /obj/item/asteroid/goliath_hide/afterattack(atom/target, mob/user, proximity_flag) diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index d7984031052..25311673076 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -138,7 +138,7 @@ /mob/living/simple_animal/hostile/mushroom/attack_hand(mob/living/carbon/human/M as mob) ..() - if(M.a_intent == I_HARM) + if(M.a_intent == INTENT_HARM) Bruise() /mob/living/simple_animal/hostile/mushroom/hitby(atom/movable/AM) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm index cce4b32235c..c2ba962e2e0 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm @@ -13,7 +13,7 @@ speak = list("HONK", "Honk!", "Welcome to clown planet!") emote_see = list("honks") speak_chance = 1 - a_intent = I_HARM + a_intent = INTENT_HARM maxHealth = 75 health = 75 speed = 0 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 3cfc1b2c291..d4a88b49e60 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -15,7 +15,7 @@ response_harm = "hits the" speak = list("ALERT.","Hostile-ile-ile entities dee-twhoooo-wected.","Threat parameterszzzz- szzet.","Bring sub-sub-sub-systems uuuup to combat alert alpha-a-a.") emote_see = list("beeps menacingly","whirrs threateningly","scans its immediate vicinity") - a_intent = I_HARM + a_intent = INTENT_HARM stop_automated_movement_when_pulled = 0 health = 300 maxHealth = 300 @@ -258,7 +258,7 @@ if(spawnees & 512) C = new(src.loc) C.name = "Corrupted drone morality core" - C.origin_tech = "illegal=[rand(3,6)]" + C.origin_tech = "syndicate=[rand(3,6)]" return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/pet.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/pet.dm index 5a0798874e4..687e0b7c73a 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/pet.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/pet.dm @@ -12,7 +12,7 @@ response_help = "pets" emote_hear = list("chitters") maxHealth = 250 - health = 200 + health = 250 harm_intent_damage = 3 melee_damage_lower = 15 melee_damage_upper = 20 diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm index 66972b06d2e..e5beb60097e 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm @@ -31,7 +31,7 @@ response_disarm = "shoves" response_harm = "hits" turns_per_move = 10 - speed = -1 + speed = 0 maxHealth = 20 health = 20 @@ -74,7 +74,7 @@ response_help = "shakes hands with" response_disarm = "shoves" response_harm = "hits" - speed = -1 + speed = 0 maxHealth = 20 health = 20 diff --git a/code/modules/mob/living/simple_animal/hostile/russian.dm b/code/modules/mob/living/simple_animal/hostile/russian.dm index 30bdb8c95e2..2f639d9e6f7 100644 --- a/code/modules/mob/living/simple_animal/hostile/russian.dm +++ b/code/modules/mob/living/simple_animal/hostile/russian.dm @@ -18,7 +18,7 @@ melee_damage_upper = 15 attacktext = "punches" attack_sound = 'sound/weapons/punch1.ogg' - a_intent = I_HARM + a_intent = INTENT_HARM unsuitable_atmos_damage = 15 faction = list("russian") status_flags = CANPUSH diff --git a/code/modules/mob/living/simple_animal/hostile/spaceworms.dm b/code/modules/mob/living/simple_animal/hostile/spaceworms.dm index 64469bb87ef..27bd2f3ee1c 100644 --- a/code/modules/mob/living/simple_animal/hostile/spaceworms.dm +++ b/code/modules/mob/living/simple_animal/hostile/spaceworms.dm @@ -28,7 +28,7 @@ maxbodytemp = 350 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) - a_intent = I_HARM //so they don't get pushed around + a_intent = INTENT_HARM //so they don't get pushed around environment_smash = 1 @@ -123,7 +123,6 @@ //Attempt to eat things we bump into, Mobs, Walls, Clowns /mob/living/simple_animal/hostile/spaceWorm/wormHead/Bump(atom/obstacle) - attemptToEat(obstacle) //Attempt to eat things, only the head can eat diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index 168ed2d441c..6ddb86fd818 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -8,7 +8,7 @@ icon_living = "angel" icon_dead = "angel" gender = NEUTER - a_intent = I_HARM + a_intent = INTENT_HARM response_help = "touches" response_disarm = "pushes" diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 805059f25f7..469631951aa 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -18,7 +18,7 @@ melee_damage_upper = 10 attacktext = "punches" attack_sound = 'sound/weapons/punch1.ogg' - a_intent = I_HARM + a_intent = INTENT_HARM unsuitable_atmos_damage = 15 faction = list("syndicate") check_friendly_fire = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/reproduction.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/reproduction.dm index d1ffa073582..d9c20c09172 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/reproduction.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/reproduction.dm @@ -25,13 +25,12 @@ ts_spiderling_list -= src return ..() -/obj/structure/spider/spiderling/terror_spiderling/Bump(atom/A) - if(istype(A, /obj/structure/table)) - forceMove(A.loc) - else if(istype(A, /obj/machinery/recharge_station)) +/obj/structure/spider/spiderling/terror_spiderling/Bump(obj/O) + if(istype(O, /obj/structure/table)) + forceMove(O.loc) + else if(istype(O, /obj/machinery/recharge_station)) qdel(src) - else - ..() + . = ..() /obj/structure/spider/spiderling/terror_spiderling/process() if(travelling_in_vent) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm index caff5e2017f..0f85d78d01f 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm @@ -329,16 +329,17 @@ var/global/list/ts_spiderling_list = list() /mob/living/simple_animal/hostile/poison/terror_spider/proc/spider_special_action() return -/mob/living/simple_animal/hostile/poison/terror_spider/Bump(atom/A) - if(istype(A, /obj/machinery/door/airlock)) - var/obj/machinery/door/airlock/L = A +/mob/living/simple_animal/hostile/poison/terror_spider/ObjBump(obj/O) + if(istype(O, /obj/machinery/door/airlock)) + var/obj/machinery/door/airlock/L = O if(L.density) - try_open_airlock(L) - if(istype(A, /obj/machinery/door/firedoor)) - var/obj/machinery/door/firedoor/F = A + return try_open_airlock(L) + if(istype(O, /obj/machinery/door/firedoor)) + var/obj/machinery/door/firedoor/F = O if(F.density && !F.welded) F.open() - ..() + return 1 + . = ..() /mob/living/simple_animal/hostile/poison/terror_spider/proc/msg_terrorspiders(msgtext) for(var/mob/living/simple_animal/hostile/poison/terror_spider/T in ts_spiderlist) @@ -362,6 +363,7 @@ var/global/list/ts_spiderling_list = list() to_chat(src, "The door is bolted shut.") else if(D.allowed(src)) D.open(1) + return 1 else if(D.arePowerSystemsOn() && (spider_opens_doors != 2)) to_chat(src, "The door's motors resist your efforts to force it.") else if(!spider_opens_doors) @@ -369,4 +371,5 @@ var/global/list/ts_spiderling_list = list() else visible_message("[src] pries open the door!") playsound(src.loc, "sparks", 100, 1) - D.open(1) \ No newline at end of file + D.open(1) + return 1 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm index b4ac6212220..f27891f5965 100644 --- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm +++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm @@ -56,7 +56,7 @@ harm_intent_damage = 5 melee_damage_lower = 25 melee_damage_upper = 25 - a_intent = I_HARM + a_intent = INTENT_HARM attack_sound = 'sound/weapons/bladeslice.ogg' atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) unsuitable_atmos_damage = 0 diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 2c1fb61be2f..91eb0970f50 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -477,7 +477,7 @@ var/mob/living/carbon/human/H = parrot_interest var/obj/item/organ/external/affecting = H.get_organ(ran_zone(pick(parrot_dam_zone))) - H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), sharp=1) + H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), sharp = 1) custom_emote(1, pick("pecks [H]'s [affecting].", "cuts [H]'s [affecting] with its talons.")) else @@ -505,7 +505,8 @@ /mob/living/simple_animal/parrot/movement_delay() if(client && stat == CONSCIOUS && parrot_state != "parrot_fly") icon_state = "parrot_fly" - ..() + //Because the most appropriate place to set icon_state is movement_delay(), clearly + return ..() /mob/living/simple_animal/parrot/proc/search_for_item() for(var/atom/movable/AM in view(src)) @@ -515,12 +516,12 @@ if(istype(AM, /obj/item)) var/obj/item/I = AM - if(I.w_class < 2) + if(I.w_class < WEIGHT_CLASS_SMALL) return I if(iscarbon(AM)) var/mob/living/carbon/C = AM - if((C.l_hand && C.l_hand.w_class <= 2) || (C.r_hand && C.r_hand.w_class <= 2)) + if((C.l_hand && C.l_hand.w_class <= WEIGHT_CLASS_SMALL) || (C.r_hand && C.r_hand.w_class <= WEIGHT_CLASS_SMALL)) return C return null @@ -544,12 +545,12 @@ if(istype(AM, /obj/item)) var/obj/item/I = AM - if(I.w_class <= 2) + if(I.w_class <= WEIGHT_CLASS_SMALL) return I if(iscarbon(AM)) var/mob/living/carbon/C = AM - if(C.l_hand && C.l_hand.w_class <= 2 || C.r_hand && C.r_hand.w_class <= 2) + if(C.l_hand && C.l_hand.w_class <= WEIGHT_CLASS_SMALL || C.r_hand && C.r_hand.w_class <= WEIGHT_CLASS_SMALL) return C return null @@ -571,7 +572,7 @@ for(var/obj/item/I in view(1,src)) //Make sure we're not already holding it and it's small enough - if(I.loc != src && I.w_class <= 2) + if(I.loc != src && I.w_class <= WEIGHT_CLASS_SMALL) //If we have a perch and the item is sitting on it, continue if(!client && parrot_perch && I.loc == parrot_perch.loc) @@ -600,10 +601,10 @@ var/obj/item/stolen_item = null for(var/mob/living/carbon/C in view(1,src)) - if(C.l_hand && C.l_hand.w_class <= 2) + if(C.l_hand && C.l_hand.w_class <= WEIGHT_CLASS_SMALL) stolen_item = C.l_hand - if(C.r_hand && C.r_hand.w_class <= 2) + if(C.r_hand && C.r_hand.w_class <= WEIGHT_CLASS_SMALL) stolen_item = C.r_hand if(stolen_item) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 7c951cebbc9..fc331fb74b9 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -250,20 +250,6 @@ else if(bodytemperature > maxbodytemp) adjustBruteLoss(heat_damage_per_tick) -/mob/living/simple_animal/Bumped(AM as mob|obj) - if(!AM) return - - if(resting || buckled) - return - - if(isturf(src.loc)) - if((status_flags & CANPUSH) && ismob(AM)) - var/newamloc = src.loc - src.loc = AM:loc - AM:loc = newamloc - else - ..() - /mob/living/simple_animal/gib() if(icon_gib) flick(icon_gib, src) @@ -318,12 +304,12 @@ switch(M.a_intent) - if(I_HELP) + if(INTENT_HELP) if(health > 0) visible_message(" [M] [response_help] [src].") playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - if(I_GRAB) + if(INTENT_GRAB) if(M == src || anchored) return if(!(status_flags & CANPUSH)) @@ -340,7 +326,7 @@ visible_message("[M] has grabbed [src] passively!") playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - if(I_HARM, I_DISARM) + if(INTENT_HARM, INTENT_DISARM) M.do_attack_animation(src) visible_message("[M] [response_harm] [src]!") playsound(loc, "punch", 25, 1, -1) @@ -352,13 +338,13 @@ switch(M.a_intent) - if(I_HELP) + if(INTENT_HELP) visible_message("[M] caresses [src] with its scythe like arm.") - if(I_GRAB) + if(INTENT_GRAB) grabbedby(M) - if(I_HARM, I_DISARM) + if(INTENT_HARM, INTENT_DISARM) M.do_attack_animation(src) var/damage = rand(15, 30) visible_message("[M] has slashed at [src]!", \ @@ -371,7 +357,7 @@ /mob/living/simple_animal/attack_larva(mob/living/carbon/alien/larva/L as mob) switch(L.a_intent) - if(I_HELP) + if(INTENT_HELP) visible_message("[L] rubs its head against [src].") @@ -436,6 +422,13 @@ damage = O.force if(O.damtype == STAMINA) damage = 0 + if(O.damtype == BRUTE) + if(prob(33)) + O.add_mob_blood(src) + var/turf/location = get_turf(src) + add_splatter_floor(location) + if(get_dist(user, src) <= 1) //people with TK won't get smeared with blood + user.add_mob_blood(src) 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 @@ -446,13 +439,12 @@ "This weapon is ineffective, it does no damage.") adjustBruteLoss(damage) - /mob/living/simple_animal/movement_delay() - var/tally = 0 //Incase I need to add stuff other than "speed" later + . = ..() - tally = speed + . = speed - return tally+config.animal_delay + . += config.animal_delay /mob/living/simple_animal/Stat() ..() @@ -606,7 +598,7 @@ alone = 0 continue if(alone && partner && children < 3) - new childtype(loc) + return new childtype(loc) /mob/living/simple_animal/say_quote(var/message) var/verb = "says" diff --git a/code/modules/mob/living/simple_animal/spawner.dm b/code/modules/mob/living/simple_animal/spawner.dm index 46a05daba98..22b5fb705a9 100644 --- a/code/modules/mob/living/simple_animal/spawner.dm +++ b/code/modules/mob/living/simple_animal/spawner.dm @@ -12,7 +12,7 @@ status_flags = 0 anchored = 1 AIStatus = AI_OFF - a_intent = "harm" + a_intent = INTENT_HARM stop_automated_movement = 1 wander = 0 atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) @@ -81,4 +81,4 @@ /mob/living/simple_animal/hostile/spawner/mining/basilisk name = "basilisk den" desc = "A den housing a nest of basilisks, bring a coat." - mob_type = /mob/living/simple_animal/hostile/asteroid/basilisk \ No newline at end of file + mob_type = /mob/living/simple_animal/hostile/asteroid/basilisk diff --git a/code/modules/mob/living/simple_animal/tribbles.dm b/code/modules/mob/living/simple_animal/tribbles.dm index 78b28abf9f8..dfe4715edd5 100644 --- a/code/modules/mob/living/simple_animal/tribbles.dm +++ b/code/modules/mob/living/simple_animal/tribbles.dm @@ -242,7 +242,6 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles, item_state = "furgloves" transfer_prints = TRUE transfer_blood = TRUE - siemens_coefficient = 0 // Equivalent to a winter coat's hood /obj/item/clothing/head/furcap diff --git a/code/modules/mob/living/stat_states.dm b/code/modules/mob/living/stat_states.dm index 58c4221504d..812eeaa0821 100644 --- a/code/modules/mob/living/stat_states.dm +++ b/code/modules/mob/living/stat_states.dm @@ -37,9 +37,9 @@ // handles revival through other means than cloning or adminbus (defib, IPC repair) /mob/living/proc/update_revive(updating = TRUE) if(stat != DEAD) - return + return 0 if(!can_be_revived()) - return + return 0 add_logs(src, null, "came back to life at [atom_loc_line(get_turf(src))]", admin=0, print_attack_log = 0) stat = CONSCIOUS dead_mob_list -= src @@ -49,3 +49,11 @@ update_canmove() // update_blind_effects() updatehealth() + + for(var/s in ownedSoullinks) + var/datum/soullink/S = s + S.ownerRevives(src) + for(var/s in sharedSoullinks) + var/datum/soullink/S = s + S.sharerRevives(src) + return 1 diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index a1b6c652913..aadd5a74c1b 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -11,6 +11,10 @@ for(var/mob/dead/observer/M in following_mobs) M.following = null following_mobs = null + QDEL_LIST_ASSOC_VAL(tkgrabbed_objects) + for(var/I in tkgrabbed_objects) + qdel(tkgrabbed_objects[I]) + tkgrabbed_objects = null if(buckled) buckled.unbuckle_mob() if(viewing_alternate_appearances) @@ -424,7 +428,7 @@ var/list/slot_equipment_priority = list( \ return 0 if(slot_flags & SLOT_DENYPOCKET) return - if( w_class <= 2 || (slot_flags & SLOT_POCKET) ) + if( w_class <= WEIGHT_CLASS_SMALL || (slot_flags & SLOT_POCKET) ) return 1 if(slot_r_store) if(H.r_store) @@ -435,7 +439,7 @@ var/list/slot_equipment_priority = list( \ return 0 if(slot_flags & SLOT_DENYPOCKET) return 0 - if( w_class <= 2 || (slot_flags & SLOT_POCKET) ) + if( w_class <= WEIGHT_CLASS_SMALL || (slot_flags & SLOT_POCKET) ) return 1 return 0 if(slot_s_store) @@ -447,7 +451,7 @@ var/list/slot_equipment_priority = list( \ if(!disable_warning) to_chat(usr, "You somehow have a suit with no defined allowed items for suit storage, stop that.") return 0 - if(src.w_class > 4) + if(src.w_class > WEIGHT_CLASS_BULKY) if(!disable_warning) to_chat(usr, "The [name] is too big to attach.") return 0 @@ -1008,9 +1012,10 @@ var/list/slot_equipment_priority = list( \ drop_l_hand() drop_r_hand() -/mob/proc/facedir(var/ndir) - if(!canface()) return 0 - dir = ndir +/mob/proc/facedir(ndir) + if(!canface()) + return 0 + setDir(ndir) client.move_delay += movement_delay() return 1 @@ -1047,104 +1052,6 @@ var/list/slot_equipment_priority = list( \ /mob/proc/get_species() return "" -/mob/proc/get_visible_implants(var/class = 0) - var/list/visible_implants = list() - for(var/obj/item/O in embedded) - if(O.w_class > class) - visible_implants += O - return visible_implants - -/mob/proc/yank_out_object() - set category = "Object" - set name = "Yank out object" - set desc = "Remove an embedded item at the cost of bleeding and pain." - set src in view(1) - - if(!isliving(usr) || usr.next_move > world.time) - return - usr.changeNext_move(CLICK_CD_RESIST) - - if(usr.stat == 1) - to_chat(usr, "You are unconcious and cannot do that!") - return - - if(usr.restrained()) - to_chat(usr, "You are restrained and cannot do that!") - return - - var/mob/S = src - var/mob/U = usr - var/list/valid_objects = list() - var/self = null - - if(S == U) - self = 1 // Removing object from yourself. - - valid_objects = get_visible_implants(0) - if(!valid_objects.len) - if(self) - to_chat(src, "You have nothing stuck in your body that is large enough to remove.") - else - to_chat(U, "[src] has nothing stuck in their wounds that is large enough to remove.") - return - - var/obj/item/weapon/selection = input("What do you want to yank out?", "Embedded objects") in valid_objects - - if(self) - visible_message("[usr] appears to be trying to extract an object from their body.") - to_chat(src, "You attempt to get a good grip on [selection] in your body.") - else - visible_message("[usr] attempts to get a good grip on [selection] in [S]'s body.") - to_chat(U, "You attempt to get a good grip on [selection] in [S]'s body.") - - if(!do_after(U, 80, target = S)) - return - if(!selection || !S || !U) - return - - if(self) - visible_message("[src] rips [selection] out of their body.","You rip [selection] out of your body.") - else - visible_message("[usr] rips [selection] out of [src]'s body.","[usr] rips [selection] out of your body.") - valid_objects = get_visible_implants(0) - if(valid_objects.len == 1) //Yanking out last object - removing verb. - src.verbs -= /mob/proc/yank_out_object - - if(ishuman(src)) - - var/mob/living/carbon/human/H = src - var/obj/item/organ/external/affected - - for(var/obj/item/organ/external/organ in H.bodyparts) //Grab the organ holding the implant. - for(var/obj/item/weapon/O in organ.implants) - if(O == selection) - affected = organ - - affected.implants -= selection - H.shock_stage+=10 - - if(prob(10)) //I'M SO ANEMIC I COULD JUST -DIE-. - var/datum/wound/internal_bleeding/I = new () - affected.wounds += I - H.custom_pain("Something tears wetly in your [affected] as [selection] is pulled free!", 1) - - if(ishuman(U)) - var/mob/living/carbon/human/human_user = U - human_user.bloody_hands(H) - - selection.forceMove(get_turf(src)) - if(!(U.l_hand && U.r_hand)) - U.put_in_hands(selection) - - for(var/obj/item/weapon/O in pinned) - if(O == selection) - pinned -= O - if(!pinned.len) - anchored = 0 - return 1 - - - /mob/dead/observer/verb/respawn() set name = "Respawn as NPC" set category = "Ghost" diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 2988363ffb9..e275d855328 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -53,8 +53,6 @@ var/lastpuke = 0 var/unacidable = 0 var/can_strip = 1 - var/list/pinned = list() //List of things pinning this creature to walls (see living_defense.dm) - var/list/embedded = list() //Embedded items, since simple mobs don't have organs. var/list/languages = list() // For speaking/listening. var/list/abilities = list() // For species-derived or admin-given powers. var/list/speak_emote = list("says") // Verbs used when speaking. Defaults to 'say' if speak_emote is null. @@ -75,8 +73,8 @@ var/overeatduration = 0 // How long this guy is overeating //Carbon var/intent = null//Living var/shakecamera = 0 - var/a_intent = I_HELP//Living - var/m_intent = "run"//Living + var/a_intent = INTENT_HELP//Living + var/m_intent = MOVE_INTENT_RUN//Living var/lastKnownIP = null var/atom/movable/buckled = null//Living var/obj/item/l_hand = null//Living @@ -122,6 +120,7 @@ var/has_enabled_antagHUD = 0 var/antagHUD = 0 + var/can_change_intents = 1 //all mobs can change intents by default. //Generic list for proc holders. Only way I can see to enable certain verbs/procs. Should be modified if needed. var/proc_holder_list[] = list() @@ -146,7 +145,7 @@ //List of active diseases - var/list/viruses = list() // replaces var/datum/disease/virus + var/list/viruses = list() // list of all diseases in a mob var/list/resistances = list() mouse_drag_pointer = MOUSE_ACTIVE_POINTER @@ -196,5 +195,7 @@ var/list/permanent_huds = list() var/list/actions = list() - + var/list/progressbars = null //for stacking do_after bars + + var/list/tkgrabbed_objects = list() // Assoc list of items to TK grabs diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 624ec318f03..4b41b5084c6 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 + w_class = WEIGHT_CLASS_BULKY /obj/item/weapon/grab/New(var/mob/user, var/mob/victim) @@ -167,9 +167,11 @@ */ + var/breathing_tube = affecting.get_organ_slot("breathing_tube") + if(state >= GRAB_NECK) affecting.Stun(5) //It will hamper your voice, being choked and all. - if(isliving(affecting)) + if(isliving(affecting) && !breathing_tube) var/mob/living/L = affecting L.adjustOxyLoss(1) @@ -177,7 +179,8 @@ //affecting.apply_effect(STUTTER, 5) //would do this, but affecting isn't declared as mob/living for some stupid reason. affecting.Stuttering(5) //It will hamper your voice, being choked and all. affecting.Weaken(5) //Should keep you down unless you get help. - affecting.AdjustLoseBreath(2, bound_lower = 0, bound_upper = 3) + if(!breathing_tube) + affecting.AdjustLoseBreath(2, bound_lower = 0, bound_upper = 3) adjust_position() @@ -290,7 +293,8 @@ msg_admin_attack("[key_name(assailant)] strangled (kill intent) [key_name(affecting)]") assailant.next_move = world.time + 10 - affecting.AdjustLoseBreath(1) + if(!affecting.get_organ_slot("breathing_tube")) + affecting.AdjustLoseBreath(1) affecting.setDir(WEST) adjust_position() @@ -316,7 +320,7 @@ var/mob/living/carbon/human/affected = affecting var/mob/living/carbon/human/attacker = assailant switch(assailant.a_intent) - if(I_HELP) + if(INTENT_HELP) /*if(force_down) to_chat(assailant, "You no longer pin [affecting] to the ground.") force_down = 0 @@ -324,10 +328,10 @@ //This specific example would allow you to stop pinning people to the floor without moving away from them. return - if(I_GRAB) + if(INTENT_GRAB) return - if(I_HARM) //This checks that the user is on harm intent. + if(INTENT_HARM) //This checks that the user is on harm intent. if(last_hit_zone == "head") //This checks the hitzone the user has selected. In this specific case, they have the head selected. if(affecting.lying) return @@ -368,7 +372,7 @@ //This specific example would allow you to squish people's eyes with a GRAB_NECK. - if(I_DISARM) //This checks that the user is on disarm intent. + if(INTENT_DISARM) //This checks that the user is on disarm intent. /* if(state < GRAB_AGGRESSIVE) to_chat(assailant, "You require a better grab to do this.") return diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 6c443b4aa30..43b12417215 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -16,11 +16,9 @@ return 0 /mob/living/carbon/human/isSynthetic() - // If they are 100% robotic, they count as synthetic. - for(var/obj/item/organ/external/E in bodyparts) - if(!(E.status & ORGAN_ROBOT)) - return 0 - return 1 + if(get_species() == "Machine") + return 1 + return 0 /mob/proc/get_screen_colour() @@ -244,7 +242,7 @@ proc/slur(phrase, var/list/slurletters = ("'"))//use a different list as an inpu return sanitize(copytext(t,1,MAX_MESSAGE_LEN)) -proc/Gibberish(t, p)//t is the inputted message, and any value higher than 70 for p will cause letters to be replaced instead of added +/proc/Gibberish(t, p)//t is the inputted message, and any value higher than 70 for p will cause letters to be replaced instead of added /* Turn text into complete gibberish! */ var/returntext = "" for(var/i = 1, i <= length(t), i++) @@ -319,50 +317,51 @@ proc/muffledspeech(phrase) return 0 //converts intent-strings into numbers and back -var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM) +var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM) /proc/intent_numeric(argument) if(istext(argument)) switch(argument) - if(I_HELP) return 0 - if(I_DISARM) return 1 - if(I_GRAB) return 2 + if(INTENT_HELP) return 0 + if(INTENT_DISARM) return 1 + if(INTENT_GRAB) return 2 else return 3 else switch(argument) - if(0) return I_HELP - if(1) return I_DISARM - if(2) return I_GRAB - else return I_HARM + if(0) return INTENT_HELP + if(1) return INTENT_DISARM + if(2) return INTENT_GRAB + else return INTENT_HARM //change a mob's act-intent. Input the intent as a string such as "help" or use "right"/"left /mob/verb/a_intent_change(input as text) set name = "a-intent" set hidden = 1 - if(ishuman(src) || isalienadult(src) || isbrain(src)) - switch(input) - if(I_HELP,I_DISARM,I_GRAB,I_HARM) - a_intent = input - if("right") - a_intent = intent_numeric((intent_numeric(a_intent)+1) % 4) - if("left") - a_intent = intent_numeric((intent_numeric(a_intent)+3) % 4) - if(hud_used && hud_used.action_intent) - hud_used.action_intent.icon_state = "[a_intent]" + if(can_change_intents) + if(ishuman(src) || isalienadult(src) || isbrain(src)) + switch(input) + if(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM) + a_intent = input + if("right") + a_intent = intent_numeric((intent_numeric(a_intent)+1) % 4) + if("left") + a_intent = intent_numeric((intent_numeric(a_intent)+3) % 4) + if(hud_used && hud_used.action_intent) + hud_used.action_intent.icon_state = "[a_intent]" - else if(isrobot(src) || islarva(src)) - switch(input) - if(I_HELP) - a_intent = I_HELP - if(I_HARM) - a_intent = I_HARM - if("right","left") - a_intent = intent_numeric(intent_numeric(a_intent) - 3) - if(hud_used && hud_used.action_intent) - if(a_intent == I_HARM) - hud_used.action_intent.icon_state = "harm" - else - hud_used.action_intent.icon_state = "help" + else if(isrobot(src) || islarva(src)) + switch(input) + if(INTENT_HELP) + a_intent = INTENT_HELP + if(INTENT_HARM) + a_intent = INTENT_HARM + if("right","left") + a_intent = intent_numeric(intent_numeric(a_intent) - 3) + if(hud_used && hud_used.action_intent) + if(a_intent == INTENT_HARM) + hud_used.action_intent.icon_state = "harm" + else + hud_used.action_intent.icon_state = "help" /mob/living/verb/mob_sleep() diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index cef870811db..20e08001754 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -15,21 +15,27 @@ return 1 return (!mover.density || !density || lying) +//The byond version of these verbs wait for the next tick before acting. +// instant verbs however can run mid tick or even during the time between ticks. +/client/verb/moveup() + set name = ".moveup" + set instant = 1 + Move(get_step(mob, NORTH), NORTH) -/client/North() - ..() +/client/verb/movedown() + set name = ".movedown" + set instant = 1 + Move(get_step(mob, SOUTH), SOUTH) +/client/verb/moveright() + set name = ".moveright" + set instant = 1 + Move(get_step(mob, EAST), EAST) -/client/South() - ..() - - -/client/West() - ..() - - -/client/East() - ..() +/client/verb/moveleft() + set name = ".moveleft" + set instant = 1 + Move(get_step(mob, WEST), WEST) /client/Northeast() @@ -105,12 +111,11 @@ /client/verb/toggle_throw_mode() set hidden = 1 - if(!istype(mob, /mob/living/carbon)) - return - if(!mob.stat && isturf(mob.loc) && !mob.restrained()) - mob:toggle_throw_mode() + if(iscarbon(mob)) + var/mob/living/carbon/C = mob + C.toggle_throw_mode() else - return + to_chat(usr, "This mob type cannot throw items.") /client/verb/drop_item() @@ -134,37 +139,38 @@ /client/proc/Move_object(direct) if(mob && mob.control_object) if(mob.control_object.density) - step(mob.control_object,direct) - if(!mob.control_object) return - mob.control_object.dir = direct + step(mob.control_object, direct) + if(!mob.control_object) + return + mob.control_object.setDir(direct) else - mob.control_object.forceMove(get_step(mob.control_object,direct)) + mob.control_object.forceMove(get_step(mob.control_object, direct)) return /client/Move(n, direct) + if(world.time < move_delay) + return - if(viewingCanvas) - view = world.view //Reset the view - winset(src, "mapwindow.map", "icon-size=[src.reset_stretch]") - viewingCanvas = 0 - mob.reset_perspective() - if(mob.hud_used) - mob.hud_used.show_hud(HUD_STYLE_STANDARD) + move_delay = world.time + world.tick_lag //this is here because Move() can now be called multiple times per tick + if(!mob || !mob.loc) + return 0 - if(mob.control_object) Move_object(direct) + if(mob.notransform) + return 0 //This is sota the goto stop mobs from moving var - if(world.time < move_delay) return + if(mob.control_object) + return Move_object(direct) - if(!isliving(mob)) return mob.Move(n,direct) + if(!isliving(mob)) + return mob.Move(n, direct) - if(moving) return 0 + if(mob.stat == DEAD) + mob.ghostize() + return 0 - if(!mob) return - - if(mob.stat==DEAD) return - - if(mob.notransform) return//This is sota the goto stop mobs from moving var + if(moving) + return 0 if(isliving(mob)) var/mob/living/L = mob @@ -172,126 +178,105 @@ Process_Incorpmove(direct) return - if(Process_Grab()) return - - if(mob.buckled) //if we're buckled to something, tell it we moved. - return mob.buckled.relaymove(mob, direct) - - if(mob.remote_control) //we're controlling something, our movement is relayed to it + if(mob.remote_control) //we're controlling something, our movement is relayed to it return mob.remote_control.relaymove(mob, direct) if(isAI(mob)) if(istype(mob.loc, /obj/item/device/aicard)) var/obj/O = mob.loc - return O.relaymove(mob, direct) //aicards have special relaymove stuff - return AIMove(n,direct,mob) + return O.relaymove(mob, direct) // aicards have special relaymove stuff + return AIMove(n, direct, mob) + + + if(Process_Grab()) + return + + if(mob.buckled) //if we're buckled to something, tell it we moved. + return mob.buckled.relaymove(mob, direct) if(!mob.canmove) return - //if(istype(mob.loc, /turf/space) || (mob.flags & NOGRAV)) - // if(!mob.Process_Spacemove(0)) return 0 - if(!mob.lastarea) mob.lastarea = get_area(mob.loc) - if(isobj(mob.loc) || ismob(mob.loc))//Inside an object, tell it we moved + if(isobj(mob.loc) || ismob(mob.loc)) //Inside an object, tell it we moved var/atom/O = mob.loc return O.relaymove(mob, direct) - - if(istype(mob.get_active_hand(), /obj/item)) - var/obj/item/I = mob.get_active_hand() - I.moved(mob, n, direct) - + if(!mob.Process_Spacemove(direct)) - return 0 + return 0 - if(isturf(mob.loc)) - - if(mob.restrained())//Why being pulled while cuffed prevents you from moving - for(var/mob/M in range(mob, 1)) - if(M.pulling == mob) - if(!M.restrained() && M.stat == 0 && M.canmove && mob.Adjacent(M)) - to_chat(src, "You're restrained! You can't move!") - return 0 - else - M.stop_pulling() - - if(mob.pinned.len) - to_chat(src, "You're pinned to a wall by [mob.pinned[1]]!") - return 0 - - var/turf/T = mob.loc - move_delay = world.time//set move delay - move_delay += T.slowdown - mob.last_movement = world.time - switch(mob.m_intent) - if("run") - if(mob.drowsyness > 0) - move_delay += 6 - move_delay += 1+config.run_speed - if("walk") - move_delay += 1+config.walk_speed - move_delay += mob.movement_delay() - - if(config.Tickcomp) - move_delay -= 1.3 - var/tickcomp = ((1/(world.tick_lag))*1.3) - move_delay = move_delay + tickcomp - - //We are now going to move - moving = 1 - //Something with pulling things - if(locate(/obj/item/weapon/grab, mob)) - move_delay = max(move_delay, world.time + 7) - var/list/L = mob.ret_grab() - if(istype(L, /list)) - if(L.len == 2) - L -= mob - var/mob/M = L[1] - if(M) - if((get_dist(mob, M) <= 1 || M.loc == mob.loc)) - . = ..() - if(isturf(M.loc)) - var/diag = get_dir(mob, M) - if((diag - 1) & diag) - else - diag = null - if((get_dist(mob, M) > 1 || diag)) - step(M, get_dir(M.loc, T)) + if(mob.restrained()) // Why being pulled while cuffed prevents you from moving + for(var/mob/M in orange(1, mob)) + if(M.pulling == mob) + if(!M.incapacitated() && mob.Adjacent(M)) + to_chat(src, "You're restrained! You can't move!") + move_delay = world.time + 10 + return 0 else - for(var/mob/M in L) - M.other_mobs = 1 - if(mob != M) - M.animate_movement = 3 - for(var/mob/M in L) - spawn( 0 ) - step(M, direct) - return - spawn( 1 ) - M.other_mobs = null - M.animate_movement = 2 - return + M.stop_pulling() - else if(mob.confused) - step(mob, pick(cardinal)) - else - . = ..() - for(var/obj/item/weapon/grab/G in mob) - if(G.state == GRAB_NECK) - mob.setDir(reverse_dir[direct]) - G.adjust_position() - for(var/obj/item/weapon/grab/G in mob.grabbed_by) - G.adjust_position() + //We are now going to move + moving = 1 + move_delay = mob.movement_delay() + world.time + mob.last_movement = world.time + + if(locate(/obj/item/weapon/grab, mob)) + move_delay = max(move_delay, world.time + 7) + var/list/L = mob.ret_grab() + if(istype(L, /list)) + if(L.len == 2) + L -= mob + var/mob/M = L[1] + if(M) + if((get_dist(mob, M) <= 1 || M.loc == mob.loc)) + var/turf/prev_loc = mob.loc + . = ..() + if(M && isturf(M.loc)) // Mob may get deleted during parent call + var/diag = get_dir(mob, M) + if((diag - 1) & diag) + else + diag = null + if((get_dist(mob, M) > 1 || diag)) + step(M, get_dir(M.loc, prev_loc)) + else + for(var/mob/M in L) + M.other_mobs = 1 + if(mob != M) + M.animate_movement = 3 + for(var/mob/M in L) + spawn(0) + step(M, direct) + return + spawn(1) + M.other_mobs = null + M.animate_movement = 2 + return + + else if(mob.confused) + step(mob, pick(cardinal)) + else + . = ..() + + for(var/obj/item/weapon/grab/G in mob) + if(G.state == GRAB_NECK) + mob.setDir(reverse_dir[direct]) + G.adjust_position() + for(var/obj/item/weapon/grab/G in mob.grabbed_by) + G.adjust_position() + + moving = 0 + if(mob && .) + if(mob.throwing) + mob.throwing.finalize(FALSE) + + for(var/obj/O in mob) + O.on_mob_move(direct, mob) - moving = 0 - if(mob && .) - mob.throwing = 0 - return . - return ///Process_Grab() @@ -408,13 +393,13 @@ var/atom/movable/backup = get_spacemove_backup() if(backup) if(istype(backup) && movement_dir && !backup.anchored) - if(backup.newtonian_move(turn(movement_dir, 180))) //You're pushing off something movable, so it moves - src << "You push off of [backup] to propel yourself." + var/opposite_dir = turn(movement_dir, 180) + if(backup.newtonian_move(opposite_dir)) //You're pushing off something movable, so it moves + to_chat(src, "You push off of [backup] to propel yourself.") return 1 return 0 /mob/get_spacemove_backup() - var/atom/movable/dense_object_backup for(var/A in orange(1, get_turf(src))) if(isarea(A)) continue @@ -434,9 +419,7 @@ return AM if(pulling == AM) continue - dense_object_backup = AM - break - . = dense_object_backup + . = AM /mob/proc/mob_has_gravity(turf/T) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 58c5ee4104d..c104d4e8ae6 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -302,7 +302,9 @@ AnnounceArrival(character, rank, join_message) callHook("latespawn", list(character)) - + var/datum/job/thisjob = job_master.GetJob(rank) + if(!thisjob.is_position_available() && thisjob in job_master.prioritized_jobs) + job_master.prioritized_jobs -= thisjob qdel(src) @@ -362,6 +364,18 @@ else if(shuttle_master.emergency.mode >= SHUTTLE_CALL) dat += "The station is currently undergoing evacuation procedures.
    " + if(length(job_master.prioritized_jobs)) + dat += "The station has flagged these jobs as high priority: " + var/amt = length(job_master.prioritized_jobs) + var/amt_count + for(var/datum/job/a in job_master.prioritized_jobs) + amt_count++ + if(amt_count != amt) + dat += " [a.title], " + else + dat += " [a.title].
    " + + dat += "Choose from the following open positions:

    " var/list/activePlayers = list() @@ -410,7 +424,10 @@ dat += "
    " dat += "[jobcat]" for(var/datum/job/job in categorizedJobs[jobcat]["jobs"]) - dat += "[job.title] ([job.current_positions]) (Active: [activePlayers[job]])
    " + if(job in job_master.prioritized_jobs) + dat += "[job.title] ([job.current_positions]) (Active: [activePlayers[job]])
    " + else + dat += "[job.title] ([job.current_positions]) (Active: [activePlayers[job]])
    " dat += "

    " dat += "
    Head:[(head && !(head.flags&ABSTRACT)) ? head : "Empty"]
     ↳Headpocket:Obscured
     ↳Headpocket:Dislodge Items
     ↳Headpocket:Empty
    Mask:Obscured
    " diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index e8899ef6123..9a2ea2e3499 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -658,6 +658,20 @@ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-med"), ICON_OVERLAY) if(4) clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(CORONER) + clothes_s = new /icon(uniform_dmi, "medical_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) + if(prob(1)) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "mortician"), ICON_OVERLAY) + else + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "medicalpack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-med"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) if(GENETICIST) clothes_s = new /icon(uniform_dmi, "geneticswhite_s") clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) diff --git a/code/modules/mob/pulling.dm b/code/modules/mob/pulling.dm index 6a6a66675b0..5a532ee1a42 100644 --- a/code/modules/mob/pulling.dm +++ b/code/modules/mob/pulling.dm @@ -15,7 +15,11 @@ return stop_pulling() - src.pulling = AM + if(AM.pulledby) + visible_message("[src] has pulled [AM] from [AM.pulledby]'s grip.") + AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once. + + pulling = AM AM.pulledby = src if(pullin) pullin.update_icon(src) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index c21733a7a39..51890a7337f 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -128,7 +128,7 @@ if("Drone") new_xeno = new /mob/living/carbon/alien/humanoid/drone(loc) - new_xeno.a_intent = I_HARM + new_xeno.a_intent = INTENT_HARM new_xeno.key = key to_chat(new_xeno, "You are now an alien.") @@ -187,7 +187,7 @@ qdel(t) var/mob/living/simple_animal/pet/corgi/new_corgi = new /mob/living/simple_animal/pet/corgi (loc) - new_corgi.a_intent = I_HARM + new_corgi.a_intent = INTENT_HARM new_corgi.key = key to_chat(new_corgi, "You are now a Corgi. Yap Yap!") @@ -218,7 +218,7 @@ var/mob/new_mob = new mobpath(src.loc) new_mob.key = key - new_mob.a_intent = I_HARM + new_mob.a_intent = INTENT_HARM to_chat(new_mob, "You suddenly feel more... animalistic.") @@ -235,7 +235,7 @@ var/mob/new_mob = new mobpath(src.loc) new_mob.key = key - new_mob.a_intent = I_HARM + new_mob.a_intent = INTENT_HARM to_chat(new_mob, "You feel more... animalistic") new_mob.update_pipe_vision() diff --git a/code/modules/modular_computers/file_system/programs/generic/file_browser.dm b/code/modules/modular_computers/file_system/programs/generic/file_browser.dm index 20c4e92fd98..a868c0958ea 100644 --- a/code/modules/modular_computers/file_system/programs/generic/file_browser.dm +++ b/code/modules/modular_computers/file_system/programs/generic/file_browser.dm @@ -43,7 +43,7 @@ if(!istype(file)) data["error"] = "I/O ERROR: Unable to open file." else - data["filedata"] = pencode_to_html(file.stored_data, sign = 0, fields = 0) + data["filedata"] = pencode_to_html(file.stored_data, format = 1, sign = 0, fields = 0) data["filename"] = "[file.filename].[file.filetype]" else if(!computer || !HDD) diff --git a/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm index bfb90ab881b..7460d357b21 100644 --- a/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm +++ b/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm @@ -213,8 +213,7 @@ if("PRG_deletechannel") . = 1 if(channel && ((channel.operator == src) || netadmin_mode)) - qdel(channel) - channel = null + QDEL_NULL(channel) if("PRG_setpassword") . = 1 if(!channel || ((channel.operator != src) && !netadmin_mode)) @@ -228,4 +227,4 @@ if(newpassword == "nopassword") channel.password = "" else - channel.password = newpassword \ No newline at end of file + channel.password = newpassword diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm index 2a6cb6f18a6..81281fe3dcc 100644 --- a/code/modules/modular_computers/laptop_vendor.dm +++ b/code/modules/modular_computers/laptop_vendor.dm @@ -31,12 +31,8 @@ /obj/machinery/lapvend/proc/reset_order() state = 0 devtype = 0 - if(fabricated_laptop) - qdel(fabricated_laptop) - fabricated_laptop = null - if(fabricated_tablet) - qdel(fabricated_tablet) - fabricated_tablet = null + QDEL_NULL(fabricated_laptop) + QDEL_NULL(fabricated_tablet) dev_cpu = 1 dev_battery = 1 dev_disk = 1 @@ -303,4 +299,4 @@ obj/machinery/lapvend/attackby(obj/item/I, mob/user) T.time = worldtime2text() vendor_account.transaction_log.Add(T) return 1 - return 0 \ No newline at end of file + return 0 diff --git a/code/modules/nano/interaction/inventory.dm b/code/modules/nano/interaction/inventory.dm index ccfbb695a99..cbe5165e5ff 100644 --- a/code/modules/nano/interaction/inventory.dm +++ b/code/modules/nano/interaction/inventory.dm @@ -4,7 +4,7 @@ /var/global/datum/topic_state/inventory_state/inventory_state = new() /datum/topic_state/inventory_state/can_use_topic(var/src_object, var/mob/user) - if(!(src_object in user)) + if(!((src_object in user) || user.is_in_active_hand(src_object) || user.is_in_inactive_hand(src_object))) return STATUS_CLOSE return user.shared_nano_interaction() diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index 1622fe1700e..8b749a67903 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -178,6 +178,7 @@ nanoui is used to open and update nano browser uis var/name = "[src_object]" var/list/config_data = list( "title" = title, + "map" = MAP_NAME, "srcObject" = list("name" = name), "stateKey" = state_key, "status" = status, diff --git a/code/modules/ninja/martial_art.dm b/code/modules/ninja/martial_art.dm index 35969ab8d5e..a17b2c00952 100644 --- a/code/modules/ninja/martial_art.dm +++ b/code/modules/ninja/martial_art.dm @@ -45,8 +45,8 @@ /datum/martial_art/ninja_martial_art/teach(var/mob/living/carbon/human/H,var/make_temporary=0) ..() H.middleClickOverride = new /datum/middleClickOverride/ninja_martial_art() - to_chat(H, "You have been taugh the ways of the Creeping Widow.
    \) - Your stikes on harm intent will deal more damage.
    Using middle mouse button on a nearby person while on harm intent will send them flying backwards.
    \ + to_chat(H, "You have been taught the ways of the Creeping Widow.
    \) + Your strikes on harm intent will deal more damage.
    Using middle mouse button on a nearby person while on harm intent will send them flying backwards.
    \ Your grabs will instantly be aggressive while you are using this style.
    Using middle mouse button while on harm intent and behind a person will put them in a silencing choke hold.
    \ Using middle mouse button on a nearby person while on disarm intent will wrench their wrist, causing them to drop what they are holding." @@ -76,7 +76,7 @@ return 0 if(has_choke_hold) // Are we already choking someone? - to_chat(A, "You are have a target in your grip!") + to_chat(A, "You already have a target in your grip!") return 0 has_choke_hold = 1 @@ -98,8 +98,8 @@ D.silent += 1 D.adjustOxyLoss(1) else - D.visible_message("[A] loses his grip on [D]'s neck!", \ - "[A] loses his grip on your neck!") + D.visible_message("[A] loses \his grip on [D]'s neck!", \ + "[A] loses \his grip on your neck!") has_choke_hold = 0 return 0 I++ @@ -162,7 +162,7 @@ if(!istype(A, /mob/living/carbon/human)) // Special moves only work on humans. user.pointed(A) return 0 - if(user.a_intent == "help") // No special move for help intent. + if(user.a_intent == INTENT_HELP) // No special move for help intent. user.pointed(A) return 0 if(!(A in range(1,user))) // Is the target within one tile of us? @@ -173,10 +173,10 @@ var/mob/living/carbon/human/target = A switch(user.a_intent) - if("disarm") + if(INTENT_DISARM) user_martial_art.wrist_wrench(user, target) - if("grab") + if(INTENT_GRAB) user_martial_art.choke_hold(user, target) - if("harm") + if(INTENT_HARM) user_martial_art.palm_strike(user, target) - return 1 \ No newline at end of file + return 1 diff --git a/code/modules/ninja/suit/suit_initialisation.dm b/code/modules/ninja/suit/suit_initialisation.dm index 9954281b06f..59303b4707c 100644 --- a/code/modules/ninja/suit/suit_initialisation.dm +++ b/code/modules/ninja/suit/suit_initialisation.dm @@ -28,9 +28,8 @@ sleep(10) to_chat(usr, "Disconnecting neural-net interface... Success.") - if(usr.hud_used) - qdel(usr.hud_used) - usr.hud_used = null + + QDEL_NULL(usr.hud_used) usr.create_mob_hud() usr.regenerate_icons() @@ -64,9 +63,8 @@ sleep(5) to_chat(usr, "Suit secured, extending neural-net interface...") - if(usr.hud_used) - qdel(usr.hud_used) - usr.hud_used = null + + QDEL_NULL(usr.hud_used) usr.hud_used = new /datum/hud/human(usr, 'icons/mob/screen_ninja.dmi', "#ffffff", 255) if(usr.hud_used) usr.hud_used.show_hud(usr.hud_used.hud_version) @@ -91,4 +89,4 @@ to_chat(usr, "NOTICE: Suit de-activation protocals aborted.") else to_chat(usr, "FĆAL �Rr�R: ŧer nt recgnized, c-cntr-r䣧-ç äcked.") - return \ No newline at end of file + return diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index a5c64adc7ea..da26fc96fec 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -4,7 +4,7 @@ icon_state = "clipboard" item_state = "clipboard" throwforce = 0 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL throw_speed = 3 throw_range = 10 var/obj/item/weapon/pen/haspen //The stored pen. diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 00458df575c..214c284f206 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -3,7 +3,7 @@ desc = "A folder." icon = 'icons/obj/bureaucracy.dmi' icon_state = "folder" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL pressure_resistance = 2 burn_state = FLAMMABLE @@ -121,4 +121,3 @@ ..() new /obj/item/documents/syndicate/blue(src) update_icon() - diff --git a/code/modules/paperwork/frames.dm b/code/modules/paperwork/frames.dm index 1e16049f4b8..067c9abcdd6 100644 --- a/code/modules/paperwork/frames.dm +++ b/code/modules/paperwork/frames.dm @@ -43,10 +43,10 @@ overlays |= icon_state /obj/item/weapon/picture_frame/proc/insert(obj/D) - if(istype(D, /obj/item/weapon/contraband/poster)) - var/obj/item/weapon/contraband/poster/P = D - displayed = P.resulting_poster - P.resulting_poster = null + if(istype(D, /obj/item/weapon/poster)) + var/obj/item/weapon/poster/P = D + displayed = P.poster_structure + P.poster_structure = null else displayed = D @@ -54,7 +54,7 @@ displayed.pixel_x = 0 displayed.pixel_y = 0 displayed.forceMove(src) - if(istype(D, /obj/item/weapon/contraband/poster)) + if(istype(D, /obj/item/weapon/poster)) qdel(D) /obj/item/weapon/picture_frame/attackby(obj/item/I, mob/user) @@ -85,7 +85,7 @@ O.forceMove(user.loc) displayed = null qdel(src) - else if(istype(I, /obj/item/weapon/paper) || istype(I, /obj/item/weapon/photo) || istype(I, /obj/item/weapon/contraband/poster)) + else if(istype(I, /obj/item/weapon/paper) || istype(I, /obj/item/weapon/photo) || istype(I, /obj/item/weapon/poster)) if(!displayed) user.unEquip(I) insert(I) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 60a501f1ecf..cd5b065b3ca 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -10,7 +10,7 @@ icon_state = "paper" item_state = "paper" throwforce = 0 - w_class = 1 + w_class = WEIGHT_CLASS_TINY throw_range = 1 throw_speed = 1 layer = 4 @@ -203,7 +203,7 @@ /obj/item/weapon/paper/proc/parsepencode(var/t, var/obj/item/weapon/pen/P, mob/user as mob) - t = pencode_to_html(t, usr, P, TRUE, TRUE, deffont, signfont, crayonfont) + t = pencode_to_html(t, usr, P, TRUE, TRUE, TRUE, deffont, signfont, crayonfont) //Count the fields var/laststart = 1 diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index da20ed65dde..f5d10cef156 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -5,7 +5,7 @@ icon_state = "paper" item_state = "paper" throwforce = 0 - w_class = 1 + w_class = WEIGHT_CLASS_TINY throw_range = 2 throw_speed = 1 layer = 4 @@ -87,7 +87,7 @@ user.visible_message("[class][user] burns right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.", \ "[class]You burn right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.") - if(user.get_inactive_hand() == src) + if(user.is_in_inactive_hand(src)) user.unEquip(src) new /obj/effect/decal/cleanable/ash(get_turf(src)) @@ -241,4 +241,4 @@ if(photo) desc += "\nThere is a photo attached to it." overlays += image('icons/obj/bureaucracy.dmi', "clip") - return \ No newline at end of file + return diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 89ba611f33c..efcce443d6c 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -4,7 +4,7 @@ icon_state = "paper_bin1" item_state = "sheet-metal" throwforce = 1 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL throw_speed = 3 throw_range = 7 pressure_resistance = 8 diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 3b8a10ffbc0..d93281f2468 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -17,7 +17,7 @@ item_state = "pen" slot_flags = SLOT_BELT | SLOT_EARS throwforce = 0 - w_class = 1 + w_class = WEIGHT_CLASS_TINY throw_speed = 3 throw_range = 7 materials = list(MAT_METAL=10) @@ -124,7 +124,7 @@ */ /obj/item/weapon/pen/sleepy flags = OPENCONTAINER - origin_tech = "materials=2;syndicate=5" + origin_tech = "engineering=4;syndicate=2" /obj/item/weapon/pen/sleepy/attack(mob/living/M, mob/user) @@ -146,7 +146,7 @@ * (Alan) Edaggers */ /obj/item/weapon/pen/edagger - origin_tech = "combat=3;syndicate=5" + origin_tech = "combat=3;syndicate=1" attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") //these wont show up if the pen is off var/on = 0 @@ -155,10 +155,10 @@ on = 0 force = initial(force) sharp = 0 - edge = 0 w_class = initial(w_class) name = initial(name) hitsound = initial(hitsound) + embed_chance = initial(embed_chance) throwforce = initial(throwforce) playsound(user, 'sound/weapons/saberoff.ogg', 5, 1) to_chat(user, "[src] can now be concealed.") @@ -166,10 +166,10 @@ on = 1 force = 18 sharp = 1 - edge = 1 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL name = "energy dagger" hitsound = 'sound/weapons/blade1.ogg' + embed_chance = 100 //rule of cool throwforce = 35 playsound(user, 'sound/weapons/saberon.ogg', 5, 1) to_chat(user, "[src] is now active.") @@ -200,4 +200,4 @@ add_logs(user, P, "used poison pen on") to_chat(user, "You apply the poison to [P].") else - to_chat(user, "[src] clicks. It seems to be depleted.") \ No newline at end of file + to_chat(user, "[src] clicks. It seems to be depleted.") diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index a9e232560fc..5797107e502 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -15,7 +15,7 @@ desc = "A camera film cartridge. Insert it into a camera to reload it." icon_state = "film" item_state = "electropack" - w_class = 1 + w_class = WEIGHT_CLASS_TINY burn_state = FLAMMABLE @@ -27,7 +27,7 @@ icon = 'icons/obj/items.dmi' icon_state = "photo" item_state = "paper" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL burn_state = FLAMMABLE burntime = 5 var/blueprints = 0 // Does this have the blueprints? @@ -64,7 +64,7 @@ user.visible_message("[class][user] burns right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.", \ "[class]You burn right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.") - if(user.get_inactive_hand() == src) + if(user.is_in_inactive_hand(src)) user.unEquip(src) new /obj/effect/decal/cleanable/ash(get_turf(src)) @@ -146,7 +146,7 @@ desc = "A polaroid camera. 10 photos left." icon_state = "camera" item_state = "electropack" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL slot_flags = SLOT_BELT var/list/matter = list("metal" = 2000) var/pictures_max = 10 @@ -508,7 +508,7 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s desc = "video camera that can send live feed to the entertainment network." icon_state = "videocam" item_state = "videocam" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL slot_flags = SLOT_BELT materials = list(MAT_METAL=2000) var/on = 0 diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index 26e397039d8..2ca25bf185f 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -5,7 +5,7 @@ icon_state = "stamp-ok" item_state = "stamp" throwforce = 0 - w_class = 1 + w_class = WEIGHT_CLASS_TINY throw_speed = 3 throw_range = 7 materials = list(MAT_METAL=60) @@ -105,4 +105,4 @@ if(chosen_stamp) name = chosen_stamp.name icon_state = chosen_stamp.icon_state - item_color = chosen_stamp.item_color \ No newline at end of file + item_color = chosen_stamp.item_color diff --git a/code/modules/pda/PDA.dm b/code/modules/pda/PDA.dm index 3ff11689078..9b0413b94ee 100755 --- a/code/modules/pda/PDA.dm +++ b/code/modules/pda/PDA.dm @@ -10,8 +10,9 @@ var/global/list/obj/item/device/pda/PDAs = list() icon = 'icons/obj/pda.dmi' icon_state = "pda" item_state = "electronic" - w_class = 1 + w_class = WEIGHT_CLASS_TINY slot_flags = SLOT_ID | SLOT_BELT | SLOT_PDA + origin_tech = "programming=2" //Main variables var/owner = null @@ -302,21 +303,29 @@ var/global/list/obj/item/device/pda/PDAs = list() /obj/item/device/pda/AltClick(mob/user) ..() - if(issilicon(usr)) + if(issilicon(user)) return if(can_use(user)) if(id) - remove_id() + remove_id(user) else to_chat(user, "This PDA does not have an ID in it!") -/obj/item/device/pda/proc/remove_id() +/obj/item/device/pda/CtrlClick(mob/user) + ..() + if(issilicon(user)) + return + + if(can_use(user)) + remove_pen(user) + +/obj/item/device/pda/proc/remove_id(mob/user) if(id) if(ismob(loc)) var/mob/M = loc M.put_in_hands(id) - to_chat(usr, "You remove the ID from the [name].") + to_chat(user, "You remove the ID from the [name].") else id.forceMove(get_turf(src)) overlays -= image('icons/goonstation/objects/pda_overlay.dmi', id.icon_state) @@ -332,36 +341,37 @@ var/global/list/obj/item/device/pda/PDAs = list() if( can_use(usr) ) if(id) - remove_id() + remove_id(usr) else to_chat(usr, "This PDA does not have an ID in it.") else to_chat(usr, "You cannot do this while restrained.") - /obj/item/device/pda/verb/verb_remove_pen() set category = "Object" set name = "Remove pen" set src in usr + remove_pen(usr) - if(issilicon(usr)) +/obj/item/device/pda/proc/remove_pen(mob/user) + + if(issilicon(user)) return - if( can_use(usr) ) + if( can_use(user) ) var/obj/item/weapon/pen/O = locate() in src if(O) + to_chat(user, "You remove the [O] from [src].") if(istype(loc, /mob)) var/mob/M = loc if(M.get_active_hand() == null) M.put_in_hands(O) - to_chat(usr, "You remove \the [O] from \the [src].") return O.forceMove(get_turf(src)) else - to_chat(usr, "This PDA does not have a pen in it.") + to_chat(user, "This PDA does not have a pen in it.") else - to_chat(usr, "You cannot do this while restrained.") - + to_chat(user, "You cannot do this while restrained.") /obj/item/device/pda/proc/id_check(mob/user as mob, choice as num)//To check for IDs; 1 for in-pda use, 2 for out of pda use. if(choice == 1) @@ -502,8 +512,3 @@ var/global/list/obj/item/device/pda/PDAs = list() /obj/item/device/pda/process() if(current_app) current_app.program_process() - -/obj/item/device/pda/hit_check(speed) - if(current_app) - current_app.program_hit_check() - ..() \ No newline at end of file diff --git a/code/modules/pda/cart.dm b/code/modules/pda/cart.dm index 459ae09835a..b432effb8be 100644 --- a/code/modules/pda/cart.dm +++ b/code/modules/pda/cart.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/pda.dmi' icon_state = "cart" item_state = "electronic" - w_class = 1 + w_class = WEIGHT_CLASS_TINY var/obj/item/radio/integrated/radio = null @@ -322,4 +322,4 @@ my_game.hacked = 1 to_chat(user, "TR4P_M45T3R.mod successfully initialized. ToS violated. User Agreement nullified. Gotta pwn them all.") to_chat(user, "You can now create trapped versions of any mob in your collection that will damage hunters who attempt to capture it.") - description_antag = "This copy of Nano-Mob Hunter GO! has been hacked to allow the creation of trap mobs which will cause any PDA that attempts to capture it to shock anyone holding it. Hacked copies of the game will not trigger the trap." \ No newline at end of file + description_antag = "This copy of Nano-Mob Hunter GO! has been hacked to allow the creation of trap mobs which will cause any PDA that attempts to capture it to shock anyone holding it. Hacked copies of the game will not trigger the trap." diff --git a/code/modules/pda/mob_hunt_game_app.dm b/code/modules/pda/mob_hunt_game_app.dm index 9b8e3225976..bec10f782ab 100644 --- a/code/modules/pda/mob_hunt_game_app.dm +++ b/code/modules/pda/mob_hunt_game_app.dm @@ -74,12 +74,6 @@ return scan_nearby() -/datum/data/pda/app/mob_hunter_game/program_hit_check() - if(!pda) - return - for(var/obj/effect/nanomob/hit_mob in get_turf(pda)) - hit_mob.hitby(pda) - /datum/data/pda/app/mob_hunter_game/proc/register_capture(datum/mob_hunt/captured, wild = 0) if(!captured) return 0 diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 03a84d161e5..da56a496947 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -122,7 +122,8 @@ desc = "Heavy-duty switching circuits for power control." icon = 'icons/obj/module.dmi' icon_state = "power_mod" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL + origin_tech = "engineering=2;programming=1" item_state = "electronic" flags = CONDUCT usesound = 'sound/items/Deconstruct.ogg' @@ -621,7 +622,7 @@ if(((stat & BROKEN) || malfhack) \ && !opened \ && ( \ - (W.force >= 5 && W.w_class >= 3.0) \ + (W.force >= 5 && W.w_class >= WEIGHT_CLASS_NORMAL) \ || istype(W,/obj/item/weapon/crowbar) \ ) \ && prob(20) ) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 33aa4931fcc..705e4ad8ed7 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -485,7 +485,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( color = COLOR_RED desc = "A coil of power cable." throwforce = 10 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL throw_speed = 2 throw_range = 5 materials = list(MAT_METAL=10, MAT_GLASS=5) @@ -525,7 +525,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( if(!S) return - if(!(S.status & ORGAN_ROBOT) || user.a_intent != I_HELP || S.open == 2) + if(!(S.status & ORGAN_ROBOT) || user.a_intent != INTENT_HELP || S.open == 2) return ..() if(S.burn_dam) @@ -568,9 +568,9 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( /obj/item/stack/cable_coil/proc/update_wclass() if(amount == 1) - w_class = 1 + w_class = WEIGHT_CLASS_TINY else - w_class = 2 + w_class = WEIGHT_CLASS_SMALL /obj/item/stack/cable_coil/examine(mob/user) if(!..(user, 1)) diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 942ed2ac98a..9832b028270 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -22,13 +22,6 @@ if(maxcharge < amount) return 0 var/power_used = min(maxcharge-charge,amount) - if(crit_fail) - return 0 - if(!prob(reliability)) - minor_fault++ - if(prob(minor_fault)) - crit_fail = 1 - return 0 charge += power_used return power_used @@ -38,8 +31,6 @@ to_chat(user, "[desc]\nThe manufacturer's label states this cell has a power rating of [maxcharge], and that you should not swallow it.\nThe charge meter reads [round(src.percent() )]%.") else to_chat(user, "This power cell has an exciting chrome finish, as it is an uber-capacity cell type! It has a power rating of [maxcharge]!\nThe charge meter reads [round(src.percent() )]%.") - if(crit_fail) - to_chat(user, "This power cell seems to be faulty.") /obj/item/weapon/stock_parts/cell/attack_self(mob/user as mob) src.add_fingerprint(user) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index a1e97bf58d2..323d403d1cb 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -122,6 +122,7 @@ fixture_type = "bulb" sheets_refunded = 1 + // the standard tube light fixture /obj/machinery/light name = "light fixture" @@ -149,6 +150,7 @@ // this is used to calc the probability the light burns out var/rigged = 0 // true if rigged to explode + var/lightmaterials = list(MAT_GLASS=100) //stores the materials the light is made of to stop infinite glass exploit // the smaller bulb light fixture @@ -305,6 +307,7 @@ brightness_range = L.brightness_range brightness_power = L.brightness_power brightness_color = L.brightness_color + lightmaterials = L.materials on = has_power() update() @@ -450,7 +453,7 @@ else if(TK in user.mutations) to_chat(user, "You telekinetically remove the light [fitting].") else - if(user.a_intent == I_DISARM || user.a_intent == I_GRAB) + if(user.a_intent == INTENT_DISARM || user.a_intent == INTENT_GRAB) to_chat(user, "You try to remove the light [fitting], but you burn your hand on it!") var/obj/item/organ/external/affecting = H.get_organ("[user.hand ? "l" : "r" ]_hand") @@ -472,6 +475,7 @@ L.brightness_range = brightness_range L.brightness_power = brightness_power L.brightness_color = brightness_color + L.materials = lightmaterials // light item inherits the switchcount, then zero it L.switchcount = switchcount @@ -500,6 +504,7 @@ L.brightness_range = brightness_range L.brightness_power = brightness_power L.brightness_color = brightness_color + L.materials = lightmaterials // light item inherits the switchcount, then zero it L.switchcount = switchcount @@ -592,11 +597,11 @@ icon = 'icons/obj/lighting.dmi' force = 2 throwforce = 5 - w_class = 1 + w_class = WEIGHT_CLASS_TINY var/status = 0 // LIGHT_OK, LIGHT_BURNED or LIGHT_BROKEN var/base_state var/switchcount = 0 // number of times switched - materials = list(MAT_METAL=60) + materials = list(MAT_GLASS=100) var/rigged = 0 // true if rigged to explode var/brightness_range = 2 //how much light it gives off var/brightness_power = 1 @@ -608,11 +613,10 @@ icon_state = "ltube" base_state = "ltube" item_state = "c_tube" - materials = list(MAT_GLASS=100) brightness_range = 8 /obj/item/weapon/light/tube/large - w_class = 2 + w_class = WEIGHT_CLASS_SMALL name = "large light tube" brightness_range = 15 brightness_power = 2 @@ -623,7 +627,6 @@ icon_state = "lbulb" base_state = "lbulb" item_state = "contvapour" - materials = list(MAT_GLASS=100) brightness_range = 5 brightness_color = "#a0a080" @@ -637,7 +640,6 @@ icon_state = "fbulb" base_state = "fbulb" item_state = "egg4" - materials = list(MAT_GLASS=100) brightness_range = 5 // update the icon state and description of the light @@ -694,7 +696,7 @@ if(!proximity) return if(istype(target, /obj/machinery/light)) return - if(user.a_intent != I_HARM) + if(user.a_intent != INTENT_HARM) return shatter() diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index dea4c4797e8..fa9b61c8059 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -204,7 +204,7 @@ icon = 'icons/obj/power.dmi' icon_state = "sp_base" item_state = "electropack" - w_class = 4 // Pretty big! + w_class = WEIGHT_CLASS_BULKY // Pretty big! anchored = 0 var/tracker = 0 var/glass_type = null diff --git a/code/modules/power/supermatter/sm_shard.dm b/code/modules/power/supermatter/sm_shard.dm index 2ffd5b040ec..d4c1109e16e 100644 --- a/code/modules/power/supermatter/sm_shard.dm +++ b/code/modules/power/supermatter/sm_shard.dm @@ -7,7 +7,7 @@ icon_state = "supermatter" sharp = 1 edge = 1 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL flags = CONDUCT light_color = "#8A8A00" var/brightness = 2 @@ -85,7 +85,7 @@ icon = 'icons/obj/weapons.dmi' icon_state = "tongs" edge = 1 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL flags = CONDUCT var/obj/item/held = null // The item currently being held diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index 7b4b7a0d02e..c4ce808f00d 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -81,4 +81,5 @@ name = "tracker electronics" icon = 'icons/obj/doors/door_assembly.dmi' icon_state = "door_electronics" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL + origin_tech = "engineering=2;programming=1" \ No newline at end of file diff --git a/code/modules/power/treadmill.dm b/code/modules/power/treadmill.dm index 0dc2bbb5f76..5f8f8c1b8e4 100644 --- a/code/modules/power/treadmill.dm +++ b/code/modules/power/treadmill.dm @@ -70,11 +70,11 @@ // a reasonable approximation of movement speed var/mob_speed = M.movement_delay() switch(M.m_intent) - if("run") + if(MOVE_INTENT_RUN) if(M.drowsyness > 0) mob_speed += 6 mob_speed += config.run_speed - 1 - if("walk") + if(MOVE_INTENT_WALK) mob_speed += config.walk_speed - 1 mob_speed = BASE_MOVE_DELAY / max(1, BASE_MOVE_DELAY + mob_speed) speed = min(speed + inertia * mob_speed, mob_speed) diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 924dcac3b4c..71400802ee2 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -6,7 +6,7 @@ flags = CONDUCT slot_flags = SLOT_BELT throwforce = 1 - w_class = 1 + w_class = WEIGHT_CLASS_TINY var/fire_sound = null //What sound should play when this ammo is fired var/caliber = null //Which kind of guns it can be loaded into var/projectile_type = null //The bullet type to create when New() is called @@ -87,7 +87,7 @@ item_state = "syringe_kit" materials = list(MAT_METAL=30000) throwforce = 2 - w_class = 1 + w_class = WEIGHT_CLASS_TINY throw_speed = 4 throw_range = 10 var/list/stored_ammo = list() @@ -192,4 +192,4 @@ var/turf_mag = get_turf(src) for(var/obj/item/ammo in stored_ammo) ammo.forceMove(turf_mag) - stored_ammo -= ammo \ No newline at end of file + stored_ammo -= ammo diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index 3b808c64d53..be46baf1c1b 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -27,7 +27,7 @@ desc = "A .38 bullet casing." caliber = "38" icon_state = "r-casing" - projectile_type = /obj/item/projectile/bullet/weakbullet2/rubber + projectile_type = /obj/item/projectile/bullet/weakbullet2 /obj/item/ammo_casing/c10mm desc = "A 10mm bullet casing." @@ -144,7 +144,7 @@ name = "beanbag slug" desc = "A weak beanbag slug for riot control." icon_state = "bshell" - projectile_type = /obj/item/projectile/bullet/weakbullet/rubber + projectile_type = /obj/item/projectile/bullet/weakbullet materials = list(MAT_METAL=250) diff --git a/code/modules/projectiles/firing.dm b/code/modules/projectiles/firing.dm index 773ed4cff72..08a2104383d 100644 --- a/code/modules/projectiles/firing.dm +++ b/code/modules/projectiles/firing.dm @@ -43,8 +43,7 @@ if(targloc == curloc) if(target) //if the target is right on our location we go straight to bullet_act() target.bullet_act(BB, BB.def_zone) - qdel(BB) - BB = null + QDEL_NULL(BB) return 1 BB.preparePixelProjectile(target, targloc, user, params, spread) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index bba922624f1..1baac918966 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -7,7 +7,7 @@ flags = CONDUCT slot_flags = SLOT_BELT materials = list(MAT_METAL=2000) - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL throwforce = 5 throw_speed = 3 throw_range = 5 @@ -117,7 +117,7 @@ if(flag) //It's adjacent, is the user, or is on the user's person if(target in user.contents) //can't shoot stuff inside us. return - if(!ismob(target) || user.a_intent == "harm") //melee attack + if(!ismob(target) || user.a_intent == INTENT_HARM) //melee attack return if(target == user && user.zone_sel.selecting != "mouth") //so we can't shoot ourselves (unless mouth selected) return @@ -232,7 +232,7 @@ obj/item/weapon/gun/proc/newshot() feedback_add_details("gun_fired","[type]") /obj/item/weapon/gun/attack(mob/M as mob, mob/user) - if(user.a_intent == "harm") //Flogging + if(user.a_intent == INTENT_HARM) //Flogging ..() else return diff --git a/code/modules/projectiles/guns/alien.dm b/code/modules/projectiles/guns/alien.dm index de217a9715d..bf0cd79f322 100644 --- a/code/modules/projectiles/guns/alien.dm +++ b/code/modules/projectiles/guns/alien.dm @@ -3,7 +3,7 @@ desc = "A vicious alien projectile weapon. Parts of it quiver gelatinously, as though the thing is insectile and alive." icon_state = "spikethrower" item_state = "spikethrower" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL fire_sound_text = "a strange noise" mag_type = /obj/item/ammo_box/magazine/internal/spikethrower burst_size = 2 @@ -49,10 +49,8 @@ name = "alloy spike" desc = "A broadhead spike made out of a weird silvery metal." projectile_type = /obj/item/projectile/bullet/spike - sharp = 1 - edge = 0 throwforce = 5 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL caliber = "spike" icon_state = "bolt" fire_sound = 'sound/weapons/bladeslice.ogg' @@ -68,7 +66,7 @@ /obj/item/projectile/bullet/spike/on_hit(atom/target, blocked = 0) if((blocked != 100) && istype(target, /mob/living/carbon/human)) var/mob/living/carbon/human/H = target - H.drip(500) + H.bleed(50) ..() //This gun only functions for armalis. The on-sprite is too huge to render properly on other sprites. @@ -101,6 +99,5 @@ flag = "bullet" pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE - embed = 0 weaken = 5 stun = 5 diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 40356f8a7d9..7a039ca29df 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -3,9 +3,9 @@ desc = "A basic energy-based laser gun that fires concentrated beams of light which pass through glass and thin metal." icon_state = "laser" item_state = "laser" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL materials = list(MAT_METAL=2000) - origin_tech = "combat=3;magnets=2" + origin_tech = "combat=4;magnets=2" ammo_type = list(/obj/item/ammo_casing/energy/lasergun) ammo_x_offset = 1 shaded_charge = 1 @@ -13,6 +13,7 @@ /obj/item/weapon/gun/energy/laser/practice name = "practice laser gun" desc = "A modified version of the basic laser gun, this one fires less concentrated energy bolts designed for target practice." + origin_tech = "combat=2;magnets=2" ammo_type = list(/obj/item/ammo_casing/energy/laser/practice) clumsy_check = 0 needs_permit = 0 @@ -66,11 +67,11 @@ desc = "An advanced laser cannon that does more damage the farther away the target is." icon_state = "lasercannon" item_state = "laser" - w_class = 4 + w_class = WEIGHT_CLASS_BULKY force = 10 flags = CONDUCT slot_flags = SLOT_BACK - origin_tech = "combat=4;materials=3;powerstorage=3" + origin_tech = "combat=4;magnets=4;powerstorage=3" ammo_type = list(/obj/item/ammo_casing/energy/laser/accelerator) ammo_x_offset = 3 @@ -111,7 +112,7 @@ name = "xray laser gun" desc = "A high-power laser gun capable of expelling concentrated xray blasts." icon_state = "xray" - origin_tech = "combat=5;materials=3;magnets=2;syndicate=2" + origin_tech = "combat=6;materials=4;magnets=4;syndicate=1" ammo_type = list(/obj/item/ammo_casing/energy/xray) /obj/item/weapon/gun/energy/immolator @@ -120,7 +121,7 @@ icon_state = "immolator" item_state = "laser" ammo_type = list(/obj/item/ammo_casing/energy/immolator) - origin_tech = "combat=4;materials=4;magnets=3;plasmatech=2" + origin_tech = "combat=4;magnets=4;powerstorage=3" shaded_charge = 1 ////////Laser Tag//////////////////// @@ -130,7 +131,7 @@ icon_state = "bluetag" desc = "Standard issue weapon of the Imperial Guard" ammo_type = list(/obj/item/ammo_casing/energy/laser/bluetag) - origin_tech = "combat=1;magnets=2" + origin_tech = "combat=2;magnets=2" clumsy_check = 0 needs_permit = 0 ammo_x_offset = 2 @@ -141,7 +142,7 @@ icon_state = "redtag" desc = "Standard issue weapon of the Imperial Guard" ammo_type = list(/obj/item/ammo_casing/energy/laser/redtag) - origin_tech = "combat=1;magnets=2" + origin_tech = "combat=2;magnets=2" clumsy_check = 0 needs_permit = 0 ammo_x_offset = 2 diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index 727ebdd7082..3e4838f7e20 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -4,7 +4,7 @@ icon_state = "energy" item_state = null //so the human update icon uses the icon_state instead. ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser) - origin_tech = "combat=3;magnets=2" + origin_tech = "combat=4;magnets=3" modifystate = 2 can_flashlight = 1 ammo_x_offset = 3 @@ -31,7 +31,7 @@ desc = "A small, pistol-sized energy gun with a built-in flashlight. It has two settings: stun and kill." icon_state = "mini" item_state = "gun" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL ammo_x_offset = 2 charge_sections = 3 can_flashlight = 0 // Can't attach or detach the flashlight, and override it's icon update @@ -51,6 +51,7 @@ name = "\improper X-01 MultiPhase Energy Gun" desc = "This is an expensive, modern recreation of an antique laser gun. This gun has several unique firemodes, but lacks the ability to recharge over time." icon_state = "hoslaser" + origin_tech = null force = 10 ammo_type = list(/obj/item/ammo_casing/energy/electrode/hos, /obj/item/ammo_casing/energy/laser/hos, /obj/item/ammo_casing/energy/disabler) ammo_x_offset = 4 @@ -71,7 +72,7 @@ icon_state = "turretlaser" item_state = "turretlaser" slot_flags = null - w_class = 5 + w_class = WEIGHT_CLASS_HUGE ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser) weapon_weight = WEAPON_MEDIUM can_flashlight = 0 @@ -83,51 +84,10 @@ desc = "An energy gun with an experimental miniaturized nuclear reactor that automatically charges the internal power cell." icon_state = "nucgun" item_state = "nucgun" - origin_tech = "combat=3;materials=5;powerstorage=3" + origin_tech = "combat=4;magnets=4;powerstorage=4" var/fail_tick = 0 charge_delay = 5 can_charge = 0 ammo_x_offset = 1 ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser, /obj/item/ammo_casing/energy/disabler) selfcharge = 1 - -/obj/item/weapon/gun/energy/gun/nuclear/process() - if(fail_tick > 0) - fail_tick-- - ..() - -/obj/item/weapon/gun/energy/gun/nuclear/shoot_live_shot() - failcheck() - update_icon() - ..() - -/obj/item/weapon/gun/energy/gun/nuclear/proc/failcheck() - if(!prob(reliability) && istype(loc, /mob/living)) - var/mob/living/M = loc - switch(fail_tick) - if(0 to 200) - fail_tick += (2*(100-reliability)) - M.apply_effect(rand(3,120), IRRADIATE) - to_chat(M, "Your [name] feels warmer.") - if(201 to INFINITY) - processing_objects.Remove(src) - M.apply_effect(300, IRRADIATE) - crit_fail = 1 - to_chat(M, "Your [name]'s reactor overloads!") - -/obj/item/weapon/gun/energy/gun/nuclear/emp_act(severity) - ..() - reliability = max(reliability - round(15/severity), 0) //Do not allow it to go negative! - -/obj/item/weapon/gun/energy/gun/nuclear/update_icon() - ..() - if(crit_fail) - overlays += "[icon_state]_fail_3" - else - switch(fail_tick) - if(0) - overlays += "[icon_state]_fail_0" - if(1 to 150) - overlays += "[icon_state]_fail_1" - if(151 to INFINITY) - overlays += "[icon_state]_fail_2" diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index c155cfb9dff..7ded54f6690 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -3,7 +3,7 @@ desc = "A heavy-duty, multifaceted energy rifle with three modes. Preferred by front-line combat personnel." icon_state = "pulse" item_state = null - w_class = 4 + w_class = WEIGHT_CLASS_BULKY force = 10 flags = CONDUCT slot_flags = SLOT_BACK @@ -25,7 +25,7 @@ /obj/item/weapon/gun/energy/pulse/carbine name = "pulse carbine" desc = "A compact variant of the pulse rifle with less firepower but easier storage." - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL slot_flags = SLOT_BELT icon_state = "pulse_carbine" item_state = "pulse" @@ -37,7 +37,7 @@ /obj/item/weapon/gun/energy/pulse/pistol name = "pulse pistol" desc = "A pulse rifle in an easily concealed handgun package with low capacity." - w_class = 2 + w_class = WEIGHT_CLASS_SMALL slot_flags = SLOT_BELT icon_state = "pulse_pistol" item_state = "gun" @@ -70,3 +70,16 @@ /obj/item/weapon/gun/energy/pulse/pistol/m1911/isHandgun() return 1 + +/obj/item/weapon/gun/energy/pulse/turret + name = "pulse turret gun" + desc = "A heavy, turret-mounted pulse energy cannon." + icon_state = "turretlaser" + item_state = "turretlaser" + slot_flags = null + w_class = WEIGHT_CLASS_HUGE + ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser/pulse) + weapon_weight = WEAPON_MEDIUM + can_flashlight = 0 + trigger_guard = TRIGGER_GUARD_NONE + ammo_x_offset = 2 diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 3595b9c7ea8..ca8d4c1fd3d 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -4,8 +4,8 @@ icon_state = "ionrifle" item_state = null //so the human update icon uses the icon_state instead. fire_sound = 'sound/weapons/IonRifle.ogg' - origin_tech = "combat=2;magnets=4" - w_class = 5 + origin_tech = "combat=4;magnets=4" + w_class = WEIGHT_CLASS_HUGE flags = CONDUCT slot_flags = SLOT_BACK ammo_type = list(/obj/item/ammo_casing/energy/ion) @@ -20,8 +20,7 @@ name = "ion carbine" desc = "The MK.II Prototype Ion Projector is a lightweight carbine version of the larger ion rifle, built to be ergonomic and efficient." icon_state = "ioncarbine" - origin_tech = "combat=4;magnets=4;materials=4" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL slot_flags = SLOT_BELT ammo_x_offset = 2 flight_x_offset = 18 @@ -32,7 +31,7 @@ desc = "A gun that discharges high amounts of controlled radiation to slowly break a target into component elements." icon_state = "decloner" fire_sound = 'sound/weapons/pulse3.ogg' - origin_tech = "combat=5;materials=4;powerstorage=3" + origin_tech = "combat=4;materials=4;biotech=5;plasmatech=6" ammo_type = list(/obj/item/ammo_casing/energy/declone) ammo_x_offset = 1 @@ -49,7 +48,7 @@ item_state = "gun" fire_sound = 'sound/effects/stealthoff.ogg' ammo_type = list(/obj/item/ammo_casing/energy/flora/yield, /obj/item/ammo_casing/energy/flora/mut) - origin_tech = "materials=2;biotech=3;powerstorage=3" + origin_tech = "materials=2;biotech=4" modifystate = 1 ammo_x_offset = 1 selfcharge = 1 @@ -60,7 +59,7 @@ icon = 'icons/obj/guns/projectile.dmi' icon_state = "riotgun" item_state = "c20r" - w_class = 4 + w_class = WEIGHT_CLASS_BULKY ammo_type = list(/obj/item/ammo_casing/energy/meteor) cell_type = /obj/item/weapon/stock_parts/cell/potato clumsy_check = 0 //Admin spawn only, might as well let clowns use it. @@ -74,7 +73,7 @@ item_state = "pen" lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' righthand_file = 'icons/mob/inhands/items_righthand.dmi' - w_class = 1 + w_class = WEIGHT_CLASS_TINY /obj/item/weapon/gun/energy/mindflayer name = "\improper Mind Flayer" @@ -89,9 +88,9 @@ desc = "A weapon favored by syndicate stealth specialists." icon_state = "crossbow" item_state = "crossbow" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL materials = list(MAT_METAL=2000) - origin_tech = "combat=2;magnets=2;syndicate=5" + origin_tech = "combat=4;magnets=4;syndicate=5" suppressed = 1 ammo_type = list(/obj/item/ammo_casing/energy/bolt) weapon_weight = WEAPON_LIGHT @@ -111,9 +110,9 @@ name = "energy crossbow" desc = "A reverse engineered weapon using syndicate technology." icon_state = "crossbowlarge" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL materials = list(MAT_METAL=4000) - origin_tech = "combat=2;magnets=2;syndicate=3" //can be further researched for more syndie tech + origin_tech = "combat=4;magnets=4;syndicate=2" suppressed = 0 ammo_type = list(/obj/item/ammo_casing/energy/bolt/large) @@ -136,7 +135,7 @@ icon_state = "plasmacutter" item_state = "plasmacutter" modifystate = -1 - origin_tech = "combat=1;materials=3;magnets=2;plasmatech=2;engineering=1" + origin_tech = "combat=1;materials=3;magnets=2;plasmatech=3;engineering=1" ammo_type = list(/obj/item/ammo_casing/energy/plasma) fire_sound = 'sound/weapons/laser.ogg' usesound = 'sound/items/Welder.ogg' @@ -145,7 +144,6 @@ attack_verb = list("attacked", "slashed", "cut", "sliced") force = 12 sharp = 1 - edge = 1 can_charge = 0 /obj/item/weapon/gun/energy/plasmacutter/examine(mob/user) @@ -173,7 +171,7 @@ name = "advanced plasma cutter" icon_state = "adv_plasmacutter" modifystate = "adv_plasmacutter" - origin_tech = "combat=3;materials=4;magnets=3;plasmatech=3;engineering=2" + origin_tech = "combat=3;materials=4;magnets=3;plasmatech=4;engineering=2" ammo_type = list(/obj/item/ammo_casing/energy/plasma/adv) force = 15 @@ -183,6 +181,7 @@ ammo_type = list(/obj/item/ammo_casing/energy/wormhole, /obj/item/ammo_casing/energy/wormhole/orange) item_state = null icon_state = "wormhole_projector1" + origin_tech = "combat=4;bluespace=6;plasmatech=4;engineering=4" var/obj/effect/portal/blue var/obj/effect/portal/orange @@ -250,7 +249,7 @@ desc = "A specialized ASMD laser-rifle, capable of flat-out disintegrating most targets in a single hit." ammo_type = list(/obj/item/ammo_casing/energy/instakill) force = 60 - origin_tech = null + origin_tech = "combat=7;magnets=6" /obj/item/weapon/gun/energy/laser/instakill/emp_act() //implying you could stop the instagib return @@ -280,8 +279,9 @@ desc = "A specialized firearm designed to fire lethal bolts of toxins." icon_state = "toxgun" fire_sound = 'sound/effects/stealthoff.ogg' - w_class = 3 - origin_tech = "combat=4;plasmatech=3" + + w_class = WEIGHT_CLASS_NORMAL + origin_tech = "combat=4;magnets=4;powerstorage=3" ammo_type = list(/obj/item/ammo_casing/energy/toxplasma) shaded_charge = 1 @@ -292,7 +292,7 @@ origin_tech = "combat=6;materials=5;powerstorage=4" ammo_type = list(/obj/item/ammo_casing/energy/sniper) slot_flags = SLOT_BACK - w_class = 4 + w_class = WEIGHT_CLASS_BULKY zoomable = TRUE zoom_amt = 7 //Long range, enough to see in front of you, but no tiles behind you. shaded_charge = 1 @@ -303,12 +303,12 @@ icon_state = "tempgun_4" item_state = "tempgun_4" slot_flags = SLOT_BACK - w_class = 4 + w_class = WEIGHT_CLASS_BULKY fire_sound = 'sound/weapons/pulse3.ogg' desc = "A gun that changes the body temperature of its targets." var/temperature = 300 var/target_temperature = 300 - origin_tech = "combat=3;materials=4;powerstorage=3;magnets=2" + origin_tech = "combat=4;materials=4;powerstorage=3;magnets=2" ammo_type = list(/obj/item/ammo_casing/energy/temp) selfcharge = 1 diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index ea92cb06449..2113a2c1b81 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -3,6 +3,7 @@ desc = "A small, low capacity gun used for non-lethal takedowns." icon_state = "taser" item_state = null //so the human update icon uses the icon_state instead. + origin_tech = "combat=3" ammo_type = list(/obj/item/ammo_casing/energy/electrode) ammo_x_offset = 3 @@ -16,6 +17,7 @@ desc = "A high-tech revolver that fires internal, reusable shock cartridges in a revolving cylinder. The cartridges can be recharged using conventional rechargers." icon_state = "stunrevolver" item_state = "gun" + origin_tech = "combat=4;materials=4;powerstorage=4" ammo_type = list(/obj/item/ammo_casing/energy/shock_revolver) can_flashlight = 0 shaded_charge = 1 @@ -25,7 +27,7 @@ desc = "A dual-mode taser designed to fire both short-range high-power electrodes and long-range disabler beams." icon_state = "advtaser" ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/disabler) - origin_tech = null + origin_tech = "combat=4" ammo_x_offset = 2 /obj/item/weapon/gun/energy/gun/advtaser/cyborg @@ -43,6 +45,7 @@ desc = "A self-defense weapon that exhausts organic targets, weakening them until they collapse." icon_state = "disabler" item_state = null + origin_tech = "combat=3" ammo_type = list(/obj/item/ammo_casing/energy/disabler) ammo_x_offset = 3 diff --git a/code/modules/projectiles/guns/grenade_launcher.dm b/code/modules/projectiles/guns/grenade_launcher.dm index 5abac9ebad9..ad49c99bfc4 100644 --- a/code/modules/projectiles/guns/grenade_launcher.dm +++ b/code/modules/projectiles/guns/grenade_launcher.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/guns/projectile.dmi' icon_state = "riotgun" item_state = "riotgun" - w_class = 4 + w_class = WEIGHT_CLASS_BULKY throw_speed = 2 throw_range = 10 force = 5 diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm index 860d52d2550..f26583bbe0d 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -7,7 +7,7 @@ fire_sound = 'sound/weapons/emitter.ogg' fire_sound_text = "energy blast" flags = CONDUCT - w_class = 5 + w_class = WEIGHT_CLASS_HUGE var/max_charges = 6 var/charges = 0 var/recharge_rate = 4 diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm index 9909cb18d9d..0ae0d886be9 100644 --- a/code/modules/projectiles/guns/magic/staff.dm +++ b/code/modules/projectiles/guns/magic/staff.dm @@ -68,7 +68,7 @@ icon_state = "focus" item_state = "focus" ammo_type = list(/obj/item/ammo_casing/forcebolt) - + /obj/item/weapon/gun/magic/staff/spellblade name = "spellblade" desc = "A deadly combination of laziness and boodlust, this blade allows the user to dismember their enemies without all the hard work of actually swinging the sword." @@ -81,7 +81,6 @@ armour_penetration = 75 block_chance = 50 sharp = 1 - edge = 1 max_charges = 4 /obj/item/weapon/gun/magic/staff/spellblade/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type) diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index 20461c08acf..ac804ab9192 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -4,7 +4,7 @@ ammo_type = /obj/item/ammo_casing/magic icon_state = "nothingwand" item_state = "wand" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL can_charge = 0 max_charges = 100 //100, 50, 50, 34 (max charge distribution by 25%ths) var/variable_charges = 1 diff --git a/code/modules/projectiles/guns/medbeam.dm b/code/modules/projectiles/guns/medbeam.dm index a556d4572a2..59a24533e80 100644 --- a/code/modules/projectiles/guns/medbeam.dm +++ b/code/modules/projectiles/guns/medbeam.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/chronos.dmi' icon_state = "chronogun" item_state = "chronogun" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL var/mob/living/current_target var/last_check = 0 diff --git a/code/modules/projectiles/guns/mounted.dm b/code/modules/projectiles/guns/mounted.dm index ae9c8f06d09..a767c94cc9c 100644 --- a/code/modules/projectiles/guns/mounted.dm +++ b/code/modules/projectiles/guns/mounted.dm @@ -1,30 +1,20 @@ /obj/item/weapon/gun/energy/gun/advtaser/mounted name = "mounted taser" desc = "An arm mounted dual-mode weapon that fires electrodes and disabler shots." - icon_state = "armcannon" + icon = 'icons/obj/items_cyborg.dmi' + icon_state = "taser" + item_state = "armcannonstun4" force = 5 - flags = NODROP - w_class = 5 - can_flashlight = 0 selfcharge = 1 + can_flashlight = 0 trigger_guard = TRIGGER_GUARD_ALLOW_ALL // Has no trigger at all, uses neural signals instead -/obj/item/weapon/gun/energy/gun/advtaser/mounted/dropped()//if somebody manages to drop this somehow... - ..() - loc = null//send it to nullspace to get retrieved by the implant later on. gotta cover those edge cases. - /obj/item/weapon/gun/energy/laser/mounted name = "mounted laser" - desc = "An arm mounted cannon that fires lethal lasers. Doesn't come with a charge beam." - icon_state = "armcannon" + desc = "An arm mounted cannon that fires lethal lasers." + icon = 'icons/obj/items_cyborg.dmi' + icon_state = "laser" item_state = "armcannonlase" force = 5 - flags = NODROP - w_class = 5 - materials = null selfcharge = 1 - trigger_guard = TRIGGER_GUARD_ALLOW_ALL - -/obj/item/weapon/gun/energy/laser/mounted/dropped() - ..() - loc = null + trigger_guard = TRIGGER_GUARD_ALLOW_ALL \ No newline at end of file diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index 961a7b91e05..7575e9b92f8 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -3,7 +3,7 @@ name = "projectile gun" icon_state = "pistol" origin_tech = "combat=2;materials=2" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL materials = list(MAT_METAL=1000) var/mag_type = /obj/item/ammo_box/magazine/m10mm //Removes the need for max_ammo and caliber info @@ -77,7 +77,7 @@ S.oldsound = fire_sound S.initial_w_class = w_class fire_sound = 'sound/weapons/Gunshot_silenced.ogg' - w_class = 3 //so pistols do not fit in pockets when suppressed + w_class = WEIGHT_CLASS_NORMAL //so pistols do not fit in pockets when suppressed A.loc = src update_icon() return @@ -169,7 +169,7 @@ user.visible_message("[user] shortens \the [src]!", "You shorten \the [src].") name = "sawn-off [name]" desc = sawn_desc - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL item_state = "gun"//phil235 is it different with different skin? slot_flags &= ~SLOT_BACK //you can't sling it on your back slot_flags |= SLOT_BELT //but you can wear it on your belt (poorly concealed under a trenchcoat, ideally) @@ -191,7 +191,7 @@ icon = 'icons/obj/guns/projectile.dmi' icon_state = "suppressor" item_state = "suppressor" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL var/oldsound = null var/initial_w_class = null diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 0b174c635b0..4b4ef8de12e 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -1,5 +1,5 @@ /obj/item/weapon/gun/projectile/automatic - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL var/alarmed = 0 var/select = 1 can_suppress = 1 @@ -83,7 +83,7 @@ desc = "A two-round burst .45 SMG, designated 'C-20r'. Has a 'Scarborough Arms - Per falcis, per pravitas' buttstamp." icon_state = "c20r" item_state = "c20r" - origin_tech = "combat=5;materials=2;syndicate=8" + origin_tech = "combat=5;materials=2;syndicate=6" mag_type = /obj/item/ammo_box/magazine/smgm45 fire_sound = 'sound/weapons/Gunshot_smg.ogg' fire_delay = 2 @@ -120,7 +120,7 @@ name = "\improper 'Type U3' Uzi" desc = "A lightweight, burst-fire submachine gun, for when you really want someone dead. Uses 9mm rounds." icon_state = "mini-uzi" - origin_tech = "combat=5;materials=2;syndicate=8" + origin_tech = "combat=4;materials=2;syndicate=4" mag_type = /obj/item/ammo_box/magazine/uzim9mm burst_size = 2 @@ -129,7 +129,7 @@ desc = "A three-round burst 5.56 toploading carbine, designated 'M-90gl'. Has an attached underbarrel grenade launcher which can be toggled on and off." icon_state = "m90" item_state = "m90" - origin_tech = "combat=5;materials=2;syndicate=8" + origin_tech = "combat=5;materials=2;syndicate=6" mag_type = /obj/item/ammo_box/magazine/m556 fire_sound = 'sound/weapons/Gunshot_smg.ogg' can_suppress = 0 @@ -194,9 +194,9 @@ desc = "A genuine 'Chicago Typewriter'." icon_state = "tommygun" item_state = "shotgun" - w_class = 5 + w_class = WEIGHT_CLASS_HUGE slot_flags = 0 - origin_tech = "combat=5;materials=1;syndicate=2" + origin_tech = "combat=5;materials=1;syndicate=3" mag_type = /obj/item/ammo_box/magazine/tommygunm45 fire_sound = 'sound/weapons/Gunshot_smg.ogg' can_suppress = 0 @@ -209,7 +209,7 @@ icon_state = "arg" item_state = "arg" slot_flags = 0 - origin_tech = "combat=5;materials=1" + origin_tech = "combat=6;engineering=4" mag_type = /obj/item/ammo_box/magazine/m556 fire_sound = 'sound/weapons/Gunshot_smg.ogg' can_suppress = 0 @@ -222,8 +222,8 @@ desc = "A compact, mag-fed semi-automatic shotgun for combat in narrow corridors, nicknamed 'Bulldog' by boarding parties. Compatible only with specialized 8-round drum magazines." icon_state = "bulldog" item_state = "bulldog" - w_class = 3 - origin_tech = "combat=5;materials=4;syndicate=6" + w_class = WEIGHT_CLASS_NORMAL + origin_tech = "combat=6;materials=4;syndicate=6" mag_type = /obj/item/ammo_box/magazine/m12g fire_sound = 'sound/weapons/Gunshot4.ogg' can_suppress = 0 @@ -255,8 +255,8 @@ desc = "An experimental carbine. Uses encased laser projectors as ammunition."//we need to uncouple the toroidal resistance dejammers icon_state = "lasercarbine" item_state = "laser" - w_class = 3 - origin_tech = "combat=5;materials=5" + w_class = WEIGHT_CLASS_NORMAL + origin_tech = "combat=4;materials=2" mag_type = /obj/item/ammo_box/magazine/laser fire_sound = 'sound/weapons/emitter2.ogg' can_suppress = 0 diff --git a/code/modules/projectiles/guns/projectile/bow.dm b/code/modules/projectiles/guns/projectile/bow.dm index 2512ebfa35f..3fea800936e 100644 --- a/code/modules/projectiles/guns/projectile/bow.dm +++ b/code/modules/projectiles/guns/projectile/bow.dm @@ -77,7 +77,6 @@ desc = "Stab, stab, stab." icon_state = "arrow" force = 10 - sharp = 1 projectile_type = /obj/item/projectile/bullet/reusable/arrow caliber = "arrow" diff --git a/code/modules/projectiles/guns/projectile/launchers.dm b/code/modules/projectiles/guns/projectile/launchers.dm index 462341fdc36..eaa1ab67e67 100644 --- a/code/modules/projectiles/guns/projectile/launchers.dm +++ b/code/modules/projectiles/guns/projectile/launchers.dm @@ -8,7 +8,7 @@ item_state = "gun" mag_type = /obj/item/ammo_box/magazine/internal/grenadelauncher fire_sound = 'sound/weapons/grenadelaunch.ogg' - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL /obj/item/weapon/gun/projectile/revolver/grenadelauncher/attackby(var/obj/item/A, mob/user, params) ..() @@ -35,7 +35,7 @@ desc = "A prototype pistol designed to fire self propelled rockets." icon_state = "gyropistol" fire_sound = 'sound/effects/Explosion1.ogg' - origin_tech = "combat=3" + origin_tech = "combat=5" mag_type = /obj/item/ammo_box/magazine/m75 burst_size = 1 fire_delay = 0 @@ -57,7 +57,8 @@ desc = "A weapon favored by carp hunters. Fires specialized spears using kinetic energy." icon_state = "speargun" item_state = "speargun" - w_class = 4 + w_class = WEIGHT_CLASS_BULKY + origin_tech = "combat=4;engineering=4" force = 10 can_suppress = 0 mag_type = /obj/item/ammo_box/magazine/internal/speargun diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index 5de627d7933..3876e067f70 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -2,8 +2,8 @@ name = "stechkin pistol" desc = "A small, easily concealable 10mm handgun. Has a threaded barrel for suppressors." icon_state = "pistol" - w_class = 2 - origin_tech = "combat=2;materials=2;syndicate=2" + w_class = WEIGHT_CLASS_SMALL + origin_tech = "combat=3;materials=2;syndicate=4" mag_type = /obj/item/ammo_box/magazine/m10mm can_suppress = 1 burst_size = 1 @@ -22,7 +22,7 @@ name = "\improper M1911" desc = "A classic .45 handgun with a small magazine capacity." icon_state = "m1911" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL mag_type = /obj/item/ammo_box/magazine/m45 can_suppress = 0 @@ -66,7 +66,7 @@ name = "stechkin APS pistol" desc = "The original russian version of a widely used Syndicate sidearm. Uses 9mm ammo." icon_state = "aps" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL origin_tech = "combat=3;materials=2;syndicate=3" mag_type = /obj/item/ammo_box/magazine/pistolm9mm can_suppress = 0 diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index 80192a3091d..f5cfede882d 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -3,6 +3,7 @@ desc = "A suspicious revolver. Uses .357 ammo." icon_state = "revolver" mag_type = /obj/item/ammo_box/magazine/internal/cylinder + origin_tech = "combat=3;materials=2" /obj/item/weapon/gun/projectile/revolver/New() ..() @@ -88,7 +89,6 @@ desc = "A cheap Martian knock-off of a classic law enforcement firearm. Uses .38-special rounds." name = "\improper .38 Mars Special" icon_state = "detective" - origin_tech = "combat=2;materials=2" mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev38 unique_rename = 1 unique_reskin = 1 @@ -146,7 +146,6 @@ name = "\improper Unica 6 auto-revolver" desc = "A retro high-powered autorevolver typically used by officers of the New Russia military. Uses .357 ammo." //>10mm hole >.357 icon_state = "mateba" - origin_tech = "combat=2;materials=2" /obj/item/weapon/gun/projectile/revolver/golden name = "\improper Golden revolver" @@ -219,7 +218,7 @@ /obj/item/weapon/gun/projectile/revolver/russian/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params) if(flag) if(!(target in user.contents) && ismob(target)) - if(user.a_intent == "harm") // Flogging action + if(user.a_intent == INTENT_HARM) // Flogging action return if(isliving(user)) @@ -258,7 +257,7 @@ /obj/item/weapon/gun/projectile/revolver/capgun name = "cap gun" desc = "Looks almost like the real thing! Ages 8 and up." - origin_tech = "combat=1;materials=1" + origin_tech = null mag_type = /obj/item/ammo_box/magazine/internal/cylinder/cap ///////////////////////////// @@ -270,11 +269,10 @@ desc = "A true classic." icon_state = "dshotgun" item_state = "shotgun" - w_class = 4 + w_class = WEIGHT_CLASS_BULKY force = 10 flags = CONDUCT slot_flags = SLOT_BACK - origin_tech = "combat=3;materials=1" mag_type = /obj/item/ammo_box/magazine/internal/shot/dual sawn_desc = "Omar's coming!" unique_rename = 1 @@ -325,10 +323,9 @@ desc = "Essentially a tube that aims shotgun shells." icon_state = "ishotgun" item_state = "shotgun" - w_class = 4 + w_class = WEIGHT_CLASS_BULKY force = 10 slot_flags = null - origin_tech = "combat=2;materials=2" mag_type = /obj/item/ammo_box/magazine/internal/shot/improvised sawn_desc = "I'm just here for the gasoline." unique_rename = 0 @@ -373,7 +370,7 @@ icon_state = "cane" item_state = "stick" sawn_state = SAWN_OFF - w_class = 2 + w_class = WEIGHT_CLASS_SMALL force = 10 can_unsuppress = 0 slot_flags = null diff --git a/code/modules/projectiles/guns/projectile/saw.dm b/code/modules/projectiles/guns/projectile/saw.dm index cfe8ffbb0a5..3714a7983da 100644 --- a/code/modules/projectiles/guns/projectile/saw.dm +++ b/code/modules/projectiles/guns/projectile/saw.dm @@ -3,9 +3,9 @@ desc = "A heavily modified 5.56 light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the receiver below the designation." icon_state = "l6closed100" item_state = "l6closedmag" - w_class = 5 + w_class = WEIGHT_CLASS_HUGE slot_flags = 0 - origin_tech = "combat=5;materials=1;syndicate=2" + origin_tech = "combat=6;engineering=3;syndicate=6" mag_type = /obj/item/ammo_box/magazine/mm556x45 weapon_weight = WEAPON_MEDIUM fire_sound = 'sound/weapons/Gunshot3.ogg' @@ -67,9 +67,9 @@ /obj/item/projectile/bullet/saw/bleeding/on_hit(atom/target, blocked = 0, hit_zone) . = ..() - if((blocked != 100) && istype(target, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = target - H.drip(350) + if((blocked != 100) && iscarbon(target)) + var/mob/living/carbon/C = target + C.bleed(35) /obj/item/projectile/bullet/saw/hollow damage = 60 diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 35cde243c20..3ef496d3c0d 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -3,7 +3,7 @@ desc = "A traditional shotgun with wood furniture and a four-shell capacity underneath." icon_state = "shotgun" item_state = "shotgun" - w_class = 4 + w_class = WEIGHT_CLASS_BULKY force = 10 flags = CONDUCT slot_flags = SLOT_BACK @@ -171,9 +171,9 @@ name = "combat shotgun" desc = "A semi automatic shotgun with tactical furniture and a six-shell capacity underneath." icon_state = "cshotgun" - origin_tech = "combat=5;materials=2" + origin_tech = "combat=6" mag_type = /obj/item/ammo_box/magazine/internal/shot/com - w_class = 5 + w_class = WEIGHT_CLASS_HUGE //Dual Feed Shotgun @@ -183,7 +183,7 @@ icon_state = "cycler" origin_tech = "combat=4;materials=2" mag_type = /obj/item/ammo_box/magazine/internal/shot/tube - w_class = 5 + w_class = WEIGHT_CLASS_HUGE var/toggled = 0 var/obj/item/ammo_box/magazine/internal/shot/alternate_magazine diff --git a/code/modules/projectiles/guns/projectile/sniper.dm b/code/modules/projectiles/guns/projectile/sniper.dm index bf26dad78b3..cd8a64fbde6 100644 --- a/code/modules/projectiles/guns/projectile/sniper.dm +++ b/code/modules/projectiles/guns/projectile/sniper.dm @@ -8,10 +8,10 @@ mag_type = /obj/item/ammo_box/magazine/sniper_rounds fire_delay = 40 burst_size = 1 - origin_tech = "combat=8" + origin_tech = "combat=7" can_unsuppress = 1 can_suppress = 1 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL zoomable = TRUE zoom_amt = 7 //Long range, enough to see in front of you, but no tiles behind you. slot_flags = SLOT_BACK @@ -26,7 +26,7 @@ /obj/item/weapon/gun/projectile/automatic/sniper_rifle/syndicate name = "syndicate sniper rifle" desc = "Syndicate flavoured sniper rifle, it packs quite a punch, a punch to your face" - origin_tech = "combat=8;syndicate=4" + origin_tech = "combat=7;syndicate=6" //Normal Boolets /obj/item/ammo_box/magazine/sniper_rounds @@ -101,7 +101,6 @@ name = "sniper rounds (Bleed)" desc = "Haemorrhage sniper rounds, leaves your target in a pool of crimson pain" icon_state = "haemorrhage" - origin_tech = "combat=7;syndicate=5" ammo_type = /obj/item/ammo_casing/haemorrhage max_ammo = 5 @@ -120,9 +119,9 @@ breakthings = FALSE /obj/item/projectile/bullet/sniper/haemorrhage/on_hit(atom/target, blocked = 0, hit_zone) - if((blocked != 100) && istype(target, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = target - H.drip(1000) + if((blocked != 100) && iscarbon(target)) + var/mob/living/carbon/C = target + C.bleed(100) return ..() @@ -131,6 +130,7 @@ name = "sniper rounds (penetrator)" desc = "An extremely powerful round capable of passing straight through cover and anyone unfortunate enough to be behind it." ammo_type = /obj/item/ammo_casing/penetrator + origin_tech = "combat=6;syndicate=3" max_ammo = 5 /obj/item/ammo_casing/penetrator diff --git a/code/modules/projectiles/guns/projectile/toy.dm b/code/modules/projectiles/guns/projectile/toy.dm index 809647e4186..8a191f06b97 100644 --- a/code/modules/projectiles/guns/projectile/toy.dm +++ b/code/modules/projectiles/guns/projectile/toy.dm @@ -20,7 +20,7 @@ name = "foam force pistol" desc = "A small, easily concealable toy handgun. Ages 8 and up." icon_state = "pistol" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL mag_type = /obj/item/ammo_box/magazine/toy/pistol fire_sound = 'sound/weapons/Gunshot.ogg' can_suppress = 0 @@ -65,7 +65,7 @@ mag_type = /obj/item/ammo_box/magazine/internal/shot/toy/crossbow fire_sound = 'sound/items/syringeproj.ogg' slot_flags = SLOT_BELT - w_class = 2 + w_class = WEIGHT_CLASS_SMALL /obj/item/weapon/gun/projectile/automatic/c20r/toy name = "donksoft SMG" @@ -96,4 +96,4 @@ icon_state = "tommygun" item_state = "shotgun" mag_type = /obj/item/ammo_box/magazine/internal/shot/toy/tommygun - w_class = 2 + w_class = WEIGHT_CLASS_SMALL diff --git a/code/modules/projectiles/guns/rocket.dm b/code/modules/projectiles/guns/rocket.dm index f9a8d00bdb1..0b1f2b2c94d 100644 --- a/code/modules/projectiles/guns/rocket.dm +++ b/code/modules/projectiles/guns/rocket.dm @@ -4,12 +4,12 @@ desc = "Say hello to my little friend" icon_state = "rocket" item_state = "rocket" - w_class = 4 + w_class = WEIGHT_CLASS_BULKY throw_speed = 2 throw_range = 10 force = 5.0 flags = CONDUCT - origin_tech = "combat=8;materials=5" + origin_tech = "combat=6" var/missile_speed = 2 var/missile_range = 30 var/max_rockets = 1 diff --git a/code/modules/projectiles/guns/syringe_gun.dm b/code/modules/projectiles/guns/syringe_gun.dm index 332d279376b..65440fa9e49 100644 --- a/code/modules/projectiles/guns/syringe_gun.dm +++ b/code/modules/projectiles/guns/syringe_gun.dm @@ -3,7 +3,8 @@ desc = "A spring loaded rifle designed to fit syringes, used to incapacitate unruly patients from a distance." icon_state = "syringegun" item_state = "syringegun" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL + origin_tech = "combat=2;biotech=3" throw_speed = 3 throw_range = 7 force = 4 @@ -88,8 +89,8 @@ desc = "A small spring-loaded sidearm that functions identically to a syringe gun." icon_state = "syringe_pistol" item_state = "gun" //Smaller inhand - w_class = 2 - origin_tech = "combat=2;syndicate=2" + w_class = WEIGHT_CLASS_SMALL + origin_tech = "combat=2;syndicate=2;biotech=3" force = 2 //Also very weak because it's smaller suppressed = 1 //Softer fire sound can_unsuppress = 0 //Permanently silenced diff --git a/code/modules/projectiles/guns/throw.dm b/code/modules/projectiles/guns/throw.dm index f19069bc32f..0ea753f4cfa 100644 --- a/code/modules/projectiles/guns/throw.dm +++ b/code/modules/projectiles/guns/throw.dm @@ -16,10 +16,10 @@ return /obj/item/weapon/gun/throw/proc/get_throwrange() - return projectile_speed + return projectile_range /obj/item/weapon/gun/throw/proc/get_throwspeed() - return projectile_range + return projectile_speed /obj/item/weapon/gun/throw/proc/modify_projectile(obj/item/I, on_chamber = 0) return @@ -80,7 +80,7 @@ to_launch = null modify_projectile(I) playsound(user, fire_sound, 50, 1) - I.throw_at(target, get_throwrange(), get_throwspeed(), user, 1) + I.throw_at(target, get_throwrange(), get_throwspeed(), user, FALSE) message_admins("[key_name_admin(user)] fired \a [I] from a [src].") log_game("[key_name_admin(user)] used \a [src].") process_chamber() diff --git a/code/modules/projectiles/guns/throw/crossbow.dm b/code/modules/projectiles/guns/throw/crossbow.dm index 11d39bf2a38..00bafd296ce 100644 --- a/code/modules/projectiles/guns/throw/crossbow.dm +++ b/code/modules/projectiles/guns/throw/crossbow.dm @@ -153,9 +153,8 @@ icon_state = "bolt" item_state = "bolt" throwforce = 20 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL sharp = 1 - edge = 0 /obj/item/weapon/arrow/proc/removed() //Helper for metal rods falling apart. return @@ -170,8 +169,6 @@ /obj/item/weapon/arrow/rod/removed() if(superheated) // The rod has been superheated - we don't want it to be useable when removed from the bow. visible_message("[src] shatters into a scattering of overstressed metal shards as it leaves the crossbow.") - var/obj/item/weapon/shard/shrapnel/S = new /obj/item/weapon/shard/shrapnel - S.loc = get_turf(src) qdel(src) #undef XBOW_TENSION_20 diff --git a/code/modules/projectiles/guns/throw/pielauncher.dm b/code/modules/projectiles/guns/throw/pielauncher.dm index f6405f47194..3af48788134 100644 --- a/code/modules/projectiles/guns/throw/pielauncher.dm +++ b/code/modules/projectiles/guns/throw/pielauncher.dm @@ -2,7 +2,7 @@ name = "pie cannon" desc = "A projectile weapon that fires pies." icon_state = "piecannon" - w_class = 5 + w_class = WEIGHT_CLASS_HUGE throw_speed = 2 throw_range = 3 force = 5 diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 4a3afd18684..86987b102d1 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -37,6 +37,7 @@ var/flag = "bullet" //Defines what armor to use when it hits things. Must be set to bullet, laser, energy,or bomb //Cael - bio and rad are also valid var/projectile_type = "/obj/item/projectile" var/range = 50 //This will de-increment every step. When 0, it will delete the projectile. + var/is_reflectable = FALSE // Can it be reflected or not? //Effects var/stun = 0 var/weaken = 0 @@ -48,7 +49,6 @@ var/drowsy = 0 var/stamina = 0 var/jitter = 0 - var/embed = 0 // whether or not the projectile can embed itself in the mob var/forcedodge = 0 //to pass through everything var/dismemberment = 0 //The higher the number, the greater the bonus to dismembering. 0 will not dismember at all. diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 6cddc1c1b91..48fe1f74564 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -8,6 +8,7 @@ hitsound_wall = 'sound/weapons/effects/searwall.ogg' flag = "laser" eyeblur = 2 + is_reflectable = TRUE /obj/item/projectile/beam/laser @@ -130,7 +131,7 @@ /obj/item/projectile/beam/instakill/on_hit(atom/target) . = ..() - if(iscarbon(target)) - var/mob/living/carbon/M = target - M.visible_message("[M] explodes into a shower of gibs!") - M.gib() + if(isliving(target)) + var/mob/living/L = target + L.visible_message("[L] explodes!") + L.gib() \ No newline at end of file diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 5c8d5136324..88150cc5371 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -4,8 +4,6 @@ damage = 60 damage_type = BRUTE flag = "bullet" - embed = 1 - sharp = 1 hitsound_wall = "ricochet" /obj/item/projectile/bullet/weakbullet //beanbag, heavy stamina damage @@ -13,12 +11,7 @@ damage = 5 stamina = 80 -/obj/item/projectile/bullet/weakbullet/rubber //beanbag that shells that don't embed - embed = 0 - sharp = 0 - /obj/item/projectile/bullet/weakbullet/booze - embed = 0 /obj/item/projectile/bullet/weakbullet/booze/on_hit(atom/target, blocked = 0) if(..(target, blocked)) @@ -44,10 +37,6 @@ stamina = 60 icon_state = "bullet-r" -/obj/item/projectile/bullet/weakbullet2/rubber //detective's bullets that don't embed - embed = 0 - sharp = 0 - /obj/item/projectile/bullet/weakbullet3 damage = 20 @@ -56,8 +45,6 @@ damage = 5 stamina = 30 icon_state = "bullet-r" - embed = 0 - sharp = 0 /obj/item/projectile/bullet/toxinbullet damage = 15 @@ -155,8 +142,6 @@ stutter = 5 jitter = 20 range = 7 - embed = 0 - sharp = 0 icon_state = "spark" color = "#FFFF00" @@ -201,6 +186,7 @@ stun = 4 /obj/item/projectile/bullet/honker + name = "banana" damage = 0 weaken = 5 stun = 5 @@ -239,8 +225,6 @@ name = "dart" icon_state = "cbbolt" damage = 6 - embed = 0 - sharp = 0 var/piercing = 0 /obj/item/projectile/bullet/dart/New() @@ -281,6 +265,7 @@ icon_state = "syringeproj" /obj/item/projectile/bullet/dart/syringe/tranquilizer + /obj/item/projectile/bullet/dart/syringe/tranquilizer/New() ..() reagents.add_reagent("haloperidol", 15) @@ -302,8 +287,6 @@ name = "cap" damage = 0 nodamage = 1 - embed = 0 - sharp = 0 /obj/item/projectile/bullet/cap/fire() loc = null diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 79ffc1d0898..d9e8a0759bd 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -4,6 +4,7 @@ damage = 0 damage_type = BURN flag = "energy" + is_reflectable = TRUE /obj/item/projectile/energy/electrode name = "electrode" diff --git a/code/modules/projectiles/projectile/force.dm b/code/modules/projectiles/projectile/force.dm index 4e5c6d27700..4d62550a852 100644 --- a/code/modules/projectiles/projectile/force.dm +++ b/code/modules/projectiles/projectile/force.dm @@ -4,7 +4,6 @@ icon_state = "ice_1" damage = 20 flag = "energy" - embed = 1 /obj/item/projectile/forcebolt/strong name = "force bolt" diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 6d4976e1d53..ff274a48993 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -243,7 +243,7 @@ proc/wabbajack(mob/living/M) M.create_attack_log("[M.real_name] ([M.ckey]) became [new_mob.real_name].") new_mob.attack_log = M.attack_log - new_mob.a_intent = I_HARM + new_mob.a_intent = INTENT_HARM if(M.mind) M.mind.transfer_to(new_mob) else diff --git a/code/modules/projectiles/projectile/reusable.dm b/code/modules/projectiles/projectile/reusable.dm index a223f415165..c66913651a3 100644 --- a/code/modules/projectiles/projectile/reusable.dm +++ b/code/modules/projectiles/projectile/reusable.dm @@ -35,8 +35,6 @@ ammo_type = /obj/item/ammo_casing/caseless/foam_dart range = 10 var/obj/item/weapon/pen/pen = null - edge = 0 - embed = 0 log_override = TRUE//it won't log even when there's a pen inside, but since the damage will be so low, I don't think there's any point in making it any more complex /obj/item/projectile/bullet/reusable/foam_dart/handle_drop() diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 83a4ec0650c..ef5ec2d7009 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -23,8 +23,6 @@ icon_state= "bolter" damage = 50 flag = "bullet" - sharp = 1 - edge = 1 /obj/item/projectile/bullet/gyro/on_hit(var/atom/target, var/blocked = 0) ..() diff --git a/code/modules/reagents/chem_splash.dm b/code/modules/reagents/chem_splash.dm new file mode 100644 index 00000000000..7c16bf1ab9a --- /dev/null +++ b/code/modules/reagents/chem_splash.dm @@ -0,0 +1,78 @@ +// Replaces chemgrenade stuff, allowing reagent explosions to be called from anywhere. +// It should be called using a location, the range, and a list of reagents involved. + +// Threatscale is a multiplier for the 'threat' of the grenade. If you're increasing the affected range drastically, you might want to improve this. +// Extra heat affects the temperature of the mixture, and may cause it to react in different ways. + + +/proc/chem_splash(turf/epicenter, affected_range = 3, list/datum/reagents/reactants = list(), extra_heat = 0, threatscale = 1, adminlog = 1) + if(!isturf(epicenter) || !reactants.len || threatscale <= 0) + return + var/has_reagents + var/total_reagents + for(var/datum/reagents/R in reactants) + if(R.total_volume) + has_reagents = 1 + total_reagents += R.total_volume + + if(!has_reagents) + return + + var/datum/reagents/splash_holder = new/datum/reagents(total_reagents*threatscale) + splash_holder.my_atom = epicenter // For some reason this is setting my_atom to null, and causing runtime errors. + var/total_temp = 0 + + for(var/datum/reagents/R in reactants) + R.trans_to(splash_holder, R.total_volume, threatscale, 1, 1) + total_temp += R.chem_temp + splash_holder.chem_temp = (total_temp/reactants.len) + extra_heat // Average temperature of reagents + extra heat. + splash_holder.handle_reactions() // React them now. + + if(splash_holder.total_volume && affected_range >= 0) //The possible reactions didnt use up all reagents, so we spread it around. + var/datum/effect/system/steam_spread/steam = new /datum/effect/system/steam_spread() + steam.set_up(10, 0, epicenter) + steam.attach(epicenter) + steam.start() + + var/list/viewable = view(affected_range, epicenter) + + var/list/accessible = list(epicenter) + for(var/i=1; i<=affected_range; i++) + var/list/turflist = list() + for(var/turf/T in (orange(i, epicenter) - orange(i-1, epicenter))) + turflist |= T + for(var/turf/T in turflist) + if( !(get_dir(T,epicenter) in cardinal) && (abs(T.x - epicenter.x) == abs(T.y - epicenter.y) )) + turflist.Remove(T) + turflist.Add(T) // we move the purely diagonal turfs to the end of the list. + for(var/turf/T in turflist) + if(accessible[T]) + continue + for(var/thing in T.GetAtmosAdjacentTurfs(alldir = TRUE)) + var/turf/NT = thing + if(!(NT in accessible)) + continue + if(!(get_dir(T,NT) in cardinal)) + continue + accessible[T] = 1 + break + var/list/reactable = accessible + for(var/turf/T in accessible) + for(var/atom/A in T.GetAllContents()) + if(!(A in viewable)) + continue + reactable |= A + if(extra_heat >= 300) + T.hotspot_expose(extra_heat*2, 5) + if(!reactable.len) //Nothing to react with. Probably means we're in nullspace. + return + for(var/thing in reactable) + var/atom/A = thing + var/distance = max(1,get_dist(A, epicenter)) + var/fraction = 0.5/(2 ** distance) //50/25/12/6... for a 200u splash, 25/12/6/3... for a 100u, 12/6/3/1 for a 50u + splash_holder.reaction(A, TOUCH, fraction) + + qdel(splash_holder) + return 1 + + diff --git a/code/modules/reagents/chemistry/colors.dm b/code/modules/reagents/chemistry/colors.dm index 3d4ab41fe9c..0eea945349c 100644 --- a/code/modules/reagents/chemistry/colors.dm +++ b/code/modules/reagents/chemistry/colors.dm @@ -14,8 +14,8 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111 var/vol_temp // see libs/IconProcs/IconProcs.dm for(var/datum/reagent/reagent in reagent_list) - if(reagent.id == "blood" && reagent.data && reagent.data["blood_colour"]) - reagent_color = reagent.data["blood_colour"] + if(reagent.id == "blood" && reagent.data && reagent.data["blood_color"]) + reagent_color = reagent.data["blood_color"] else reagent_color = reagent.color diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index c65c628353b..9ad885cd9b7 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -108,7 +108,7 @@ var/const/INGEST = 2 return the_id -/datum/reagents/proc/trans_to(target, amount=1, multiplier=1, preserve_data=1)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred. +/datum/reagents/proc/trans_to(target, amount=1, multiplier=1, preserve_data=1, no_react = 0)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred. if(!target) return if(total_volume <= 0) @@ -135,21 +135,18 @@ var/const/INGEST = 2 for(var/datum/reagent/current_reagent in reagent_list) if(!current_reagent) continue - if(current_reagent.id == "blood" && ishuman(target)) - var/mob/living/carbon/human/H = target - H.inject_blood(my_atom, amount) - continue var/current_reagent_transfer = current_reagent.volume * part if(preserve_data) trans_data = copy_data(current_reagent) - R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, chem_temp) + R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, chem_temp, no_react = 1) remove_reagent(current_reagent.id, current_reagent_transfer) update_total() R.update_total() - R.handle_reactions() - handle_reactions() + if(!no_react) + R.handle_reactions() + handle_reactions() return amount /datum/reagents/proc/copy_to(obj/target, amount=1, multiplier=1, preserve_data=1, safety = 0) @@ -537,7 +534,7 @@ var/const/INGEST = 2 var/amt = list_reagents[r_id] add_reagent(r_id, amt, data) -/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300) +/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, no_react = 0) if(!isnum(amount)) return 1 update_total() @@ -554,7 +551,8 @@ var/const/INGEST = 2 update_total() my_atom.on_reagent_change() R.on_merge(data) - handle_reactions() + if(!no_react) + handle_reactions() return 0 var/datum/reagent/D = chemical_reagents_list[reagent] @@ -570,7 +568,8 @@ var/const/INGEST = 2 update_total() my_atom.on_reagent_change() - handle_reactions() + if(!no_react) + handle_reactions() return 0 else warning("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])") diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 1aa72ac0918..625849b8dbc 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -159,7 +159,7 @@ if(archive_diseases[id]) var/datum/disease/advance/A = archive_diseases[id] A.AssignName(new_name) - for(var/datum/disease/advance/AD in disease_master.processing) + for(var/datum/disease/advance/AD in active_diseases) AD.Refresh() updateUsrDialog() @@ -205,7 +205,8 @@ var/list/vir = Blood.data["viruses"] if(vir.len) var/i = 0 - for(var/datum/disease/D in Blood.data["viruses"]) + for(var/thing in Blood.data["viruses"]) + var/datum/disease/D = thing i++ if(!(D.visibility_flags & HIDDEN_PANDEMIC)) diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 2714b8d1b16..839ce9c0a8d 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -151,7 +151,7 @@ return 1 if (!is_type_in_list(I, blend_items) && !is_type_in_list(I, juice_items)) - if(user.a_intent == I_HARM) + if(user.a_intent == INTENT_HARM) return ..() else to_chat(user, "Cannot refine into a reagent!") diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 054be7442e6..cf92f9f9447 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -7,7 +7,6 @@ var/list/data = null var/volume = 0 var/metabolization_rate = REAGENTS_METABOLISM - //var/list/viruses = list() var/color = "#000000" // rgb: 0, 0, 0 (does not support alpha channels - yet!) var/shock_reduction = 0 var/heart_rate_increase = 0 diff --git a/code/modules/reagents/chemistry/reagents/admin.dm b/code/modules/reagents/chemistry/reagents/admin.dm index eadcb57cc91..c8a723813ee 100644 --- a/code/modules/reagents/chemistry/reagents/admin.dm +++ b/code/modules/reagents/chemistry/reagents/admin.dm @@ -47,13 +47,11 @@ M.SetConfused(0) M.SetSleeping(0) M.SetJitter(0) - for(var/datum/disease/D in M.viruses) + for(var/thing in M.viruses) + var/datum/disease/D = thing if(D.severity == NONTHREAT) continue - D.spread_text = "Remissive" - D.stage-- - if(D.stage < 1) - D.cure() + D.cure(0) ..() /datum/reagent/medicine/adminordrazine/nanites diff --git a/code/modules/reagents/chemistry/reagents/alcohol.dm b/code/modules/reagents/chemistry/reagents/alcohol.dm index 232032fd9e7..c64777dd41f 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol.dm @@ -877,10 +877,11 @@ taste_message = "brain damageeeEEeee" /datum/reagent/consumable/ethanol/neurotoxin/on_mob_life(mob/living/M) - M.Weaken(3) - if(current_cycle >=55) + if(current_cycle >= 13) + M.Weaken(3) + if(current_cycle >= 55) M.Druggy(55) - if(current_cycle >=200) + if(current_cycle >= 200) M.adjustToxLoss(2) ..() diff --git a/code/modules/reagents/chemistry/reagents/disease.dm b/code/modules/reagents/chemistry/reagents/disease.dm index f9fbf930e3e..7db78883e90 100644 --- a/code/modules/reagents/chemistry/reagents/disease.dm +++ b/code/modules/reagents/chemistry/reagents/disease.dm @@ -141,11 +141,11 @@ can_synth = 0 /datum/reagent/concentrated_initro/on_mob_life(mob/living/M) - if(volume >=5) + if(volume >= 5) if(ishuman(M)) var/mob/living/carbon/human/H = M - if(!H.heart_attack) - H.heart_attack = 1 // rip in pepperoni + if(!H.undergoing_cardiac_arrest()) + H.set_heartattack(TRUE) // rip in pepperoni //virus foods @@ -183,4 +183,4 @@ /datum/reagent/plasma_dust/plasmavirusfood/weak name = "weakened virus plasma" id = "weakplasmavirusfood" - color = "#CEC3C6" // rgb: 206,195,198 \ No newline at end of file + color = "#CEC3C6" // rgb: 206,195,198 diff --git a/code/modules/reagents/chemistry/reagents/food.dm b/code/modules/reagents/chemistry/reagents/food.dm index ef45cc1a6f3..c1492df6087 100644 --- a/code/modules/reagents/chemistry/reagents/food.dm +++ b/code/modules/reagents/chemistry/reagents/food.dm @@ -32,11 +32,9 @@ if(H.can_eat(diet_flags)) //Make sure the species has it's dietflag set, otherwise it can't digest any nutrients if(prob(50)) M.adjustBruteLoss(-1) - if(H.species.exotic_blood) - H.vessel.add_reagent(H.species.exotic_blood, 0.4) - else - if(!(H.species.flags & NO_BLOOD)) - H.vessel.add_reagent("blood", 0.4) + if(!(H.species.flags & NO_BLOOD))//do not restore blood on things with no blood by nature. + if(H.blood_volume < BLOOD_VOLUME_NORMAL) + H.blood_volume += 0.4 ..() /datum/reagent/consumable/nutriment/protein // Meat-based protein, digestable by carnivores and omnivores, worthless to herbivores @@ -69,11 +67,9 @@ M.satiety += 30 if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.species.exotic_blood) - H.vessel.add_reagent(H.species.exotic_blood, 0.5) - else - if(!(H.species.flags & NO_BLOOD)) - H.vessel.add_reagent("blood", 0.5) + if(!(H.species.flags & NO_BLOOD))//do not restore blood on things with no blood by nature. + if(H.blood_volume < BLOOD_VOLUME_NORMAL) + H.blood_volume += 0.5 ..() /datum/reagent/consumable/sugar @@ -817,8 +813,8 @@ M.Weaken(1) if(ishuman(M)) var/mob/living/carbon/human/H = M - if(!H.heart_attack) - H.heart_attack = 1 + if(!H.undergoing_cardiac_arrest()) + H.set_heartattack(TRUE) ..() /datum/reagent/fungus diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm index 6a156313971..ab09d75551c 100644 --- a/code/modules/reagents/chemistry/reagents/medicine.dm +++ b/code/modules/reagents/chemistry/reagents/medicine.dm @@ -211,10 +211,11 @@ if(prob(33)) M.adjustBruteLoss(-2*REAGENTS_EFFECT_MULTIPLIER) M.adjustFireLoss(-2*REAGENTS_EFFECT_MULTIPLIER) - if(ishuman(M)) + if(ishuman(M) && prob(33)) var/mob/living/carbon/human/H = M - if(!H.species.exotic_blood && !(H.species.flags & NO_BLOOD) && prob(33)) - H.vessel.add_reagent("blood", 1) + if(!(H.species.flags & NO_BLOOD))//do not restore blood on things with no blood by nature. + if(H.blood_volume < BLOOD_VOLUME_NORMAL) + H.blood_volume += 1 ..() /datum/reagent/medicine/synthflesh @@ -1024,3 +1025,11 @@ /datum/reagent/medicine/earthsblood/overdose_process(mob/living/M) M.SetHallucinate(min(max(0, M.hallucination + 10), 50)) M.adjustToxLoss(5 * REAGENTS_EFFECT_MULTIPLIER) + +/datum/reagent/medicine/corazone + name = "Corazone" + id = "corazone" + description = "A medication used to treat pain, fever, and inflammation, along with heart attacks." + color = "#F5F5F5" + +// This reagent's effects are handled in heart attack handling code diff --git a/code/modules/reagents/chemistry/reagents/misc.dm b/code/modules/reagents/chemistry/reagents/misc.dm index e0e1854b866..96a50c80016 100644 --- a/code/modules/reagents/chemistry/reagents/misc.dm +++ b/code/modules/reagents/chemistry/reagents/misc.dm @@ -156,7 +156,7 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M if(!H.species.exotic_blood && !(H.species.flags & NO_BLOOD)) - H.vessel.add_reagent("blood", 0.8) + H.blood_volume += 0.8 ..() //foam @@ -396,11 +396,13 @@ description = "What is this emotion you humans call \"love?\" Oh, it's this? This is it? Huh, well okay then, thanks." reagent_state = LIQUID color = "#FF83A5" + process_flags = ORGANIC | SYNTHETIC // That's the power of love~ taste_message = "love" /datum/reagent/love/on_mob_life(mob/living/M) - if(M.a_intent == I_HARM) - M.a_intent = I_HELP + if(M.a_intent != INTENT_HELP) + M.a_intent_change(INTENT_HELP) + M.can_change_intents = 0 //Now you have no choice but to be helpful. if(prob(8)) var/lovely_phrase = pick("appreciated", "loved", "pretty good", "really nice", "pretty happy with yourself, even though things haven't always gone as well as they could") @@ -417,9 +419,14 @@ break ..() +/datum/reagent/love/on_mob_delete(mob/living/M) + M.can_change_intents = 1 + ..() + /datum/reagent/love/reaction_mob(mob/living/M, method=TOUCH, volume) to_chat(M, "You feel loved!") + /datum/reagent/royal_bee_jelly name = "royal bee jelly" id = "royal_bee_jelly" diff --git a/code/modules/reagents/chemistry/reagents/toxins.dm b/code/modules/reagents/chemistry/reagents/toxins.dm index 63bce7d68ea..96c7856e85c 100644 --- a/code/modules/reagents/chemistry/reagents/toxins.dm +++ b/code/modules/reagents/chemistry/reagents/toxins.dm @@ -229,6 +229,8 @@ if(method == TOUCH) if(ishuman(M)) var/mob/living/carbon/human/H = M + if(H.get_species() == "Grey") + return if(volume > 25) @@ -255,6 +257,10 @@ if(method == INGEST) if(ishuman(M)) var/mob/living/carbon/human/H = M + + if(H.get_species() == "Grey") + return + if(volume >=10 && volume <=25) if(!H.unacidable) M.take_organ_damage(0,min(max(volume-10,2)*2,20)) @@ -658,8 +664,8 @@ M.Weaken(2) if(ishuman(M)) var/mob/living/carbon/human/H = M - if(!H.heart_attack) - H.heart_attack = 1 // rip in pepperoni + if(!H.undergoing_cardiac_arrest()) + H.set_heartattack(TRUE) // rip in pepperoni ..() /datum/reagent/pancuronium diff --git a/code/modules/reagents/chemistry/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm index 33aedce7222..6efc1474bfe 100644 --- a/code/modules/reagents/chemistry/reagents/water.dm +++ b/code/modules/reagents/chemistry/reagents/water.dm @@ -21,10 +21,65 @@ taste_message = null /datum/reagent/water/reaction_mob(mob/living/M, method=TOUCH, volume) -// Put out fire if(method == TOUCH) + // Put out fire M.adjust_fire_stacks(-(volume / 10)) M.ExtinguishMob() + if(ishuman(M)) + + var/mob/living/carbon/human/H = M + + if(H.get_species() != "Grey") //God this is so gross I hate it. + return + + if(volume > 25) + + if(H.wear_mask) + to_chat(H, "Your mask protects you from the water!") + return + + if(H.head) + to_chat(H, "Your helmet protects you from the water!") + return + + if(!M.unacidable) + if(prob(75)) + var/obj/item/organ/external/affecting = H.get_organ("head") + if(affecting) + affecting.take_damage(5, 10) + H.UpdateDamageIcon() + H.emote("scream") + else + M.take_organ_damage(5,10) + else + M.take_organ_damage(5,10) + + if(method == INGEST) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + + if(H.get_species() != "Grey") + return + + if(volume < 10) + to_chat(M, "The watery solvent substance stings you, but isn't concentrated enough to harm you!") + + if(volume >=10 && volume <=25) + if(!H.unacidable) + M.take_organ_damage(0,min(max(volume-10,2)*2,20)) + M.emote("scream") + + + if(volume > 25) + if(!M.unacidable) + if(prob(75)) + var/obj/item/organ/external/affecting = H.get_organ("head") + if(affecting) + affecting.take_damage(0, 20) + H.UpdateDamageIcon() + H.emote("scream") + else + M.take_organ_damage(0,20) /datum/reagent/water/reaction_turf(turf/simulated/T, volume) if(!istype(T)) @@ -145,7 +200,8 @@ /datum/reagent/blood/reaction_mob(mob/living/M, method=TOUCH, volume) if(data && data["viruses"]) - for(var/datum/disease/D in data["viruses"]) + for(var/thing in data["viruses"]) + var/datum/disease/D = thing if(D.spread_flags & SPECIAL || D.spread_flags & NON_CONTAGIOUS) continue @@ -155,6 +211,14 @@ else //ingest, patch or inject M.ForceContractDisease(D) + if(method == INGEST && iscarbon(M)) + var/mob/living/carbon/C = M + if(C.get_blood_id() == "blood") + if((!data || !(data["blood_type"] in get_safe_blood(C.dna.b_type))) && !M.mind.vampire) + C.reagents.add_reagent("toxin", volume * 0.5) + else + C.blood_volume = min(C.blood_volume + round(volume, 0.1), BLOOD_VOLUME_MAXIMUM) + /datum/reagent/blood/on_new(list/data) if(istype(data)) SetViruses(src, data) @@ -183,13 +247,13 @@ preserve += D data["viruses"] = preserve - if(mix_data["blood_colour"]) - color = mix_data["blood_colour"] + if(mix_data["blood_color"]) + color = mix_data["blood_color"] return 1 /datum/reagent/blood/on_update(atom/A) - if(data["blood_colour"]) - color = data["blood_colour"] + if(data["blood_color"]) + color = data["blood_color"] return ..() /datum/reagent/blood/reaction_turf(turf/simulated/T, volume)//splash the blood all over the place @@ -203,22 +267,12 @@ blood_prop = new(T) blood_prop.blood_DNA[data["blood_DNA"]] = data["blood_type"] - for(var/datum/disease/D in data["viruses"]) - var/datum/disease/newVirus = D.Copy(1) - blood_prop.viruses += newVirus - newVirus.holder = blood_prop - else if(istype(data["donor"], /mob/living/carbon/alien)) var/obj/effect/decal/cleanable/blood/xeno/blood_prop = locate() in T if(!blood_prop) blood_prop = new(T) blood_prop.blood_DNA["UNKNOWN DNA STRUCTURE"] = "X*" - for(var/datum/disease/D in data["viruses"]) - var/datum/disease/newVirus = D.Copy(1) - blood_prop.viruses += newVirus - newVirus.holder = blood_prop - /datum/reagent/vaccine //data must contain virus type name = "Vaccine" @@ -227,7 +281,8 @@ /datum/reagent/vaccine/reaction_mob(mob/living/M, method=TOUCH, volume) if(islist(data) && (method == INGEST)) - for(var/datum/disease/D in M.viruses) + for(var/thing in M.viruses) + var/datum/disease/D = thing if(D.GetDiseaseID() in data) D.cure() M.resistances |= data diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index 1c22693513f..31547e10c44 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -271,4 +271,11 @@ required_reagents = list("ethanol" = 1, "copper" = 1, "silver" = 1) result_amount = 3 min_temp = 370 - mix_message = "The solution gently swirls with a metallic sheen." \ No newline at end of file + mix_message = "The solution gently swirls with a metallic sheen." + +/datum/chemical_reaction/corazone + name = "Corazone" + id = "corazone" + result = "corazone" + result_amount = 3 + required_reagents = list("phenol" = 2, "lithium" = 1) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index c441ab97805..c379e869768 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -3,7 +3,7 @@ desc = "..." icon = 'icons/obj/chemical.dmi' icon_state = null - w_class = 1 + w_class = WEIGHT_CLASS_TINY var/amount_per_transfer_from_this = 5 var/possible_transfer_amounts = list(5,10,15,25,30) var/volume = 30 @@ -32,7 +32,7 @@ create_reagents(volume) if(spawned_disease) var/datum/disease/F = new spawned_disease(0) - var/list/data = list("viruses" = list(F), "blood_colour" = "#A10808") + var/list/data = list("viruses" = list(F), "blood_color" = "#A10808") reagents.add_reagent("blood", disease_amount, data) if(list_reagents) reagents.add_reagent_list(list_reagents) diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index b170f6b0867..63db086cef8 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -40,7 +40,8 @@ /obj/machinery/biogenerator, /obj/machinery/hydroponics, /obj/machinery/constructable_frame, - /obj/machinery/icemachine) + /obj/machinery/icemachine, + /obj/item/weapon/bombcore/chemical) /obj/item/weapon/reagent_containers/glass/New() ..() @@ -289,9 +290,10 @@ name = "cryostasis beaker" desc = "A cryostasis beaker that allows for chemical storage without reactions. Can hold up to 50 units." icon_state = "beakernoreact" - materials = list(MAT_GLASS=500) + materials = list(MAT_METAL=3000) volume = 50 amount_per_transfer_from_this = 10 + origin_tech = "materials=2;engineering=3;plasmatech=3" flags = OPENCONTAINER /obj/item/weapon/reagent_containers/glass/beaker/noreact/New() @@ -302,12 +304,12 @@ name = "bluespace beaker" desc = "A bluespace beaker, powered by experimental bluespace technology and Element Cuban combined with the Compound Pete. Can hold up to 300 units." icon_state = "beakerbluespace" - materials = list(MAT_GLASS=5000) + materials = list(MAT_GLASS=3000) volume = 300 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,25,30,50,100,300) flags = OPENCONTAINER - + origin_tech = "bluespace=5;materials=4;plasmatech=4" /obj/item/weapon/reagent_containers/glass/beaker/cryoxadone list_reagents = list("cryoxadone" = 30) @@ -330,7 +332,7 @@ icon_state = "bucket" item_state = "bucket" materials = list(MAT_METAL=200) - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL amount_per_transfer_from_this = 20 possible_transfer_amounts = list(5,10,15,20,25,30,50,80,100,120) volume = 120 @@ -353,4 +355,4 @@ user.unEquip(src) qdel(src) else - ..() \ No newline at end of file + ..() diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index cc4bf75ea45..8674ba75a09 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -7,7 +7,7 @@ flags = OPENCONTAINER | NOBLUDGEON slot_flags = SLOT_BELT throwforce = 0 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL throw_speed = 3 throw_range = 7 var/spray_maxrange = 3 //what the sprayer will set spray_currentrange to in the attack_self. @@ -145,7 +145,7 @@ icon_state = "chemsprayer" item_state = "chemsprayer" throwforce = 0 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL spray_maxrange = 7 spray_currentrange = 7 amount_per_transfer_from_this = 10 @@ -204,4 +204,4 @@ icon_state = "plantbgone" item_state = "plantbgone" volume = 100 - list_reagents = list("glyphosate" = 100) \ No newline at end of file + list_reagents = list("glyphosate" = 100) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 0f2b766bb3c..e4205ef54d0 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -14,8 +14,9 @@ amount_per_transfer_from_this = 5 possible_transfer_amounts = null //list(5,10,15) volume = 15 - w_class = 1 + w_class = WEIGHT_CLASS_TINY sharp = 1 + var/busy = 0 var/mode = SYRINGE_DRAW var/projectile_type = /obj/item/projectile/bullet/dart/syringe @@ -58,13 +59,16 @@ ..() return -/obj/item/weapon/reagent_containers/syringe/afterattack(obj/target, mob/user, proximity) - if(!proximity) return - if(!target.reagents) return +/obj/item/weapon/reagent_containers/syringe/afterattack(atom/target, mob/user , proximity) + if(!proximity) + return + if(!target.reagents) + return + var/mob/living/L if(isliving(target)) - var/mob/living/M = target - if(!M.can_inject(user, 1)) + L = target + if(!L.can_inject(user, 1)) return if(mode == SYRINGE_BROKEN) @@ -75,163 +79,84 @@ if(SYRINGE_DRAW) if(reagents.total_volume >= reagents.maximum_volume) - to_chat(user, "The syringe is full.") + to_chat(user, "The syringe is full.") return - if(ismob(target))//Blood! - if(istype(target, /mob/living/carbon/slime)) - to_chat(user, "You are unable to locate any blood.") - return - if(reagents.has_reagent("blood")) - to_chat(user, "There is already a blood sample in this syringe") - return - if(istype(target, /mob/living/carbon))//maybe just add a blood reagent to all mobs. Then you can suck them dry...With hundreds of syringes. Jolly good idea. - var/mob/living/carbon/T = target - if(!T.dna) - to_chat(usr, "You are unable to locate any blood. (To be specific, your target seems to be missing their DNA datum)") + if(L) //living mob + var/drawn_amount = reagents.maximum_volume - reagents.total_volume + if(target != user) + target.visible_message("[user] is trying to take a blood sample from [target]!", \ + "[user] is trying to take a blood sample from [target]!") + busy = 1 + if(!do_mob(user, target)) + busy = 0 return - if(NOCLONE in T.mutations) //target done been et, no more blood in him - to_chat(user, "You are unable to locate any blood.") + if(reagents.total_volume >= reagents.maximum_volume) return - - - var/time = 30 - if(istype(target,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = T - if(H.species.flags & NO_BLOOD) - to_chat(usr, "You are unable to locate any blood.") - return - if(target == user) - time = 0 - else - for(var/mob/O in viewers(world.view, user)) - O.show_message(text("[] is trying to take a blood sample from []!", user, target), 1) - if(!do_mob(user, target, time)) - return - - var/amount = reagents.maximum_volume - reagents.total_volume - if(amount == 0) - to_chat(usr, "The syringe is full!") - return - - var/datum/reagent/B - if(istype(T,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = T - if(H.species && H.species.exotic_blood && H.vessel.total_volume) - H.vessel.trans_to(src,amount) - else - B = T.take_blood(src,amount) - else - B = T.take_blood(src,amount) - - if(B) - reagents.reagent_list |= B - reagents.update_total() - on_reagent_change() - reagents.handle_reactions() - - to_chat(user, "You take a blood sample from [target]") - for(var/mob/O in viewers(4, user)) - O.show_message("[user] takes a blood sample from [target].", 1) - else - user.visible_message("[user] takes a sample from [target].", "You take a sample from [target].") + busy = 0 + if(L.transfer_blood_to(src, drawn_amount)) + user.visible_message("[user] takes a blood sample from [L].") + else + to_chat(user, "You are unable to draw any blood from [L]!") else //if not mob if(!target.reagents.total_volume) - to_chat(user, "[target] is empty.") + to_chat(user, "[target] is empty!") return if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers) && !istype(target,/obj/item/slime_extract)) - to_chat(user, "You cannot directly remove reagents from this object.") + to_chat(user, "You cannot directly remove reagents from [target]!") return var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) // transfer from, transfer to - who cares? - to_chat(user, "You fill the syringe with [trans] units of the solution.") + to_chat(user, "You fill [src] with [trans] units of the solution.") if(reagents.total_volume >= reagents.maximum_volume) mode=!mode update_icon() if(SYRINGE_INJECT) if(!reagents.total_volume) - to_chat(user, "The Syringe is empty.") - return - if(istype(target, /obj/item/weapon/implantcase/chem)) + to_chat(user, "[src] is empty.") return if(!target.is_open_container() && !ismob(target) && !istype(target, /obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/slime_extract) && !istype(target, /obj/item/clothing/mask/cigarette) && !istype(target, /obj/item/weapon/storage/fancy/cigarettes)) - to_chat(user, "You cannot directly fill this object.") + to_chat(user, "You cannot directly fill [target]!") return - if(istype(target, /obj/item/clothing/mask/cigarette)) - var/obj/item/clothing/mask/cigarette/C = target - if(istype(C.loc, /obj/item/weapon/storage/fancy/cigarettes)) - to_chat(user, "You cannot inject a cigarette while it's still in the pack.") - return if(target.reagents.total_volume >= target.reagents.maximum_volume) - to_chat(user, "[target] is full.") + to_chat(user, "[target] is full.") return - var/mob/living/carbon/human/H = target - if(istype(H)) - var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting) - if(!affected) - to_chat(user, "\The [H] is missing that limb!") - return - /* else if(affected.status & ORGAN_ROBOT) - to_chat(user, "You cannot inject a robotic limb.") - return */ + if(L) //living mob + if(L != user) + L.visible_message("[user] is trying to inject [L]!", \ + "[user] is trying to inject [L]!") + if(!do_mob(user, L)) + return + if(!reagents.total_volume) + return + if(L.reagents.total_volume >= L.reagents.maximum_volume) + return + L.visible_message("[user] injects [L] with the syringe!", \ + "[user] injects [L] with the syringe!") - if(ismob(target) && target != user) - for(var/mob/O in viewers(world.view, user)) - O.show_message(text("[] is trying to inject []!", user, target), 1) + var/list/rinject = list() + for(var/datum/reagent/R in reagents.reagent_list) + rinject += R.name + var/contained = english_list(rinject) - if(!do_mob(user, target, 30)) return - - for(var/mob/O in viewers(world.view, user)) - O.show_message(text("[] injects [] with the syringe!", user, target), 1) - - if(istype(target,/mob/living)) - var/mob/living/M = target - var/list/injected = list() - for(var/datum/reagent/R in reagents.reagent_list) - injected += R.name - var/contained = english_list(injected) - M.create_attack_log("Has been injected with [name] by [key_name(user)]. Reagents: [contained]") - user.create_attack_log("Used the [name] to inject [key_name(M)]. Reagents: [contained]") - if(M.ckey) - msg_admin_attack("[key_name_admin(user)] injected [key_name_admin(M)] with [name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])") - if(!iscarbon(user)) - M.LAssailant = null - else - M.LAssailant = user - - reagents.reaction(target, INGEST) - if(ismob(target) && target == user) - reagents.reaction(target, INGEST) - - spawn(5) - var/datum/reagent/blood/B - for(var/datum/reagent/blood/d in reagents.reagent_list) - B = d - break - var/trans - if(B && istype(target,/mob/living/carbon)) - var/mob/living/carbon/C = target - C.inject_blood(src, 5) + if(L != user) + add_logs(user, L, "injected", src, addition="which had [contained]") else - trans = reagents.trans_to(target, amount_per_transfer_from_this) - to_chat(user, "You inject [trans] units of the solution. The syringe now contains [reagents.total_volume] units.") - if(istype(target, /obj/item/weapon/reagent_containers/food/pill/patch)) - var/obj/item/weapon/reagent_containers/food/pill/patch/P = target - if(P.instant_application) - to_chat(user, "You break the medical seal on the [P]!") - P.instant_application = 0 + log_attack("[user.name] ([user.ckey]) injected [L.name] ([L.ckey]) with [src.name], which had [contained] (INTENT: [uppertext(user.a_intent)])") - if(reagents.total_volume <= 0 && mode==SYRINGE_INJECT) - mode = SYRINGE_DRAW - update_icon() - - return + var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1) + reagents.reaction(L, INGEST, fraction) + reagents.trans_to(target, amount_per_transfer_from_this) + to_chat(user, "You inject [amount_per_transfer_from_this] units of the solution. The syringe now contains [reagents.total_volume] units.") + if (reagents.total_volume <= 0 && mode==SYRINGE_INJECT) + mode = SYRINGE_DRAW + update_icon() /obj/item/weapon/reagent_containers/syringe/update_icon() if(mode == SYRINGE_BROKEN) @@ -398,4 +323,4 @@ /obj/item/weapon/reagent_containers/syringe/bioterror name = "bioterror syringe" desc = "Contains several paralyzing reagents." - list_reagents = list("neurotoxin" = 5, "capulettium_plus" = 5, "sodium_thiopental" = 5) \ No newline at end of file + list_reagents = list("neurotoxin" = 5, "capulettium_plus" = 5, "sodium_thiopental" = 5) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 11abc89a343..eb43698d451 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -29,6 +29,7 @@ /obj/structure/reagent_dispensers/proc/boom() visible_message("[src] ruptures!") + chem_splash(loc, 5, list(reagents)) qdel(src) /obj/structure/reagent_dispensers/ex_act(severity) @@ -53,15 +54,6 @@ desc = "A water tank." icon_state = "water" -/obj/structure/reagent_dispensers/watertank/boom() - playsound(loc, 'sound/effects/spray2.ogg', 50, 1, -6) - new /obj/effect/effect/water(loc) - for(var/turf/simulated/T in view(5, loc)) - T.MakeSlippery() - for(var/mob/living/L in T) - L.adjust_fire_stacks(-20) - ..() - /obj/structure/reagent_dispensers/watertank/high name = "high-capacity water tank" desc = "A highly-pressurized water tank made to hold gargantuan amounts of water.." @@ -223,6 +215,34 @@ user.put_in_hands(S) paper_cups-- +/obj/structure/reagent_dispensers/water_cooler/attackby(obj/item/weapon/W, mob/living/user, params) + add_fingerprint(user) + user.changeNext_move(CLICK_CD_MELEE) + if(iswrench(W)) + if(anchored) + playsound(loc, W.usesound, 100, 1) + user.visible_message("[user] starts loosening [src]'s floor casters.", \ + "You start loosening [src]'s floor casters...") + if(do_after(user, 40 * W.toolspeed, target = src)) + if(!loc || !anchored) + return + user.visible_message("[user] loosened [src]'s floor casters.", \ + "You loosen [src]'s floor casters.") + anchored = 0 + else + if(!isfloorturf(loc)) + user.visible_message("A floor must be present to secure [src]!") + return + playsound(loc, W.usesound, 100, 1) + user.visible_message("[user] start securing [src]'s floor casters...", \ + "You start securing [src]'s floor casters...") + if(do_after(user, 40 * W.toolspeed, target = src)) + if(!loc || anchored) + return + user.visible_message("[user] has secured [src]'s floor casters.", \ + "You have secured [src]'s floor casters.") + anchored = 1 + /obj/structure/reagent_dispensers/beerkeg name = "beer keg" desc = "Beer is liquid bread, it's good for you..." @@ -254,4 +274,4 @@ icon_state = "fuel_chem" anchored = 1 density = 0 - accepts_rig = 0 \ No newline at end of file + accepts_rig = 0 diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 209edb809b2..f0861b2591c 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -140,7 +140,7 @@ update_move_direction() to_chat(user, "You rotate [src].") - else if(user.a_intent != "harm") + else if(user.a_intent != INTENT_HARM) if(user.drop_item()) I.forceMove(loc) else @@ -334,7 +334,7 @@ icon_state = "conveyor0" name = "conveyor belt assembly" desc = "A conveyor belt assembly." - w_class = 4 + w_class = WEIGHT_CLASS_BULKY var/id = "" //inherited by the belt /obj/item/conveyor_construct/attackby(obj/item/I, mob/user, params) @@ -361,7 +361,7 @@ desc = "A conveyor control switch assembly." icon = 'icons/obj/recycling.dmi' icon_state = "switch-off" - w_class = 4 + w_class = WEIGHT_CLASS_BULKY var/id = "" //inherited by the switch /obj/item/conveyor_switch_construct/New() @@ -377,7 +377,7 @@ found = 1 break if(!found) - to_chat(usr, "\icon[src]The conveyor switch did not detect any linked conveyor belts in range.") + to_chat(usr, "[bicon(src)] The conveyor switch did not detect any linked conveyor belts in range.") return var/obj/machinery/conveyor_switch/NC = new/obj/machinery/conveyor_switch(A, id) transfer_fingerprints_to(NC) diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index 73fbb455835..e38ea69f345 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -98,7 +98,7 @@ /obj/structure/disposalconstruct/AltClick(mob/user) if(user.incapacitated()) - to_chat(user << "You can't do that right now!") + to_chat(user, "You can't do that right now!") return if(!Adjacent(user)) return @@ -195,7 +195,7 @@ playsound(src.loc, I.usesound, 100, 1) update() return - + var/obj/structure/disposalpipe/CP = locate() in T if(ptype>=6 && ptype <= 8) // Disposal or outlet if(CP) // There's something there diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index a8d3902e6f3..52db1f8d30c 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -216,7 +216,7 @@ //The whole system for the sorttype var is determined based on the order of this list, //disposals must always be 1, since anything that's untagged will automatically go to disposals, or sorttype = 1 --Superxpdude - w_class = 1 + w_class = WEIGHT_CLASS_TINY item_state = "electronic" flags = CONDUCT slot_flags = SLOT_BELT @@ -430,4 +430,4 @@ /obj/item/shippingPackage/Destroy() QDEL_NULL(wrapped) - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index 9e411abaee3..25a9862b6b1 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -103,8 +103,6 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). for(var/obj/I in component_parts) if(istype(I, /obj/item/weapon/reagent_containers/glass/beaker)) reagents.trans_to(I, reagents.total_volume) - if(I.reliability != 100 && crit_fail) - I.crit_fail = 1 I.loc = src.loc for(var/obj/item/weapon/reagent_containers/glass/G in component_parts) reagents.trans_to(G, G.reagents.maximum_volume) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 26f9413bc5f..a3ea37c2d30 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -2,7 +2,7 @@ /*************************************************************** ** Design Datums ** -** All the data for building stuff and tracking reliability. ** +** All the data for building stuff. ** ***************************************************************/ /* For the materials datum, it assumes you need reagents unless specified otherwise. To designate a material that isn't a reagent, @@ -23,9 +23,6 @@ The currently supporting non-reagent materials: Don't add new keyword/IDs if they are made from an existing one (such as rods which are made from metal). Only add raw materials. Design Guidlines -- The reliability formula for all R&D built items is reliability (a fixed number) + total tech levels required to make it + -reliability_mod (starts at 0, gets improved through experimentation). Example: PACMAN generator. 79 base reliablity + 6 tech -(3 plasmatech, 3 powerstorage) + 0 (since it's completely new) = 85% reliability. Reliability is the chance it works CORRECTLY. - When adding new designs, check rdreadme.dm to see what kind of things have already been made and where new stuff is needed. - A single sheet of anything is 2000 units of material. Materials besides metal/glass require help from other jobs (mining for other types of metals and chemistry for reagents). @@ -39,7 +36,6 @@ other types of metals and chemistry for reagents). var/desc = "Desc" //Description of the created object. var/id = "id" //ID of the created object for easy refernece. Alphanumeric, lower-case, no symbols var/list/req_tech = list() //IDs of that techs the object originated from and the minimum level requirements. - var/reliability = 100 //Reliability of the device. var/build_type = null //Flag as to what kind machine the design is built in. See defines. var/list/materials = list() //List of materials. Format: "id" = amount. var/construction_time //Amount of time required for building the object @@ -51,14 +47,3 @@ other types of metals and chemistry for reagents). var/list/reagents = list() //List of reagents. Format: "id" = amount. var/maxstack = 1 var/lathe_time_factor = 1 //How many times faster than normal is this to build on the protolathe - -//A proc to calculate the reliability of a design based on tech levels and innate modifiers. -//Input: A list of /datum/tech; Output: The new reliabilty. -/datum/design/proc/CalcReliability(var/list/temp_techs) - var/new_reliability - for(var/datum/tech/T in temp_techs) - if(T.id in req_tech) - new_reliability += T.level - new_reliability = Clamp(new_reliability, reliability, 100) - reliability = new_reliability - return diff --git a/code/modules/research/designs/AI_module_designs.dm b/code/modules/research/designs/AI_module_designs.dm index 01de6f63848..018c0bb837a 100644 --- a/code/modules/research/designs/AI_module_designs.dm +++ b/code/modules/research/designs/AI_module_designs.dm @@ -6,7 +6,7 @@ name = "AI Module (Freeform)" desc = "Allows for the construction of a Freeform AI Module." id = "freeform_module" - req_tech = list("programming" = 4, "materials" = 4) + req_tech = list("programming" = 5, "materials" = 4) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_GOLD = 100) build_path = /obj/item/weapon/aiModule/freeform @@ -16,7 +16,7 @@ name = "AI Module (oneCrewMember)" desc = "Allows for the construction of a oneCrewMember AI Module." id = "onecrewmember_module" - req_tech = list("programming" = 4, "materials" = 6) + req_tech = list("programming" = 6, "materials" = 4) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_DIAMOND = 100) build_path = /obj/item/weapon/aiModule/oneCrewMember @@ -26,7 +26,7 @@ name = "AI Module (OxygenIsToxicToHumans)" desc = "Allows for the construction of a Safeguard AI Module." id = "oxygen_module" - req_tech = list("programming" = 3, "biotech" = 2, "materials" = 4) + req_tech = list("programming" = 4, "biotech" = 2, "materials" = 4) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_GOLD = 100) build_path = /obj/item/weapon/aiModule/oxygen @@ -36,7 +36,7 @@ name = "AI Module (ProtectStation)" desc = "Allows for the construction of a ProtectStation AI Module." id = "protectstation_module" - req_tech = list("programming" = 3, "materials" = 6) + req_tech = list("programming" = 5, "materials" = 4) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_GOLD = 100) build_path = /obj/item/weapon/aiModule/protectStation @@ -46,7 +46,7 @@ name = "AI Module (Purge)" desc = "Allows for the construction of a Purge AI Module." id = "purge_module" - req_tech = list("programming" = 4, "materials" = 6) + req_tech = list("programming" = 5, "materials" = 6) build_type = IMPRINTER materials = list(MAT_GLASS = 2000, "sacid" = 20, MAT_DIAMOND = 100) build_path = /obj/item/weapon/aiModule/purge @@ -66,7 +66,7 @@ name = "AI Module (Reset)" desc = "Allows for the construction of a Reset AI Module." id = "reset_module" - req_tech = list("programming" = 3, "materials" = 6) + req_tech = list("programming" = 4, "materials" = 6) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_GOLD = 100) build_path = /obj/item/weapon/aiModule/reset @@ -76,7 +76,7 @@ name = "AI Module (Safeguard)" desc = "Allows for the construction of a Safeguard AI Module." id = "safeguard_module" - req_tech = list("programming" = 3, "materials" = 4) + req_tech = list("programming" = 3, "materials" = 3) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_GOLD = 100) build_path = /obj/item/weapon/aiModule/safeguard @@ -86,7 +86,7 @@ name = "Core AI Module (Antimov)" desc = "Allows for the construction of a Antimov AI Core Module." id = "antimov_module" - req_tech = list("programming" = 4, "materials" = 6, "syndicate" = 2) + req_tech = list("programming" = 5, "syndicate" = 2, "materials" = 5) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_DIAMOND = 100) build_path = /obj/item/weapon/aiModule/antimov @@ -96,7 +96,7 @@ name = "Core AI Module (Asimov)" desc = "Allows for the construction of a Asimov AI Core Module." id = "asimov_module" - req_tech = list("programming" = 3, "materials" = 6) + req_tech = list("programming" = 3, "materials" = 5) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_DIAMOND = 100) build_path = /obj/item/weapon/aiModule/asimov @@ -106,7 +106,7 @@ name = "Core AI Module (Corporate)" desc = "Allows for the construction of a Corporate AI Core Module." id = "corporate_module" - req_tech = list("programming" = 4, "materials" = 6) + req_tech = list("programming" = 5, "materials" = 5) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_DIAMOND = 100) build_path = /obj/item/weapon/aiModule/corp @@ -116,7 +116,7 @@ name = "Core AI Module (Crewsimov)" desc = "Allows for the construction of a Crewsimov AI Core Module." id = "crewsimov_module" - req_tech = list("programming" = 3, "materials" = 6) + req_tech = list("programming" = 3, "materials" = 5) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_DIAMOND = 100) build_path = /obj/item/weapon/aiModule/crewsimov @@ -126,7 +126,7 @@ name = "Core AI Module (Freeform)" desc = "Allows for the construction of a Freeform AI Core Module." id = "freeformcore_module" - req_tech = list("programming" = 4, "materials" = 6) + req_tech = list("programming" = 6, "materials" = 6) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_DIAMOND = 100) build_path = /obj/item/weapon/aiModule/freeformcore @@ -136,7 +136,7 @@ name = "Core AI Module (P.A.L.A.D.I.N.)" desc = "Allows for the construction of a P.A.L.A.D.I.N. AI Core Module." id = "paladin_module" - req_tech = list("programming" = 4, "materials" = 6) + req_tech = list("programming" = 5, "materials" = 5) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_DIAMOND = 100) build_path = /obj/item/weapon/aiModule/paladin @@ -146,7 +146,7 @@ name = "Core AI Module (T.Y.R.A.N.T.)" desc = "Allows for the construction of a T.Y.R.A.N.T. AI Module." id = "tyrant_module" - req_tech = list("programming" = 4, "syndicate" = 2, "materials" = 6) + req_tech = list("programming" = 5, "syndicate" = 2, "materials" = 5) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_DIAMOND = 100) build_path = /obj/item/weapon/aiModule/tyrant diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 29370cbc04b..99d4fa8fe22 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -852,7 +852,6 @@ name = "Machine Board (Vendor)" desc = "The circuit board for a Vendor." id = "vendor" - req_tech = list("programming" = 1) build_type = AUTOLATHE materials = list(MAT_GLASS = 750, MAT_METAL = 250) build_path = /obj/item/weapon/circuitboard/vendor diff --git a/code/modules/research/designs/bluespace_designs.dm b/code/modules/research/designs/bluespace_designs.dm index e15fe544f1a..ed42ac98780 100644 --- a/code/modules/research/designs/bluespace_designs.dm +++ b/code/modules/research/designs/bluespace_designs.dm @@ -5,10 +5,9 @@ name = "Artificial Bluespace Crystal" desc = "A small blue crystal with mystical properties." id = "bluespace_crystal" - req_tech = list("bluespace" = 4, "materials" = 6) + req_tech = list("bluespace" = 3, "materials" = 6, "plasmatech" = 4) build_type = PROTOLATHE materials = list(MAT_DIAMOND = 1500, MAT_PLASMA = 1500) - reliability = 100 build_path = /obj/item/weapon/ore/bluespace_crystal/artificial category = list("Bluespace") @@ -16,10 +15,9 @@ name = "Bag of Holding" desc = "A backpack that opens into a localized pocket of Blue Space." id = "bag_holding" - req_tech = list("bluespace" = 4, "materials" = 6) + req_tech = list("bluespace" = 7, "materials" = 5, "engineering" = 5, "plasmatech" = 6) build_type = PROTOLATHE materials = list(MAT_GOLD = 3000, MAT_DIAMOND = 1500, MAT_URANIUM = 250) - reliability = 80 build_path = /obj/item/weapon/storage/backpack/holding category = list("Bluespace") @@ -27,29 +25,17 @@ name = "Belt of Holding" desc = "An astonishingly complex belt popularized by a rich blue-space technology magnate." id = "bluespace_belt" - req_tech = list("bluespace" = 4, "materials" = 6) + req_tech = list("bluespace" = 7, "materials" = 5, "engineering" = 5, "plasmatech" = 6) build_type = PROTOLATHE materials = list(MAT_GOLD = 1500, MAT_DIAMOND = 3000, MAT_URANIUM = 1000) - reliability = 80 build_path = /obj/item/weapon/storage/belt/bluespace category = list("Bluespace") -/datum/design/bluespacebeaker - name = "Bluespace Beaker" - desc = "A bluespace beaker, powered by experimental bluespace technology and Element Cuban combined with the Compound Pete. Can hold up to 300 units." - id = "bluespacebeaker" - req_tech = list("bluespace" = 2, "materials" = 6) - build_type = PROTOLATHE - materials = list(MAT_METAL = 3000, MAT_PLASMA = 3000, MAT_DIAMOND = 500) - reliability = 76 - build_path = /obj/item/weapon/reagent_containers/glass/beaker/bluespace - category = list("Medical") - /datum/design/telesci_gps name = "GPS Device" desc = "A device that can track its position at all times." id = "telesci_Gps" - req_tech = list("materials" = 2, "magnets" = 3, "bluespace" = 3) + req_tech = list("materials" = 2, "bluespace" = 2) build_type = PROTOLATHE materials = list(MAT_METAL = 500, MAT_GLASS = 1000) build_path = /obj/item/device/gps @@ -59,10 +45,9 @@ name = "Mining Satchel of Holding" desc = "A mining satchel that can hold an infinite amount of ores." id = "minerbag_holding" - req_tech = list("bluespace" = 3, "materials" = 4) + req_tech = list("bluespace" = 4, "materials" = 3, "engineering" = 4) build_type = PROTOLATHE materials = list(MAT_GOLD = 250, MAT_URANIUM = 500) //quite cheap, for more convenience - reliability = 100 build_path = /obj/item/weapon/storage/bag/ore/holding category = list("Bluespace") @@ -70,7 +55,7 @@ name = "Telepad Beacon" desc = "Use to warp in a cargo telepad." id = "telepad_beacon" - req_tech = list("bluespace" = 3, "materials" = 4) + req_tech = list("programming" = 5, "bluespace" = 4, "engineering" = 4, "plasmatech" = 4) build_type = PROTOLATHE materials = list (MAT_METAL = 2000, MAT_GLASS = 1750, MAT_SILVER = 500) build_path = /obj/item/device/telepad_beacon @@ -82,6 +67,6 @@ id = "beacon" req_tech = list("bluespace" = 1) build_type = PROTOLATHE - materials = list (MAT_METAL = 20, MAT_GLASS = 10) + materials = list (MAT_METAL = 150, MAT_GLASS = 100) build_path = /obj/item/device/radio/beacon - category = list("Bluespace") \ No newline at end of file + category = list("Bluespace") diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm index 6d3624701b9..961dfd51710 100644 --- a/code/modules/research/designs/comp_board_designs.dm +++ b/code/modules/research/designs/comp_board_designs.dm @@ -6,7 +6,7 @@ name = "Console Board (AI Core)" desc = "Allows for the construction of circuit boards used to build new AI cores." id = "aicore" - req_tech = list("programming" = 4, "biotech" = 3) + req_tech = list("programming" = 3) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/aicore @@ -16,7 +16,7 @@ name = "Console Board (AI Integrity Restorer)" desc = "Allows for the construction of circuit boards used to build an AI Integrity Restorer." id = "aifixer" - req_tech = list("programming" = 3, "biotech" = 2) + req_tech = list("programming" = 4, "magnets" = 3) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/aifixer @@ -26,7 +26,7 @@ name = "Console Board (AI Upload)" desc = "Allows for the construction of circuit boards used to build an AI Upload Console." id = "aiupload" - req_tech = list("programming" = 4) + req_tech = list("programming" = 5, "engineering" = 4) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/aiupload @@ -56,7 +56,7 @@ name = "Console Board (Camera Monitor)" desc = "Allows for the construction of circuit boards used to build camera monitors." id = "seccamera" - req_tech = list("programming" = 2) + req_tech = list("programming" = 2, "combat" = 2) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/camera @@ -66,7 +66,7 @@ name = "Console Board (Cloning Machine Console)" desc = "Allows for the construction of circuit boards used to build a new Cloning Machine console." id = "clonecontrol" - req_tech = list("programming" = 3, "biotech" = 3) + req_tech = list("programming" = 4, "biotech" = 3) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/cloning @@ -76,7 +76,7 @@ name = "Console Board (Communications Console)" desc = "Allows for the construction of circuit boards used to build a communications console." id = "comconsole" - req_tech = list("programming" = 2, "magnets" = 2) + req_tech = list("programming" = 3, "magnets" = 3) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/communications @@ -96,7 +96,7 @@ name = "Console Board (Cyborg Upload)" desc = "Allows for the construction of circuit boards used to build a Cyborg Upload Console." id = "borgupload" - req_tech = list("programming" = 4) + req_tech = list("programming" = 5, "engineering" = 4) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/borgupload @@ -106,7 +106,7 @@ name = "Console Board (DNA Machine)" desc = "Allows for the construction of circuit boards used to build a new DNA scanning console." id = "scan_console" - req_tech = list("programming" = 2, "biotech" = 3) + req_tech = list("programming" = 2, "biotech" = 2) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/scan_consolenew @@ -136,7 +136,7 @@ name = "Console Board (ID Computer)" desc = "Allows for the construction of circuit boards used to build an ID computer." id = "idcardconsole" - req_tech = list("programming" = 2) + req_tech = list("programming" = 3) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/card @@ -146,7 +146,7 @@ name = "Console Board (Mech Bay Power Control Console)" desc = "Allows for the construction of circuit boards used to build a mech bay power control console." id = "mechapower" - req_tech = list("programming" = 2, "powerstorage" = 3) + req_tech = list("programming" = 3, "powerstorage" = 3) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mech_bay_power_console @@ -156,7 +156,7 @@ name = "Console Board (Medical Records)" desc = "Allows for the construction of circuit boards used to build a medical records console." id = "med_data" - req_tech = list("programming" = 2) + req_tech = list("programming" = 2, "biotech" = 2) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/med_data @@ -176,7 +176,7 @@ name = "Console Board (Operating Computer)" desc = "Allows for the construction of circuit boards used to build an operating computer console." id = "operating" - req_tech = list("programming" = 2, "biotech" = 2) + req_tech = list("programming" = 2, "biotech" = 3) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/operating @@ -186,7 +186,7 @@ name = "Computer Design (PanD.E.M.I.C. 2200)" desc = "Allows for the construction of circuit boards used to build a PanD.E.M.I.C. 2200 console." id = "pandemic" - req_tech = list("programming" = 2, "biotech" = 2) + req_tech = list("programming" = 3, "biotech" = 3) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/pandemic @@ -196,7 +196,7 @@ name = "Console Board (Power Monitor)" desc = "Allows for the construction of circuit boards used to build a new power monitor" id = "powermonitor" - req_tech = list("programming" = 2) + req_tech = list("programming" = 2, "powerstorage" = 2) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/powermonitor @@ -246,7 +246,7 @@ name = "Console Board (Security Records Console)" desc = "Allows for the construction of circuit boards used to build a security records console." id = "secdata" - req_tech = list("programming" = 2) + req_tech = list("programming" = 2, "combat" = 2) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/secure_data @@ -266,7 +266,7 @@ name = "Console Board (Spacepod Locator)" desc = "Allows for the construction of circuit boards used to build a space-pod locating console" id = "spacepodc" - req_tech = list("programming" = 2) + req_tech = list("programming" = 4) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/pod_locater @@ -296,7 +296,7 @@ name = "Console Board (Telecommunications Monitoring Console)" desc = "Allows for the construction of circuit boards used to build a telecommunications monitor." id = "comm_monitor" - req_tech = list("programming" = 3) + req_tech = list("programming" = 3, "magnets" = 3, "bluespace" = 2) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/comm_monitor @@ -306,7 +306,7 @@ name = "Console Board (Telecommunications Server Monitoring Console)" desc = "Allows for the construction of circuit boards used to build a telecommunication server browser and monitor." id = "comm_server" - req_tech = list("programming" = 3) + req_tech = list("programming" = 3, "magnets" = 3, "bluespace" = 2) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/comm_server @@ -316,7 +316,7 @@ name = "Console Board (Telecommunications Traffic Control Console)" desc = "Allows for the construction of circuit boards used to build a telecommunications traffic control console." id = "comm_traffic" - req_tech = list("programming" = 3) + req_tech = list("programming" = 3, "magnets" = 3, "bluespace" = 2) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/comm_traffic @@ -326,7 +326,7 @@ name = "Console Board (Telepad Control Console)" desc = "Allows for the construction of circuit boards used to build a telescience console." id = "telesci_console" - req_tech = list("programming" = 3, "bluespace" = 2) + req_tech = list("programming" = 3, "bluespace" = 3, "plasmatech" = 4) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/telesci_console @@ -336,7 +336,7 @@ name = "Console Board (Teleporter Console)" desc = "Allows for the construction of circuit boards used to build a teleporter control console." id = "teleconsole" - req_tech = list("programming" = 3, "bluespace" = 2) + req_tech = list("programming" = 3, "bluespace" = 3, "plasmatech" = 4) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/teleporter diff --git a/code/modules/research/designs/computer_part_designs.dm b/code/modules/research/designs/computer_part_designs.dm index 278adb3cf25..5108cdfeaee 100644 --- a/code/modules/research/designs/computer_part_designs.dm +++ b/code/modules/research/designs/computer_part_designs.dm @@ -63,7 +63,7 @@ id = "netcard_basic" req_tech = list("programming" = 2, "engineering" = 1) build_type = IMPRINTER - materials = list(MAT_GLASS = 100, "sacid" = 20) + materials = list(MAT_METAL = 250, MAT_GLASS = 100, "sacid" = 20) build_path = /obj/item/weapon/computer_hardware/network_card category = list("Computer Parts") @@ -72,7 +72,7 @@ id = "netcard_advanced" req_tech = list("programming" = 4, "engineering" = 2) build_type = IMPRINTER - materials = list(MAT_GLASS = 200, "sacid" = 20) + materials = list(MAT_METAL = 500, MAT_GLASS = 200, "sacid" = 20) build_path = /obj/item/weapon/computer_hardware/network_card/advanced category = list("Computer Parts") @@ -81,7 +81,7 @@ id = "netcard_wired" req_tech = list("programming" = 5, "engineering" = 3) build_type = IMPRINTER - materials = list(MAT_GLASS = 400, "sacid" = 20) + materials = list(MAT_METAL = 2500, MAT_GLASS = 400, "sacid" = 20) build_path = /obj/item/weapon/computer_hardware/network_card/wired category = list("Computer Parts") diff --git a/code/modules/research/designs/equipment_designs.dm b/code/modules/research/designs/equipment_designs.dm index 9792f007c55..a3e9b82b722 100644 --- a/code/modules/research/designs/equipment_designs.dm +++ b/code/modules/research/designs/equipment_designs.dm @@ -5,7 +5,7 @@ name = "Experimental Welding Tool" desc = "An experimental welder capable of self-fuel generation." id = "exwelder" - req_tech = list("materials" = 4, "engineering" = 4, "bluespace" = 3, "plasmatech" = 3) + req_tech = list("materials" = 4, "engineering" = 5, "bluespace" = 3, "plasmatech" = 4) build_type = PROTOLATHE materials = list(MAT_METAL = 1000, MAT_GLASS = 500, MAT_PLASMA = 1500, MAT_URANIUM = 200) build_path = /obj/item/weapon/weldingtool/experimental @@ -17,7 +17,7 @@ id = "health_hud" req_tech = list("biotech" = 2, "magnets" = 3) build_type = PROTOLATHE - materials = list(MAT_METAL = 50, MAT_GLASS = 50) + materials = list(MAT_METAL = 500, MAT_GLASS = 500) build_path = /obj/item/clothing/glasses/hud/health category = list("Equipment") @@ -25,9 +25,9 @@ name = "Night Vision Health Scanner HUD" desc = "An advanced medical head-up display that allows doctors to find patients in complete darkness." id = "health_hud_night" - req_tech = list("biotech" = 4, "magnets" = 5) + req_tech = list("biotech" = 4, "magnets" = 5, "plasmatech" = 4, "engineering" = 6) build_type = PROTOLATHE - materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_URANIUM = 1000, MAT_SILVER = 250) + materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_URANIUM = 1000, MAT_SILVER = 350) build_path = /obj/item/clothing/glasses/hud/health/night category = list("Equipment") @@ -45,9 +45,9 @@ name = "Night Vision Goggles" desc = "Goggles that let you see through darkness unhindered." id = "night_vision_goggles" - req_tech = list("magnets" = 4) + req_tech = list("materials" = 4, "magnets" = 5, "plasmatech" = 4, "engineering" = 5) build_type = PROTOLATHE - materials = list(MAT_METAL = 100, MAT_GLASS = 100, MAT_URANIUM = 1000) + materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_PLASMA = 350, MAT_URANIUM = 1000) build_path = /obj/item/clothing/glasses/night category = list("Equipment") @@ -57,7 +57,7 @@ id = "security_hud" req_tech = list("magnets" = 3, "combat" = 2) build_type = PROTOLATHE - materials = list(MAT_METAL = 50, MAT_GLASS = 50) + materials = list(MAT_METAL = 500, MAT_GLASS = 500) build_path = /obj/item/clothing/glasses/hud/security category = list("Equipment") @@ -65,9 +65,9 @@ name = "Night Vision Security HUD" desc = "A heads-up display which provides id data and vision in complete darkness." id = "security_hud_night" - req_tech = list("magnets" = 5, "combat" = 4) + req_tech = list("combat" = 4, "magnets" = 5, "plasmatech" = 4, "engineering" = 6) build_type = PROTOLATHE - materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_URANIUM = 1000, MAT_GOLD = 350) + materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_URANIUM = 1000, MAT_GOLD = 350) build_path = /obj/item/clothing/glasses/hud/security/night category = list("Equipment") @@ -75,9 +75,9 @@ name = "Optical Meson Scanners" desc = "Used for seeing walls, floors, and stuff through anything." id = "mesons" - req_tech = list("materials" = 3, "magnets" = 3, "engineering" = 3) + req_tech = list("magnets" = 2, "engineering" = 2, "plasmatech" = 2) build_type = PROTOLATHE - materials = list(MAT_METAL = 200, MAT_GLASS = 300, MAT_PLASMA = 100) + materials = list(MAT_METAL = 500, MAT_GLASS = 500) build_path = /obj/item/clothing/glasses/meson category = list("Equipment") @@ -85,9 +85,9 @@ name = "Night Vision Optical Meson Scanners" desc = "Prototype meson scanners fitted with an extra sensor which amplifies the visible light spectrum and overlays it to the UHD display." id = "nvgmesons" - req_tech = list("materials" = 5, "magnets" = 5, "engineering" = 4) + req_tech = list("magnets" = 5, "plasmatech" = 5, "engineering" = 6) build_type = PROTOLATHE - materials = list(MAT_METAL = 300, MAT_GLASS = 400, MAT_PLASMA = 250, MAT_URANIUM = 1000) + materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_PLASMA = 350, MAT_URANIUM = 1000) build_path = /obj/item/clothing/glasses/meson/night category = list("Equipment") @@ -95,7 +95,7 @@ name = "Air Horn" desc = "Damn son, where'd you find this?" id = "air_horn" - req_tech = list("materials" = 2, "engineering" = 2) + req_tech = list("materials" = 4, "engineering" = 4) build_type = PROTOLATHE materials = list(MAT_METAL = 4000, MAT_BANANIUM = 1000) build_path = /obj/item/weapon/bikehorn/airhorn @@ -105,9 +105,9 @@ name = "Welding Gas Mask" desc = "A gas mask with built in welding goggles and face shield. Looks like a skull, clearly designed by a nerd." id = "weldingmask" - req_tech = list("materials" = 2, "engineering" = 2) + req_tech = list("materials" = 2, "engineering" = 3) build_type = PROTOLATHE - materials = list(MAT_METAL = 4000, MAT_GLASS = 1000) + materials = list(MAT_METAL = 3000, MAT_GLASS = 1000) build_path = /obj/item/clothing/mask/gas/welding category = list("Equipment") @@ -115,37 +115,26 @@ name = "Portable Seed Extractor" desc = "For the enterprising botanist on the go. Less efficient than the stationary model, it creates one seed per plant." build_type = PROTOLATHE - req_tech = list("biotech" = 2, "materials" = 2) - materials = list(MAT_METAL = 200, MAT_GLASS = 100) + req_tech = list("biotech" = 3, "engineering" = 2) + materials = list(MAT_METAL = 1000, MAT_GLASS = 400) build_path = /obj/item/weapon/storage/bag/plants/portaseeder category = list("Equipment") -/datum/design/detective_scanner - name = "Forensic Scanner" - desc = "A high tech scanner designed for forensic evidence collection, DNA recovery, and fiber analysis." - id = "detectivescanner" - req_tech = list("biotech" = 2, "magnets" = 4) - build_type = PROTOLATHE - materials = list(MAT_METAL = 6000, MAT_GLASS = 2000) - build_path = /obj/item/device/detective_scanner - locked = 1 //no validhunting scientists. - category = list("Equipment") - /datum/design/sci_goggles name = "Science Goggles" desc = "Goggles fitted with a portable analyzer capable of determining the research worth of an item or components of a machine." id = "scigoggles" - req_tech = list("materials" = 3, "magnets" = 3, "engineering" = 2) + req_tech = list("magnets" = 2) build_type = PROTOLATHE - materials = list(MAT_METAL = 250, MAT_GLASS = 300) + materials = list(MAT_METAL = 500, MAT_GLASS = 500) build_path = /obj/item/clothing/glasses/science category = list("Equipment") /datum/design/nv_sci_goggles name = "Night Vision Science Goggles" - desc = "Like Science google, but works in darkness." + desc = "Like Science Goggles, but works in darkness." id = "nvscigoggles" - req_tech = list("materials" = 5, "magnets" = 5, "engineering" = 4) + req_tech = list("magnets" = 5, "plasmatech" = 4, "engineering" = 6) build_type = PROTOLATHE materials = list(MAT_METAL = 250, MAT_GLASS = 300, MAT_PLASMA = 250, MAT_URANIUM = 1000) build_path = /obj/item/clothing/glasses/science/night @@ -155,9 +144,9 @@ name = "Diagnostic HUD" desc = "A HUD used to analyze and determine faults within robotic machinery." id = "dianostic_hud" - req_tech = list("magnets" = 3, "engineering" = 3, "materials" = 2) + req_tech = list("magnets" = 3, "engineering" = 2) build_type = PROTOLATHE - materials = list("$metal" = 50, "$glass" = 50) + materials = list(MAT_METAL = 500, MAT_GLASS = 500) build_path = /obj/item/clothing/glasses/hud/diagnostic category = list("Equipment") @@ -165,9 +154,9 @@ name = "Night Vision Diagnostic HUD" desc = "Upgraded version of the diagnostic HUD designed to function during a power failure." id = "dianostic_hud_night" - req_tech = list("magnets" = 5, "engineering" = 4, "materials" = 4) + req_tech = list("magnets" = 5, "plasmatech" = 4, "engineering" = 6, "powerstorage" = 4) build_type = PROTOLATHE - materials = list("$metal" = 200, "$glass" = 200, "$uranium" = 1000, "$plasma" = 300) + materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_URANIUM = 1000, MAT_PLASMA = 300) build_path = /obj/item/clothing/glasses/hud/diagnostic/night category = list("Equipment") @@ -177,7 +166,7 @@ id = "hydroponic_hud" req_tech = list("magnets" = 3, "biotech" = 3) build_type = PROTOLATHE - materials = list("$metal" = 50, "$glass" = 50) + materials = list(MAT_METAL = 50, MAT_GLASS = 50) build_path = /obj/item/clothing/glasses/hud/hydroponic category = list("Equipment") @@ -185,9 +174,9 @@ name = "Night Vision Hydroponic HUD" desc = "A HUD used to analyze the health and status of plants growing in low-light environments." id = "hydroponic_hud_night" - req_tech = list("magnets" = 5, "biotech" = 4) + req_tech = list("biotech" = 4, "magnets" = 5, "plasmatech" = 4, "engineering" = 6) build_type = PROTOLATHE - materials = list("$metal" = 200, "$glass" = 200, "$uranium" = 1000, "$plasma" = 200) + materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_URANIUM = 1000, MAT_PLASMA = 200) build_path = /obj/item/clothing/glasses/hud/hydroponic/night category = list("Equipment") @@ -269,4 +258,4 @@ build_path = /obj/item/device/multitool/abductor build_type = PROTOLATHE materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 5000, MAT_DIAMOND = 2000) - category = list("Equipment") \ No newline at end of file + category = list("Equipment") diff --git a/code/modules/research/designs/janitorial_designs.dm b/code/modules/research/designs/janitorial_designs.dm index 8c575425ebe..d7031f4f754 100644 --- a/code/modules/research/designs/janitorial_designs.dm +++ b/code/modules/research/designs/janitorial_designs.dm @@ -13,9 +13,9 @@ /datum/design/blutrash name = "Trashbag of Holding" - desc = "An advanced trashabg with bluespace properties; capable of holding a plethora of garbage." + desc = "An advanced trash bag with bluespace properties; capable of holding a plethora of garbage." id = "blutrash" - req_tech = list("materials" = 5, "bluespace" = 3) + req_tech = list("materials" = 5, "bluespace" = 4, "engineering" = 4, "plasmatech" = 3) build_type = PROTOLATHE materials = list(MAT_GOLD = 1500, MAT_URANIUM = 250, MAT_PLASMA = 1500) build_path = /obj/item/weapon/storage/bag/trash/bluespace @@ -25,7 +25,7 @@ name = "Floor Buffer Upgrade" desc = "A floor buffer that can be attached to vehicular janicarts." id = "buffer" - req_tech = list("materials" = 5, "engineering" = 3) + req_tech = list("materials" = 4, "engineering" = 4) build_type = PROTOLATHE materials = list(MAT_METAL = 3000, MAT_GLASS = 200) build_path = /obj/item/janiupgrade @@ -35,7 +35,7 @@ name = "Holographic Sign Projector" desc = "A holograpic projector used to project various warning signs." id = "holosign" - req_tech = list("magnets" = 3, "powerstorage" = 2) + req_tech = list("programming" = 3) build_type = PROTOLATHE materials = list(MAT_METAL = 2000, MAT_GLASS = 1000) build_path = /obj/item/weapon/holosign_creator @@ -45,8 +45,8 @@ name = "Light Replacer" desc = "A device to automatically replace lights. Refill with working lightbulbs." id = "light_replacer" - req_tech = list("magnets" = 3, "materials" = 4) + req_tech = list("magnets" = 3, "engineering" = 4) build_type = PROTOLATHE materials = list(MAT_METAL = 1500, MAT_SILVER = 150, MAT_GLASS = 3000) build_path = /obj/item/device/lightreplacer - category = list("Janitorial") \ No newline at end of file + category = list("Janitorial") diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index c1d3c64d6b9..5e54cbadb4e 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -26,7 +26,7 @@ name = "Machine Board (Emitter)" desc = "The circuit board for an emitter." id = "emitter" - req_tech = list("programming" = 4, "powerstorage" = 5, "engineering" = 5) + req_tech = list("programming" = 3, "powerstorage" = 5, "engineering" = 4) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/emitter @@ -36,7 +36,7 @@ name = "Computer Design (Power Turbine Console Board)" desc = "The circuit board for a power turbine console." id = "power_turbine_console" - req_tech = list("programming" = 4, "powerstorage" = 4, "engineering" = 4) + req_tech = list("programming" = 4, "powerstorage" = 5, "engineering" = 4) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/turbine_computer @@ -76,7 +76,7 @@ name = "Machine Board (Telepad Board)" desc = "Allows for the construction of circuit boards used to build a Telepad." id = "telepad" - req_tech = list("programming" = 4, "bluespace" = 4, "materials" = 3, "engineering" = 3) + req_tech = list("programming" = 4, "bluespace" = 5, "plasmatech" = 4, "engineering" = 4) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/telesci_pad @@ -96,7 +96,7 @@ name = "Machine Board (Teleportation Station)" desc = "Allows for the construction of circuit boards used to build a Teleporter Station." id = "tele_station" - req_tech = list("programming" = 4, "bluespace" = 4, "engineering" = 4) + req_tech = list("programming" = 5, "bluespace" = 4, "engineering" = 4, "plasmatech" = 4) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/teleporter_station @@ -116,7 +116,7 @@ name = "Machine Board (Body Scanner)" desc = "Allows for the construction of circuit boards used to build a Body Scanner." id = "bodyscanner" - req_tech = list("programming" = 3, "biotech" = 2, "materials" = 3, "engineering" = 3) + req_tech = list("programming" = 3, "biotech" = 2, "engineering" = 3) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/bodyscanner @@ -126,7 +126,7 @@ name = "Machine Board (Body Scanner Console)" desc = "Allows for the construction of circuit boards used to build a Body Scanner Console." id = "bodyscanner_console" - req_tech = list("programming" = 3, "biotech" = 2, "materials" = 3, "engineering" = 3) + req_tech = list("programming" = 3, "biotech" = 2, "engineering" = 3) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/bodyscanner_console @@ -136,7 +136,7 @@ name = "Machine Board (Cloning Pod)" desc = "Allows for the construction of circuit boards used to build a Cloning Pod." id = "clonepod" - req_tech = list("programming" = 3, "biotech" = 3) + req_tech = list("programming" = 4, "biotech" = 3) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/clonepod @@ -146,7 +146,7 @@ name = "Machine Board (Cloning Scanner)" desc = "Allows for the construction of circuit boards used to build a Cloning Scanner." id = "clonescanner" - req_tech = list("programming" = 3, "biotech" = 3) + req_tech = list("programming" = 4, "biotech" = 3) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/clonescanner @@ -156,7 +156,7 @@ name = "Machine Board (Cryotube Board)" desc = "Allows for the construction of circuit boards used to build a Cryotube." id = "cryotube" - req_tech = list("programming" = 4, "biotech" = 3, "engineering" = 4) + req_tech = list("programming" = 5, "biotech" = 3, "engineering" = 4, "plasmatech" = 3) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/cryo_tube @@ -166,7 +166,7 @@ name = "Machine Board (Portable Chem Dispenser)" desc = "The circuit board for a Portable Chem Dispenser." id = "chem_dispenser" - req_tech = list("programming" = 4, "biotech" = 3, "engineering" = 4, "materials" = 4, "plasmatech" = 3) + req_tech = list("programming" = 5, "biotech" = 3, "materials" = 4, "plasmatech" = 4) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/chem_dispenser @@ -176,7 +176,7 @@ name = "Machine Design (Chem Master Board)" desc = "The circuit board for a Chem Master 2999." id = "chem_master" - req_tech = list("biotech" = 1, "materials" = 2, "programming" = 2) + req_tech = list("biotech" = 3, "materials" = 3, "programming" = 2) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/chem_master @@ -186,7 +186,7 @@ name = "Machine Design (Chemical Heater Board)" desc = "The circuit board for a chemical heater." id = "chem_heater" - req_tech = list("engineering" = 2, "materials" = 2) + req_tech = list("engineering" = 2, "biotech" = 2, "programming" = 2) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/chem_heater @@ -196,7 +196,7 @@ name = "Machine Board (Sleeper)" desc = "Allows for the construction of circuit boards used to build a Sleeper." id = "sleeper" - req_tech = list("programming" = 3, "biotech" = 2, "materials" = 3, "engineering" = 3) + req_tech = list("programming" = 3, "biotech" = 2, "engineering" = 3) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/sleeper @@ -206,7 +206,7 @@ name = "Machine Board (Biogenerator)" desc = "The circuit board for a Biogenerator." id = "biogenerator" - req_tech = list("programming" = 3, "biotech" = 2, "materials" = 3) + req_tech = list("programming" = 2, "biotech" = 3, "materials" = 3) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/biogenerator @@ -216,7 +216,7 @@ name = "Machine Board (Hydroponics Tray)" desc = "The circuit board for a Hydroponics Tray." id = "hydro_tray" - req_tech = list("programming" = 1, "biotech" = 1) + req_tech = list("biotech" = 2) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/hydroponics @@ -226,7 +226,7 @@ name = "Machine Board (Autolathe)" desc = "The circuit board for an Autolathe." id = "autolathe" - req_tech = list("programming" = 2, "engineering" = 2) + req_tech = list("programming" = 3, "engineering" = 3) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/autolathe @@ -276,7 +276,7 @@ name = "Machine Board (Mech Bay Recharger)" desc = "The circuit board for a Mech Bay Recharger." id = "mech_recharger" - req_tech = list("programming" = 3, "powerstorage" = 4, "engineering" = 4) + req_tech = list("programming" = 3, "powerstorage" = 4, "engineering" = 3) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mech_recharger @@ -316,7 +316,7 @@ name = "Machine Design (Gibber Board)" desc = "The circuit board for a gibber." id = "gibber" - req_tech = list("programming" = 1) + req_tech = list("programming" = 2, "engineering" = 2) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/gibber @@ -366,7 +366,7 @@ name = "Machine Design (Recycler Board)" desc = "The circuit board for a recycler." id = "recycler" - req_tech = list("programming" = 1) + req_tech = list("programming" = 2, "engineering" = 2) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/recycler @@ -396,7 +396,7 @@ name = "Machine Board (Microwave)" desc = "The circuit board for a Microwave." id = "microwave" - req_tech = list("programming" = 1) + req_tech = list("programming" = 2, "magnets" = 2) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/microwave @@ -406,7 +406,7 @@ name = "Machine Board (Oven)" desc = "The circuit board for an Oven." id = "oven" - req_tech = list("programming" = 1, "plasmatech" = 1) + req_tech = list("programming" = 2, "magnets" = 2) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/oven @@ -416,7 +416,7 @@ name = "Machine Board (Grill)" desc = "The circuit board for a Grill." id = "grill" - req_tech = list("programming" = 1, "plasmatech" = 1) + req_tech = list("programming" = 2, "magnets" = 2) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/grill @@ -426,7 +426,7 @@ name = "Machine Board (Candy Maker)" desc = "The circuit board for a Candy Maker." id = "candymaker" - req_tech = list("programming" = 2) + req_tech = list("programming" = 2, "magnets" = 2) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/candy_maker @@ -436,7 +436,7 @@ name = "Machine Board (Deep Fryer)" desc = "The circuit board for a Deep Fryer." id = "deepfryer" - req_tech = list("programming" = 2) + req_tech = list("programming" = 1) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/deepfryer @@ -446,7 +446,7 @@ name = "Machine Board (Orion Trail Arcade Machine)" desc = "Allows for the construction of circuit boards used to build a new Orion Trail machine." id = "arcademachineonion" - req_tech = list("programming" = 2) + req_tech = list("programming" = 1) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/arcade/orion_trail @@ -456,7 +456,7 @@ name = "Machine Board (Programmable Unloader)" desc = "The circuit board for a Programmable Unloader." id = "selunload" - req_tech = list("programming" = 5) + req_tech = list("engineering" = 1, "programming" = 2) build_type = IMPRINTER materials = list(MAT_GLASS = 2000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/programmable @@ -476,7 +476,7 @@ name = "Machine Design (Ore Redemption Board)" desc = "The circuit board for an Ore Redemption machine." id = "ore_redemption" - req_tech = list("programming" = 1, "engineering" = 2) + req_tech = list("programming" = 2, "engineering" = 2, "plasmatech" = 3) build_type = IMPRINTER materials = list(MAT_GLASS=1000, "sacid"=20) build_path = /obj/item/weapon/circuitboard/ore_redemption @@ -486,7 +486,7 @@ name = "Machine Design (Mining Rewards Vendor Board)" desc = "The circuit board for a Mining Rewards Vendor." id = "mining_equipment_vendor" - req_tech = list("programming" = 1, "engineering" = 2) + req_tech = list("engineering" = 3) build_type = IMPRINTER materials = list(MAT_GLASS=1000, "sacid"=20) build_path = /obj/item/weapon/circuitboard/mining_equipment_vendor @@ -496,7 +496,7 @@ name = "Machine Design (Claw Game Board)" desc = "The circuit board for a Claw Game." id = "clawgame" - req_tech = list("programming" = 2) + req_tech = list("programming" = 1) build_type = IMPRINTER materials = list(MAT_GLASS=1000, "sacid"=20) build_path = /obj/item/weapon/circuitboard/clawgame @@ -530,4 +530,14 @@ build_type = IMPRINTER materials = list(MAT_GLASS=1000, "sacid"=20) build_path = /obj/item/weapon/circuitboard/plantgenes - category = list("Hydroponics Machinery") \ No newline at end of file + category = list("Hydroponics Machinery") + +/datum/design/ntnet_relay + name = "Machine Design (NTNet Relay Board)" + desc = "The circuit board for a wireless network relay." + id = "ntnet_relay" + req_tech = list("programming" = 2, "engineering" = 2, "bluespace" = 2) + build_type = IMPRINTER + materials = list(MAT_GLASS=1000, "sacid"=20) + build_path = /obj/item/weapon/circuitboard/machine/ntnet_relay + category = list("Subspace Telecomms") diff --git a/code/modules/research/designs/mecha_designs.dm b/code/modules/research/designs/mecha_designs.dm index 4b00be0b932..e535c6cf3c0 100644 --- a/code/modules/research/designs/mecha_designs.dm +++ b/code/modules/research/designs/mecha_designs.dm @@ -6,7 +6,7 @@ name = "Exosuit Board (APLU \"Ripley\" Central Control module)" desc = "Allows for the construction of a \"Ripley\" Central Control module." id = "ripley_main" - req_tech = list("programming" = 3) + req_tech = list("programming" = 2) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/ripley/main @@ -16,7 +16,7 @@ name = "Exosuit Board (APLU \"Ripley\" Peripherals Control module)" desc = "Allows for the construction of a \"Ripley\" Peripheral Control module." id = "ripley_peri" - req_tech = list("programming" = 3) + req_tech = list("programming" = 2) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/ripley/peripherals @@ -27,7 +27,7 @@ name = "Exosuit Board (\"Odysseus\" Central Control module)" desc = "Allows for the construction of a \"Odysseus\" Central Control module." id = "odysseus_main" - req_tech = list("programming" = 3,"biotech" = 2) + req_tech = list("programming" = 3,"biotech" = 3, "engineering" = 3) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/odysseus/main @@ -37,7 +37,7 @@ name = "Exosuit Board (\"Odysseus\" Peripherals Control module)" desc = "Allows for the construction of a \"Odysseus\" Peripheral Control module." id = "odysseus_peri" - req_tech = list("programming" = 3,"biotech" = 2) + req_tech = list("programming" = 3,"biotech" = 3, "engineering" = 3) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/odysseus/peripherals @@ -48,7 +48,7 @@ name = "Exosuit Board (\"Gygax\" Central Control module)" desc = "Allows for the construction of a \"Gygax\" Central Control module." id = "gygax_main" - req_tech = list("programming" = 4) + req_tech = list("programming" = 4, "combat" = 3, "engineering" = 4) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/gygax/main @@ -58,7 +58,7 @@ name = "Exosuit Board (\"Gygax\" Peripherals Control module)" desc = "Allows for the construction of a \"Gygax\" Peripheral Control module." id = "gygax_peri" - req_tech = list("programming" = 4) + req_tech = list("programming" = 4, "combat" = 3, "engineering" = 4) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/gygax/peripherals @@ -68,7 +68,7 @@ name = "Exosuit Board (\"Gygax\" Weapons & Targeting Control module)" desc = "Allows for the construction of a \"Gygax\" Weapons & Targeting Control module." id = "gygax_targ" - req_tech = list("programming" = 4, "combat" = 2) + req_tech = list("programming" = 4, "combat" = 4, "engineering" = 4) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/gygax/targeting @@ -79,7 +79,7 @@ name = "Exosuit Board (\"Durand\" Central Control module)" desc = "Allows for the construction of a \"Durand\" Central Control module." id = "durand_main" - req_tech = list("programming" = 4) + req_tech = list("programming" = 4, "combat" = 4, "engineering" = 4) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/durand/main @@ -89,7 +89,7 @@ name = "Exosuit Board (\"Durand\" Peripherals Control module)" desc = "Allows for the construction of a \"Durand\" Peripheral Control module." id = "durand_peri" - req_tech = list("programming" = 4) + req_tech = list("programming" = 4, "combat" = 4, "engineering" = 4) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/durand/peripherals @@ -99,7 +99,7 @@ name = "Exosuit Board (\"Durand\" Weapons & Targeting Control module)" desc = "Allows for the construction of a \"Durand\" Weapons & Targeting Control module." id = "durand_targ" - req_tech = list("programming" = 4, "combat" = 2) + req_tech = list("programming" = 5, "combat" = 4, "engineering" = 4) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/durand/targeting @@ -110,7 +110,7 @@ name = "Exosuit Board (\"Phazon\" Central Control module)" desc = "Allows for the construction of a \"Phazon\" Central Control module." id = "phazon_main" - req_tech = list("programming" = 5, "materials" = 7, "powerstorage" = 6) + req_tech = list("programming" = 6, "materials" = 6, "plasmatech" = 5) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/phazon/main @@ -120,7 +120,7 @@ name = "Exosuit Board (\"Phazon\" Peripherals Control module)" desc = "Allows for the construction of a \"Phazon\" Peripheral Control module." id = "phazon_peri" - req_tech = list("programming" = 5, "bluespace" = 6) + req_tech = list("programming" = 6, "bluespace" = 5, "plasmatech" = 5) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/phazon/peripherals @@ -130,7 +130,7 @@ name = "Exosuit Design (\"Phazon\" Weapons & Targeting Control module)" desc = "Allows for the construction of a \"Phazon\" Weapons & Targeting Control module." id = "phazon_targ" - req_tech = list("programming" = 5, "magnets" = 6) + req_tech = list("programming" = 6, "magnets" = 5, "plasmatech" = 5) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/phazon/targeting @@ -141,7 +141,7 @@ name = "Exosuit Board (\"H.O.N.K\" Central Control module)" desc = "Allows for the construction of a \"H.O.N.K\" Central Control module." id = "honker_main" - req_tech = list("programming" = 3) + req_tech = list("programming" = 3, "engineering" = 3) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/honker/main @@ -151,7 +151,7 @@ name = "Exosuit Board (\"H.O.N.K\" Peripherals Control module)" desc = "Allows for the construction of a \"H.O.N.K\" Peripheral Control module." id = "honker_peri" - req_tech = list("programming" = 3) + req_tech = list("programming" = 3, "engineering" = 3) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/honker/peripherals @@ -161,7 +161,7 @@ name = "Exosuit Board (\"H.O.N.K\" Weapons & Targeting Control module)" desc = "Allows for the construction of a \"H.O.N.K\" Weapons & Targeting Control module." id = "honker_targ" - req_tech = list("programming" = 3) + req_tech = list("programming" = 3, "engineering" = 3) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/honker/targeting @@ -171,7 +171,7 @@ name = "Exosuit Module (\"Reticence\" Central Control module)" desc = "Allows for the construction of a \"Reticence\" Central Control module." id = "reticence_main" - req_tech = list("programming" = 3) + req_tech = list("programming" = 3, "engineering" = 3) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/reticence/main @@ -181,7 +181,7 @@ name = "Exosuit Module (\"Reticence\" Peripherals Control module)" desc = "Allows for the construction of a \"Reticence\" Peripheral Control module." id = "reticence_peri" - req_tech = list("programming" = 3) + req_tech = list("programming" = 3, "engineering" = 3) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/reticence/peripherals @@ -191,8 +191,8 @@ name = "Exosuit Module (\"Reticence\" Weapons & Targeting Control module)" desc = "Allows for the construction of a \"Reticence\" Weapons & Targeting Control module." id = "reticence_targ" - req_tech = list("programming" = 3) + req_tech = list("programming" = 3, "engineering" = 3) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/reticence/targeting - category = list("Exosuit Modules") \ No newline at end of file + category = list("Exosuit Modules") diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 876a4352fe9..7c572f759c7 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -637,7 +637,7 @@ name = "Exosuit Medical Equipment (Mounted Sleeper)" id = "mech_sleeper" build_type = MECHFAB - req_tech = list("biotech" = 2) + req_tech = list("biotech" = 3, "engineering" = 3, "plasmatech" = 2) build_path = /obj/item/mecha_parts/mecha_equipment/medical/sleeper materials = list(MAT_METAL=5000,MAT_GLASS=10000) construction_time = 100 @@ -647,7 +647,7 @@ name = "Exosuit Medical Equipment (Syringe Gun)" id = "mech_syringe_gun" build_type = MECHFAB - req_tech = list("magnets" = 3,"biotech" = 3) + req_tech = list("magnets" = 4,"biotech" = 4, "combat" = 3, "materials" = 4) build_path = /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun materials = list(MAT_METAL=3000,MAT_GLASS=2000) construction_time = 200 @@ -658,7 +658,7 @@ id = "mech_generator" build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/generator - materials = list(MAT_METAL=10000,MAT_GLASS=1000,MAT_SILVER=500) + materials = list(MAT_METAL=10000,MAT_GLASS=1000,MAT_SILVER=2000,MAT_PLASMA=5000) construction_time = 100 category = list("Exosuit Equipment") @@ -666,7 +666,7 @@ name = "Exosuit Weapon (PBT \"Pacifier\" Mounted Taser)" id = "mech_taser" build_type = MECHFAB - req_tech = list("combat" = 2) + req_tech = list("combat" = 3) build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/taser materials = list(MAT_METAL=10000) construction_time = 100 @@ -676,7 +676,7 @@ name = "Exosuit Weapon (\"Ultra AC 2\" LMG)" id = "mech_lmg" build_type = MECHFAB - req_tech = list("combat" = 2) + req_tech = list("combat" = 4) build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg materials = list(MAT_METAL=10000) construction_time = 100 @@ -734,7 +734,7 @@ desc = "An upgraded version of the standard drill." id = "mech_diamond_drill" build_type = MECHFAB - req_tech = list("materials" = 4, "engineering" = 3) + req_tech = list("materials" = 5, "engineering" = 4) build_path = /obj/item/mecha_parts/mecha_equipment/drill/diamonddrill materials = list(MAT_METAL=10000,MAT_DIAMOND=6500) construction_time = 100 @@ -754,7 +754,7 @@ desc = "Compact nuclear reactor module." id = "mech_generator_nuclear" build_type = MECHFAB - req_tech = list("powerstorage"= 3, "engineering" = 3, "materials" = 3) + req_tech = list("powerstorage"= 5, "engineering" = 4, "materials" = 3) build_path = /obj/item/mecha_parts/mecha_equipment/generator/nuclear materials = list(MAT_METAL=10000,MAT_GLASS=1000,MAT_SILVER=500) construction_time = 100 @@ -765,7 +765,7 @@ desc = "An exosuit mounted Gravitational Catapult." id = "mech_gravcatapult" build_type = MECHFAB - req_tech = list("bluespace" = 2, "magnets" = 3, "engineering" = 3) + req_tech = list("bluespace" = 4, "magnets" = 3, "engineering" = 4) build_path = /obj/item/mecha_parts/mecha_equipment/gravcatapult materials = list(MAT_METAL=10000) construction_time = 100 @@ -776,7 +776,7 @@ desc = "An exosuit module that allows generating of small quasi-stable wormholes." id = "mech_wormhole_gen" build_type = MECHFAB - req_tech = list("bluespace" = 3, "magnets" = 2) + req_tech = list("bluespace" = 4, "magnets" = 4, "plasmatech" = 3) build_path = /obj/item/mecha_parts/mecha_equipment/wormhole_generator materials = list(MAT_METAL=10000) construction_time = 100 @@ -787,7 +787,7 @@ desc = "An exosuit-mounted Rapid Construction Device." id = "mech_rcd" build_type = MECHFAB - req_tech = list("materials" = 4, "bluespace" = 3, "magnets" = 4, "powerstorage"=4, "engineering" = 4) + req_tech = list("materials" = 5, "bluespace" = 3, "magnets" = 4, "powerstorage"=4, "engineering" = 5) build_path = /obj/item/mecha_parts/mecha_equipment/rcd materials = list(MAT_METAL=30000,MAT_GOLD=20000,MAT_PLASMA=25000,MAT_SILVER=20000) construction_time = 1200 @@ -820,7 +820,7 @@ desc = "Automated Repair Droid. BEEP BOOP" id = "mech_repair_droid" build_type = MECHFAB - req_tech = list("magnets" = 3, "programming" = 3, "engineering" = 3) + req_tech = list("magnets" = 3, "programming" = 3, "engineering" = 5) build_path = /obj/item/mecha_parts/mecha_equipment/repair_droid materials = list(MAT_METAL=10000,MAT_GLASS=5000,MAT_GOLD=1000,MAT_SILVER=2000) construction_time = 100 @@ -853,9 +853,9 @@ desc = "An exosuit module that allows exosuits to teleport to any position in view." id = "mech_teleporter" build_type = MECHFAB - req_tech = list("bluespace" = 10, "magnets" = 5) + req_tech = list("bluespace" = 8, "magnets" = 5) build_path = /obj/item/mecha_parts/mecha_equipment/teleporter - materials = list(MAT_METAL=10000) + materials = list(MAT_METAL=10000,MAT_DIAMOND=10000) construction_time = 100 category = list("Exosuit Equipment") @@ -864,7 +864,7 @@ desc = "Tesla Energy Relay" id = "mech_energy_relay" build_type = MECHFAB - req_tech = list("magnets" = 4, "powerstorage" = 3) + req_tech = list("magnets" = 4, "powerstorage" = 5, "engineering" = 4) build_path = /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay materials = list(MAT_METAL=10000,MAT_GLASS=2000,MAT_GOLD=2000,MAT_SILVER=3000) construction_time = 100 @@ -876,23 +876,34 @@ desc = "Allows for the construction of CH-LC Laser Cannon." id = "mech_laser_heavy" build_type = MECHFAB - req_tech = list("combat" = 4, "magnets" = 4) + req_tech = list("combat" = 4, "magnets" = 4, "engineering" = 4) build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy materials = list(MAT_METAL=10000) construction_time = 100 category = list("Exosuit Equipment") /datum/design/mech_laser - name = "Exosuit Weapon (CH-PS \"Immolator\" Laser)" + name = "Exosuit Weapon (CH-PL \"Firedart\" Laser)" desc = "Allows for the construction of CH-PS Laser." id = "mech_laser" build_type = MECHFAB - req_tech = list("combat" = 3, "magnets" = 3) + req_tech = list("combat" = 3, "magnets" = 3, "engineering" = 3) build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser materials = list(MAT_METAL=10000) construction_time = 100 category = list("Exosuit Equipment") +/datum/design/mech_disabler + name = "Exosuit Weapon (CH-PD Disabler)" + desc = "Allows for the construction of CH-PD Disabler." + id = "mech_laser" + build_type = MECHFAB + req_tech = list("combat" = 3) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/disabler + materials = list(MAT_METAL=10000) + construction_time = 100 + category = list("Exosuit Equipment") + /datum/design/mech_carbine name = "Exosuit Weapon (FNX-99 \"Hades\" Carbine)" desc = "Allows for the construction of FNX-99 \"Hades\" Carbine." @@ -931,7 +942,7 @@ desc = "Allows for the construction of SGL-6 Grenade Launcher." id = "mech_grenade_launcher" build_type = MECHFAB - req_tech = list("combat" = 3) + req_tech = list("combat" = 4, "engineering" = 4) build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang materials = list(MAT_METAL=22000,MAT_GOLD=6000,MAT_SILVER=8000) construction_time = 100 @@ -942,7 +953,7 @@ desc = "Allows for the construction of SRM-8 Missile Rack." id = "mech_missile_rack" build_type = MECHFAB - req_tech = list("combat" = 6, "materials" = 6) + req_tech = list("combat" = 6, "materials" = 5, "engineering" = 5) build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack materials = list(MAT_METAL=22000,MAT_GOLD=6000,MAT_SILVER=8000) construction_time = 100 @@ -953,9 +964,31 @@ desc = "A device that shoots resonant plasma bursts at extreme velocity. The blasts are capable of crushing rock and demolishing solid obstacles." id = "mech_plasma_cutter" build_type = MECHFAB - req_tech = list("powerstorage"= 3, "engineering" = 3, "materials" = 3, "combat" = 1, "plasmatech" = 2) + req_tech = list("engineering" = 3, "materials" = 3, "plasmatech" = 4) build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma - materials = list(MAT_METAL=1500, MAT_GLASS=500, MAT_PLASMA=200) + materials = list(MAT_METAL = 8000, MAT_GLASS = 1000, MAT_PLASMA = 2000) + construction_time = 100 + category = list("Exosuit Equipment") + +/datum/design/mech_tesla + name = "Exosuit Weapon (P-X Tesla Cannon)" + desc = "Allows for the construction of P-X Tesla Cannon." + id = "mech_tesla" + build_type = MECHFAB + req_tech = list("combat" = 6, "magnets" = 5, "materials" = 5) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/tesla + materials = list(MAT_METAL=20000,MAT_SILVER=8000) + construction_time = 100 + category = list("Exosuit Equipment") + +/datum/design/mech_immolator + name = "Exosuit Weapon (ZFI Immolation Beam Gun)" + desc = "Allows for the construction of ZFI Immolation Beam Gun." + id = "mech_tesla" + build_type = MECHFAB + req_tech = list("combat" = 6, "magnets" = 5, "materials" = 5) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/immolator + materials = list(MAT_METAL = 10000, MAT_SILVER = 8000, MAT_PLASMA = 8000) construction_time = 100 category = list("Exosuit Equipment") @@ -993,7 +1026,7 @@ id = "borg_upgrade_vtec" build_type = MECHFAB build_path = /obj/item/borg/upgrade/vtec - req_tech = list("engineering" = 4, "materials" = 5) + req_tech = list("engineering" = 4, "materials" = 5, "programming" = 4) materials = list(MAT_METAL=80000 , MAT_GLASS=6000 , MAT_URANIUM= 5000) construction_time = 120 category = list("Cyborg Upgrade Modules") @@ -1013,7 +1046,7 @@ id = "borg_upgrade_disablercooler" build_type = MECHFAB build_path = /obj/item/borg/upgrade/disablercooler - req_tech = list("combat" = 5, "powerstorage" = 4) + req_tech = list("combat" = 5, "powerstorage" = 4, "engineering" = 4) materials = list(MAT_METAL=80000 , MAT_GLASS=6000 , MAT_GOLD= 2000, MAT_DIAMOND = 500) construction_time = 120 category = list("Cyborg Upgrade Modules") @@ -1023,7 +1056,7 @@ id = "borg_upgrade_diamonddrill" build_type = MECHFAB build_path = /obj/item/borg/upgrade/ddrill - req_tech = list("engineering" = 5, "materials" = 5) + req_tech = list("engineering" = 5, "materials" = 6) materials = list(MAT_METAL=10000, MAT_DIAMOND=2000) construction_time = 120 category = list("Cyborg Upgrade Modules") @@ -1033,7 +1066,7 @@ id = "borg_upgrade_holding" build_type = MECHFAB build_path = /obj/item/borg/upgrade/soh - req_tech = list("engineering" = 5, "materials" = 5, "bluespace" = 3) + req_tech = list("engineering" = 4, "materials" = 4, "bluespace" = 4) materials = list(MAT_METAL = 10000, MAT_GOLD = 250, MAT_URANIUM = 500) construction_time = 120 category = list("Cyborg Upgrade Modules") @@ -1042,7 +1075,7 @@ name = "Cyborg Upgrade (Illegal Modules)" id = "borg_syndicate_module" build_type = MECHFAB - req_tech = list("combat" = 4, "syndicate" = 3) + req_tech = list("combat" = 4, "syndicate" = 2) build_path = /obj/item/borg/upgrade/syndicate materials = list(MAT_METAL=10000,MAT_GLASS=15000,MAT_DIAMOND = 10000) construction_time = 120 @@ -1096,6 +1129,15 @@ construction_time = 200 category = list("Misc") +/datum/design/ipc_charger + name = "IPC Charger" + id = "ipc_cahrger" + build_type = MECHFAB + build_path = /obj/item/organ/internal/cyberimp/arm/power_cord + materials = list(MAT_METAL=2000, MAT_GLASS=1000) + construction_time = 200 + category = list("Misc") + /datum/design/ipc_optics name = "IPC Optical Sensor" id = "ipc_optics" @@ -1104,3 +1146,14 @@ materials = list(MAT_METAL=1000, MAT_GLASS=2500) construction_time = 200 category = list("Misc") + +/datum/design/synthetic_flash + name = "Synthetic Flash" + desc = "A synthetic flash used mostly in borg construction." + id = "sflash" + req_tech = list("magnets" = 3, "combat" = 2) + build_type = MECHFAB + materials = list(MAT_METAL = 750, MAT_GLASS = 750) + construction_time = 100 + build_path = /obj/item/device/flash/synthetic + category = list("Misc") diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index f1d477a4f89..2a791e8c61a 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -5,10 +5,9 @@ name = "Advanced Mass-Spectrometer" desc = "A device for analyzing chemicals in the blood and their quantities." id = "adv_mass_spectrometer" - req_tech = list("biotech" = 2, "magnets" = 4) + req_tech = list("biotech" = 3, "magnets" = 4, "plasmatech" = 3) build_type = PROTOLATHE - materials = list(MAT_METAL = 30, MAT_GLASS = 20) - reliability = 74 + materials = list(MAT_METAL = 500, MAT_GLASS = 200) build_path = "/obj/item/device/mass_spectrometer/adv" category = list("Medical") @@ -16,21 +15,29 @@ name = "Advanced Reagent Scanner" desc = "A device for identifying chemicals and their proportions." id = "adv_reagent_scanner" - req_tech = list("biotech" = 2, "magnets" = 4) + req_tech = list("biotech" = 3, "magnets" = 4, "plasmatech" = 3) build_type = PROTOLATHE materials = list(MAT_METAL = 30, MAT_GLASS = 20) - reliability = 74 build_path = /obj/item/device/reagent_scanner/adv category = list("Medical") +/datum/design/bluespacebeaker + name = "Bluespace Beaker" + desc = "A bluespace beaker, powered by experimental bluespace technology and Element Cuban combined with the Compound Pete. Can hold up to 300 units." + id = "bluespacebeaker" + req_tech = list("bluespace" = 6, "materials" = 5, "plasmatech" = 4) + build_type = PROTOLATHE + materials = list(MAT_METAL = 3000, MAT_PLASMA = 3000, MAT_DIAMOND = 500) + build_path = /obj/item/weapon/reagent_containers/glass/beaker/bluespace + category = list("Medical") + /datum/design/noreactbeaker name = "Cryostasis Beaker" desc = "A cryostasis beaker that allows for chemical storage without reactions. Can hold up to 50 units." id = "splitbeaker" - req_tech = list("materials" = 2) + req_tech = list("materials" = 3, "engineering" = 3, "plasmatech" = 3) build_type = PROTOLATHE materials = list(MAT_METAL = 3000) - reliability = 76 build_path = /obj/item/weapon/reagent_containers/glass/beaker/noreact category = list("Medical") @@ -41,7 +48,6 @@ req_tech = list("programming" = 2, "biotech" = 2, "magnets" = 2) build_type = PROTOLATHE materials = list(MAT_METAL = 30, MAT_GLASS = 20) - reliability = 76 build_path = /obj/item/device/robotanalyzer category = list("Medical") @@ -62,7 +68,6 @@ req_tech = list("materials" = 7, "biotech" = 5, "powerstorage" = 5) build_type = PROTOLATHE materials = list(MAT_METAL = 5000, MAT_GLASS = 2000, MAT_SILVER = 1000) - reliability = 76 build_path = /obj/item/weapon/defibrillator category = list("Medical") @@ -71,10 +76,9 @@ name = "Handheld Crew Monitor" desc = "A device for tracking crew members on the station." id = "sensor_device" - req_tech = list("biotech" = 4, "magnets" = 3, "materials" = 3) + req_tech = list("programming" = 3, "magnets" = 2, "biotech" = 2) build_type = PROTOLATHE materials = list(MAT_METAL = 30, MAT_GLASS = 20) - reliability = 76 build_path = /obj/item/device/sensor_device category = list("Medical") @@ -82,11 +86,10 @@ name = "Man-Machine Interface" desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity." id = "mmi" - req_tech = list("programming" = 2, "biotech" = 3) + req_tech = list("programming" = 3, "biotech" = 2, "engineering" = 2) build_type = PROTOLATHE | MECHFAB materials = list(MAT_METAL = 1000, MAT_GLASS = 500) construction_time = 75 - reliability = 76 build_path = /obj/item/device/mmi category = list("Misc","Medical") @@ -94,10 +97,9 @@ name = "Mass-Spectrometer" desc = "A device for analyzing chemicals in the blood." id = "mass_spectrometer" - req_tech = list("biotech" = 2, "magnets" = 2) + req_tech = list("magnets" = 2, "plasmatech" = 2) build_type = PROTOLATHE - materials = list(MAT_METAL = 30, MAT_GLASS = 20) - reliability = 76 + materials = list(MAT_METAL = 300, MAT_GLASS = 100) build_path = /obj/item/device/mass_spectrometer category = list("Medical") @@ -105,10 +107,9 @@ name = "Positronic Brain" desc = "The latest in Artificial Intelligences." id = "mmi_posi" - req_tech = list("programming" = 5, "biotech" = 4) + req_tech = list("programming" = 5, "biotech" = 4, "plasmatech" = 3) build_type = PROTOLATHE | MECHFAB materials = list(MAT_METAL = 1700, MAT_GLASS = 1350, MAT_GOLD = 500) //Gold, because SWAG. - reliability = 74 construction_time = 75 build_path = /obj/item/device/mmi/posibrain category = list("Misc","Medical") @@ -117,11 +118,10 @@ name = "Radio-Enabled Man-Machine Interface" desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity. This one comes with a built-in radio." id = "mmi_radio" - req_tech = list("programming" = 2, "biotech" = 4) + req_tech = list("programming" = 3, "biotech" = 2, "engineering" = 2) build_type = PROTOLATHE | MECHFAB materials = list(MAT_METAL = 1200, MAT_GLASS = 500) construction_time = 75 - reliability = 74 build_path = /obj/item/device/mmi/radio_enabled category = list("Misc","Medical") @@ -139,25 +139,12 @@ name = "Reagent Scanner" desc = "A device for identifying chemicals." id = "reagent_scanner" - req_tech = list("biotech" = 2, "magnets" = 2) + req_tech = list("magnets" = 2, "plasmatech" = 2) build_type = PROTOLATHE materials = list(MAT_METAL = 30, MAT_GLASS = 20) - reliability = 76 build_path = /obj/item/device/reagent_scanner category = list("Medical") -/datum/design/synthetic_flash - name = "Synthetic Flash" - desc = "A synthetic flash used mostly in borg construction." - id = "sflash" - req_tech = list("magnets" = 3, "combat" = 2) - build_type = MECHFAB - materials = list(MAT_METAL = 750, MAT_GLASS = 750) - construction_time = 100 - reliability = 76 - build_path = /obj/item/device/flash/synthetic - category = list("Misc") - /datum/design/item/scalpel_laser1 name = "Basic Laser Scalpel" desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks basic and could be improved." @@ -266,21 +253,43 @@ name = "Welding Shield implant" desc = "These reactive micro-shields will protect you from welders and flashes without obscuring your vision." id = "ci-welding" - req_tech = list("materials" = 4, "biotech" = 2) + req_tech = list("materials" = 4, "biotech" = 4, "engineering" = 5, "plasmatech" = 4) build_type = PROTOLATHE | MECHFAB construction_time = 40 - materials = list(MAT_METAL = 200, MAT_GLASS = 400) + materials = list(MAT_METAL = 600, MAT_GLASS = 400) build_path = /obj/item/organ/internal/cyberimp/eyes/shield category = list("Misc", "Medical") +/datum/design/cyberimp_breather + name = "Breathing Tube Implant" + desc = "This simple implant adds an internals connector to your back, allowing you to use internals without a mask and protecting you from being choked." + id = "ci-breather" + req_tech = list("materials" = 2, "biotech" = 3) + build_type = PROTOLATHE | MECHFAB + construction_time = 35 + materials = list(MAT_METAL = 600, MAT_GLASS = 250) + build_path = /obj/item/organ/internal/cyberimp/mouth/breathing_tube + category = list("Misc", "Medical") + +/datum/design/cyberimp_toolset + name = "Toolset Arm Implant" + desc = "A stripped-down version of engineering cyborg toolset, designed to be installed on subject's arm." + id = "ci-toolset" + req_tech = list("materials" = 3, "engineering" = 4, "biotech" = 4, "powerstorage" = 4) + build_type = PROTOLATHE | MECHFAB + materials = list (MAT_METAL = 2500, MAT_GLASS = 1500, MAT_SILVER = 1500) + construction_time = 200 + build_path = /obj/item/organ/internal/cyberimp/arm/toolset + category = list("Misc", "Medical") + /datum/design/cyberimp_medical_hud name = "Medical HUD implant" desc = "These cybernetic eyes will display a medical HUD over everything you see. Wiggle eyes to control." id = "ci-medhud" - req_tech = list("materials" = 6, "programming" = 4, "biotech" = 4) + req_tech = list("materials" = 5, "programming" = 4, "biotech" = 4) build_type = PROTOLATHE | MECHFAB construction_time = 50 - materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_SILVER = 500, MAT_GOLD = 500) + materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 500, MAT_GOLD = 500) build_path = /obj/item/organ/internal/cyberimp/eyes/hud/medical category = list("Misc", "Medical") @@ -288,10 +297,10 @@ name = "Security HUD implant" desc = "These cybernetic eyes will display a security HUD over everything you see. Wiggle eyes to control." id = "ci-sechud" - req_tech = list("materials" = 6, "programming" = 5, "biotech" = 4, "combat" = 2) + req_tech = list("materials" = 5, "programming" = 4, "biotech" = 4, "combat" = 3) build_type = PROTOLATHE | MECHFAB construction_time = 50 - materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_SILVER = 750, MAT_GOLD = 750) + materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 750, MAT_GOLD = 750) build_path = /obj/item/organ/internal/cyberimp/eyes/hud/security category = list("Misc", "Medical") @@ -299,10 +308,10 @@ name = "X-Ray implant" desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile." id = "ci-xray" - req_tech = list("materials" = 7, "programming" = 5, "biotech" = 6, "magnets" = 5) + req_tech = list("materials" = 7, "programming" = 5, "biotech" = 7, "magnets" = 5,"plasmatech" = 6) build_type = PROTOLATHE | MECHFAB construction_time = 60 - materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_SILVER = 600, MAT_GOLD = 600, MAT_PLASMA = 1000, MAT_URANIUM = 1000, MAT_DIAMOND = 2000) + materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 600, MAT_GOLD = 600, MAT_PLASMA = 1000, MAT_URANIUM = 1000, MAT_DIAMOND = 2000) build_path = /obj/item/organ/internal/cyberimp/eyes/xray category = list("Misc", "Medical") @@ -310,10 +319,10 @@ name = "Thermals implant" desc = "These cybernetic eyes will give you Thermal vision. Vertical slit pupil included." id = "ci-thermals" - req_tech = list("materials" = 7, "programming" = 5, "biotech" = 5, "magnets" = 5, "syndicate" = 5) + req_tech = list("materials" = 6, "programming" = 4, "biotech" = 7, "magnets" = 5,"plasmatech" = 4) build_type = PROTOLATHE | MECHFAB construction_time = 60 - materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_SILVER = 600, MAT_GOLD = 600, MAT_PLASMA = 1000, MAT_DIAMOND = 2000) + materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 600, MAT_GOLD = 600, MAT_PLASMA = 1000, MAT_DIAMOND = 2000) build_path = /obj/item/organ/internal/cyberimp/eyes/thermals category = list("Misc", "Medical") @@ -321,10 +330,10 @@ name = "Anti-Drop implant" desc = "This cybernetic brain implant will allow you to force your hand muscles to contract, preventing item dropping. Twitch ear to toggle." id = "ci-antidrop" - req_tech = list("materials" = 7, "programming" = 5, "biotech" = 5) + req_tech = list("materials" = 5, "programming" = 6, "biotech" = 5) build_type = PROTOLATHE | MECHFAB construction_time = 60 - materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_SILVER = 400, MAT_GOLD = 400) + materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 400, MAT_GOLD = 400) build_path = /obj/item/organ/internal/cyberimp/brain/anti_drop category = list("Misc", "Medical") @@ -332,10 +341,10 @@ name = "CNS Rebooter implant" desc = "This implant will automatically give you back control over your central nervous system, reducing downtime when stunned." id = "ci-antistun" - req_tech = list("materials" = 7, "programming" = 5, "biotech" = 6) + req_tech = list("materials" = 6, "programming" = 5, "biotech" = 6) build_type = PROTOLATHE | MECHFAB construction_time = 60 - materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_SILVER = 500, MAT_GOLD = 1000) + materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 500, MAT_GOLD = 1000) build_path = /obj/item/organ/internal/cyberimp/brain/anti_stun category = list("Misc", "Medical") @@ -354,10 +363,10 @@ name = "Nutriment pump implant" desc = "This implant with synthesize and pump into your bloodstream a small amount of nutriment when you are starving." id = "ci-nutriment" - req_tech = list("materials" = 6, "programming" = 4, "biotech" = 5) + req_tech = list("materials" = 3, "powerstorage" = 4, "biotech" = 3) build_type = PROTOLATHE | MECHFAB construction_time = 40 - materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_GOLD = 500, MAT_URANIUM = 500) + materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_GOLD = 500) build_path = /obj/item/organ/internal/cyberimp/chest/nutriment category = list("Misc", "Medical") @@ -365,10 +374,10 @@ name = "Nutriment pump implant PLUS" desc = "This implant with synthesize and pump into your bloodstream a small amount of nutriment when you are hungry." id = "ci-nutrimentplus" - req_tech = list("materials" = 6, "programming" = 4, "biotech" = 6) + req_tech = list("materials" = 5, "powerstorage" = 4, "biotech" = 4) build_type = PROTOLATHE | MECHFAB construction_time = 50 - materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_GOLD = 500, MAT_URANIUM = 750) + materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_GOLD = 500, MAT_URANIUM = 750) build_path = /obj/item/organ/internal/cyberimp/chest/nutriment/plus category = list("Misc", "Medical") @@ -376,10 +385,10 @@ name = "Reviver implant" desc = "This implant will attempt to revive you if you lose consciousness. For the faint of heart!" id = "ci-reviver" - req_tech = list("materials" = 6, "programming" = 4, "biotech" = 7, "syndicate" = 4) + req_tech = list("materials" = 5, "programming" = 4, "biotech" = 5) build_type = PROTOLATHE | MECHFAB construction_time = 60 - materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_GOLD = 500, MAT_URANIUM = 1000, MAT_DIAMOND = 2000) + materials = list(MAT_METAL = 800, MAT_GLASS = 800, MAT_GOLD = 300, MAT_URANIUM = 500) build_path = /obj/item/organ/internal/cyberimp/chest/reviver category = list("Misc", "Medical") @@ -391,7 +400,7 @@ name = "Implanter" desc = "A sterile automatic implant injector." id = "implanter" - req_tech = list("materials" = 1, "programming" = 2, "biotech" = 3) + req_tech = list("materials" = 2, "biotech" = 3, "programming" = 2) build_type = PROTOLATHE materials = list(MAT_METAL = 600, MAT_GLASS = 200) build_path = /obj/item/weapon/implanter @@ -401,28 +410,28 @@ name = "Implant Case" desc = "A glass case containing an implant." id = "implantcase" - req_tech = list("materials" = 1, "biotech" = 2) + req_tech = list("biotech" = 2) build_type = PROTOLATHE materials = list(MAT_GLASS = 500) build_path = /obj/item/weapon/implantcase category = list("Medical") -/datum/design/implant_freedom - name = "Freedom Implant Case" +/datum/design/implant_chem + name = "Chemical Implant Case" desc = "A glass case containing an implant." - id = "implant_freedom" - req_tech = list("materials" = 2, "biotech" = 3, "magnets" = 3, "syndicate" = 5) + id = "implant_chem" + req_tech = list("materials" = 3, "biotech" = 5,) build_type = PROTOLATHE - materials = list(MAT_METAL = 50, MAT_GLASS = 500, MAT_GOLD = 250) - build_path = /obj/item/weapon/implantcase/freedom + materials = list(MAT_GLASS = 700) + build_path = /obj/item/weapon/implantcase/chem category = list("Medical") -/datum/design/implant_adrenalin - name = "Adrenalin Implant Case" +/datum/design/implant_tracking + name = "Tracking Implant Case" desc = "A glass case containing an implant." - id = "implant_adrenalin" - req_tech = list("materials" = 2, "biotech" = 5, "combat" = 3, "syndicate" = 6) + id = "implant_tracking" + req_tech = list("materials" = 2, "biotech" = 3, "magnets" = 3, "programming" = 2) build_type = PROTOLATHE - materials = list(MAT_METAL = 50, MAT_GLASS = 500, MAT_GOLD = 500, MAT_URANIUM = 100, MAT_DIAMOND = 200) - build_path = /obj/item/weapon/implantcase/adrenaline - category = list("Medical") \ No newline at end of file + materials = list(MAT_METAL = 500, MAT_GLASS = 500) + build_path = /obj/item/weapon/implantcase/track + category = list("Medical") diff --git a/code/modules/research/designs/mining_designs.dm b/code/modules/research/designs/mining_designs.dm index aa3014e2825..fa75bd29c24 100644 --- a/code/modules/research/designs/mining_designs.dm +++ b/code/modules/research/designs/mining_designs.dm @@ -5,28 +5,17 @@ name = "Diamond Mining Drill" desc = "Yours is the drill that will pierce the heavens!" id = "drill_diamond" - req_tech = list("materials" = 6, "powerstorage" = 4, "engineering" = 4) + req_tech = list("materials" = 6, "powerstorage" = 5, "engineering" = 5) build_type = PROTOLATHE materials = list(MAT_METAL = 3000, MAT_GLASS = 1000, MAT_DIAMOND = 2000) //Yes, a whole diamond is needed. - reliability = 79 build_path = /obj/item/weapon/pickaxe/drill/diamonddrill category = list("Mining") -/datum/design/pick_diamond - name = "Diamond Pickaxe" - desc = "A pickaxe with a diamond pick head, this is just like minecraft." - id = "pick_diamond" - req_tech = list("materials" = 6) - build_type = PROTOLATHE - materials = list(MAT_DIAMOND = 3000) - build_path = /obj/item/weapon/pickaxe/diamond - category = list("Mining") - /datum/design/drill name = "Mining Drill" desc = "Yours is the drill that will pierce through the rock walls." id = "drill" - req_tech = list("materials" = 2, "powerstorage" = 3, "engineering" = 2) + req_tech = list("materials" = 2, "powerstorage" = 2, "engineering" = 3) build_type = PROTOLATHE materials = list(MAT_METAL = 6000, MAT_GLASS = 1000) build_path = /obj/item/weapon/pickaxe/drill @@ -36,10 +25,9 @@ name = "Plasma Cutter" desc = "You could use it to cut limbs off of xenos! Or, you know, mine stuff." id = "plasmacutter" - req_tech = list("materials" = 2, "plasmatech" = 2, "engineering" = 2, "combat" = 1, "magnets" = 2) + req_tech = list("materials" = 3, "plasmatech" = 3, "magnets" = 2) build_type = PROTOLATHE - materials = list(MAT_METAL = 1500, MAT_GLASS = 500, MAT_GOLD = 500, MAT_PLASMA = 500) - reliability = 79 + materials = list(MAT_METAL = 1500, MAT_GLASS = 500, MAT_PLASMA = 400) build_path = /obj/item/weapon/gun/energy/plasmacutter category = list("Mining") @@ -47,10 +35,9 @@ name = "Advanced Plasma Cutter" desc = "It's an advanced plasma cutter, oh my god." id = "plasmacutter_adv" - req_tech = list("materials" = 4, "plasmatech" = 3, "engineering" = 3, "combat" = 3, "magnets" = 3) + req_tech = list("materials" = 4, "plasmatech" = 4, "engineering" = 2, "combat" = 3, "magnets" = 3) build_type = PROTOLATHE materials = list(MAT_METAL = 3000, MAT_GLASS = 1000, MAT_PLASMA = 2000, MAT_GOLD = 500) - reliability = 79 build_path = /obj/item/weapon/gun/energy/plasmacutter/adv category = list("Mining") @@ -58,7 +45,7 @@ name = "Sonic Jackhammer" desc = "Essentially a handheld planet-cracker. Can drill through walls with ease as well." id = "jackhammer" - req_tech = list("materials" = 6, "powerstorage" = 6, "engineering" = 5, "magnets" = 6) + req_tech = list("materials" = 7, "powerstorage" = 5, "engineering" = 6, "magnets" = 5) build_type = PROTOLATHE materials = list(MAT_METAL = 6000, MAT_GLASS = 2000, MAT_SILVER = 2000, MAT_DIAMOND = 6000) build_path = /obj/item/weapon/pickaxe/drill/jackhammer @@ -70,10 +57,10 @@ id = "superresonator" req_tech = list("materials" = 4, "powerstorage" = 3, "engineering" = 3, "magnets" = 3) build_type = PROTOLATHE - materials = list(MAT_METAL = 4000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_URANIUM = 2000) + materials = list(MAT_METAL = 4000, MAT_GLASS = 1500, MAT_SILVER = 1000, MAT_URANIUM = 1000) build_path = /obj/item/weapon/resonator/upgraded category = list("Mining") - + /datum/design/trigger_guard_mod name = "Kinetic Accelerator Trigger Guard Mod" desc = "A device which allows kinetic accelerators to be wielded by any organism." @@ -132,4 +119,4 @@ build_type = PROTOLATHE | MECHFAB materials = list(MAT_METAL = 8000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_GOLD = 2000, MAT_DIAMOND = 2000) build_path = /obj/item/borg/upgrade/modkit/aoe/turfs - category = list("Mining", "Cyborg Upgrade Modules") \ No newline at end of file + category = list("Mining", "Cyborg Upgrade Modules") diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index ea67fe5e809..080cca11ffb 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -7,7 +7,7 @@ id = "design_disk" req_tech = list("programming" = 1) build_type = PROTOLATHE | AUTOLATHE - materials = list(MAT_METAL = 30, MAT_GLASS = 10) + materials = list(MAT_METAL = 300, MAT_GLASS = 100) build_path = /obj/item/weapon/disk/design_disk category = list("Miscellaneous") @@ -25,7 +25,7 @@ name = "Intellicard" desc = "Allows for the construction of an intellicard." id = "intellicard" - req_tech = list("programming" = 4, "materials" = 4) + req_tech = list("programming" = 3, "materials" = 3) build_type = PROTOLATHE materials = list(MAT_GLASS = 1000, MAT_GOLD = 200) build_path = /obj/item/device/aicard @@ -47,7 +47,7 @@ id = "tech_disk" req_tech = list("programming" = 1) build_type = PROTOLATHE | AUTOLATHE - materials = list(MAT_METAL = 30, MAT_GLASS = 10) + materials = list(MAT_METAL = 300, MAT_GLASS = 100) build_path = /obj/item/weapon/disk/tech_disk category = list("Miscellaneous") @@ -59,4 +59,4 @@ build_type = PROTOLATHE materials = list(MAT_METAL = 500, MAT_GLASS = 300) build_path = /obj/item/device/camera/digital - category = list("Miscellaneous") \ No newline at end of file + category = list("Miscellaneous") diff --git a/code/modules/research/designs/power_designs.dm b/code/modules/research/designs/power_designs.dm index a70088b25b1..f1b361a4b5b 100644 --- a/code/modules/research/designs/power_designs.dm +++ b/code/modules/research/designs/power_designs.dm @@ -28,10 +28,9 @@ name = "Hyper-Capacity Power Cell" desc = "A power cell that holds 30000 units of energy" id = "hyper_cell" - req_tech = list("powerstorage" = 5, "materials" = 4) - reliability = 70 + req_tech = list("powerstorage" = 5, "materials" = 5, "engineering" = 5) build_type = PROTOLATHE | MECHFAB | PODFAB - materials = list(MAT_METAL = 400, MAT_GOLD = 150, MAT_SILVER = 150, MAT_GLASS = 70) + materials = list(MAT_METAL = 700, MAT_GOLD = 150, MAT_SILVER = 150, MAT_GLASS = 70) construction_time=100 build_path = /obj/item/weapon/stock_parts/cell/hyper category = list("Misc","Power") @@ -40,8 +39,7 @@ name = "Super-Capacity Power Cell" desc = "A power cell that holds 20000 units of energy" id = "super_cell" - req_tech = list("powerstorage" = 3, "materials" = 2) - reliability = 75 + req_tech = list("powerstorage" = 3, "materials" = 3) build_type = PROTOLATHE | MECHFAB | PODFAB materials = list(MAT_METAL = 700, MAT_GLASS = 70) construction_time=100 @@ -52,8 +50,7 @@ name = "Bluespace Power Cell" desc = "A power cell that holds 40000 units of energy." id = "bluespace_cell" - req_tech = list("powerstorage" = 6, "materials" = 5) - reliability = 70 + req_tech = list("powerstorage" = 6, "materials" = 5, "engineering" = 5, "bluespace" = 5) build_type = PROTOLATHE | MECHFAB materials = list(MAT_METAL = 800, MAT_GOLD = 300, MAT_SILVER = 300, MAT_GLASS = 160, MAT_DIAMOND = 160) construction_time=100 @@ -64,9 +61,8 @@ name = "Machine Board (PACMAN-type Generator)" desc = "The circuit board that for a PACMAN-type portable generator." id = "pacman" - req_tech = list("programming" = 3, "plasmatech" = 3, "powerstorage" = 3, "engineering" = 3) + req_tech = list("programming" = 2, "plasmatech" = 3, "powerstorage" = 3, "engineering" = 3) build_type = IMPRINTER - reliability = 79 materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/pacman category = list("Engineering Machinery") @@ -75,9 +71,8 @@ name = "Machine Board (MRSPACMAN-type Generator)" desc = "The circuit board that for a MRSPACMAN-type portable generator." id = "mrspacman" - req_tech = list("programming" = 3, "powerstorage" = 5, "engineering" = 5) + req_tech = list("programming" = 3, "powerstorage" = 5, "engineering" = 5, "plasmatech" = 4) build_type = IMPRINTER - reliability = 74 materials = list(MAT_GLASS = 2000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/pacman/mrs category = list("Engineering Machinery") @@ -88,7 +83,6 @@ id = "superpacman" req_tech = list("programming" = 3, "powerstorage" = 4, "engineering" = 4) build_type = IMPRINTER - reliability = 76 materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/pacman/super category = list("Engineering Machinery") @@ -97,7 +91,7 @@ name = "Machine Design (Tesla Coil Board)" desc = "The circuit board for a tesla coil." id = "tesla_coil" - req_tech = list("programming" = 1) + req_tech = list("programming" = 3, "powerstorage" = 3, "magnets" = 3) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/tesla_coil @@ -107,8 +101,8 @@ name = "Machine Design (Grounding Rod Board)" desc = "The circuit board for a grounding rod." id = "grounding_rod" - req_tech = list("programming" = 1) + req_tech = list("programming" = 3, "powerstorage" = 3, "magnets" = 3, "plasmatech" = 2) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/grounding_rod - category = list("Engineering Machinery") \ No newline at end of file + category = list("Engineering Machinery") diff --git a/code/modules/research/designs/stock_parts_designs.dm b/code/modules/research/designs/stock_parts_designs.dm index 7859f635cd5..ab4464a5f27 100644 --- a/code/modules/research/designs/stock_parts_designs.dm +++ b/code/modules/research/designs/stock_parts_designs.dm @@ -8,7 +8,7 @@ id = "basic_capacitor" req_tech = list("powerstorage" = 1) build_type = PROTOLATHE | AUTOLATHE - materials = list(MAT_METAL = 50, MAT_GLASS = 50) + materials = list(MAT_METAL = 100, MAT_GLASS = 100) build_path = /obj/item/weapon/stock_parts/capacitor category = list("Stock Parts","Machinery","initial") lathe_time_factor = 5 @@ -19,7 +19,7 @@ id = "basic_sensor" req_tech = list("magnets" = 1) build_type = PROTOLATHE | AUTOLATHE - materials = list(MAT_METAL = 50, MAT_GLASS = 20) + materials = list(MAT_METAL = 100, MAT_GLASS = 50) build_path = /obj/item/weapon/stock_parts/scanning_module category = list("Stock Parts","Machinery","initial") lathe_time_factor = 5 @@ -28,9 +28,9 @@ name = "Micro Manipulator" desc = "A stock part used in the construction of various devices." id = "micro_mani" - req_tech = list("materials" = 1, "programming" = 1) + req_tech = list("materials" = 1) build_type = PROTOLATHE | AUTOLATHE - materials = list(MAT_METAL = 30) + materials = list(MAT_METAL = 100) build_path = /obj/item/weapon/stock_parts/manipulator category = list("Stock Parts","Machinery","initial") lathe_time_factor = 5 @@ -41,7 +41,7 @@ id = "basic_micro_laser" req_tech = list("magnets" = 1) build_type = PROTOLATHE | AUTOLATHE - materials = list(MAT_METAL = 10, MAT_GLASS = 20) + materials = list(MAT_METAL = 100, MAT_GLASS = 50) build_path = /obj/item/weapon/stock_parts/micro_laser category = list("Stock Parts","Machinery","initial") lathe_time_factor = 5 @@ -52,7 +52,7 @@ id = "basic_matter_bin" req_tech = list("materials" = 1) build_type = PROTOLATHE | AUTOLATHE - materials = list(MAT_METAL = 80) + materials = list(MAT_METAL = 100) build_path = /obj/item/weapon/stock_parts/matter_bin category = list("Stock Parts","Machinery","initial") lathe_time_factor = 5 @@ -63,7 +63,7 @@ id = "adv_capacitor" req_tech = list("powerstorage" = 3) build_type = PROTOLATHE - materials = list(MAT_METAL = 50, MAT_GLASS = 50) + materials = list(MAT_METAL = 150, MAT_GLASS = 150) build_path = /obj/item/weapon/stock_parts/capacitor/adv category = list("Stock Parts") lathe_time_factor = 5 @@ -74,7 +74,7 @@ id = "adv_sensor" req_tech = list("magnets" = 3) build_type = PROTOLATHE - materials = list(MAT_METAL = 50, MAT_GLASS = 20) + materials = list(MAT_METAL = 150, MAT_GLASS = 100) build_path = /obj/item/weapon/stock_parts/scanning_module/adv category = list("Stock Parts") lathe_time_factor = 5 @@ -85,7 +85,7 @@ id = "nano_mani" req_tech = list("materials" = 3, "programming" = 2) build_type = PROTOLATHE - materials = list(MAT_METAL = 30) + materials = list(MAT_METAL = 150) build_path = /obj/item/weapon/stock_parts/manipulator/nano category = list("Stock Parts") lathe_time_factor = 5 @@ -96,7 +96,7 @@ id = "high_micro_laser" req_tech = list("magnets" = 3) build_type = PROTOLATHE - materials = list(MAT_METAL = 10, MAT_GLASS = 20) + materials = list(MAT_METAL = 150, MAT_GLASS = 100) build_path = /obj/item/weapon/stock_parts/micro_laser/high category = list("Stock Parts") lathe_time_factor = 5 @@ -107,7 +107,7 @@ id = "adv_matter_bin" req_tech = list("materials" = 3) build_type = PROTOLATHE - materials = list(MAT_METAL = 80) + materials = list(MAT_METAL = 150) build_path = /obj/item/weapon/stock_parts/matter_bin/adv category = list("Stock Parts") lathe_time_factor = 5 @@ -116,10 +116,9 @@ name = "Super Capacitor" desc = "A stock part used in the construction of various devices." id = "super_capacitor" - req_tech = list("powerstorage" = 5, "materials" = 4) + req_tech = list("powerstorage" = 5, "engineering" = 5) build_type = PROTOLATHE - reliability = 71 - materials = list(MAT_METAL = 50, MAT_GLASS = 50, MAT_GOLD = 20) + materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_GOLD = 100) build_path = /obj/item/weapon/stock_parts/capacitor/super category = list("Stock Parts") lathe_time_factor = 5 @@ -128,10 +127,9 @@ name = "Phasic Scanning Module" desc = "A stock part used in the construction of various devices." id = "phasic_sensor" - req_tech = list("magnets" = 5, "materials" = 3) + req_tech = list("magnets" = 5, "engineering" = 5) build_type = PROTOLATHE - materials = list(MAT_METAL = 50, MAT_GLASS = 20, MAT_SILVER = 10) - reliability = 72 + materials = list(MAT_METAL = 200, MAT_GLASS = 150, MAT_SILVER = 60) build_path = /obj/item/weapon/stock_parts/scanning_module/phasic category = list("Stock Parts") lathe_time_factor = 5 @@ -140,10 +138,9 @@ name = "Pico Manipulator" desc = "A stock part used in the construction of various devices." id = "pico_mani" - req_tech = list("materials" = 5, "programming" = 2) + req_tech = list("materials" = 5, "programming" = 4, "engineering" = 5) build_type = PROTOLATHE - materials = list(MAT_METAL = 30) - reliability = 73 + materials = list(MAT_METAL = 200) build_path = /obj/item/weapon/stock_parts/manipulator/pico category = list("Stock Parts") lathe_time_factor = 5 @@ -152,10 +149,9 @@ name = "Ultra-High-Power Micro-Laser" desc = "A stock part used in the construction of various devices." id = "ultra_micro_laser" - req_tech = list("magnets" = 5, "materials" = 5) + req_tech = list("magnets" = 5, "engineering" = 5) build_type = PROTOLATHE - materials = list(MAT_METAL = 10, MAT_GLASS = 20, MAT_URANIUM = 10) - reliability = 70 + materials = list(MAT_METAL = 200, MAT_GLASS = 150, MAT_URANIUM = 60) build_path = /obj/item/weapon/stock_parts/micro_laser/ultra category = list("Stock Parts") lathe_time_factor = 5 @@ -164,10 +160,9 @@ name = "Super Matter Bin" desc = "A stock part used in the construction of various devices." id = "super_matter_bin" - req_tech = list("materials" = 5) + req_tech = list("materials" = 5, "engineering" = 5) build_type = PROTOLATHE - materials = list(MAT_METAL = 80) - reliability = 75 + materials = list(MAT_METAL = 200) build_path = /obj/item/weapon/stock_parts/matter_bin/super category = list("Stock Parts") lathe_time_factor = 5 @@ -176,10 +171,9 @@ name = "Quadratic Capacitor" desc = "A stock part used in the construction of various devices." id = "quadratic_capacitor" - req_tech = list("powerstorage" = 6, "materials" = 5) + req_tech = list("powerstorage" = 6, "engineering" = 5, "materials" = 5, "bluespace" = 5) build_type = PROTOLATHE - reliability = 71 - materials = list(MAT_METAL = 100, MAT_GLASS = 100, MAT_DIAMOND = 40) + materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_GOLD = 100, MAT_DIAMOND = 100) build_path = /obj/item/weapon/stock_parts/capacitor/quadratic category = list("Stock Parts") lathe_time_factor = 5 @@ -188,10 +182,9 @@ name = "Triphasic Scanning Module" desc = "A stock part used in the construction of various devices." id = "triphasic_scanning" - req_tech = list("magnets" = 6, "materials" = 4) + req_tech = list("magnets" = 6, "materials" = 5, "engineering" = 5, "bluespace" = 5) build_type = PROTOLATHE - materials = list(MAT_METAL = 100, MAT_GLASS = 40, MAT_DIAMOND = 20) - reliability = 72 + materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_DIAMOND = 60) build_path = /obj/item/weapon/stock_parts/scanning_module/triphasic category = list("Stock Parts") lathe_time_factor = 5 @@ -200,10 +193,9 @@ name = "Femto Manipulator" desc = "A stock part used in the construction of various devices." id = "femto_mani" - req_tech = list("materials" = 6, "programming" = 3) + req_tech = list("materials" = 7, "programming" = 5, "engineering" = 5, "bluespace" = 5) build_type = PROTOLATHE - materials = list(MAT_METAL = 60, MAT_DIAMOND = 30) - reliability = 73 + materials = list(MAT_METAL = 200, MAT_DIAMOND = 60) build_path = /obj/item/weapon/stock_parts/manipulator/femto category = list("Stock Parts") lathe_time_factor = 5 @@ -212,10 +204,9 @@ name = "Quad-Ultra Micro-Laser" desc = "A stock part used in the construction of various devices." id = "quadultra_micro_laser" - req_tech = list("magnets" = 6, "materials" = 6) + req_tech = list("magnets" = 6, "materials" = 5, "engineering" = 5, "bluespace" = 5) build_type = PROTOLATHE - materials = list(MAT_METAL = 20, MAT_GLASS = 40, MAT_URANIUM = 20, MAT_DIAMOND = 20) - reliability = 70 + materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_URANIUM = 100, MAT_DIAMOND = 60) build_path = /obj/item/weapon/stock_parts/micro_laser/quadultra category = list("Stock Parts") lathe_time_factor = 5 @@ -224,10 +215,9 @@ name = "Bluespace Matter Bin" desc = "A stock part used in the construction of various devices." id = "bluespace_matter_bin" - req_tech = list("materials" = 6) + req_tech = list("materials" = 7, "engineering" = 5, "bluespace" = 5) build_type = PROTOLATHE - materials = list(MAT_METAL = 160, MAT_DIAMOND = 200) - reliability = 75 + materials = list(MAT_METAL = 250, MAT_DIAMOND = 200) build_path = /obj/item/weapon/stock_parts/matter_bin/bluespace category = list("Stock Parts") lathe_time_factor = 5 @@ -236,7 +226,7 @@ name = "Rapid Part Exchange Device" desc = "Special mechanical module made to store, sort, and apply standard machine parts." id = "rped" - req_tech = list("engineering" = 3, "materials" = 3) + req_tech = list("engineering" = 1) build_type = PROTOLATHE materials = list(MAT_METAL = 10000, MAT_GLASS = 5000) //hardcore build_path = /obj/item/weapon/storage/part_replacer @@ -246,7 +236,7 @@ name = "Bluespace RPED" desc = "Powered by bluespace technology, this RPED variant can upgrade buildings from a distance, without needing to remove the panel first." id = "bs_rped" - req_tech = list("engineering" = 3, "materials" = 5, "programming" = 3, "bluespace" = 3) + req_tech = list("engineering" = 4, "bluespace" = 3) build_type = PROTOLATHE materials = list(MAT_METAL = 15000, MAT_GLASS = 5000, MAT_SILVER = 2500) //hardcore build_path = /obj/item/weapon/storage/part_replacer/bluespace @@ -261,4 +251,4 @@ materials = list(MAT_METAL = 4000, MAT_PLASMA = 4000) build_path = /obj/item/stack/sheet/mineral/abductor category = list("Stock Parts") - lathe_time_factor = 5 \ No newline at end of file + lathe_time_factor = 5 diff --git a/code/modules/research/designs/telecomms_designs.dm b/code/modules/research/designs/telecomms_designs.dm index 4c6d72c0120..fec717f41ab 100644 --- a/code/modules/research/designs/telecomms_designs.dm +++ b/code/modules/research/designs/telecomms_designs.dm @@ -36,7 +36,7 @@ name = "Machine Board (Relay Mainframe)" desc = "Allows for the construction of Telecommunications Relay Mainframes." id = "s-relay" - req_tech = list("programming" = 1, "engineering" = 2, "bluespace" = 2) + req_tech = list("programming" = 2, "engineering" = 2, "bluespace" = 2) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/telecomms/relay @@ -56,7 +56,7 @@ name = "Machine Board (Subspace Broadcaster)" desc = "Allows for the construction of Subspace Broadcasting equipment." id = "s-broadcaster" - req_tech = list("programming" = 2, "engineering" = 2, "bluespace" = 1) + req_tech = list("programming" = 2, "engineering" = 2) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/telecomms/broadcaster @@ -66,7 +66,7 @@ name = "Machine Board (Subspace Receiver)" desc = "Allows for the construction of Subspace Receiver equipment." id = "s-receiver" - req_tech = list("programming" = 2, "engineering" = 1, "bluespace" = 1) + req_tech = list("programming" = 2, "engineering" = 2, "bluespace" = 1) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/telecomms/receiver @@ -76,9 +76,9 @@ name = "Ansible Crystal" desc = "A sophisticated analyzer capable of analyzing cryptic subspace wavelengths." id = "s-crystal" - req_tech = list("magnets" = 2, "materials" = 2, "bluespace" = 1) + req_tech = list("magnets" = 2, "materials" = 2, "bluespace" = 3, "plasmatech" = 3) build_type = PROTOLATHE - materials = list(MAT_GLASS = 1000, MAT_SILVER = 20, MAT_GOLD = 20) + materials = list(MAT_GLASS = 800, MAT_SILVER = 100, MAT_GOLD = 100) build_path = /obj/item/weapon/stock_parts/subspace/crystal category = list("Stock Parts") @@ -86,9 +86,9 @@ name = "Hyperwave Filter" desc = "A tiny device capable of filtering and converting super-intense radiowaves." id = "s-filter" - req_tech = list("programming" = 2, "magnets" = 2) + req_tech = list("programming" = 3, "magnets" = 3) build_type = PROTOLATHE - materials = list(MAT_METAL = 40, MAT_SILVER = 10) + materials = list(MAT_METAL = 100, MAT_SILVER = 100) build_path = /obj/item/weapon/stock_parts/subspace/filter category = list("Stock Parts") @@ -96,9 +96,9 @@ name = "Subspace Amplifier" desc = "A compact micro-machine capable of amplifying weak subspace transmissions." id = "s-amplifier" - req_tech = list("programming" = 2, "magnets" = 2, "materials" = 2, "bluespace" = 1) + req_tech = list("programming" = 3, "magnets" = 4, "materials" = 3, "bluespace" = 2) build_type = PROTOLATHE - materials = list(MAT_METAL = 10, MAT_GOLD = 30, MAT_URANIUM = 15) + materials = list(MAT_METAL = 100, MAT_GOLD = 100, MAT_URANIUM = 100) build_path = /obj/item/weapon/stock_parts/subspace/amplifier category = list("Stock Parts") @@ -106,9 +106,9 @@ name = "Subspace Analyzer" desc = "A sophisticated analyzer capable of analyzing cryptic subspace wavelengths." id = "s-analyzer" - req_tech = list("programming" = 2, "magnets" = 2, "materials" = 2, "bluespace" = 1) + req_tech = list("programming" = 3, "magnets" = 4, "materials" = 2, "bluespace" = 3) build_type = PROTOLATHE - materials = list(MAT_METAL = 10, MAT_GOLD = 15) + materials = list(MAT_METAL = 100, MAT_GOLD = 100) build_path = /obj/item/weapon/stock_parts/subspace/analyzer category = list("Stock Parts") @@ -116,9 +116,9 @@ name = "Subspace Ansible" desc = "A compact module capable of sensing extradimensional activity." id = "s-ansible" - req_tech = list("programming" = 2, "magnets" = 2, "materials" = 2, "bluespace" = 1) + req_tech = list("programming" = 2, "magnets" = 2, "materials" = 2) build_type = PROTOLATHE - materials = list(MAT_METAL = 80, MAT_SILVER = 20) + materials = list(MAT_METAL = 100, MAT_SILVER = 100) build_path = /obj/item/weapon/stock_parts/subspace/ansible category = list("Stock Parts") @@ -126,9 +126,9 @@ name = "Subspace Transmitter" desc = "A large piece of equipment used to open a window into the subspace dimension." id = "s-transmitter" - req_tech = list("magnets" = 3, "materials" = 3, "bluespace" = 2) + req_tech = list("magnets" = 3, "materials" = 4, "bluespace" = 4) build_type = PROTOLATHE - materials = list(MAT_GLASS = 100, MAT_SILVER = 10, MAT_URANIUM = 15) + materials = list(MAT_GLASS = 100, MAT_SILVER = 100, MAT_URANIUM = 100) build_path = /obj/item/weapon/stock_parts/subspace/transmitter category = list("Stock Parts") @@ -136,8 +136,8 @@ name = "Subspace Treatment Disk" desc = "A compact micro-machine capable of stretching out hyper-compressed radio waves." id = "s-treatment" - req_tech = list("programming" = 2, "magnets" = 1, "materials" = 2, "bluespace" = 1) + req_tech = list("programming" = 2, "magnets" = 3, "materials" = 2, "bluespace" = 3) build_type = PROTOLATHE - materials = list(MAT_METAL = 10, MAT_SILVER = 20) + materials = list(MAT_METAL = 100, MAT_SILVER = 200) build_path = /obj/item/weapon/stock_parts/subspace/treatment category = list("Stock Parts") diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index e282e42fa3f..09b17748dfd 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -6,10 +6,9 @@ name = "Advanced Energy Gun" desc = "An energy gun with an experimental miniaturized reactor." id = "nuclear_gun" - req_tech = list("combat" = 4, "materials" = 5, "powerstorage" = 3) + req_tech = list("combat" = 5, "magnets" = 5, "powerstorage" = 5) build_type = PROTOLATHE - materials = list(MAT_METAL = 5000, MAT_GLASS = 1000, MAT_URANIUM = 2000) - reliability = 76 + materials = list(MAT_METAL = 10000, MAT_GLASS = 2000, MAT_URANIUM = 4000) build_path = /obj/item/weapon/gun/energy/gun/nuclear locked = 1 category = list("Weapons") @@ -18,7 +17,7 @@ name = "Decloner" desc = "Your opponent will bubble into a messy pile of goop." id = "decloner" - req_tech = list("combat" = 6, "materials" = 7, "biotech" = 5, "powerstorage" = 6) + req_tech = list("combat" = 5, "materials" = 5, "biotech" = 6, "plasmatech" = 7) build_type = PROTOLATHE materials = list(MAT_GOLD = 5000,MAT_URANIUM = 10000) reagents = list("mutagen" = 40) @@ -30,19 +29,18 @@ name = "Energy Crossbow" desc = "A reverse-engineered energy crossbow favored by syndicate infiltration teams and carp hunters." id = "largecrossbow" - req_tech = list("combat" = 5, "materials" = 5, "engineering" = 3, "biotech" = 4, "syndicate" = 3) + req_tech = list("combat" = 5, "engineering" = 3, "magnet" = 5, "syndicate" = 3) build_type = PROTOLATHE materials = list(MAT_METAL = 5000, MAT_GLASS = 1500, MAT_URANIUM = 1500, MAT_SILVER = 1500) build_path = /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow/large locked = 1 category = list("Weapons") - reliability = 76 /datum/design/flora_gun name = "Floral Somatoray" desc = "A tool that discharges controlled radiation which induces mutation in plant cells. Harmless to other organic life." id = "flora_gun" - req_tech = list("materials" = 2, "biotech" = 3, "powerstorage" = 3) + req_tech = list("materials" = 2, "biotech" = 4) build_type = PROTOLATHE materials = list(MAT_METAL = 2000, MAT_GLASS = 500) reagents = list("radium" = 20) @@ -53,9 +51,9 @@ name = "Ion Carbine" desc = "How to dismantle a cyborg : The gun." id = "ioncarbine" - req_tech = list("combat" = 5, "materials" = 4, "magnets" = 4) + req_tech = list("combat" = 5, "magnets" = 4) build_type = PROTOLATHE - materials = list(MAT_SILVER = 4000, MAT_METAL = 6000, MAT_URANIUM = 1000) + materials = list(MAT_SILVER = 6000, MAT_METAL = 8000, MAT_URANIUM = 2000) build_path = /obj/item/weapon/gun/energy/ionrifle/carbine locked = 1 category = list("Weapons") @@ -64,9 +62,9 @@ name = "Bluespace Wormhole Projector" desc = "A projector that emits high density quantum-coupled bluespace beams." id = "wormholeprojector" - req_tech = list("combat" = 6, "materials" = 6, "bluespace" = 4) + req_tech = list("combat" = 5, "engineering" = 5, "bluespace" = 7, "plasmatech" = 6) build_type = PROTOLATHE - materials = list(MAT_SILVER = 1000, MAT_METAL = 5000, MAT_DIAMOND = 3000) + materials = list(MAT_SILVER = 2000, MAT_METAL = 5000, MAT_DIAMOND = 3000) build_path = /obj/item/weapon/gun/energy/wormhole_projector locked = 1 access_requirement = list(access_rd) //screw you, HoS, this aint yours; this is only for a man of science---and trouble. @@ -76,18 +74,47 @@ name = "Large Grenade" desc = "A grenade that affects a larger area and use larger containers." id = "large_Grenade" - req_tech = list("combat" = 3, "materials" = 2) + req_tech = list("combat" = 3, "engineering" = 3) build_type = PROTOLATHE materials = list(MAT_METAL = 3000) - reliability = 79 build_path = /obj/item/weapon/grenade/chem_grenade/large category = list("Weapons") +/datum/design/pyro_grenade + name = "Pyro Grenade" + desc = "An advanced grenade that is able to self ignite its mixture." + id = "pyro_Grenade" + req_tech = list("combat" = 4, "engineering" = 4) + build_type = PROTOLATHE + materials = list(MAT_METAL = 2000, MAT_PLASMA = 500) + build_path = /obj/item/weapon/grenade/chem_grenade/pyro + category = list("Weapons") + +/datum/design/cryo_grenade + name = "Cryo Grenade" + desc = "An advanced grenade that rapidly cools its contents upon detonation." + id = "cryo_Grenade" + req_tech = list("combat" = 3, "materials" = 3) + build_type = PROTOLATHE + materials = list(MAT_METAL = 2000, MAT_SILVER = 500) + build_path = /obj/item/weapon/grenade/chem_grenade/cryo + category = list("Weapons") + +/datum/design/adv_grenade + name = "Advanced Release Grenade" + desc = "An advanced grenade that can be detonated several times, best used with a repeating igniter." + id = "adv_Grenade" + req_tech = list("combat" = 3, "engineering" = 4) + build_type = PROTOLATHE + materials = list(MAT_METAL = 3000, MAT_GLASS = 500) + build_path = /obj/item/weapon/grenade/chem_grenade/adv_release + category = list("Weapons") + /datum/design/tele_shield name = "Telescopic Riot Shield" desc = "An advanced riot shield made of lightweight materials that collapses for easy storage." id = "tele_shield" - req_tech = list("combat" = 4, "materials" = 3, "engineering" = 3) + req_tech = list("combat" = 4, "materials" = 3, "engineering" = 4) build_type = PROTOLATHE materials = list(MAT_METAL = 4000, MAT_GLASS = 5000, MAT_SILVER = 300) build_path = /obj/item/weapon/shield/riot/tele @@ -97,9 +124,9 @@ name = "Accelerator Laser Cannon" desc = "A heavy duty laser cannon. It does more damage the farther away the target is." id = "lasercannon" - req_tech = list("combat" = 4, "materials" = 3, "powerstorage" = 3) + req_tech = list("combat" = 5, "magnets" = 5, "powerstorage" = 3) build_type = PROTOLATHE - materials = list(MAT_METAL = 10000, MAT_GLASS = 2000, MAT_DIAMOND = 2000) + materials = list(MAT_METAL = 10000, MAT_GLASS = 3000, MAT_DIAMOND = 3000) build_path = /obj/item/weapon/gun/energy/lasercannon locked = 1 category = list("Weapons") @@ -108,7 +135,7 @@ name = "Plasma Pistol" desc = "A specialized firearm designed to fire lethal bolts of toxins." id = "ppistol" - req_tech = list("combat" = 4, "plasmatech" = 3) + req_tech = list("combat" = 5, "magnets" = 5, "powerstorage" = 5) build_type = PROTOLATHE materials = list(MAT_METAL = 5000, MAT_GLASS = 1000, MAT_PLASMA = 3000) build_path = /obj/item/weapon/gun/energy/toxgun @@ -152,7 +179,7 @@ name = "Rapid Syringe Gun" desc = "A gun that fires many syringes." id = "rapidsyringe" - req_tech = list("combat" = 3, "materials" = 3, "engineering" = 3, "biotech" = 2) + req_tech = list("combat" = 2, "biotech" = 3) build_type = PROTOLATHE materials = list(MAT_METAL = 5000, MAT_GLASS = 1000) build_path = /obj/item/weapon/gun/syringe/rapidsyringe @@ -172,7 +199,7 @@ name = "Tesla Revolver" desc = "A high-tech revolver that fires internal, reusable shock cartridges in a revolving cylinder. The cartridges can be recharged using conventional rechargers." id = "stunrevolver" - req_tech = list("combat" = 3, "materials" = 3, "powerstorage" = 5) + req_tech = list("combat" = 4, "materials" = 4, "powerstorage" = 5) build_type = PROTOLATHE materials = list(MAT_METAL = 10000, MAT_GLASS = 10000, MAT_SILVER = 10000) build_path = /obj/item/weapon/gun/energy/shock_revolver @@ -183,7 +210,7 @@ name = "Temperature Gun" desc = "A gun that changes the body temperature of its targets." id = "temp_gun" - req_tech = list("combat" = 3, "materials" = 4, "powerstorage" = 3, "magnets" = 2) + req_tech = list("combat" = 4, "materials" = 4, "powerstorage" = 3, "magnets" = 2) build_type = PROTOLATHE materials = list(MAT_METAL = 5000, MAT_GLASS = 500, MAT_SILVER = 3000) build_path = /obj/item/weapon/gun/energy/temperature @@ -213,9 +240,9 @@ name = "Xray Laser Gun" desc = "Not quite as menacing as it sounds" id = "xray" - req_tech = list("combat" = 6, "materials" = 5, "biotech" = 5, "powerstorage" = 4) + req_tech = list("combat" = 7, "magnets" = 5, "biotech" = 5, "powerstorage" = 4) build_type = PROTOLATHE - materials = list(MAT_GOLD = 5000,MAT_URANIUM = 10000, MAT_METAL = 4000) + materials = list(MAT_GOLD = 5000,MAT_URANIUM = 10000, MAT_METAL = 5000) build_path = /obj/item/weapon/gun/energy/xray locked = 1 category = list("Weapons") @@ -224,9 +251,9 @@ name = "Immolator Laser Gun" desc = "Has fewer shots than a regular laser gun, but ignites the target on hit" id = "immolator" - req_tech = list("combat" = 4, "materials" = 5, "powerstorage" = 5, "magnets" = 4) + req_tech = list("combat" = 5, "magnets" = 5, "powerstorage" = 5) build_type = PROTOLATHE materials = list(MAT_METAL = 4000, MAT_GLASS = 1000, MAT_SILVER = 3000, MAT_PLASMA = 2000) build_path = /obj/item/weapon/gun/energy/immolator locked = 1 - category = list("Weapons") \ No newline at end of file + category = list("Weapons") diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 421f0cf8e92..f0aed90bc91 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -149,9 +149,6 @@ if(temp_tech.len == 0) to_chat(user, "You cannot experiment on this item!") return - if(O.reliability < 90 && O.crit_fail == 0) - to_chat(usr, "Item is neither reliable enough or broken enough to learn from.") - return if(!user.drop_item()) return loaded_item = O @@ -494,16 +491,11 @@ //Global reactions if(prob(EFFECT_PROB_VERYLOW) && prob(13)) - visible_message("[src] improves [exp_on], drawing the life essence of those nearby!") + visible_message("Experimentor draws the life essence of those nearby!") for(var/mob/living/m in view(4,src)) to_chat(m, "You feel your flesh being torn from you, mists of blood drifting to [src]!") m.take_overall_damage(50) investigate_log("Experimentor has taken 50 brute a blood sacrifice from [m]", "experimentor") - var/list/reqs = ConvertReqString2List(exp_on.origin_tech) - for(var/T in reqs) - reqs[T] = reqs[T] + 1 - exp_on.origin_tech = list2params(reqs) - investigate_log("Experimentor has set the origin tech of [exp_on] to [exp_on.origin_tech]", "experimentor") if(prob(EFFECT_PROB_VERYLOW-badThingCoeff) && prob(87)) var/globalMalf = rand(1,87) @@ -585,7 +577,6 @@ var/list/temp_tech = ConvertReqString2List(process.origin_tech) for(var/T in temp_tech) linked_console.files.UpdateTech(T, temp_tech[T]) - linked_console.files.UpdateDesigns(process,temp_tech) src.updateUsrDialog() return @@ -639,6 +630,7 @@ name = realName cooldownMax = rand(60,300) realProc = pick("teleport","explode","rapidDupe","petSpray","flash","clean","floofcannon") + origin_tech = pick("engineering=[rand(2,5)]","magnets=[rand(2,5)]","plasmatech=[rand(2,5)]","programming=[rand(2,5)]","powerstorage=[rand(2,5)]") /obj/item/weapon/relic/attack_self(mob/user) if(revealed) diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index 20093e7771b..ad90dcce9f6 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -72,10 +72,10 @@ Note: Must be placed west/left of and R&D console to function. for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts) T += M.rating materials.max_amount = T * 75000 - T = 0 + T = 1.2 for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) - T += (M.rating/3) - efficiency_coeff = max(T, 1) + T -= M.rating/10 + efficiency_coeff = min(max(0, T), 1) /obj/machinery/r_n_d/protolathe/proc/check_mat(datum/design/being_built, var/M) // now returns how many times the item can be built with the material var/A = materials.amount(M) @@ -103,8 +103,6 @@ Note: Must be placed west/left of and R&D console to function. for(var/obj/I in component_parts) if(istype(I, /obj/item/weapon/reagent_containers/glass/beaker)) reagents.trans_to(I, reagents.total_volume) - if(I.reliability != 100 && crit_fail) - I.crit_fail = 1 I.loc = src.loc for(var/obj/item/weapon/reagent_containers/glass/G in component_parts) reagents.trans_to(G, G.reagents.maximum_volume) diff --git a/code/modules/research/rd-readme.dm b/code/modules/research/rd-readme.dm index 8680460c227..1ecc9dbb0da 100644 --- a/code/modules/research/rd-readme.dm +++ b/code/modules/research/rd-readme.dm @@ -22,7 +22,7 @@ materials. While researching you are dealing with two different types of information: Technology Paths and Device Designs. Technology Paths are the "Tech Trees" of the game. You start out with a number of them at the game start and they are improved by using the Destructive Analyzer. By themselves, they don't do a whole lot. However, they unlock Device Designs. This is the information used -by the circuit imprinter and the protolathe to produce objects. It also tracks the current reliability of that particular design. +by the circuit imprinter and the protolathe to produce objects. //EXISTING TECH Each tech path should have at LEAST one item at every level (levels 1 - 20). This is to allow for a more fluid progression of the diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 1e7e9b1674a..fc57e16a6e9 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -319,58 +319,62 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(linked_destroy) if(linked_destroy.busy) to_chat(usr, "The destructive analyzer is busy at the moment.") - else - var/choice = input("Proceeding will destroy loaded item.") in list("Proceed", "Cancel") - if(choice == "Cancel" || !linked_destroy) return - linked_destroy.busy = 1 - add_wait_message("Processing and Updating Database...", DECONSTRUCT_DELAY) - nanomanager.update_uis(src) - flick("d_analyzer_process", linked_destroy) - spawn(DECONSTRUCT_DELAY) - clear_wait_message() - if(linked_destroy) - linked_destroy.busy = 0 - if(!linked_destroy.hacked) - if(!linked_destroy.loaded_item) - to_chat(usr, "The destructive analyzer appears to be empty.") - menu = 0 - submenu = 0 - return - if((linked_destroy.loaded_item.reliability >= 99 - (linked_destroy.decon_mod * 3)) || linked_destroy.loaded_item.crit_fail) - var/list/temp_tech = linked_destroy.ConvertReqString2List(linked_destroy.loaded_item.origin_tech) - for(var/T in temp_tech) - if(prob(linked_destroy.loaded_item.reliability)) //If deconstructed item is not reliable enough its just being wasted, else it is pocessed - files.UpdateTech(T, temp_tech[T]) //Check if deconstructed item has research levels higher/same/one less than current ones - files.UpdateDesigns(linked_destroy.loaded_item, temp_tech, src) //If if such reseach type found all the known designs are checked for having this research type in them - menu = 0 //If design have it it gains some reliability - submenu = 0 - else //Same design always gain quality - menu = 2 //Crit fail gives the same design a lot of reliability, like really a lot - submenu = 0 - if(linked_lathe) //Also sends salvaged materials to a linked protolathe, if any. - for(var/material in linked_destroy.loaded_item.materials) - linked_lathe.materials.insert_amount(min((linked_lathe.materials.max_amount - linked_lathe.materials.total_amount), (linked_destroy.loaded_item.materials[material]*(linked_destroy.decon_mod/10))), material) - linked_destroy.loaded_item = null - else + return + var/list/temp_tech = linked_destroy.ConvertReqString2List(linked_destroy.loaded_item.origin_tech) + var/cancontinue = FALSE + for(var/T in temp_tech) + if(files.IsTechHigher(T, temp_tech[T])) + cancontinue = TRUE + break + if(!cancontinue) + var/choice = input("This item does not raise tech levels. Proceed destroying loaded item anyway?") in list("Proceed", "Cancel") + if(choice == "Cancel" || !linked_destroy) + return + linked_destroy.busy = 1 + add_wait_message("Processing and Updating Database...", DECONSTRUCT_DELAY) + nanomanager.update_uis(src) + flick("d_analyzer_process", linked_destroy) + spawn(DECONSTRUCT_DELAY) + clear_wait_message() + if(linked_destroy) + linked_destroy.busy = 0 + if(!linked_destroy.hacked) + if(!linked_destroy.loaded_item) + to_chat(usr, "The destructive analyzer appears to be empty.") menu = 0 submenu = 0 - for(var/obj/I in linked_destroy.contents) - for(var/mob/M in I.contents) - M.death() - if(istype(I,/obj/item/stack/sheet))//Only deconsturcts one sheet at a time instead of the entire stack - var/obj/item/stack/sheet/S = I - if(S.amount > 1) - S.amount-- - linked_destroy.loaded_item = S - else - qdel(S) - linked_destroy.icon_state = "d_analyzer" + return + for(var/T in temp_tech) + var/datum/tech/KT = files.known_tech[T] //For stat logging of high levels + if(files.IsTechHigher(T, temp_tech[T]) && KT.level >= 5) //For stat logging of high levels + feedback_add_details("high_research_level","[KT][KT.level + 1]") //+1 to show the level which we're about to get + files.UpdateTech(T, temp_tech[T]) + menu = 0 + submenu = 0 + if(linked_lathe) //Also sends salvaged materials to a linked protolathe, if any. + for(var/material in linked_destroy.loaded_item.materials) + linked_lathe.materials.insert_amount(min((linked_lathe.materials.max_amount - linked_lathe.materials.total_amount), (linked_destroy.loaded_item.materials[material]*(linked_destroy.decon_mod/10))), material) + linked_destroy.loaded_item = null + else + menu = 0 + submenu = 0 + for(var/obj/I in linked_destroy.contents) + for(var/mob/M in I.contents) + M.death() + if(istype(I,/obj/item/stack/sheet))//Only deconsturcts one sheet at a time instead of the entire stack + var/obj/item/stack/sheet/S = I + if(S.amount > 1) + S.amount-- + linked_destroy.loaded_item = S else - if(!(I in linked_destroy.component_parts)) - qdel(I) - linked_destroy.icon_state = "d_analyzer" - use_power(250) - nanomanager.update_uis(src) + qdel(S) + linked_destroy.icon_state = "d_analyzer" + else + if(!(I in linked_destroy.component_parts)) + qdel(I) + linked_destroy.icon_state = "d_analyzer" + use_power(250) + nanomanager.update_uis(src) else if(href_list["sync"]) //Sync the research holder with all the R&D consoles in the game that aren't sync protected. if(!sync) @@ -399,13 +403,12 @@ won't update every console in existence) but it's more of a hassle to do. Also, sync = !sync else if(href_list["build"]) //Causes the Protolathe to build something. - var/coeff - if(linked_lathe) - coeff = linked_lathe.efficiency_coeff - else - coeff = 1 - var/g2g = 1 if(linked_lathe) + if(linked_lathe.busy) + to_chat(usr, "Protolathe is busy at the moment.") + return + var/coeff = linked_lathe.efficiency_coeff + var/g2g = 1 var/datum/design/being_built = files.known_designs[href_list["build"]] if(being_built) var/power = 2000 @@ -416,15 +419,11 @@ won't update every console in existence) but it's more of a hassle to do. Also, for(var/M in being_built.materials) power += round(being_built.materials[M] * amount / 5) power = max(2000, power) - if(linked_lathe.busy) - g2g = 0 var/key = usr.key //so we don't lose the info during the spawn delay if(!(being_built.build_type & PROTOLATHE)) g2g = 0 message_admins("Protolathe exploit attempted by [key_name(usr, usr.client)]!") - - if(g2g) //If input is incorrect, nothing happens var/time_to_construct = PROTOLATHE_CONSTRUCT_DELAY * amount / coeff var/enough_materials = 1 @@ -437,7 +436,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, var/list/efficient_mats = list() for(var/MAT in being_built.materials) - efficient_mats[MAT] = being_built.materials[MAT] + efficient_mats[MAT] = being_built.materials[MAT]*coeff if(!linked_lathe.materials.has_materials(efficient_mats, amount)) src.visible_message("The [src.name] beeps, \"Not enough materials to complete prototype.\"") @@ -445,7 +444,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, g2g = 0 else for(var/R in being_built.reagents) - if(!linked_lathe.reagents.has_reagent(R, being_built.reagents[R])) + if(!linked_lathe.reagents.has_reagent(R, being_built.reagents[R])*coeff) src.visible_message("The [src.name] beeps, \"Not enough reagents to complete prototype.\"") enough_materials = 0 g2g = 0 @@ -453,7 +452,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(enough_materials) linked_lathe.materials.use_amount(efficient_mats, amount) for(var/R in being_built.reagents) - linked_lathe.reagents.remove_reagent(R, being_built.reagents[R]) + linked_lathe.reagents.remove_reagent(R, being_built.reagents[R]*coeff) var/P = being_built.build_path //lets save these values before the spawn() just in case. Nobody likes runtimes. var/O = being_built.locked @@ -464,7 +463,6 @@ won't update every console in existence) but it's more of a hassle to do. Also, var/obj/item/new_item = new P(src) if( new_item.type == /obj/item/weapon/storage/backpack/holding ) new_item.investigate_log("built by [key]","singulo") - new_item.reliability = 100 if(!istype(new_item, /obj/item/stack/sheet)) // To avoid materials dupe glitches new_item.materials = efficient_mats.Copy() if(O) @@ -487,6 +485,9 @@ won't update every console in existence) but it's more of a hassle to do. Also, var/coeff = linked_imprinter.efficiency_coeff var/g2g = 1 if(linked_imprinter) + if(linked_imprinter.busy) + to_chat(usr, "Circuit Imprinter is busy at the moment.") + return var/datum/design/being_built = null being_built = files.known_designs[href_list["imprint"]] if(being_built) @@ -494,8 +495,6 @@ won't update every console in existence) but it's more of a hassle to do. Also, for(var/M in being_built.materials) power += round(being_built.materials[M] / 5) power = max(2000, power) - if(linked_imprinter.busy) - g2g = 0 if(!(being_built.build_type & IMPRINTER)) g2g = 0 message_admins("Circuit imprinter exploit attempted by [key_name(usr, usr.client)]!") @@ -525,7 +524,6 @@ won't update every console in existence) but it's more of a hassle to do. Also, spawn(IMPRINTER_DELAY) if(g2g) var/obj/item/new_item = new P(src) - new_item.reliability = 100 new_item.loc = linked_imprinter.loc linked_imprinter.busy = 0 clear_wait_message() @@ -710,7 +708,6 @@ won't update every console in existence) but it's more of a hassle to do. Also, var/list/disk_data = list() data["disk_data"] = disk_data disk_data["name"] = d_disk.blueprint.name - disk_data["reliability"] = d_disk.blueprint.reliability var/b_type = d_disk.blueprint.build_type var/list/lathe_types = list() disk_data["lathe_types"] = lathe_types @@ -743,7 +740,6 @@ won't update every console in existence) but it's more of a hassle to do. Also, var/list/loaded_item_list = list() data["loaded_item"] = loaded_item_list loaded_item_list["name"] = linked_destroy.loaded_item.name - loaded_item_list["reliability"] = linked_destroy.loaded_item.reliability var/list/temp_tech = linked_destroy.ConvertReqString2List(linked_destroy.loaded_item.origin_tech) var/list/tech_list = list() loaded_item_list["origin_tech"] = tech_list @@ -767,6 +763,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(submenu == 1) var/list/designs_list = list() data["matching_designs"] = designs_list + var/coeff = linked_lathe.efficiency_coeff for(var/datum/design/D in matching_designs) var/list/design_list = list() designs_list[++designs_list.len] = design_list @@ -779,7 +776,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, var/list/material_list = list() materials_list[++materials_list.len] = material_list material_list["name"] = CallMaterialName(M) - material_list["amount"] = D.materials[M] + material_list["amount"] = D.materials[M]*coeff var/t = linked_lathe.check_mat(D, M) if(t < 1) @@ -792,7 +789,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, var/list/material_list = list() materials_list[++materials_list.len] = material_list material_list["name"] = CallMaterialName(R) - material_list["amount"] = D.reagents[R] + material_list["amount"] = D.reagents[R]*coeff var/t = linked_lathe.check_mat(D, R) if(t < 1) diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index 8386c79377d..ac1ed47f7b3 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -51,8 +51,8 @@ research holder datum. // known is a list of id -> datum mappings var/list/possible_tech = list() //List of all tech in the game that players have access to (barring special events). var/list/known_tech = list() //List of locally known tech. - var/list/possible_designs = list() //List of all designs (at base reliability). - var/list/known_designs = list() //List of available designs (at base reliability). + var/list/possible_designs = list() //List of all designs + var/list/known_designs = list() //List of available designs /datum/research/New() //Insert techs into possible_tech here. Known_tech automatically updated. // MON DIEU!!! @@ -102,15 +102,11 @@ research holder datum. /datum/research/proc/AddDesign2Known(var/datum/design/D) if(D.id in known_designs) - // NOTE: This is for reliability only - This is on the chopping block - var/datum/design/known = known_designs[D.id] - if(D.reliability > known.reliability) - known.reliability = D.reliability return // Global datums make me nervous known_designs[D.id] = D -//Refreshes known_tech and known_designs list. Then updates the reliability vars of the designs in the known_designs list. +//Refreshes known_tech and known_designs list. //Input/Output: n/a /datum/research/proc/RefreshResearch() for(var/datum/tech/PT in possible_tech) @@ -122,10 +118,6 @@ research holder datum. for(var/v in known_tech) var/datum/tech/T = known_tech[v] T.level = Clamp(T.level, 0, 20) - for(var/v in known_designs) - var/datum/design/D = known_designs[v] - // NOTE: reliability stuff, axe this later - D.CalcReliability(known_tech) //Refreshes the levels of a given tech. //Input: Tech's ID and Level; Output: null @@ -133,22 +125,20 @@ research holder datum. var/datum/tech/KT = known_tech[ID] if(KT) if(KT.level <= level) - // Will bump the tech to (value_of_target - 1) automatically - - // after that it'll only bump it up by 1 until it's greater + // Will bump the tech to (value_of_target) automatically - + // after that it'll bump it up by 1 until it's greater // than the source tech - KT.level = max((KT.level + 1), (level - 1)) + KT.level = max((KT.level + 1), level) -/datum/research/proc/UpdateDesigns(var/obj/item/I, var/list/temp_tech) - for(var/T in temp_tech) - if(temp_tech[T] - 1 >= known_tech[T]) - for(var/datum/design/D in known_designs) - // NOTE: icky reliability stuff - if(D.req_tech[T]) - D.reliability = min(100, D.reliability + 1) - if(D.build_path == I.type) - D.reliability = min(100, D.reliability + rand(1,3)) - if(I.crit_fail) - D.reliability = min(100, D.reliability + rand(3, 5)) +//Checks if the origin level can raise current tech levels +//Input: Tech's ID and Level; Output: TRUE for yes, FALSE for no +/datum/research/proc/IsTechHigher(ID, level) + var/datum/tech/KT = known_tech[ID] + if(KT) + if(KT.level <= level) + return TRUE + else + return FALSE /datum/research/proc/FindDesignByID(var/id) return known_designs[id] @@ -210,63 +200,63 @@ research holder datum. //Trunk Technologies (don't require any other techs and you start knowning them). -datum/tech/materials +/datum/tech/materials name = "Materials Research" desc = "Development of new and improved materials." id = "materials" max_level = 7 -datum/tech/engineering +/datum/tech/engineering name = "Engineering Research" desc = "Development of new and improved engineering parts and methods." id = "engineering" - max_level = 6 + max_level = 7 -datum/tech/plasmatech +/datum/tech/plasmatech name = "Plasma Research" desc = "Research into the mysterious substance colloqually known as 'plasma'." id = "plasmatech" - max_level = 4 + max_level = 7 rare = 3 -datum/tech/powerstorage +/datum/tech/powerstorage name = "Power Manipulation Technology" desc = "The various technologies behind the storage and generation of electicity." id = "powerstorage" - max_level = 6 + max_level = 7 -datum/tech/bluespace +/datum/tech/bluespace name = "'Blue-space' Research" desc = "Research into the sub-reality known as 'blue-space'." id = "bluespace" - max_level = 6 + max_level = 7 rare = 2 -datum/tech/biotech +/datum/tech/biotech name = "Biological Technology" desc = "Research into the deeper mysteries of life and organic substances." id = "biotech" - max_level = 5 + max_level = 7 -datum/tech/combat +/datum/tech/combat name = "Combat Systems Research" desc = "The development of offensive and defensive systems." id = "combat" - max_level=6 + max_level = 7 -datum/tech/magnets +/datum/tech/magnets name = "Electromagnetic Spectrum Research" desc = "Research into the electromagnetic spectrum. No clue how they actually work, though." id = "magnets" - max_level = 6 + max_level = 7 -datum/tech/programming +/datum/tech/programming name = "Data Theory Research" desc = "The development of new computer and artificial intelligence and data storage systems." id = "programming" - max_level = 5 + max_level = 7 -datum/tech/syndicate +/datum/tech/syndicate name = "Illegal Technologies Research" desc = "The study of technologies that violate standard Nanotrasen regulations." id = "syndicate" @@ -352,7 +342,7 @@ datum/tech/robotics name = "\improper Component Design Disk" desc = "A disk for storing device design data for construction in lathes." icon_state = "datadisk2" - materials = list(MAT_METAL=30, MAT_GLASS=10) + materials = list(MAT_METAL=100, MAT_GLASS=100) var/datum/design/blueprint // I'm doing this so that disk paths with pre-loaded designs don't get weird names // Otherwise, I'd use "initial()" diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 0fa680faf6a..787fdf67350 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -260,7 +260,7 @@ temp_server.files.RefreshResearch() else if(href_list["reset_design"]) - var/choice = alert("Design Data Deletion", "Are you sure you want to delete this design? If you still have the prerequisites for the design, it'll reset to its base reliability. Data lost cannot be recovered.", "Continue", "Cancel") + var/choice = alert("Design Data Deletion", "Are you sure you want to delete this design? Data lost cannot be recovered.", "Continue", "Cancel") if(choice == "Continue") for(var/datum/design/D in temp_server.files.known_designs) if(D.id == href_list["reset_design"]) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm index b1071222b17..f3b82e18ecd 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm @@ -17,14 +17,12 @@ if(affecting && istype(affecting)) affecting.heal_damage(25 * weakness, 25 * weakness) //H:heal_organ_damage(25, 25) - H.vessel.add_reagent("blood",5) + H.blood_volume += 5 H.nutrition += 50 * weakness H.adjustBrainLoss(-25 * weakness) var/radiation = min(H.radiation, 25 * weakness) H.apply_effect(-radiation,IRRADIATE,0) H.bodytemperature = initial(H.bodytemperature) - spawn(1) - H.fixblood() // C.adjustOxyLoss(-25 * weakness) C.adjustToxLoss(-25 * weakness) diff --git a/code/modules/research/xenoarchaeology/chemistry.dm b/code/modules/research/xenoarchaeology/chemistry.dm index b198bd02459..7094f2d00f4 100644 --- a/code/modules/research/xenoarchaeology/chemistry.dm +++ b/code/modules/research/xenoarchaeology/chemistry.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/device.dmi' icon_state = "solution_tray" materials = list(MAT_GLASS=5) - w_class = 1 + w_class = WEIGHT_CLASS_TINY amount_per_transfer_from_this = 1 possible_transfer_amounts = list(1, 2) volume = 2 @@ -51,4 +51,4 @@ obj/item/weapon/reagent_containers/glass/solution_tray/attackby(obj/item/weapon/ /obj/item/weapon/reagent_containers/glass/beaker/fuel name = "beaker 'fuel'" - list_reagents = list("fuel" = 50) \ No newline at end of file + list_reagents = list("fuel" = 50) diff --git a/code/modules/research/xenoarchaeology/finds/finds_misc.dm b/code/modules/research/xenoarchaeology/finds/finds_misc.dm index 0c4f8e8369d..8582575867f 100644 --- a/code/modules/research/xenoarchaeology/finds/finds_misc.dm +++ b/code/modules/research/xenoarchaeology/finds/finds_misc.dm @@ -6,7 +6,6 @@ throwforce = 15.0 icon_state = "plasmalarge" sharp = 1 - edge = 1 /obj/item/weapon/shard/plasma/New() diff --git a/code/modules/research/xenoarchaeology/finds/finds_special.dm b/code/modules/research/xenoarchaeology/finds/finds_special.dm index 5fd432a7a6f..cf0c1cfa273 100644 --- a/code/modules/research/xenoarchaeology/finds/finds_special.dm +++ b/code/modules/research/xenoarchaeology/finds/finds_special.dm @@ -134,7 +134,7 @@ B.target_turf = pick(range(1, src)) B.blood_DNA = list() B.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type - M.vessel.remove_reagent("blood",rand(25,50)) + M.blood_volume -= rand(25,50) //animated blood 2 SPOOKY /obj/effect/decal/cleanable/blood/splatter/animated diff --git a/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm b/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm index 2cacdc4801e..a4a52b3ea5f 100644 --- a/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm +++ b/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm @@ -191,7 +191,6 @@ datum/genesequence visible_message("[bicon(src)] [src] clones something from a reconstituted gene sequence!") playsound(src.loc, 'sound/effects/screech.ogg', 50, 1, -3) pod1.occupant = new cloned_genesequence.spawned_type(pod1) - pod1.locked = 1 pod1.icon_state = "pod_1" //pod1.occupant.name = "[pod1.occupant.name] ([rand(0,999)])" pod1.biomass -= CLONE_BIOMASS diff --git a/code/modules/research/xenoarchaeology/geosample.dm b/code/modules/research/xenoarchaeology/geosample.dm index e4aaa4a554b..6d32b4e0ca9 100644 --- a/code/modules/research/xenoarchaeology/geosample.dm +++ b/code/modules/research/xenoarchaeology/geosample.dm @@ -19,7 +19,7 @@ desc = "It looks extremely delicate." icon = 'icons/obj/xenoarchaeology.dmi' icon_state = "sliver1" //0-4 - w_class = 1 + w_class = WEIGHT_CLASS_TINY sharp = 1 //item_state = "electronic" var/source_rock = "/turf/simulated/mineral/" diff --git a/code/modules/research/xenoarchaeology/tools/tools.dm b/code/modules/research/xenoarchaeology/tools/tools.dm index 6ac7aee6a2b..b17569da383 100644 --- a/code/modules/research/xenoarchaeology/tools/tools.dm +++ b/code/modules/research/xenoarchaeology/tools/tools.dm @@ -7,7 +7,7 @@ desc = "A coiled metallic tape used to check dimensions and lengths." icon = 'icons/obj/xenoarchaeology.dmi' icon_state = "measuring" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL //todo: dig site tape @@ -17,8 +17,8 @@ icon = 'icons/obj/mining.dmi' icon_state = "satchel" slot_flags = SLOT_BELT | SLOT_POCKET - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL storage_slots = 50 max_combined_w_class = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * ore.w_class - max_w_class = 3 + max_w_class = WEIGHT_CLASS_NORMAL can_hold = list(/obj/item/weapon/fossil) diff --git a/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm b/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm index d020845784c..4edf8f69d9a 100644 --- a/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm +++ b/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/xenoarchaeology.dmi' icon_state = "flashgun" item_state = "lampgreen" - w_class = 1 + w_class = WEIGHT_CLASS_TINY slot_flags = SLOT_BELT var/nearest_artifact_id = "unknown" var/nearest_artifact_distance = -1 diff --git a/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm b/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm index 72f85146df1..8c4ec23004c 100644 --- a/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm +++ b/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm @@ -19,7 +19,7 @@ icon = 'icons/obj/device.dmi' icon_state = "sampler0" item_state = "screwdriver_brown" - w_class = 1 + w_class = WEIGHT_CLASS_TINY //slot_flags = SLOT_BELT var/sampled_turf = "" var/num_stored_bags = 10 @@ -73,7 +73,7 @@ filled_bag.icon_state = "evidence" var/image/I = image("icon"=R, "layer"=FLOAT_LAYER) filled_bag.underlays += I - filled_bag.w_class = 1 + filled_bag.w_class = WEIGHT_CLASS_TINY to_chat(user, "You take a core sample of the [item_to_sample].") else diff --git a/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm b/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm index 83429d509bc..ad195a0a141 100644 --- a/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm +++ b/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm @@ -9,7 +9,7 @@ icon = 'icons/obj/pda.dmi' icon_state = "crap" item_state = "analyzer" - w_class = 1 + w_class = WEIGHT_CLASS_TINY slot_flags = SLOT_BELT var/list/positive_locations = list() var/datum/depth_scan/current diff --git a/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm b/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm index 4e6e48b49b5..ec00023ab29 100644 --- a/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm +++ b/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm @@ -12,7 +12,7 @@ excavation_amount = 0.5 digsound = list('sound/weapons/thudswoosh.ogg') drill_verb = "brushing" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL /obj/item/weapon/pickaxe/one_pick name = "1/6 pick" @@ -24,7 +24,7 @@ excavation_amount = 1 digsound = list('sound/items/Screwdriver.ogg') drill_verb = "delicately picking" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL /obj/item/weapon/pickaxe/two_pick name = "1/3 pick" @@ -36,7 +36,7 @@ excavation_amount = 2 digsound = list('sound/items/Screwdriver.ogg') drill_verb = "delicately picking" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL /obj/item/weapon/pickaxe/three_pick name = "1/2 pick" @@ -48,7 +48,7 @@ excavation_amount = 3 digsound = list('sound/items/Screwdriver.ogg') drill_verb = "delicately picking" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL /obj/item/weapon/pickaxe/four_pick name = "2/3 pick" @@ -60,7 +60,7 @@ excavation_amount = 4 digsound = list('sound/items/Screwdriver.ogg') drill_verb = "delicately picking" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL /obj/item/weapon/pickaxe/five_pick name = "5/6 pick" @@ -72,7 +72,7 @@ excavation_amount = 5 digsound = list('sound/items/Screwdriver.ogg') drill_verb = "delicately picking" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL /obj/item/weapon/pickaxe/six_pick name = "1/1 pick" @@ -84,7 +84,7 @@ excavation_amount = 6 digsound = list('sound/items/Screwdriver.ogg') drill_verb = "delicately picking" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL /obj/item/weapon/pickaxe/hand name = "hand pickaxe" @@ -96,7 +96,7 @@ excavation_amount = 15 digsound = list('sound/items/Crowbar.ogg') drill_verb = "clearing" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL /obj/item/weapon/pickaxe/robotic name = "robotic pickaxe" @@ -125,7 +125,7 @@ item_state = "syringe_kit" foldable = /obj/item/stack/sheet/cardboard //BubbleWrap storage_slots = 7 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL can_hold = list(/obj/item/weapon/pickaxe/brush,\ /obj/item/weapon/pickaxe/one_pick,\ /obj/item/weapon/pickaxe/two_pick,\ @@ -134,7 +134,7 @@ /obj/item/weapon/pickaxe/five_pick,\ /obj/item/weapon/pickaxe/six_pick) max_combined_w_class = 17 - max_w_class = 4 + max_w_class = WEIGHT_CLASS_BULKY use_to_pickup = 1 // for picking up broken bulbs, not that most people will try /obj/item/weapon/storage/box/excavation/New() diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index c42b6e8286c..c3a0c1a030a 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -7,7 +7,7 @@ icon = 'icons/mob/slimes.dmi' icon_state = "grey slime extract" force = 1 - w_class = 1 + w_class = WEIGHT_CLASS_TINY throwforce = 0 throw_speed = 3 throw_range = 6 @@ -121,7 +121,7 @@ /obj/item/slimepotion name = "slime potion" desc = "A hard yet gelatinous capsule excreted by a slime, containing mysterious substances." - w_class = 1 + w_class = WEIGHT_CLASS_TINY origin_tech = "biotech=4" /obj/item/slimepotion/afterattack(obj/item/weapon/reagent_containers/target, mob/user, proximity_flag) @@ -179,7 +179,7 @@ desc = "A miraculous chemical mix that can raise the intelligence of creatures to human levels." icon = 'icons/obj/chemical.dmi' icon_state = "bottle19" - origin_tech = "biotech=5" + origin_tech = "biotech=6" var/list/not_interested = list() var/being_used = 0 var/sentience_type = SENTIENCE_ORGANIC @@ -350,6 +350,7 @@ desc = "A potent chemical mix that will remove the slowdown from any item." icon = 'icons/obj/chemical.dmi' icon_state = "bottle3" + origin_tech = "biotech=5" /obj/item/slimepotion/speed/afterattack(obj/item/C, mob/user, proximity_flag) if(!proximity_flag) @@ -371,6 +372,7 @@ desc = "A potent chemical mix that will fireproof any article of clothing. Has three uses." icon = 'icons/obj/chemical.dmi' icon_state = "bottle17" + origin_tech = "biotech=5" var/uses = 3 /obj/item/slimepotion/fireproof/afterattack(obj/item/clothing/C, mob/user, proximity_flag) @@ -552,7 +554,7 @@ singular_name = "floor tile" desc = "Through a series of micro-teleports, these tiles let people move at incredible speeds." icon_state = "tile-bluespace" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL force = 6 materials = list(MAT_METAL=500) throwforce = 10 @@ -575,7 +577,7 @@ singular_name = "floor tile" desc = "Time seems to flow very slowly around these tiles." icon_state = "tile-sepia" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL force = 6 materials = list(MAT_METAL=500) throwforce = 10 diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 116ac637ac5..3d459dd08a4 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -262,6 +262,10 @@ mode = SHUTTLE_ESCAPE timer = world.time priority_announcement.Announce("The Emergency Shuttle has left the station. Estimate [timeLeft(600)] minutes until the shuttle docks at Central Command.") + for(var/mob/M in player_list) + if(!isnewplayer(M) && !M.client.karma_spent && !(M.client.ckey in karma_spenders) && !M.get_preference(DISABLE_KARMA_REMINDER)) + to_chat(M, "You have not yet spent your karma for the round; was there a player worthy of receiving your reward? Look under OOC tab, Award Karma.") + if(SHUTTLE_ESCAPE) if(time_left <= 0) //move each escape pod to its corresponding escape dock diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index 24d76267b13..d24853a7948 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -183,18 +183,17 @@ objective.unit_completed(cost) msg += "+[cost]: [tech.name] - new data.
    " - // Sell max reliablity designs + // Sell designs if(istype(thing, /obj/item/weapon/disk/design_disk)) var/obj/item/weapon/disk/design_disk/disk = thing - if(!disk.blueprint) continue + if(!disk.blueprint) + continue var/datum/design/design = disk.blueprint - if(design.id in shuttle_master.researchDesigns) continue - - if(initial(design.reliability) < 100 && design.reliability >= 100) - // Maxed out reliability designs only. - shuttle_master.points += shuttle_master.points_per_design - shuttle_master.researchDesigns += design.id - msg += "+[shuttle_master.points_per_design]: Reliable [design.name] design.
    " + if(design.id in shuttle_master.researchDesigns) + continue + shuttle_master.points += shuttle_master.points_per_design + shuttle_master.researchDesigns += design.id + msg += "+[shuttle_master.points_per_design]: [design.name] design.
    " // Sell exotic plants if(istype(thing, /obj/item/seeds)) @@ -246,6 +245,7 @@ /obj/machinery/teleport/station, /obj/machinery/teleport/hub, /obj/machinery/telepad, + /obj/machinery/telepad_cargo, /obj/machinery/clonepod, /obj/effect/hierophant, /obj/item/device/warp_cube, diff --git a/code/modules/spacepods/equipment.dm b/code/modules/spacepods/equipment.dm index 65b3b9232b8..dcdbe564657 100644 --- a/code/modules/spacepods/equipment.dm +++ b/code/modules/spacepods/equipment.dm @@ -104,7 +104,7 @@ /obj/item/device/spacepod_equipment/weaponry/laser name = "laser system" - desc = "A weak laser system for space pods, fires concentrated bursts of energy" + desc = "A weak laser system for space pods, fires concentrated bursts of energy." icon_state = "weapon_laser" projectile_type = /obj/item/projectile/beam shot_cost = 600 @@ -113,7 +113,7 @@ // MINING LASERS /obj/item/device/spacepod_equipment/weaponry/mining_laser_basic name = "weak mining laser system" - desc = "A weak mining laser system for space pods, fires bursts of energy that cut through rock" + desc = "A weak mining laser system for space pods, fires bursts of energy that cut through rock." icon = 'icons/goonstation/pods/ship.dmi' icon_state = "pod_taser" projectile_type = /obj/item/projectile/kinetic/pod @@ -123,7 +123,7 @@ /obj/item/device/spacepod_equipment/weaponry/mining_laser name = "mining laser system" - desc = "A mining laser system for space pods, fires bursts of energy that cut through rock" + desc = "A mining laser system for space pods, fires bursts of energy that cut through rock." icon = 'icons/goonstation/pods/ship.dmi' icon_state = "pod_m_laser" projectile_type = /obj/item/projectile/kinetic/pod/regular @@ -133,7 +133,7 @@ /obj/item/device/spacepod_equipment/weaponry/mining_laser_hyper name = "enhanced mining laser system" - desc = "An enhanced mining laser system for space pods, fires bursts of energy that cut through rock" + desc = "An enhanced mining laser system for space pods, fires bursts of energy that cut through rock." icon = 'icons/goonstation/pods/ship.dmi' icon_state = "pod_w_laser" projectile_type = /obj/item/projectile/kinetic/pod/enhanced @@ -226,15 +226,15 @@ // Passenger Seat /obj/item/device/spacepod_equipment/sec_cargo/chair - name = "passanger seat" - desc = "A passenger seat for a spacepod" + name = "passenger seat" + desc = "A passenger seat for a spacepod." icon_state = "sec_cargo_chair" occupant_mod = 1 // Loot Box /obj/item/device/spacepod_equipment/sec_cargo/loot_box name = "loot box" - desc = "A small compartment to store valuables" + desc = "A small compartment to store valuables." icon_state = "sec_cargo_loot" storage_mod = list("slots" = 7, "w_class" = 14) @@ -269,7 +269,7 @@ desc = "A key for a spacepod lock." icon = 'icons/vehicles/spacepod.dmi' icon_state = "podkey" - w_class = 1 + w_class = WEIGHT_CLASS_TINY var/id = 0 // Key - Lock Interactions diff --git a/code/modules/spacepods/parts.dm b/code/modules/spacepods/parts.dm index 757d7a95dcc..4ae9f73025b 100644 --- a/code/modules/spacepods/parts.dm +++ b/code/modules/spacepods/parts.dm @@ -6,7 +6,7 @@ name="Space Pod Core" icon_state = "core" flags = CONDUCT - origin_tech = "programming=2;materials=3;bluespace=2;engineering=3" + origin_tech = "programming=2;materials=2;biotech=2;engineering=2" /obj/item/pod_parts/pod_frame name = "Space Pod Frame" diff --git a/code/modules/spacepods/spacepod.dm b/code/modules/spacepods/spacepod.dm index 2a111433948..a90bd9bb1d8 100644 --- a/code/modules/spacepods/spacepod.dm +++ b/code/modules/spacepods/spacepod.dm @@ -296,7 +296,7 @@ to_chat(M, mymessage) /obj/spacepod/attackby(obj/item/W as obj, mob/user as mob, params) - if(user.a_intent == I_HARM) + if(user.a_intent == INTENT_HARM) ..() deal_damage(W.force) else @@ -377,8 +377,7 @@ user.visible_message(user, "[user] is drilling through the [src]'s lock!", "You start drilling through the [src]'s lock!") if(do_after(user, 100 * W.toolspeed, target = src)) - qdel(equipment_system.lock_system) - equipment_system.lock_system = null + QDEL_NULL(equipment_system.lock_system) user.visible_message(user, "[user] has destroyed the [src]'s lock!", "You destroy the [src]'s lock!") else @@ -408,7 +407,7 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment cargo_hold.max_combined_w_class += SPE.storage_mod["w_class"] /obj/spacepod/attack_hand(mob/user as mob) - if(user.a_intent == I_GRAB && unlocked) + if(user.a_intent == INTENT_GRAB && unlocked) var/mob/target if(pilot) target = pilot diff --git a/code/modules/store/items.dm b/code/modules/store/items.dm index 4fc51d7fb8d..f660efc0d16 100644 --- a/code/modules/store/items.dm +++ b/code/modules/store/items.dm @@ -83,7 +83,7 @@ /datum/storeitem/minigibber name = "miniature gibber" - desc = "A miniature recreation of NanoTrasen's famous meat grinder." + desc = "A miniature recreation of Nanotrasen's famous meat grinder." typepath = /obj/item/toy/minigibber cost = 400 @@ -96,14 +96,20 @@ /datum/storeitem/violin name = "space violin" desc = "A wooden musical instrument with four strings and a bow. \"The devil went down to space, he was looking for an assistant to grief.\"" - typepath = /obj/item/device/violin + typepath = /obj/item/device/instrument/violin cost = 500 /datum/storeitem/guitar name = "guitar" desc = "It's made of wood and has bronze strings." - typepath = /obj/item/device/guitar - cost = 700 + typepath = /obj/item/device/instrument/guitar + cost = 500 + +/datum/storeitem/eguitar + name = "electric guitar" + desc = "Makes all your shredding needs possible." + typepath = /obj/item/device/instrument/eguitar + cost = 500 /datum/storeitem/baby name = "Toddler" diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/cavity_implant.dm similarity index 53% rename from code/modules/surgery/implant.dm rename to code/modules/surgery/cavity_implant.dm index 498976c4635..bd82e7192ae 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/cavity_implant.dm @@ -1,10 +1,3 @@ -//Procedures in this file: Putting items in body cavity. Implant removal. Items removal. - - -////////////////////////////////////////////////////////////////// -// ITEM PLACEMENT SURGERY // -////////////////////////////////////////////////////////////////// - /datum/surgery/cavity_implant name = "Cavity Implant/Removal" steps = list(/datum/surgery_step/generic/cut_open,/datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/open_encased/saw, @@ -199,198 +192,15 @@ affected.wounds += I affected.owner.custom_pain("You feel something rip in your [affected.name]!", 1) user.drop_item() - target.internal_organs += tool + affected.hidden = tool tool.forceMove(affected) return 1 else if(IC) user.visible_message("[user] pulls [IC] out of [target]'s [target_zone]!", "You pull [IC] out of [target]'s [target_zone].") user.put_in_hands(IC) - target.internal_organs -= IC + affected.hidden = null return 1 else to_chat(user, "You don't find anything in [target]'s [target_zone].") - return 0 - - -////////////////////////////////////////////////////////////////// -// IMPLANT/ITEM REMOVAL SURGERY // -////////////////////////////////////////////////////////////////// - -/datum/surgery/cavity_implant_rem - name = "Implant Removal" - steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin,/datum/surgery_step/cavity/implant_removal,/datum/surgery_step/cavity/close_space,/datum/surgery_step/generic/cauterize/) - possible_locs = list("chest")//head is for borers..i can put it elsewhere - -/datum/surgery/cavity_implant_rem/synth - name = "Implant Removal" - steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch,/datum/surgery_step/cavity/implant_removal,/datum/surgery_step/robotics/external/close_hatch) - possible_locs = list("chest")//head is for borers..i can put it elsewhere - -/datum/surgery/cavity_implant_rem/can_start(mob/user, mob/living/carbon/human/target) - if(!istype(target)) - return 0 - var/obj/item/organ/external/affected = target.get_organ(user.zone_sel.selecting) - if(!affected) - return 0 - if(affected.status & ORGAN_ROBOT) - return 0 - return 1 - -/datum/surgery/cavity_implant_rem/synth/can_start(mob/user, mob/living/carbon/human/target) - if(!istype(target)) - return 0 - var/obj/item/organ/external/affected = target.get_organ(user.zone_sel.selecting) - if(!affected) - return 0 - if(!(affected.status & ORGAN_ROBOT)) - return 0 - - return 1 - -/datum/surgery_step/cavity/implant_removal - name = "extract implant" - allowed_tools = list( - /obj/item/weapon/hemostat = 100, \ - /obj/item/weapon/wirecutters = 75, \ - /obj/item/weapon/kitchen/utensil/fork = 20 - ) - var/obj/item/weapon/implant/I = null - time = 64 - -/datum/surgery_step/cavity/implant_removal/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - var/obj/item/organ/external/affected = target.get_organ(target_zone) - I = locate(/obj/item/weapon/implant) in target - user.visible_message("[user] starts poking around inside [target]'s [affected.name] with \the [tool].", \ - "You start poking around inside [target]'s [affected.name] with \the [tool]." ) - target.custom_pain("The pain in your [affected.name] is living hell!",1) - ..() - -/datum/surgery_step/cavity/implant_removal/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - var/obj/item/organ/external/affected = target.get_organ(target_zone) - I = locate(/obj/item/weapon/implant) in target - if(I && (target_zone == "chest")) //implant removal only works on the chest. - user.visible_message("[user] takes something out of [target]'s [affected.name] with \the [tool].", \ - "You take [I] out of [target]'s [affected.name]s with \the [tool]." ) - - I.removed(target) - - var/obj/item/weapon/implantcase/case - - if(istype(user.get_item_by_slot(slot_l_hand), /obj/item/weapon/implantcase)) - case = user.get_item_by_slot(slot_l_hand) - else if(istype(user.get_item_by_slot(slot_r_hand), /obj/item/weapon/implantcase)) - case = user.get_item_by_slot(slot_r_hand) - else - case = locate(/obj/item/weapon/implantcase) in get_turf(target) - - if(case && !case.imp) - case.imp = I - I.loc = case - case.update_icon() - user.visible_message("[user] places [I] into [case]!", "You place [I] into [case].") - else - qdel(I) - return 1 - else - user.visible_message(" [user] could not find anything inside [target]'s [affected.name], and pulls \the [tool] out.", \ - "You could not find anything inside [target]'s [affected.name].") - return 1 - -/datum/surgery_step/cavity/implant_removal/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - ..() - var/obj/item/organ/external/chest/affected = target.get_organ(target_zone) - if(affected.implants.len) - var/fail_prob = 10 - fail_prob += 100 - tool_quality(tool) - if(prob(fail_prob)) - var/obj/item/weapon/implant/imp = affected.implants[1] - user.visible_message(" Something beeps inside [target]'s [affected.name]!") - playsound(imp.loc, 'sound/items/countdown.ogg', 75, 1, -3) - spawn(25) - imp.activate() - return 0 - - -////////////////////////////////////////////////////////////////// -// EMBEDDED ITEM REOMOVAL // -////////////////////////////////////////////////////////////////// - -/datum/surgery/embedded_removal - name = "Removal of Embedded Objects" - steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/remove_object, /datum/surgery_step/generic/cauterize) - possible_locs = list("r_arm","l_arm","r_leg","l_leg","r_hand","r_foot","l_hand","l_foot","groin","chest","head") - -/datum/surgery/embedded_removal/synth - steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch, /datum/surgery_step/remove_object, /datum/surgery_step/robotics/external/close_hatch) - possible_locs = list("r_arm","l_arm","r_leg","l_leg","r_hand","r_foot","l_hand","l_foot","groin","chest","head") - - -/datum/surgery/embedded_removal/can_start(mob/user, mob/living/carbon/human/target) - if(!istype(target)) - return 0 - var/obj/item/organ/external/affected = target.get_organ(user.zone_sel.selecting) - if(!affected) - return 0 - if(affected.status & ORGAN_ROBOT) - return 0 - return 1 - -/datum/surgery/embedded_removal/synth/can_start(mob/user, mob/living/carbon/human/target) - if(!istype(target)) - return 0 - var/obj/item/organ/external/affected = target.get_organ(user.zone_sel.selecting) - if(!affected) - return 0 - if(!(affected.status & ORGAN_ROBOT)) - return 0 - return 1 - -/datum/surgery_step/remove_object - name = "remove embedded objects" - time = 32 - allowed_tools = list( - /obj/item/weapon/scalpel/laser/manager = 100, \ - /obj/item/weapon/hemostat = 100, \ - /obj/item/stack/cable_coil = 75, \ - /obj/item/device/assembly/mousetrap = 20 - ) - var/obj/item/organ/external/L = null - - -/datum/surgery_step/remove_object/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery) - L = target.get_organ(target_zone) - if(L) - user.visible_message("[user] looks for objects embedded in [target]'s [target_zone].", "You look for objects embedded in [target]'s [target_zone]...") - else - user.visible_message("[user] looks for [target]'s [target_zone].", "You look for [target]'s [target_zone]...") - - -/datum/surgery_step/remove_object/end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(L) - if(ishuman(target)) - var/mob/living/carbon/human/H = target - var/objects = 0 - for(var/obj/item/I in L.implants) - if(!istype(I,/obj/item/weapon/implant)) - objects++ - I.forceMove(get_turf(H)) - L.implants -= I - - //Handle possessive brain borers. - if(H.has_brain_worms() && target_zone == "head")//remove worms outside the loop - var/mob/living/simple_animal/borer/worm = H.has_brain_worms() - if(worm.controlling) - target.release_control() - worm.detach() - worm.leave_host() - user.visible_message("a slug like creature wiggles out of [H]'s [target_zone]!") - - if(objects > 0) - user.visible_message("[user] sucessfully removes [objects] objects from [H]'s [L.limb_name]!", "You sucessfully remove [objects] objects from [H]'s [L.limb_name].") - else - to_chat(user, "You find no objects embedded in [H]'s [L.limb_name]!") - else - to_chat(user, "You can't find [target]'s [target_zone], let alone any objects embedded in it!") - - return 1 + return 0 \ No newline at end of file diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm index c17f318e748..28e0be1b046 100644 --- a/code/modules/surgery/face.dm +++ b/code/modules/surgery/face.dm @@ -106,7 +106,7 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) user.visible_message(" [user]'s hand slips, tearing skin on [target]'s face with \the [tool]!", \ " Your hand slips, tearing skin on [target]'s face with \the [tool]!") - target.apply_damage(10, BRUTE, affected, sharp=1, edge=1) + target.apply_damage(10, BRUTE, affected, sharp = 1) return 0 /datum/surgery_step/face/cauterize diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index 300f6a88918..d87458e3ed9 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -143,7 +143,7 @@ msg = " [user]'s hand slips, damaging several organs [target]'s lower abdomen with \the [tool]" self_msg = " Your hand slips, damaging several organs [target]'s lower abdomen with \the [tool]!" user.visible_message(msg, self_msg) - target.apply_damage(12, BRUTE, affected, sharp=1) + target.apply_damage(12, BRUTE, affected, sharp = 1) return 0 /datum/surgery_step/generic/cauterize @@ -236,7 +236,7 @@ add_logs(user, target, "surgically removed [affected.name] from", addition="INTENT: [uppertext(user.a_intent)]")//log it - var/atom/movable/thing = affected.droplimb(1,DROPLIMB_EDGE) + var/atom/movable/thing = affected.droplimb(1,DROPLIMB_SHARP) if(istype(thing,/obj/item)) user.put_in_hands(thing) return 1 diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm new file mode 100644 index 00000000000..7b04be81e1d --- /dev/null +++ b/code/modules/surgery/implant_removal.dm @@ -0,0 +1,78 @@ +////////////////////////////////////////////////////////////////// +// IMPLANT REMOVAL SURGERY // +////////////////////////////////////////////////////////////////// + +/datum/surgery/implant_removal + name = "Implant Removal" + steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin,/datum/surgery_step/extract_implant,/datum/surgery_step/generic/cauterize) + possible_locs = list("chest") + +/datum/surgery/implant_removal/synth + name = "Implant Removal" + steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch,/datum/surgery_step/extract_implant,/datum/surgery_step/robotics/external/close_hatch) + possible_locs = list("chest") + +/datum/surgery/implant_removal/can_start(mob/user, mob/living/carbon/human/target) + if(!istype(target)) + return 0 + var/obj/item/organ/external/affected = target.get_organ(user.zone_sel.selecting) + if(!affected) + return 0 + if(affected.status & ORGAN_ROBOT) + return 0 + return 1 + +/datum/surgery/implant_removal/synth/can_start(mob/user, mob/living/carbon/human/target) + if(!istype(target)) + return 0 + var/obj/item/organ/external/affected = target.get_organ(user.zone_sel.selecting) + if(!affected) + return 0 + if(!(affected.status & ORGAN_ROBOT)) + return 0 + + return 1 + +/datum/surgery_step/extract_implant + name = "extract implant" + allowed_tools = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/crowbar = 65) + time = 64 + var/obj/item/weapon/implant/I = null + +/datum/surgery_step/extract_implant/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + I = locate(/obj/item/weapon/implant) in target + user.visible_message("[user] starts poking around inside [target]'s [affected.name] with \the [tool].", \ + "You start poking around inside [target]'s [affected.name] with \the [tool]." ) + target.custom_pain("The pain in your [affected.name] is living hell!",1) + ..() + +/datum/surgery_step/extract_implant/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + I = locate(/obj/item/weapon/implant) in target + if(I && (target_zone == "chest")) //implant removal only works on the chest. + user.visible_message("[user] takes something out of [target]'s [affected.name] with \the [tool].", \ + "You take [I] out of [target]'s [affected.name]s with \the [tool]." ) + + I.removed(target) + + var/obj/item/weapon/implantcase/case + + if(istype(user.get_item_by_slot(slot_l_hand), /obj/item/weapon/implantcase)) + case = user.get_item_by_slot(slot_l_hand) + else if(istype(user.get_item_by_slot(slot_r_hand), /obj/item/weapon/implantcase)) + case = user.get_item_by_slot(slot_r_hand) + else + case = locate(/obj/item/weapon/implantcase) in get_turf(target) + + if(case && !case.imp) + case.imp = I + I.forceMove(case) + case.update_icon() + user.visible_message("[user] places [I] into [case]!", "You place [I] into [case].") + else + qdel(I) + else + user.visible_message(" [user] could not find anything inside [target]'s [affected.name], and pulls \the [tool] out.", \ + "You could not find anything inside [target]'s [affected.name].") + return 1 \ No newline at end of file diff --git a/code/modules/surgery/limb_augmentation.dm b/code/modules/surgery/limb_augmentation.dm new file mode 100644 index 00000000000..773508c88ea --- /dev/null +++ b/code/modules/surgery/limb_augmentation.dm @@ -0,0 +1,58 @@ +/datum/surgery/limb_augmentation + name = "Augment Limb" + steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/augment) + possible_locs = list("chest","l_arm","r_arm","r_leg","l_leg") + +/datum/surgery/limb_augmentation/can_start(mob/user, mob/living/carbon/target) + if(ishuman(target)) + var/mob/living/carbon/human/H = target + var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting) + if(!affected) + return 0 + if(affected.status & ORGAN_BROKEN) //The arm has to be in prime condition to augment it. + return 0 + if(affected.status & ORGAN_ROBOT) + return 0 + return 1 + +/datum/surgery_step/augment + name = "augment limb with robotic part" + allowed_tools = list(/obj/item/robot_parts = 100) + time = 32 + +/datum/surgery_step/augment/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/robot_parts/p = tool + if(p.part) + if(!(target_zone in p.part)) + to_chat(user, "[tool] cannot be used to augment this limb!") + return 0 + return 1 + +/datum/surgery_step/augment/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] starts augmenting [affected] with [tool].", "You start augmenting [affected] with [tool].") + +/datum/surgery_step/augment/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/robot_parts/L = tool + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] has finished augmenting [affected] with [tool].", \ + "You augment [affected] with [tool].") + + if(L.part) + for(var/part_name in L.part) + if(!target.get_organ(part_name)) + continue + affected.robotize(L.model_info, make_tough = 1, convert_all = 0) + if(L.sabotaged) + affected.sabotaged = 1 + break + target.update_body() + target.updatehealth() + target.UpdateDamageIcon() + + qdel(tool) + + affected.open = 0 + affected.germ_level = 0 + affected.status &= ~ORGAN_BLEEDING + return 1 \ No newline at end of file diff --git a/code/modules/surgery/limb_reattach.dm b/code/modules/surgery/limb_reattach.dm index 667f5c02a96..8b2d2507041 100644 --- a/code/modules/surgery/limb_reattach.dm +++ b/code/modules/surgery/limb_reattach.dm @@ -126,7 +126,7 @@ var/obj/item/organ/external/E = tool user.visible_message("[user]'s hand slips, damaging [target]'s [E.amputation_point]!", \ "Your hand slips, damaging [target]'s [E.amputation_point]!") - target.apply_damage(10, BRUTE, null, sharp=1) + target.apply_damage(10, BRUTE, null, sharp = 1) return 0 @@ -213,7 +213,7 @@ var/obj/item/organ/external/E = target.get_organ(target_zone) user.visible_message("[user]'s hand slips, damaging [target]'s [E.amputation_point]!", \ "Your hand slips, damaging [target]'s [E.amputation_point]!") - target.apply_damage(10, BRUTE, null, sharp=1) + target.apply_damage(10, BRUTE, null, sharp = 1) return 0 /datum/surgery_step/limb/mechanize @@ -271,5 +271,5 @@ /datum/surgery_step/limb/mechanize/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("[user]'s hand slips, damaging [target]'s flesh!", \ "Your hand slips, damaging [target]'s flesh!") - target.apply_damage(10, BRUTE, null, sharp=1) + target.apply_damage(10, BRUTE, null, sharp = 1) return 0 diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm new file mode 100644 index 00000000000..4b62e42cb8a --- /dev/null +++ b/code/modules/surgery/organs/augments_arms.dm @@ -0,0 +1,315 @@ +/obj/item/organ/internal/cyberimp/arm + name = "arm-mounted implant" + desc = "You shouldn't see this! Adminhelp and report this as an issue on github!" + parent_organ = "r_arm" + slot = "r_arm_device" + icon_state = "implant-toolkit" + w_class = WEIGHT_CLASS_NORMAL + actions_types = list(/datum/action/item_action/organ_action/toggle) + + var/list/items_list = list() + // Used to store a list of all items inside, for multi-item implants. + // I would use contents, but they shuffle on every activation/deactivation leading to interface inconsistencies. + + var/obj/item/holder = null + // You can use this var for item path, it would be converted into an item on New() + +/obj/item/organ/internal/cyberimp/arm/New() + ..() + if(ispath(holder)) + holder = new holder(src) + + update_icon() + slot = parent_organ + "_device" + items_list = contents.Copy() + +/obj/item/organ/internal/cyberimp/arm/update_icon() + if(parent_organ == "r_arm") + transform = null + else // Mirroring the icon + transform = matrix(-1, 0, 0, 0, 1, 0) + +/obj/item/organ/internal/cyberimp/arm/examine(mob/user) + ..() + to_chat(user, "[src] is assembled in the [parent_organ == "r_arm" ? "right" : "left"] arm configuration. You can use a screwdriver to reassemble it.") + +/obj/item/organ/internal/cyberimp/arm/attackby(obj/item/weapon/W, mob/user, params) + ..() + if(isscrewdriver(W)) + if(parent_organ == "r_arm") + parent_organ = "l_arm" + else + parent_organ = "r_arm" + slot = parent_organ + "_device" + to_chat(user, "You modify [src] to be installed on the [parent_organ == "r_arm" ? "right" : "left"] arm.") + update_icon() + else if(istype(W, /obj/item/weapon/card/emag)) + emag_act() + +/obj/item/organ/internal/cyberimp/arm/remove(mob/living/carbon/M, special = 0) + Retract() + . = ..() + +/obj/item/organ/internal/cyberimp/arm/emag_act() + return 0 + +/obj/item/organ/internal/cyberimp/arm/gun/emp_act(severity) + if(prob(15/severity) && owner) + to_chat(owner, "[src] is hit by EMP!") + // give the owner an idea about why his implant is glitching + Retract() + ..() + +/obj/item/organ/internal/cyberimp/arm/proc/Retract() + if(!holder || (holder in src)) + return + + owner.visible_message("[owner] retracts [holder] back into \his [parent_organ == "r_arm" ? "right" : "left"] arm.", + "[holder] snaps back into your [parent_organ == "r_arm" ? "right" : "left"] arm.", + "You hear a short mechanical noise.") + + if(istype(holder, /obj/item/device/flash/armimplant)) + var/obj/item/device/flash/F = holder + F.set_light(0) + + owner.unEquip(holder, 1) + holder.forceMove(src) + holder = null + playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1) + +/obj/item/organ/internal/cyberimp/arm/proc/Extend(var/obj/item/item) + if(!(item in src)) + return + + + holder = item + + holder.flags |= NODROP + holder.unacidable = 1 + holder.slot_flags = null + holder.w_class = WEIGHT_CLASS_HUGE + holder.materials = null + + if(istype(holder, /obj/item/device/flash/armimplant)) + var/obj/item/device/flash/F = holder + F.set_light(7) + + var/arm_slot = (parent_organ == "r_arm" ? slot_r_hand : slot_l_hand) + var/obj/item/arm_item = owner.get_item_by_slot(arm_slot) + + if(arm_item) + if(!owner.unEquip(arm_item)) + to_chat(owner, "Your [arm_item] interferes with [src]!") + return + else + to_chat(owner, "You drop [arm_item] to activate [src]!") + + if(parent_organ == "r_arm" ? !owner.put_in_r_hand(holder) : !owner.put_in_l_hand(holder)) + to_chat(owner, "Your [src] fails to activate!") + return + + // Activate the hand that now holds our item. + if(parent_organ == "r_arm" ? owner.hand : !owner.hand) + owner.swap_hand() + + owner.visible_message("[owner] extends [holder] from \his [parent_organ == "r_arm" ? "right" : "left"] arm.", + "You extend [holder] from your [parent_organ == "r_arm" ? "right" : "left"] arm.", + "You hear a short mechanical noise.") + playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1) + +/obj/item/organ/internal/cyberimp/arm/ui_action_click() + if(crit_fail || (!holder && !contents.len)) + to_chat(owner, "The implant doesn't respond. It seems to be broken...") + return + + // You can emag the arm-mounted implant by activating it while holding emag in it's hand. + var/arm_slot = (parent_organ == "r_arm" ? slot_r_hand : slot_l_hand) + if(istype(owner.get_item_by_slot(arm_slot), /obj/item/weapon/card/emag) && emag_act()) + return + + if(!holder || (holder in src)) + holder = null + if(contents.len == 1) + Extend(contents[1]) + else // TODO: make it similar to borg's storage-like module selection + var/obj/item/choise = input("Activate which item?", "Arm Implant", null, null) as null|anything in items_list + if(owner && owner == usr && owner.stat != DEAD && (src in owner.internal_organs) && !holder && istype(choise) && (choise in contents)) + // This monster sanity check is a nice example of how bad input() is. + Extend(choise) + else + Retract() + + +/obj/item/organ/internal/cyberimp/arm/gun/emp_act(severity) + if(prob(30/severity) && owner && !crit_fail) + Retract() + owner.visible_message("A loud bang comes from [owner]\'s [parent_organ == "r_arm" ? "right" : "left"] arm!") + playsound(get_turf(owner), 'sound/weapons/flashbang.ogg', 100, 1) + to_chat(owner, "You feel an explosion erupt inside your [parent_organ == "r_arm" ? "right" : "left"] arm as your implant breaks!") + owner.adjust_fire_stacks(20) + owner.IgniteMob() + owner.adjustFireLoss(25) + crit_fail = 1 + else // The gun will still discharge anyway. + ..() + + +/obj/item/organ/internal/cyberimp/arm/gun/laser + name = "arm-mounted laser implant" + desc = "A variant of the arm cannon implant that fires lethal laser beams. The cannon emerges from the subject's arm and remains inside when not in use." + icon_state = "arm_laser" + origin_tech = "materials=4;combat=4;biotech=4;powerstorage=4;syndicate=3" + contents = newlist(/obj/item/weapon/gun/energy/laser/mounted) + +/obj/item/organ/internal/cyberimp/arm/gun/laser/l + parent_organ = "l_arm" + + +/obj/item/organ/internal/cyberimp/arm/gun/taser + name = "arm-mounted taser implant" + desc = "A variant of the arm cannon implant that fires electrodes and disabler shots. The cannon emerges from the subject's arm and remains inside when not in use." + icon_state = "arm_taser" + origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4" + contents = newlist(/obj/item/weapon/gun/energy/gun/advtaser/mounted) + +/obj/item/organ/internal/cyberimp/arm/gun/taser/l + parent_organ = "l_arm" + + +/obj/item/organ/internal/cyberimp/arm/toolset + name = "integrated toolset implant" + desc = "A stripped-down version of engineering cyborg toolset, designed to be installed on subject's arm. Contains all neccessary tools." + origin_tech = "materials=3;engineering=4;biotech=3;powerstorage=4" + contents = newlist(/obj/item/weapon/screwdriver/cyborg, /obj/item/weapon/wrench/cyborg, /obj/item/weapon/weldingtool/largetank/cyborg, + /obj/item/weapon/crowbar/cyborg, /obj/item/weapon/wirecutters/cyborg, /obj/item/device/multitool/cyborg) + +/obj/item/organ/internal/cyberimp/arm/toolset/l + parent_organ = "l_arm" + +/obj/item/organ/internal/cyberimp/arm/toolset/emag_act() + if(!(locate(/obj/item/weapon/kitchen/knife/combat/cyborg) in items_list)) + to_chat(usr, "You unlock [src]'s integrated knife!") + items_list += new /obj/item/weapon/kitchen/knife/combat/cyborg(src) + return 1 + return 0 + +/obj/item/organ/internal/cyberimp/arm/esword + name = "arm-mounted energy blade" + desc = "An illegal, and highly dangerous cybernetic implant that can project a deadly blade of concentrated enregy." + contents = newlist(/obj/item/weapon/melee/energy/blade/hardlight) + origin_tech = "materials=4;combat=5;biotech=3;powerstorage=2;syndicate=5" + +/obj/item/organ/internal/cyberimp/arm/medibeam + name = "integrated medical beamgun" + desc = "A cybernetic implant that allows the user to project a healing beam from their hand." + contents = newlist(/obj/item/weapon/gun/medbeam) + origin_tech = "materials=5;combat=2;biotech=5;powerstorage=4;syndicate=1" + +/obj/item/organ/internal/cyberimp/arm/flash + name = "integrated high-intensity photon projector" //Why not + desc = "An integrated projector mounted onto a user's arm, that is able to be used as a powerful flash." + contents = newlist(/obj/item/device/flash/armimplant) + origin_tech = "materials=4;combat=3;biotech=4;magnets=4;powerstorage=3" + +/obj/item/organ/internal/cyberimp/arm/flash/New() + ..() + if(locate(/obj/item/device/flash/armimplant) in items_list) + var/obj/item/device/flash/armimplant/F = locate(/obj/item/device/flash/armimplant) in items_list + F.I = src + +/obj/item/organ/internal/cyberimp/arm/baton + name = "arm electrification implant" + desc = "An illegal combat implant that allows the user to administer disabling shocks from their arm." + contents = newlist(/obj/item/borg/stun) + origin_tech = "materials=3;combat=5;biotech=4;powerstorage=4;syndicate=3" + +/obj/item/organ/internal/cyberimp/arm/combat + name = "combat cybernetics implant" + desc = "A powerful cybernetic implant that contains combat modules built into the user's arm" + contents = newlist(/obj/item/weapon/melee/energy/blade/hardlight, /obj/item/weapon/gun/medbeam, /obj/item/borg/stun, /obj/item/device/flash/armimplant) + origin_tech = "materials=5;combat=7;biotech=5;powerstorage=5;syndicate=6;programming=5" + +/obj/item/organ/internal/cyberimp/arm/combat/New() + ..() + if(locate(/obj/item/device/flash/armimplant) in items_list) + var/obj/item/device/flash/armimplant/F = locate(/obj/item/device/flash/armimplant) in items_list + F.I = src + +/obj/item/organ/internal/cyberimp/arm/surgery + name = "surgical toolset implant" + desc = "A set of surgical tools hidden behind a concealed panel on the user's arm" + contents = newlist(/obj/item/weapon/retractor, /obj/item/weapon/hemostat, /obj/item/weapon/cautery, /obj/item/weapon/surgicaldrill, /obj/item/weapon/scalpel, /obj/item/weapon/circular_saw, /obj/item/weapon/bonegel, /obj/item/weapon/FixOVein, /obj/item/weapon/bonesetter) + origin_tech = "materials=3;engineering=3;biotech=3;programming=2;magnets=3" + +// lets make IPCs even *more* vulnerable to EMPs! +/obj/item/organ/internal/cyberimp/arm/power_cord + name = "APC-compatible power adapter implant" + desc = "An implant commonly installed inside IPCs in order to allow them to easily collect energy from their environment" + origin_tech = "materials=3;biotech=2;powerstorage=3" + contents = newlist(/obj/item/apc_powercord) + +/obj/item/organ/internal/cyberimp/arm/power_cord/emp_act(severity) + // To allow repair via nanopaste/screwdriver + // also so IPCs don't also catch on fire and fall even more apart upon EMP + damage = 1 + crit_fail = TRUE + +/obj/item/organ/internal/cyberimp/arm/power_cord/surgeryize() + if(crit_fail && owner) + to_chat(owner, "Your [src] feels functional again.") + crit_fail = FALSE + + +/obj/item/apc_powercord + name = "power cable" + desc = "Insert into a nearby APC to draw power from it." + icon = 'icons/obj/power.dmi' + icon_state = "wire1" + flags = NOBLUDGEON + +/obj/item/apc_powercord/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + if(!istype(target, /obj/machinery/power/apc) || !ishuman(user) || !proximity_flag) + return ..() + user.changeNext_move(CLICK_CD_MELEE) + var/obj/machinery/power/apc/A = target + var/mob/living/carbon/human/H = user + if(H.get_int_organ(/obj/item/organ/internal/cell)) + if(A.emagged || A.stat & BROKEN) + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread + s.set_up(3, 1, A) + s.start() + to_chat(H, "The APC power currents surge erratically, damaging your chassis!") + H.adjustFireLoss(10,0) + else if(A.cell && A.cell.charge > 0) + if(H.nutrition >= NUTRITION_LEVEL_WELL_FED) + to_chat(user, "You are already fully charged!") + else + addtimer(src, "powerdraw_loop", 0, TRUE, A, H) + else + to_chat(user, "There is no charge to draw from that APC.") + else + to_chat(user, "You lack a cell in which to store charge!") + +/obj/item/apc_powercord/proc/powerdraw_loop(obj/machinery/power/apc/A, mob/living/carbon/human/H) + H.visible_message("[H] inserts a power connector into \the [A].", "You begin to draw power from \the [A].") + while(do_after(H, 10, target = A)) + if(loc != H) + to_chat(H, "You must keep your connector out while charging!") + break + if(A.cell.charge == 0) + to_chat(H, "\The [A] has no more charge.") + break + A.charging = 1 + if(A.cell.charge >= 500) + H.nutrition += 50 + A.cell.charge -= 500 + to_chat(H, "You siphon off some of the stored charge for your own use.") + else + H.nutrition += A.cell.charge/10 + A.cell.charge = 0 + to_chat(H, "You siphon off the last of \the [A]'s charge.") + break + if(H.nutrition > NUTRITION_LEVEL_WELL_FED) + to_chat(H, "You are now fully charged.") + break + H.visible_message("[H] unplugs from \the [A].", "You unplug from \the [A].") \ No newline at end of file diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm index 1c66bd2c31b..1e419fb1b2b 100644 --- a/code/modules/surgery/organs/augments_eyes.dm +++ b/code/modules/surgery/organs/augments_eyes.dm @@ -5,7 +5,7 @@ implant_overlay = "eye_implant_overlay" slot = "eye_sight" parent_organ = "eyes" - w_class = 1 + w_class = WEIGHT_CLASS_TINY var/vision_flags = 0 var/dark_view = 0 @@ -42,7 +42,7 @@ desc = "These cybernetic eye implants will give you X-ray vision. Blinking is futile." eye_colour = list(0, 0, 0) implant_color = "#000000" - origin_tech = "materials=6;programming=4;biotech=6;magnets=5" + origin_tech = "materials=4;programming=4;biotech=6;magnets=4" vision_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS dark_view = 8 see_invisible = SEE_INVISIBLE_MINIMUM @@ -54,7 +54,7 @@ implant_color = "#FFCC00" vision_flags = SEE_MOBS flash_protect = -1 - origin_tech = "materials=6;programming=4;biotech=5;magnets=5;syndicate=4" + origin_tech = "materials=5;programming=4;biotech=4;magnets=4;syndicate=1" aug_message = "You see prey everywhere you look..." // HUD implants @@ -83,7 +83,7 @@ desc = "These cybernetic eye implants will display a medical HUD over everything you see." eye_colour = list(0,0,208) implant_color = "#00FFFF" - origin_tech = "materials=4;programming=3;biotech=4" + origin_tech = "materials=4;programming=4;biotech=4" aug_message = "You suddenly see health bars floating above people's heads..." HUD_type = DATA_HUD_MEDICAL_ADVANCED @@ -92,7 +92,7 @@ desc = "These cybernetic eye implants will display a security HUD over everything you see." eye_colour = list(208,0,0) implant_color = "#CC0000" - origin_tech = "materials=4;programming=4;biotech=3;combat=1" + origin_tech = "materials=4;programming=4;biotech=3;combat=3" aug_message = "Job indicator icons pop up in your vision. That is not a certified surgeon..." HUD_type = DATA_HUD_SECURITY_ADVANCED @@ -101,7 +101,7 @@ name = "welding shield implant" desc = "These reactive micro-shields will protect you from welders and flashes without obscuring your vision." slot = "eye_shield" - origin_tech = "materials=4;biotech=3" + origin_tech = "materials=4;biotech=3;engineering=4;plasmatech=3" implant_color = "#101010" flash_protect = 2 // Welding with thermals will still hurt your eyes a bit. diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index ffd0b4f0b1e..0a99a9b9e5a 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -48,7 +48,7 @@ var/obj/item/r_hand_obj = null implant_color = "#DE7E00" slot = "brain_antidrop" - origin_tech = "materials=5;programming=4;biotech=4" + origin_tech = "materials=4;programming=5;biotech=4" actions_types = list(/datum/action/item_action/organ_action/toggle) /obj/item/organ/internal/cyberimp/brain/anti_drop/ui_action_click() @@ -126,7 +126,7 @@ desc = "This implant will automatically give you back control over your central nervous system, reducing downtime when stunned." implant_color = "#FFFF00" slot = "brain_antistun" - origin_tech = "materials=6;programming=4;biotech=5" + origin_tech = "materials=5;programming=4;biotech=5" /obj/item/organ/internal/cyberimp/brain/anti_stun/on_life() ..() @@ -144,6 +144,24 @@ spawn(90 / severity) crit_fail = 0 + +//[[[[MOUTH]]]] +/obj/item/organ/internal/cyberimp/mouth + parent_organ = "mouth" + +/obj/item/organ/internal/cyberimp/mouth/breathing_tube + name = "breathing tube implant" + desc = "This simple implant adds an internals connector to your back, allowing you to use internals without a mask and protecting you from being choked." + icon_state = "implant_mask" + slot = "breathing_tube" + w_class = WEIGHT_CLASS_TINY + origin_tech = "materials=2;biotech=3" + +/obj/item/organ/internal/cyberimp/mouth/breathing_tube/emp_act(severity) + if(prob(60/severity) && owner) + to_chat(owner, "Your breathing tube suddenly closes!") + owner.AdjustLoseBreath(2) + /obj/item/organ/internal/cyberimp/brain/clown_voice name = "Comical implant" desc = "Uh oh." @@ -168,7 +186,7 @@ var/synthesizing = 0 var/poison_amount = 5 slot = "stomach" - origin_tech = "materials=5;programming=3;biotech=4" + origin_tech = "materials=2;powerstorage=2;biotech=2" /obj/item/organ/internal/cyberimp/chest/nutriment/on_life() if(!owner) @@ -197,14 +215,14 @@ implant_color = "#006607" hunger_threshold = NUTRITION_LEVEL_HUNGRY poison_amount = 10 - origin_tech = "materials=5;programming=3;biotech=5" + origin_tech = "materials=4;powerstorage=3;biotech=3" /obj/item/organ/internal/cyberimp/chest/reviver name = "Reviver implant" desc = "This implant will attempt to revive you if you lose consciousness. For the faint of heart!" icon_state = "chest_implant" implant_color = "#AD0000" - origin_tech = "materials=6;programming=3;biotech=6;syndicate=4" + origin_tech = "materials=5;programming=4;biotech=4" slot = "heartdrive" var/revive_cost = 0 var/reviving = 0 @@ -249,181 +267,12 @@ if(istype(owner, /mob/living/carbon/human)) var/mob/living/carbon/human/H = owner if(H.stat != DEAD && prob(50 / severity)) - H.heart_attack = 1 + H.set_heartattack(TRUE) spawn(600 / severity) - H.heart_attack = 0 + H.set_heartattack(FALSE) if(H.stat == CONSCIOUS) to_chat(H, "You feel your heart beating again!") -//ARM...THAT GO IN THE CHEST -/obj/item/organ/internal/cyberimp/chest/arm_mod//dummy parent item for making arm-mod implants. works best with nodrop items that are sent to nullspace upon being dropped. - name = "Arm-mounted item implant" - desc = "You shouldn't see this! Adminhelp and report this as an issue on github!" - icon_state = "chest_implant" - implant_color = "#007ACC" - slot = "shoulders" - origin_tech = "materials=5;biotech=4;powerstorage=4" - actions_types = list(/datum/action/item_action/organ_action/toggle) - var/obj/holder//is defined as the retractable item itself. ensure this is defined somewhere! - var/out = 0//determines if the item is in the owner's hand or not - var/overloaded = 0//is set to 1 when owner gets EMPed. if set to 1, implant doesn't work. - var/lasthand = null - -/obj/item/organ/internal/cyberimp/chest/arm_mod/ui_action_click() - toggle_item() - -/obj/item/organ/internal/cyberimp/chest/arm_mod/proc/toggle_item() - if(overloaded)//ensure the implant isn't broken - to_chat(owner, "The implant doesn't respond. It seems to be broken...") - return - owner.changeNext_move(CLICK_CD_MELEE) - if(owner.next_move < world.time) - return // No spam - if(out)//check if the owner has the item out already - owner.unEquip(holder, 1)//if he does, take it away. then, - holder.loc = null//stash it in nullspace - out = 0//and set this to clarify the item isn't out. - owner.visible_message("[owner] retracts [holder].","You retract [holder].") - playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1) - else//if he doesn't have the item out - if(owner.put_in_hands(holder))//put it in his hands. - lasthand = owner.get_active_hand() - out = 1 - owner.visible_message("[owner] extends [holder]!","You extend [holder]!") - playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1) - else//if this fails to put the item in his hands, - holder.loc = null//keep it in nullspace - to_chat(owner, "You can't extend [holder] if you can't use your hands!") - -/obj/item/organ/internal/cyberimp/chest/arm_mod/emp_act(severity)//if the implant gets EMPed... - if(!owner || overloaded)//ensure that it's in an owner and that it's not already EMPed, then... - return - if(out)//check if he has the item out... - owner.unEquip(holder, 1)//if he does, take it away. - holder.loc = null - out = 0 - owner.visible_message("[holder] forcibly retracts into [owner]'s arm.") - overload() // Make sure this doesn't happen again - -/obj/item/organ/internal/cyberimp/chest/arm_mod/proc/overload() - owner.visible_message("A loud bang comes from [owner]...") - playsound(get_turf(owner), 'sound/effects/bang.ogg', 100, 1) - to_chat(owner, "You feel an explosion erupt inside you as your chest implant breaks. Is it hot in here?") - owner.adjust_fire_stacks(20) - owner.IgniteMob()//ignite the owner, as well as - owner.say("AUUUUUUUUUUUUUUUUUUGH!!") - if(prob(50)) - if(lasthand == "r_hand") - var/obj/item/organ/external/limb = owner.get_organ("r_arm") - limb.droplimb(0, DROPLIMB_EDGE) - else if(lasthand == "l_hand") - var/obj/item/organ/external/limb = owner.get_organ("l_arm") - limb.droplimb(0, DROPLIMB_EDGE) - owner.say("I HAVE BEEN DISARMED!!!") - owner.adjustFireLoss(25)//severely injure him! - overloaded = TRUE - -/obj/item/organ/internal/cyberimp/chest/arm_mod/tase//mounted, self-charging taser! - name = "Arm-cannon taser implant" - desc = "A variant of the arm cannon implant that fires electrodes and disabler shots. The cannon emerges from the subject's arms and remains in the shoulders when not in use." - icon_state = "armcannon_tase_implant" - origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4" - actions_types = list(/datum/action/item_action/organ_action/toggle) - -/obj/item/organ/internal/cyberimp/chest/arm_mod/tase/New()//when the implant is created... - ..() - holder = new /obj/item/weapon/gun/energy/gun/advtaser/mounted(src)//assign a brand new item to it. (in this case, a gun) - -/obj/item/organ/internal/cyberimp/chest/arm_mod/lase//mounted, self-charging laser! - name = "Arm-cannon laser implant" - desc = "A variant of the arm cannon implant that fires lethal laser beams. The cannon emerges from the subject's arms and remains in the shoulders when not in use." - icon_state = "armcannon_lase_implant" - origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4;syndicate=5"//this is kinda nutty and i might lower it - actions_types = list(/datum/action/item_action/organ_action/toggle) - -/obj/item/organ/internal/cyberimp/chest/arm_mod/lase/New() - ..() - holder = new /obj/item/weapon/gun/energy/laser/mounted(src) - -// lets make IPCs even *more* vulnerable to EMPs! -/obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord - name = "APC-compatible power adapter implant" - desc = "An implant commonly installed inside IPCs in order to allow them to easily collect energy from their environment" - origin_tech = "materials=3;biotech=2;powerstorage=3" - slot = "shoulders2" - actions_types = list(/datum/action/item_action/organ_action/toggle) - - -/obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord/New() - ..() - holder = new /obj/item/apc_powercord(src) - -/obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord/overload() - // To allow repair via nanopaste/screwdriver - // also so IPCs don't also catch on fire and fall even more apart upon EMP - damage = 1 - overloaded = TRUE - -/obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord/surgeryize() - if(overloaded && owner) - to_chat(owner, "Your [src] feels functional again.") - overloaded = FALSE - - -/obj/item/apc_powercord - name = "power cable" - desc = "Insert into a nearby APC to draw power from it." - icon = 'icons/obj/power.dmi' - icon_state = "wire1" - flags = NODROP | NOBLUDGEON - -/obj/item/apc_powercord/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - if(!istype(target, /obj/machinery/power/apc) || !ishuman(user) || !proximity_flag) - return ..() - user.changeNext_move(CLICK_CD_MELEE) - var/obj/machinery/power/apc/A = target - var/mob/living/carbon/human/H = user - if(H.get_int_organ(/obj/item/organ/internal/cell)) - if(A.emagged || A.stat & BROKEN) - var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread - s.set_up(3, 1, A) - s.start() - to_chat(H, "The APC power currents surge erratically, damaging your chassis!") - H.adjustFireLoss(10,0) - else if(A.cell && A.cell.charge > 0) - if(H.nutrition >= NUTRITION_LEVEL_WELL_FED) - to_chat(user, "You are already fully charged!") - else - addtimer(src, "powerdraw_loop", 0, TRUE, A, H) - else - to_chat(user, "There is no charge to draw from that APC.") - else - to_chat(user, "You lack a cell in which to store charge!") - -/obj/item/apc_powercord/proc/powerdraw_loop(obj/machinery/power/apc/A, mob/living/carbon/human/H) - H.visible_message("[H] inserts a power connector into \the [A].", "You begin to draw power from \the [A].") - while(do_after(H, 10, target = A)) - if(loc != H) - to_chat(H, "You must keep your connector out while charging!") - break - if(A.cell.charge == 0) - to_chat(H, "\The [A] has no more charge.") - break - A.charging = 1 - if(A.cell.charge >= 500) - H.nutrition += 50 - A.cell.charge -= 500 - to_chat(H, "You siphon off some of the stored charge for your own use.") - else - H.nutrition += A.cell.charge/10 - A.cell.charge = 0 - to_chat(H, "You siphon off the last of \the [A]'s charge.") - break - if(H.nutrition > NUTRITION_LEVEL_WELL_FED) - to_chat(H, "You are now fully charged.") - break - H.visible_message("[H] unplugs from \the [A].", "You unplug from \the [A].") - //BOX O' IMPLANTS /obj/item/weapon/storage/box/cyber_implants diff --git a/code/modules/surgery/organs/autoimplanter.dm b/code/modules/surgery/organs/autoimplanter.dm index 4af88abc52f..6f72deca2e1 100644 --- a/code/modules/surgery/organs/autoimplanter.dm +++ b/code/modules/surgery/organs/autoimplanter.dm @@ -3,7 +3,7 @@ desc = "A device that automatically injects a cyber-implant into the user without the hassle of extensive surgery. It has a slot to insert implants and a screwdriver slot for removing accidentally added implants." icon_state = "autoimplanter" item_state = "walkietalkie"//left as this so as to intentionally not have inhands - w_class = 2 + w_class = WEIGHT_CLASS_SMALL usesound = 'sound/weapons/circsawhit.ogg' var/obj/item/organ/internal/cyberimp/storedorgan diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm index 9eefe264524..5416ab777c1 100644 --- a/code/modules/surgery/organs/blood.dm +++ b/code/modules/surgery/organs/blood.dm @@ -1,87 +1,42 @@ /**************************************************** BLOOD SYSTEM ****************************************************/ - -/mob/living/carbon/human/var/datum/reagents/vessel //Container for blood and BLOOD ONLY. Do not transfer other chems here. - -//Initializes blood vessels -/mob/living/carbon/human/proc/make_blood() - - if(vessel) +/mob/living/carbon/human/proc/suppress_bloodloss(amount) + if(bleedsuppress) return - - vessel = new/datum/reagents(max_blood) - vessel.my_atom = src - - if(species && species.exotic_blood) - vessel.add_reagent(species.exotic_blood, max_blood) else - vessel.add_reagent("blood", max_blood) - for(var/datum/reagent/blood/B in vessel.reagent_list) - if(B.id == "blood") - B.data = list( - "donor" = src, - "viruses" = null, - "blood_DNA" = dna.unique_enzymes, - "blood_colour" = species.blood_color, - "blood_type" = b_type, - "resistances" = null, - "trace_chem" = null) - spawn(1) - fixblood() + bleedsuppress = 1 + spawn(amount) + bleedsuppress = 0 + if(stat != DEAD && bleed_rate) + to_chat(src, "The blood soaks through your bandage.") + -//Resets blood data -/mob/living/carbon/human/proc/fixblood() - for(var/datum/reagent/blood/B in vessel.reagent_list) - if(B.id == "blood") - B.data = list( - "donor" = src, - "viruses" = null, - "blood_DNA" = dna.unique_enzymes, - "blood_colour" = species.blood_color, - "blood_type" = b_type, - "resistances" = null, - "trace_chem" = null) // Takes care blood loss and regeneration -/mob/living/carbon/human/proc/handle_blood() - var/blood_volume - if(species && species.flags & NO_BLOOD) +/mob/living/carbon/human/handle_blood() + var/list/blood_data = get_blood_data(get_blood_id())//PROCCEPTION + + if(in_stasis) return - if(stat != DEAD && bodytemperature >= 170) //Dead or cryosleep people do not pump the blood. - if(species.exotic_blood) - var/blood_reagent = species.exotic_blood // This is a string of the name of the species' blood reagent - blood_volume = round(vessel.get_reagent_amount(blood_reagent)) - if(blood_volume < max_blood && blood_volume) - vessel.add_reagent(blood_reagent, 0.1) // regenerate blood VERY slowly - if(reagents.has_reagent(blood_reagent)) - vessel.add_reagent(blood_reagent, 0.4) - else - blood_volume = round(vessel.get_reagent_amount("blood")) - //Blood regeneration if there is some space - if(blood_volume < max_blood && blood_volume) - var/datum/reagent/blood/B = locate() in vessel.reagent_list //Grab some blood - if(B) // Make sure there's some blood at all - if(mind) //Handles vampires "eating" blood that isn't their own. - if(mind in ticker.mode.vampires) - for(var/datum/reagent/blood/BL in vessel.reagent_list) - if(nutrition >= NUTRITION_LEVEL_WELL_FED) - break //We don't want blood tranfusions making vampires fat. - if(BL.data["donor"] != src) - nutrition += (15 * REAGENTS_METABOLISM) - BL.volume -= REAGENTS_METABOLISM - if(BL.volume <= 0) - qdel(BL) - break //Only process one blood per tick, to maintain the same metabolism as nutriment for non-vampires. + if(species && species.flags & NO_BLOOD) + bleed_rate = 0 + return - if(B.data["donor"] != src) //If it's not theirs, then we look for theirs - for(var/datum/reagent/blood/D in vessel.reagent_list) - if(D.data["donor"] == src) - B = D - break + if(bodytemperature >= 225 && !(NOCLONE in mutations)) //cryosleep or husked people do not pump the blood. - vessel.add_reagent("blood", 0.1) // regenerate blood VERY slowly + //Blood regeneration if there is some space + if(blood_volume < max_blood && blood_volume) + if(mind) //Handles vampires "eating" blood that isn't their own. + if(mind in ticker.mode.vampires) + if(nutrition >= NUTRITION_LEVEL_WELL_FED) + return //We don't want blood tranfusions making vampires fat. + if(blood_data["donor"] != src) + nutrition += (15 * REAGENTS_METABOLISM) + return //Only process one blood per tick, to maintain the same metabolism as nutriment for non-vampires. + if(blood_volume < BLOOD_VOLUME_NORMAL) + blood_volume += 0.1 // regenerate blood VERY slowly //Effects of bloodloss @@ -102,6 +57,7 @@ adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1)) if(prob(5)) EyeBlurry(6) + var/word = pick("dizzy","woozy","faint") to_chat(src, "You feel very [word].") if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD) @@ -117,264 +73,217 @@ death() //Bleeding out - var/blood_max = 0 + var/temp_bleed = 0 for(var/obj/item/organ/external/temp in bodyparts) if(!(temp.status & ORGAN_BLEEDING) || temp.status & ORGAN_ROBOT) continue for(var/datum/wound/W in temp.wounds) if(W.bleeding()) - blood_max += W.damage / 4 + temp_bleed += W.damage / 4 if(temp.open) - blood_max += 2 //Yer stomach is cut open - drip(blood_max) + temp_bleed += 0.5 -//Makes a blood drop, leaking certain amount of blood from the mob -/mob/living/carbon/human/proc/drip(var/amt as num) + bleed_rate = max(bleed_rate - 0.5, temp_bleed)//if no wounds, other bleed effects (heparin) naturally decreases - if(species && species.flags & NO_BLOOD) //TODO: Make drips come from the reagents instead. - return + if(bleed_rate && !bleedsuppress) + bleed(bleed_rate) - if(!amt) - return +//Makes a blood drop, leaking amt units of blood from the mob +/mob/living/carbon/proc/bleed(amt) + if(blood_volume) + blood_volume = max(blood_volume - amt, 0) + if(isturf(loc)) //Blood loss still happens in locker, floor stays clean + if(amt >= 10) + add_splatter_floor(loc) + else + add_splatter_floor(loc, 1) - var/amm = 0.1 * amt - var/turf/T = get_turf(src) +/mob/living/carbon/human/bleed(amt) + if(!(species && species.flags & NO_BLOOD)) + ..() + if(species.exotic_blood) + var/datum/reagent/R = chemical_reagents_list[get_blood_id()] + if(istype(R) && isturf(loc)) + R.reaction_turf(get_turf(src), amt) - if(species.exotic_blood) - vessel.remove_reagent(species.exotic_blood,amm) - if(vessel.total_volume) - var/fraction = amm / vessel.total_volume - vessel.reaction(T, TOUCH, fraction) - return - - else - vessel.remove_reagent("blood",amm) - blood_splatter(src, src) +/mob/living/proc/restore_blood() + blood_volume = initial(blood_volume) +/mob/living/carbon/human/restore_blood() + blood_volume = BLOOD_VOLUME_NORMAL + bleed_rate = 0 /**************************************************** BLOOD TRANSFERS ****************************************************/ -//Gets blood from mob to the container, preserving all data in it. -/mob/living/carbon/proc/take_blood(obj/item/weapon/reagent_containers/container, var/amount) - var/datum/reagent/B = get_blood(container.reagents) - if(!istype(B, /datum/reagent/blood)) B = new /datum/reagent/blood - B.holder = container - B.volume += amount +//Gets blood from mob to a container or other mob, preserving all data in it. +/mob/living/proc/transfer_blood_to(atom/movable/AM, amount, forced) + if(!blood_volume || !AM.reagents) + return 0 + if(blood_volume < BLOOD_VOLUME_BAD && !forced) + return 0 - //set reagent data - B.data["donor"] = src - B.data["viruses"] = list() + if(blood_volume < amount) + amount = blood_volume - for(var/datum/disease/D in viruses) - B.data["viruses"] += D.Copy() - if(resistances && resistances.len) - B.data["resistances"] = resistances.Copy() + var/blood_id = get_blood_id() + if(!blood_id) + return 0 - B.data["blood_DNA"] = copytext(src.dna.unique_enzymes,1,0) - B.data["blood_type"] = copytext(src.dna.b_type,1,0) + blood_volume -= amount - // Putting this here due to return shenanigans. - if(istype(src,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = src - B.data["blood_colour"] = H.species.blood_color - B.color = B.data["blood_colour"] + var/list/blood_data = get_blood_data(blood_id) - var/list/temp_chem = list() - for(var/datum/reagent/R in src.reagents.reagent_list) - temp_chem += R.id - temp_chem[R.id] = R.volume - B.data["trace_chem"] = list2params(temp_chem) - if(mind) - B.data["mind"] = mind - if(ckey) - B.data["ckey"] = ckey + if(iscarbon(AM)) + var/mob/living/carbon/C = AM + if(blood_id == C.get_blood_id())//both mobs have the same blood substance + if(blood_id == "blood") //normal blood + if(blood_data["viruses"]) + for(var/thing in blood_data["viruses"]) + var/datum/disease/D = thing + if((D.spread_flags & SPECIAL) || (D.spread_flags & NON_CONTAGIOUS)) + continue + C.ForceContractDisease(D) + if(!(blood_data["blood_type"] in get_safe_blood(C.dna.b_type))) + C.reagents.add_reagent("toxin", amount * 0.5) + return 1 - if(!suiciding) - B.data["cloneable"] = 1 - B.data["gender"] = gender - B.data["real_name"] = real_name - B.data["factions"] = faction - return B + C.blood_volume = min(C.blood_volume + round(amount, 0.1), BLOOD_VOLUME_MAXIMUM) + return 1 -//For humans, blood does not appear from blue, it comes from vessels. -/mob/living/carbon/human/take_blood(obj/item/weapon/reagent_containers/container, var/amount) - if(src.species.exotic_blood) - if(vessel.get_reagent_amount(src.species.exotic_blood) < amount) - return null - var/datum/reagent/W = new /datum/reagent - W.holder = container - W.volume += amount + AM.reagents.add_reagent(blood_id, amount, blood_data, bodytemperature) + return 1 + + +/mob/living/proc/get_blood_data(blood_id) + return + +/mob/living/carbon/human/get_blood_data(blood_id) + if(blood_id == "blood") //actual blood reagent + var/blood_data = list() + //set the blood data + blood_data["donor"] = src + blood_data["viruses"] = list() + + for(var/thing in viruses) + var/datum/disease/D = thing + blood_data["viruses"] += D.Copy() + + blood_data["blood_DNA"] = copytext(dna.unique_enzymes,1,0) + if(resistances && resistances.len) + blood_data["resistances"] = resistances.Copy() var/list/temp_chem = list() - for(var/datum/reagent/R in src.reagents.reagent_list) - temp_chem += R.id + for(var/datum/reagent/R in reagents.reagent_list) temp_chem[R.id] = R.volume - W.data["trace_chem"] = list2params(temp_chem) - vessel.remove_reagent(src.species.exotic_blood,amount) // Removes blood if human - return W - if(species && species.flags & NO_BLOOD) - return null - else - if(vessel.get_reagent_amount("blood") < amount) - return null - . = ..() - vessel.remove_reagent("blood",amount) // Removes blood if human + blood_data["trace_chem"] = list2params(temp_chem) + if(mind) + blood_data["mind"] = mind + if(ckey) + blood_data["ckey"] = ckey + if(!suiciding) + blood_data["cloneable"] = 1 + blood_data["blood_type"] = copytext(src.dna.b_type,1,0) + blood_data["gender"] = gender + blood_data["real_name"] = real_name + blood_data["blood_color"] = species.blood_color + blood_data["factions"] = faction + return blood_data -//Transfers blood from container ot vessels -/mob/living/carbon/proc/inject_blood(obj/item/weapon/reagent_containers/container, var/amount) - var/datum/reagent/blood/injected = get_blood(container.reagents) +//get the id of the substance this mob use as blood. +/mob/proc/get_blood_id() + return - if(!istype(injected)) +/mob/living/simple_animal/get_blood_id() + if(blood_volume) + return "blood" + +/mob/living/carbon/human/get_blood_id() + if(species.exotic_blood)//some races may bleed water..or kethcup.. + return species.exotic_blood + else if((species && species.flags & NO_BLOOD) || (NOCLONE in mutations)) return - - var/list/chems = list() - chems = params2list(injected.data["trace_chem"]) - for(var/C in chems) - src.reagents.add_reagent(C, (text2num(chems[C]) / BLOOD_VOLUME_NORMAL) * amount)//adds trace chemicals to owner's blood - reagents.update_total() - - container.reagents.remove_reagent("blood", amount) - -//Transfers blood from container ot vessels, respecting blood types compatability. -/mob/living/carbon/human/inject_blood(obj/item/weapon/reagent_containers/container, var/amount) - - var/datum/reagent/blood/injected = get_blood(container.reagents) - - if(!istype(injected)) //Sanity.. - return - - if(species && species.flags & NO_BLOOD) - reagents.add_reagent("blood", amount, injected.data) - reagents.update_total() - return - - var/datum/reagent/blood/our = get_blood(vessel) - - if(!istype(our)) // Do we not have blood? - vessel.add_reagent("blood", amount, injected.data) // This is only ran once, so we need to add back their DNA. - vessel.update_total() - ..() - our = get_blood(vessel) // Get the new blood. - our.data["blood_DNA"] = dna.unique_enzymes // Give it the proper DNA we had before (src.dna) - our.data["blood_type"] = dna.b_type // Proper blood type. - our.data["donor"] = src // Without this, it'd be random each time it was extracted or Null. - return - - if(blood_incompatible(injected.data["blood_type"],our.data["blood_type"]) ) - reagents.add_reagent("toxin",amount * 0.5) - reagents.update_total() - else - vessel.add_reagent("blood", amount, injected.data) - vessel.update_total() - ..() - -//Gets human's own blood. -/mob/living/carbon/proc/get_blood(datum/reagents/container) - var/datum/reagent/blood/res = locate() in container.reagent_list //Grab some blood - if(res) // Make sure there's some blood at all - if(res.data["donor"] != src) //If it's not theirs, then we look for theirs - for(var/datum/reagent/blood/D in container.reagent_list) - if(D.data["donor"] == src) - return D - return res - -/mob/living/carbon/human/get_blood(datum/reagents/container) - if(species.exotic_blood) - return container.get_reagent_from_id(species.exotic_blood) - else - return ..() - -/mob/living/carbon/proc/get_blood_name() return "blood" -/mob/living/carbon/human/get_blood_name() - if(species.exotic_blood) - return species.exotic_blood - else - return ..() +// This is has more potential uses, and is probably faster than the old proc. +/proc/get_safe_blood(bloodtype) + . = list() + if(!bloodtype) + return + switch(bloodtype) + if("A-") + return list("A-", "O-") + if("A+") + return list("A-", "A+", "O-", "O+") + if("B-") + return list("B-", "O-") + if("B+") + return list("B-", "B+", "O-", "O+") + if("AB-") + return list("A-", "B-", "O-", "AB-") + if("AB+") + return list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+") + if("O-") + return list("O-") + if("O+") + return list("O-", "O+") -/proc/blood_incompatible(donor,receiver) +//to add a splatter of blood or other mob liquid. +/mob/living/proc/add_splatter_floor(turf/T, small_drip) + if(get_blood_id() != "blood")//is it blood or welding fuel? + return - var/donor_antigen = copytext(donor,1,lentext(donor)) - var/receiver_antigen = copytext(receiver,1,lentext(receiver)) - var/donor_rh = findtext("+",donor) - var/receiver_rh = findtext("+",receiver) + if(!T) + T = get_turf(src) - if(donor_rh && !receiver_rh) return 1 - switch(receiver_antigen) - if("A") - if(donor_antigen != "A" && donor_antigen != "O") return 1 - if("B") - if(donor_antigen != "B" && donor_antigen != "O") return 1 - if("O") - if(donor_antigen != "O") return 1 - //AB is a universal receiver. - return 0 + var/list/temp_blood_DNA + var/list/b_data = get_blood_data(get_blood_id()) -/* -Target: Thing/tile to get bloody -Source: Human or blood reagent -Large: Whether the splat should be big or not -*/ -/proc/blood_splatter(var/target,var/source,var/large = 0) - - var/obj/effect/decal/cleanable/blood/B - var/decal_type = /obj/effect/decal/cleanable/blood/splatter - var/turf/T = get_turf(target) - var/datum/reagent/blood/bld - if(istype(source,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = source - bld = H.get_blood(H.vessel) - if(H.species.exotic_blood) - H.vessel.reaction(T, TOUCH) + if(small_drip) + // Only a certain number of drips (or one large splatter) can be on a given turf. + var/obj/effect/decal/cleanable/blood/drip/drop = locate() in T + if(drop) + if(drop.drips < 3) + drop.drips++ + drop.overlays |= pick(drop.random_icon_states) + drop.transfer_mob_blood_dna(src) + drop.basecolor = b_data["blood_color"] + drop.update_icon() + else + temp_blood_DNA = list() + temp_blood_DNA |= drop.blood_DNA.Copy() //we transfer the dna from the drip to the splatter + qdel(drop) + else + drop = new(T) + drop.transfer_mob_blood_dna(src) + drop.basecolor = b_data["blood_color"] + drop.update_icon() return - else if(H.species.flags & NO_BLOOD) - return - else if(istype(source, /datum/reagent)) - bld = source - if(!istype(bld, /datum/reagent/blood)) - var/datum/reagent/R = bld - if(istype(R)) - R.reaction_turf(T, R.volume) - return - else if(source) - log_runtime(EXCEPTION("Non-human or reagent blood source. Area: [get_area(source)], Name: [source]"), source) - - // Are we dripping or splattering? - var/list/drips = list() - // Only a certain number of drips (or one large splatter) can be on a given turf. - for(var/obj/effect/decal/cleanable/blood/drip/drop in T) - drips |= drop.drips - qdel(drop) - if(!large && drips.len < 3) - decal_type = /obj/effect/decal/cleanable/blood/drip // Find a blood decal or create a new one. - B = locate(decal_type) in T + var/obj/effect/decal/cleanable/blood/B = locate() in T if(!B) - B = new decal_type(T) + B = new /obj/effect/decal/cleanable/blood/splatter(T) + B.transfer_mob_blood_dna(src) //give blood info to the blood decal. + if(temp_blood_DNA) + B.blood_DNA |= temp_blood_DNA + B.update_icon() - var/obj/effect/decal/cleanable/blood/drip/drop = B - if(istype(drop) && drips && drips.len && !large) - drop.overlays |= drips - drop.drips |= drips +/mob/living/carbon/human/add_splatter_floor(turf/T, small_drip) + if(!(species && species.flags & NO_BLOOD)) + ..() - // If there's no data to copy, call it quits here. - if(!bld) - return B +/mob/living/carbon/alien/add_splatter_floor(turf/T, small_drip) + if(!T) + T = get_turf(src) + var/obj/effect/decal/cleanable/blood/xeno/B = locate() in T.contents + if(!B) + B = new(T) + B.blood_DNA["UNKNOWN DNA"] = "X*" - // Update appearance. - if(bld.data["blood_colour"]) - B.basecolor = bld.data["blood_colour"] - B.update_icon() - - // Update blood information. - if(bld.data["blood_DNA"]) - B.blood_DNA = list() - if(bld.data["blood_type"]) - B.blood_DNA[bld.data["blood_DNA"]] = bld.data["blood_type"] - else - B.blood_DNA[bld.data["blood_DNA"]] = "O+" - - return B +/mob/living/silicon/robot/add_splatter_floor(turf/T, small_drip) + if(!T) + T = get_turf(src) + var/obj/effect/decal/cleanable/blood/oil/B = locate() in T.contents + if(!B) + B = new(T) \ No newline at end of file diff --git a/code/modules/surgery/organs/helpers.dm b/code/modules/surgery/organs/helpers.dm index 94b0de5e066..61ed78d0e3b 100644 --- a/code/modules/surgery/organs/helpers.dm +++ b/code/modules/surgery/organs/helpers.dm @@ -30,9 +30,7 @@ return returnorg /mob/living/carbon/get_organ_slot(slot) - for(var/obj/item/organ/internal/O in internal_organs) - if(slot == O.slot) - return O + return internal_organs_slot[slot] /mob/living/carbon/get_int_organ_tag(tag) for(var/obj/item/organ/internal/O in internal_organs) diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm index 1af9e92b233..414bdc0e844 100644 --- a/code/modules/surgery/organs/organ.dm +++ b/code/modules/surgery/organs/organ.dm @@ -32,6 +32,7 @@ var/list/organ_cache = list() var/sterile = 0 //can the organ be infected by germs? var/tough = 0 //can organ be easily damaged? + /obj/item/organ/Destroy() processing_objects.Remove(src) if(owner) @@ -233,7 +234,7 @@ var/list/organ_cache = list() W.time_inflicted = world.time //Note: external organs have their own version of this proc -/obj/item/organ/proc/take_damage(amount, var/silent=0) +/obj/item/organ/proc/take_damage(amount, silent = 0) if(tough) return if(status & ORGAN_ROBOT) @@ -268,15 +269,22 @@ var/list/organ_cache = list() /obj/item/organ/emp_act(severity) if(!(status & ORGAN_ROBOT)) return - switch(severity) - if(1.0) - take_damage(0,20) - return - if(2.0) - take_damage(0,7) - return - if(3.0) - take_damage(0,3) + if(tough) + switch(severity) + if(1) + take_damage(0, 5.5) + if(owner) + owner.Stun(10) + if(2) + take_damage(0, 2.8) + if(owner) + owner.Stun(5) + else + switch(severity) + if(1) + take_damage(0, 20) + if(2) + take_damage(0, 7) /obj/item/organ/internal/emp_act(severity) if(!robotic) @@ -284,17 +292,15 @@ var/list/organ_cache = list() if(robotic == 2) switch(severity) if(1.0) - take_damage(20,1) + take_damage(20, 1) if(2.0) - take_damage(7,1) - if(3.0) - take_damage(3,1) + take_damage(7, 1) else if(robotic == 1) - take_damage(11,1) + take_damage(11, 1) /obj/item/organ/internal/heart/emp_act(intensity) if(owner && robotic == 2) - owner.heart_attack = 1 + Stop() // In the name of looooove~! owner.visible_message("[owner] clutches their chest and gasps!","You clutch your chest in pain!") else if(owner && robotic == 1) take_damage(11,1) @@ -311,9 +317,9 @@ var/list/organ_cache = list() loc = get_turf(owner) processing_objects |= src var/datum/reagent/blood/organ_blood - if(reagents) organ_blood = reagents.get_reagent_from_id(owner.get_blood_name()) + if(reagents) organ_blood = reagents.get_reagent_from_id(owner.get_blood_id()) if((!organ_blood || !organ_blood.data["blood_DNA"]) && (owner && !(owner.species.flags & NO_BLOOD))) - owner.vessel.trans_to(src, 5, 1, 1) + owner.transfer_blood_to(src) if(owner && vital && is_primary_organ()) // I'd do another check for species or whatever so that you couldn't "kill" an IPC by removing a human head from them, but it doesn't matter since they'll come right back from the dead if(user) @@ -324,19 +330,13 @@ var/list/organ_cache = list() owner = null return src -/obj/item/organ/proc/replaced(var/mob/living/carbon/human/target,var/obj/item/organ/external/affected) - - if(!istype(target)) return - - owner = target - processing_objects -= src - affected.internal_organs |= src - if(!target.get_int_organ(src)) - target.internal_organs += src - loc = target - if(robotic) - status |= ORGAN_ROBOT +/obj/item/organ/proc/replaced(var/mob/living/carbon/human/target) + return // Nothing uses this, it is always overridden +// A version of `replaced` that "flattens" the process of insertion, making organs "Plug'n'play" +// (Particularly the heart, which stops beating when removed) +/obj/item/organ/proc/safe_replace(var/mob/living/carbon/human/target) + replaced(target) /obj/item/organ/proc/surgeryize() return @@ -380,4 +380,4 @@ I use this so that this can be made better once the organ overhaul rolls out -- // The only thing the official proc does is //instantiate the list and call this proc dna.deserialize(data["dna"]) - ..() \ No newline at end of file + ..() diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm index 151636a9a50..7ad38b5060d 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -46,6 +46,7 @@ var/obj/item/organ/external/parent var/list/obj/item/organ/external/children + var/list/convertable_children = list() // Internal organs of this body part var/list/internal_organs = list() @@ -58,7 +59,7 @@ var/encased // Needs to be opened with a saw to access the organs. var/obj/item/hidden = null - var/list/implants = list() + var/list/embedded_objects = list() // how often wounds should be updated, a higher number means less often var/wound_update_accuracy = 1 @@ -104,7 +105,7 @@ QDEL_LIST(wounds) - QDEL_LIST(implants) + QDEL_LIST(embedded_objects) QDEL_NULL(hidden) @@ -193,7 +194,11 @@ DAMAGE PROCS ****************************************************/ -/obj/item/organ/external/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list()) +/obj/item/organ/external/take_damage(brute, burn, sharp, used_weapon = null, list/forbidden_limbs = list()) + if(tough) + brute = max(0, brute - 5) + burn = max(0, burn - 4) + if((brute <= 0) && (burn <= 0)) return 0 @@ -271,7 +276,7 @@ if(possible_points.len) //And pass the pain around var/obj/item/organ/external/target = pick(possible_points) - target.take_damage(brute, burn, sharp, edge, used_weapon, forbidden_limbs + src) + target.take_damage(brute, burn, sharp, used_weapon, forbidden_limbs + src) if(fail_at_full_damage == 2 && body_part != UPPER_TORSO && body_part != LOWER_TORSO) var/losstype if(burn > brute) @@ -287,8 +292,8 @@ if(owner && loc == owner) if(!cannot_amputate && config.limbs_can_break && (brute_dam) >= (max_damage * config.organ_health_multiplier)) if(prob(brute / 2)) - if(edge) - droplimb(0,DROPLIMB_EDGE) + if(sharp) + droplimb(0, DROPLIMB_SHARP) if(owner_old) owner_old.updatehealth() return update_icon() @@ -358,12 +363,6 @@ This function completely restores a damaged organ to perfect condition. for(var/obj/item/organ/external/EO in contents) EO.rejuvenate() - // remove embedded objects and drop them on the floor - for(var/obj/implanted_object in implants) - if(!istype(implanted_object,/obj/item/weapon/implant)) // We don't want to remove REAL implants. Just shrapnel etc. - implanted_object.loc = owner.loc - implants -= implanted_object - owner.updatehealth() update_icon() if(!owner) @@ -578,9 +577,9 @@ Note that amputating the affected organ does in fact remove the infection from t var/bicardose = owner.reagents.get_reagent_amount("styptic_powder") if(!bicardose) //styptic powder stops internal wounds from growing bigger with time, and also stop bleeding W.open_wound(0.1 * wound_update_accuracy) - owner.vessel.remove_reagent("blood",0.05 * W.damage * wound_update_accuracy) + owner.blood_volume -= (0.05 * W.damage * wound_update_accuracy) - owner.vessel.remove_reagent("blood",0.02 * W.damage * wound_update_accuracy) + owner.blood_volume -= (0.02 * W.damage * wound_update_accuracy) if(prob(1 * wound_update_accuracy)) owner.custom_pain("You feel a stabbing pain in your [name]!",1) @@ -691,10 +690,10 @@ Note that amputating the affected organ does in fact remove the infection from t return if(!disintegrate) - disintegrate = DROPLIMB_EDGE + disintegrate = DROPLIMB_SHARP switch(disintegrate) - if(DROPLIMB_EDGE) + if(DROPLIMB_SHARP) if(!clean) var/gore_sound = "[(status & ORGAN_ROBOT) ? "tortured metal" : "ripping tendons and flesh"]" owner.visible_message( @@ -743,9 +742,9 @@ Note that amputating the affected organ does in fact remove the infection from t victim.regenerate_icons() dir = 2 switch(disintegrate) - if(DROPLIMB_EDGE) + if(DROPLIMB_SHARP) compile_icon() - add_blood(victim) + add_blood(victim.blood_DNA, victim.species.blood_color) var/matrix/M = matrix() M.Turn(rand(180)) src.transform = M @@ -847,19 +846,18 @@ Note that amputating the affected organ does in fact remove the infection from t status &= ~ORGAN_BROKEN return 1 -// I put these two next to each other to highlight that both exist. This should likely be resolved. -/obj/item/organ/external/robotize() +/obj/item/organ/external/robotize(company, make_tough = 0, convert_all = 1) ..() //robot limbs take reduced damage - brute_mod = 0.66 - burn_mod = 0.66 + if(!make_tough) + brute_mod = 0.66 + burn_mod = 0.66 + fail_at_full_damage = 1 + else + tough = 1 // Robot parts also lack bones // This is so surgery isn't kaput, let's see how this does encased = null - fail_at_full_damage = 1 - -/obj/item/organ/external/robotize(var/company) - ..() if(company && istext(company)) set_company(company) @@ -867,8 +865,8 @@ Note that amputating the affected organ does in fact remove the infection from t cannot_break = 1 get_icon() for(var/obj/item/organ/external/T in children) - if(T) - T.robotize() + if((convert_all) || (T.type in convertable_children)) + T.robotize(company, make_tough, convert_all) @@ -900,26 +898,12 @@ Note that amputating the affected organ does in fact remove the infection from t return 0 /obj/item/organ/external/proc/is_usable() - if((status & ORGAN_ROBOT) && get_damage() >= max_damage) //robot limbs just become inoperable at max damage + if(((status & ORGAN_ROBOT) && get_damage() >= max_damage) && !tough) //robot limbs just become inoperable at max damage return return !(status & (ORGAN_DESTROYED|ORGAN_MUTATED|ORGAN_DEAD)) /obj/item/organ/external/proc/is_malfunctioning() - return ((status & ORGAN_ROBOT) && (brute_dam + burn_dam) >= 10 && prob(brute_dam + burn_dam)) - -/obj/item/organ/external/proc/embed(var/obj/item/weapon/W, var/silent = 0) - if(!owner || loc != owner) - return - if(!silent) - owner.visible_message("\The [W] sticks in the wound!") - implants += W - owner.embedded_flag = 1 - owner.verbs += /mob/proc/yank_out_object - W.add_blood(owner) - if(ismob(W.loc)) - var/mob/living/H = W.loc - H.drop_item() - W.loc = owner + return ((status & ORGAN_ROBOT) && (brute_dam + burn_dam) >= 10 && prob(brute_dam + burn_dam) && !tough) /obj/item/organ/external/proc/open_enough_for_surgery() return (encased ? (open == 3) : (open == 2)) @@ -931,14 +915,17 @@ Note that amputating the affected organ does in fact remove the infection from t var/is_robotic = status & ORGAN_ROBOT var/mob/living/carbon/human/victim = owner + for(var/obj/item/I in embedded_objects) + embedded_objects -= I + I.forceMove(src) + if(!owner.has_embedded_objects()) + owner.clear_alert("embeddedobject") + . = ..() status |= ORGAN_DESTROYED victim.bad_external_organs -= src - for(var/implant in implants) //todo: check if this can be left alone - qdel(implant) - // Attached organs also fly off. if(!ignore_children) for(var/obj/item/organ/external/O in children) @@ -1018,3 +1005,22 @@ Note that amputating the affected organ does in fact remove the infection from t ..() // Parent call loads in the DNA if(data["dna"]) sync_colour_to_dna() + +//Remove all embedded objects from all limbs on the carbon mob +/mob/living/carbon/human/proc/remove_all_embedded_objects() + var/turf/T = get_turf(src) + + for(var/X in bodyparts) + var/obj/item/organ/external/L = X + for(var/obj/item/I in L.embedded_objects) + L.embedded_objects -= I + I.forceMove(T) + + clear_alert("embeddedobject") + +/mob/living/carbon/human/proc/has_embedded_objects() + . = 0 + for(var/X in bodyparts) + var/obj/item/organ/external/L = X + for(var/obj/item/I in L.embedded_objects) + return 1 \ No newline at end of file diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 7bea9c480af..e07208cc97d 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -1,12 +1,12 @@ #define PROCESS_ACCURACY 10 /obj/item/organ/internal - origin_tech = "biotech=2" + origin_tech = "biotech=3" force = 1 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL throwforce = 0 - var/zone = "chest" var/slot + // DO NOT add slots with matching names to different zones - it will break internal_organs_slot list! vital = 0 var/non_primary = 0 @@ -29,6 +29,7 @@ owner = M M.internal_organs |= src + M.internal_organs_slot[slot] = src var/obj/item/organ/external/parent if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/H = M @@ -52,6 +53,8 @@ owner = null if(M) M.internal_organs -= src + if(M.internal_organs_slot[slot] == src) + M.internal_organs_slot.Remove(slot) if(vital && !special) if(M.stat != DEAD)//safety check! M.death() @@ -69,9 +72,8 @@ A.Remove(M) return src -/obj/item/organ/internal/replaced(var/mob/living/carbon/human/target,var/obj/item/organ/external/affected) +/obj/item/organ/internal/replaced(var/mob/living/carbon/human/target) insert(target) - ..() /obj/item/organ/internal/item_action_slot_check(slot, mob/user) return @@ -140,7 +142,7 @@ organ_tag = "heart" parent_organ = "chest" slot = "heart" - origin_tech = "biotech=3" + origin_tech = "biotech=5" var/beating = 1 dead_icon = "heart-off" var/icon_base = "heart" @@ -155,11 +157,9 @@ . = ..() if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.stat == DEAD || H.heart_attack) + if(H.stat == DEAD) Stop() return - if(!special) - H.heart_attack = 1 spawn(120) if(!owner) @@ -173,14 +173,9 @@ if(!owner) Stop() - -/obj/item/organ/internal/heart/insert(mob/living/carbon/M, special = 0) +/obj/item/organ/internal/heart/safe_replace(mob/living/carbon/human/target) + Restart() ..() - if(ishuman(M) && beating) - var/mob/living/carbon/human/H = M - if(H.heart_attack) - H.heart_attack = 0 - return /obj/item/organ/internal/heart/proc/Stop() beating = 0 @@ -202,7 +197,7 @@ desc = "it needs to be pumped..." icon_state = "cursedheart-off" icon_base = "cursedheart" - origin_tech = "biotech=5" + origin_tech = "biotech=6" actions_types = list(/datum/action/item_action/organ_action/cursed_heart) var/last_pump = 0 var/pump_delay = 30 //you can pump 1 second early, for lag, but no more (otherwise you could spam heal) @@ -229,10 +224,11 @@ if(world.time > (last_pump + pump_delay)) if(ishuman(owner) && owner.client) //While this entire item exists to make people suffer, they can't control disconnects. var/mob/living/carbon/human/H = owner - H.vessel.remove_reagent("blood", blood_loss) - to_chat(H, "You have to keep pumping your blood!") - if(H.client) - H.client.color = "red" //bloody screen so real + if(!(H.species.flags & NO_BLOOD)) + H.blood_volume = max(H.blood_volume - blood_loss, 0) + to_chat(H, "You have to keep pumping your blood!") + if(H.client) + H.client.color = "red" //bloody screen so real else last_pump = world.time //lets be extra fair *sigh* @@ -261,13 +257,14 @@ var/mob/living/carbon/human/H = owner if(istype(H)) - H.vessel.add_reagent("blood", (cursed_heart.blood_loss*0.5))//gain half the blood back from a failure - if(owner.client) - owner.client.color = "" + if(!(H.species.flags & NO_BLOOD)) + H.blood_volume = min(H.blood_volume + cursed_heart.blood_loss*0.5, BLOOD_VOLUME_MAXIMUM) + if(owner.client) + owner.client.color = "" - H.adjustBruteLoss(-cursed_heart.heal_brute) - H.adjustFireLoss(-cursed_heart.heal_burn) - H.adjustOxyLoss(-cursed_heart.heal_oxy) + H.adjustBruteLoss(-cursed_heart.heal_brute) + H.adjustFireLoss(-cursed_heart.heal_burn) + H.adjustOxyLoss(-cursed_heart.heal_oxy) /obj/item/organ/internal/lungs name = "lungs" @@ -294,7 +291,7 @@ if(is_bruised()) if(prob(2)) owner.custom_emote(1, "coughs up blood!") - owner.drip(10) + owner.bleed(1) if(prob(4)) owner.custom_emote(1, "gasps for air!") owner.AdjustLoseBreath(5) @@ -499,8 +496,8 @@ name = "black tumor" desc = "A tiny black mass with red tendrils trailing from it. It seems to shrivel in the light." icon_state = "blacktumor" - origin_tech = "biotech=4" - w_class = 1 + origin_tech = "biotech=5" + w_class = WEIGHT_CLASS_TINY parent_organ = "head" slot = "brain_tumor" health = 3 @@ -532,7 +529,7 @@ desc = "A tiny yellow mass shaped like..a banana?" icon_state = "honktumor" origin_tech = "biotech=1" - w_class = 1 + w_class = WEIGHT_CLASS_TINY parent_organ = "head" slot = "brain_tumor" health = 3 @@ -619,7 +616,7 @@ desc = "Let they who is worthy wear the beard of Thorbjorndottir." icon_state = "liver" origin_tech = "biotech=1" - w_class = 1 + w_class = WEIGHT_CLASS_TINY parent_organ = "head" slot = "hair_organ" diff --git a/code/modules/surgery/organs/robolimbs.dm b/code/modules/surgery/organs/robolimbs.dm index 2d31942059c..d3c297bc0c7 100644 --- a/code/modules/surgery/organs/robolimbs.dm +++ b/code/modules/surgery/organs/robolimbs.dm @@ -1,5 +1,6 @@ var/global/list/all_robolimbs = list() var/global/list/chargen_robolimbs = list() +var/global/list/selectable_robolimbs = list() var/global/datum/robolimb/basic_robolimb /proc/populate_robolimb_list() @@ -11,12 +12,15 @@ var/global/datum/robolimb/basic_robolimb if(R != "head" && R != "chest" && R != "groin" ) //Part of the method that ensures only IPCs can access head, chest and groin prosthetics. if(R.has_subtypes) //Ensures solos get added to the list as well be incorporating has_subtypes == 1 and has_subtypes == 2. chargen_robolimbs[R.company] = R //List only main brands and solo parts. + if(R.selectable) + selectable_robolimbs[R.company] = R /datum/robolimb var/company = "Unbranded" // Shown when selecting the limb. var/desc = "A generic unbranded robotic prosthesis." // Seen when examining a limb. var/icon = 'icons/mob/human_races/robotic.dmi' // Icon base to draw from. var/unavailable_at_chargen // If set, not available at chargen. + var/selectable = 1 // If set, is it available for selection on attack_self with a robo limb? var/is_monitor // If set, limb is a monitor and should be getting monitor styles. var/has_subtypes = 2 // If null, object is a model. If 1, object is a brand (that serves as the default model) with child models. If 2, object is a brand that has no child models and thus also serves as the model.. var/parts = list("chest", "groin", "head", "r_arm", "r_hand", "r_leg", "r_foot", "l_leg", "l_foot", "l_arm", "l_hand") // Defines what parts said brand can replace on a body. @@ -31,6 +35,7 @@ var/global/datum/robolimb/basic_robolimb company = "Bishop Cybernetics alt." icon = 'icons/mob/human_races/cyberlimbs/bishop/bishop_alt1.dmi' parts = list("head") + selectable = 0 has_subtypes = null /datum/robolimb/bishop/monitor @@ -38,6 +43,7 @@ var/global/datum/robolimb/basic_robolimb icon = 'icons/mob/human_races/cyberlimbs/bishop/bishop_monitor.dmi' parts = list("head") is_monitor = 1 + selectable = 0 has_subtypes = null /datum/robolimb/hesphiastos @@ -51,6 +57,7 @@ var/global/datum/robolimb/basic_robolimb icon = 'icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_alt1.dmi' parts = list("head") is_monitor = 1 + selectable = 0 has_subtypes = null /datum/robolimb/hesphiastos/monitor @@ -58,6 +65,7 @@ var/global/datum/robolimb/basic_robolimb icon = 'icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_monitor.dmi' parts = list("head") is_monitor = 1 + selectable = 0 has_subtypes = null /datum/robolimb/morpheus @@ -74,6 +82,7 @@ var/global/datum/robolimb/basic_robolimb parts = list("head") unavailable_at_chargen = null is_monitor = null + selectable = 0 has_subtypes = 2 //Edge case. We want to be able to pick this one, and if we had it left as null for has_subtypes we'd be assuming it'll be chosen as a child model, //and since the parent is unavailable at chargen, we wouldn't be able to see it in the list anyway. Now, we'll be able to select the Morpheus Ckt. Alt. head as a solo-model. @@ -87,6 +96,7 @@ var/global/datum/robolimb/basic_robolimb company = "Ward-Takahashi alt." icon = 'icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_alt1.dmi' parts = list("head") + selectable = 0 has_subtypes = null /datum/robolimb/wardtakahashi/monitor @@ -94,6 +104,7 @@ var/global/datum/robolimb/basic_robolimb icon = 'icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_monitor.dmi' parts = list("head") is_monitor = 1 + selectable = 0 has_subtypes = null /datum/robolimb/xion @@ -106,6 +117,7 @@ var/global/datum/robolimb/basic_robolimb company = "Xion Manufacturing Group alt." icon = 'icons/mob/human_races/cyberlimbs/xion/xion_alt1.dmi' parts = list("head") + selectable = 0 has_subtypes = null /datum/robolimb/xion/monitor @@ -113,6 +125,7 @@ var/global/datum/robolimb/basic_robolimb icon = 'icons/mob/human_races/cyberlimbs/xion/xion_monitor.dmi' parts = list("head") is_monitor = 1 + selectable = 0 has_subtypes = null /datum/robolimb/zenghu @@ -131,6 +144,7 @@ var/global/datum/robolimb/basic_robolimb company = "Shellguard Munitions Elite Series" icon = 'icons/mob/human_races/cyberlimbs/shellguard/shellguard_alt1.dmi' parts = list("head") + selectable = 0 has_subtypes = null /datum/robolimb/shellguard/monitor @@ -138,4 +152,5 @@ var/global/datum/robolimb/basic_robolimb icon = 'icons/mob/human_races/cyberlimbs/shellguard/shellguard_monitor.dmi' parts = list("head") is_monitor = 1 + selectable = 0 has_subtypes = null \ No newline at end of file diff --git a/code/modules/surgery/organs/subtypes/skrell.dm b/code/modules/surgery/organs/subtypes/skrell.dm index c069b852886..842088f2937 100644 --- a/code/modules/surgery/organs/subtypes/skrell.dm +++ b/code/modules/surgery/organs/subtypes/skrell.dm @@ -1,3 +1,63 @@ /obj/item/organ/internal/liver/skrell alcohol_intensity = 4 species = "Skrell" + +/obj/item/organ/internal/headpocket + name = "headpocket" + desc = "Allows Skrell to hide tiny objects within their head tentacles." + icon_state = "skrell_headpocket" + origin_tech = "biotech=2" + w_class = WEIGHT_CLASS_TINY + parent_organ = "head" + slot = "headpocket" + species = "Skrell" + actions_types = list(/datum/action/item_action/organ_action/toggle) + var/obj/item/weapon/storage/internal/pocket + +/obj/item/organ/internal/headpocket/New() + ..() + pocket = new /obj/item/weapon/storage/internal(src) + pocket.storage_slots = 1 + // Allow adjacency calculation to work properly + loc = owner + // Fit only pocket sized items + pocket.max_w_class = WEIGHT_CLASS_SMALL + pocket.max_combined_w_class = 2 + +/obj/item/organ/internal/headpocket/on_life() + ..() + var/obj/item/organ/external/head/head = owner.get_organ("head") + if(pocket.contents.len && (owner.stunned || !findtextEx(head.h_style, "Tentacles"))) + owner.visible_message("Something falls from [owner]'s head!", + "Something falls from your head!") + empty_contents() + +/obj/item/organ/internal/headpocket/ui_action_click() + if(!loc) + loc = owner + pocket.MouseDrop(owner) + +/obj/item/organ/internal/headpocket/on_owner_death() + empty_contents() + +/obj/item/organ/internal/headpocket/remove() + empty_contents() + . = ..() + +/obj/item/organ/internal/headpocket/proc/empty_contents() + pocket.empty_object_contents(0, get_turf(owner)) + +/obj/item/organ/internal/headpocket/proc/get_contents() + return pocket.contents + +/obj/item/organ/internal/headpocket/emp_act(severity) + pocket.emp_act(severity) + ..() + +/obj/item/organ/internal/headpocket/hear_talk(mob/living/M as mob, msg) + pocket.hear_talk(M, msg) + ..() + +/obj/item/organ/internal/headpocket/hear_message(mob/living/M as mob, msg) + pocket.hear_message(M, msg) + ..() diff --git a/code/modules/surgery/organs/subtypes/standard.dm b/code/modules/surgery/organs/subtypes/standard.dm index 62ae8c78d66..d3a76fab60c 100644 --- a/code/modules/surgery/organs/subtypes/standard.dm +++ b/code/modules/surgery/organs/subtypes/standard.dm @@ -8,7 +8,7 @@ icon_name = "torso" max_damage = 100 min_broken_damage = 35 - w_class = 5 + w_class = WEIGHT_CLASS_HUGE body_part = UPPER_TORSO vital = 1 amputation_point = "spine" @@ -17,6 +17,7 @@ parent_organ = null encased = "ribcage" var/fat = FALSE + convertable_children = list(/obj/item/organ/external/groin) /obj/item/organ/external/chest/proc/makeFat(update_body_icon = 1) fat = TRUE @@ -42,7 +43,7 @@ icon_name = "groin" max_damage = 100 min_broken_damage = 35 - w_class = 4 + w_class = WEIGHT_CLASS_BULKY // if you know what I mean ;) body_part = LOWER_TORSO vital = 1 parent_organ = "chest" @@ -55,11 +56,12 @@ icon_name = "l_arm" max_damage = 50 min_broken_damage = 30 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL body_part = ARM_LEFT parent_organ = "chest" amputation_point = "left shoulder" can_grasp = 1 + convertable_children = list(/obj/item/organ/external/hand) /obj/item/organ/external/arm/right limb_name = "r_arm" @@ -67,6 +69,7 @@ icon_name = "r_arm" body_part = ARM_RIGHT amputation_point = "right shoulder" + convertable_children = list(/obj/item/organ/external/hand/right) /obj/item/organ/external/leg limb_name = "l_leg" @@ -74,12 +77,13 @@ icon_name = "l_leg" max_damage = 50 min_broken_damage = 30 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL body_part = LEG_LEFT icon_position = LEFT parent_organ = "groin" amputation_point = "left hip" can_stand = 1 + convertable_children = list(/obj/item/organ/external/foot) /obj/item/organ/external/leg/right limb_name = "r_leg" @@ -88,6 +92,7 @@ body_part = LEG_RIGHT icon_position = RIGHT amputation_point = "right hip" + convertable_children = list(/obj/item/organ/external/foot/right) /obj/item/organ/external/foot limb_name = "l_foot" @@ -95,7 +100,7 @@ icon_name = "l_foot" max_damage = 30 min_broken_damage = 15 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL body_part = FOOT_LEFT icon_position = LEFT parent_organ = "l_leg" @@ -121,7 +126,7 @@ icon_name = "l_hand" max_damage = 30 min_broken_damage = 15 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL body_part = HAND_LEFT parent_organ = "l_arm" amputation_point = "left wrist" @@ -152,7 +157,7 @@ name = "head" max_damage = 75 min_broken_damage = 35 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL body_part = HEAD vital = 1 parent_organ = "chest" @@ -214,8 +219,8 @@ ..() -/obj/item/organ/external/head/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list()) - ..(brute, burn, sharp, edge, used_weapon, forbidden_limbs) +/obj/item/organ/external/head/take_damage(brute, burn, sharp, used_weapon = null, list/forbidden_limbs = list()) + ..(brute, burn, sharp, used_weapon, forbidden_limbs) if(!disfigured) if(brute_dam > 40) if(prob(50)) diff --git a/code/modules/surgery/organs/subtypes/xenos.dm b/code/modules/surgery/organs/subtypes/xenos.dm index 5e771931165..8f4434f41bc 100644 --- a/code/modules/surgery/organs/subtypes/xenos.dm +++ b/code/modules/surgery/organs/subtypes/xenos.dm @@ -36,8 +36,8 @@ /obj/item/organ/internal/xenos/plasmavessel name = "xeno plasma vessel" icon_state = "plasma" - origin_tech = "biotech=5;plasmatech=2" - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL + origin_tech = "biotech=5;plasmatech=4" parent_organ = "chest" slot = "plasmavessel" alien_powers = list(/mob/living/carbon/alien/humanoid/verb/plant, /mob/living/carbon/alien/humanoid/verb/transfer_plasma) @@ -56,7 +56,7 @@ /obj/item/organ/internal/xenos/plasmavessel/queen name = "bloated xeno plasma vessel" icon_state = "plasma_large" - origin_tech = "biotech=6;plasma=3" + origin_tech = "biotech=6;plasmatech=4" stored_plasma = 200 max_plasma = 500 plasma_rate = 25 @@ -127,7 +127,7 @@ parent_organ = "head" slot = "hivenode" origin_tech = "biotech=5;magnets=4;bluespace=3" - w_class = 1 + w_class = WEIGHT_CLASS_TINY alien_powers = list(/mob/living/carbon/alien/humanoid/verb/whisp) /obj/item/organ/internal/xenos/hivenode/insert(mob/living/carbon/M, special = 0) @@ -163,6 +163,6 @@ icon_state = "eggsac" parent_organ = "groin" slot = "eggsac" - w_class = 4 - origin_tech = "biotech=8" + w_class = WEIGHT_CLASS_BULKY + origin_tech = "biotech=6" alien_powers = list(/mob/living/carbon/alien/humanoid/queen/verb/lay_egg) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 05486c9046d..4bb0f2846c7 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -38,7 +38,6 @@ var/static/regex/multispin_words = regex("like a record baby") /obj/item/organ/internal/vocal_cords //organs that are activated through speech with the :x channel name = "vocal cords" icon_state = "appendix" - zone = "mouth" slot = "vocal_cords" parent_organ = "mouth" var/spans = null @@ -245,7 +244,7 @@ var/static/regex/multispin_words = regex("like a record baby") //BLEED else if((findtext(message, bleed_words))) for(var/mob/living/carbon/human/H in listeners) - H.drip(100 * power_multiplier) + H.bleed_rate += (5 * power_multiplier) next_command = world.time + cooldown_damage //FIRE @@ -305,8 +304,8 @@ var/static/regex/multispin_words = regex("like a record baby") else if((findtext(message, walk_words))) for(var/V in listeners) var/mob/living/L = V - if(L.m_intent != "walk") - L.m_intent = "walk" + if(L.m_intent != MOVE_INTENT_WALK) + L.m_intent = MOVE_INTENT_WALK if(L.hud_used) L.hud_used.move_intent.icon_state = "walking" next_command = world.time + cooldown_meme @@ -315,8 +314,8 @@ var/static/regex/multispin_words = regex("like a record baby") else if((findtext(message, run_words))) for(var/V in listeners) var/mob/living/L = V - if(L.m_intent != "run") - L.m_intent = "run" + if(L.m_intent != MOVE_INTENT_RUN) + L.m_intent = MOVE_INTENT_RUN if(L.hud_used) L.hud_used.move_intent.icon_state = "running" next_command = world.time + cooldown_meme @@ -324,25 +323,25 @@ var/static/regex/multispin_words = regex("like a record baby") //HELP INTENT else if((findtext(message, helpintent_words))) for(var/mob/living/carbon/human/H in listeners) - H.a_intent_change(I_HELP) + H.a_intent_change(INTENT_HELP) next_command = world.time + cooldown_meme //DISARM INTENT else if((findtext(message, disarmintent_words))) for(var/mob/living/carbon/human/H in listeners) - H.a_intent_change(I_DISARM) + H.a_intent_change(INTENT_DISARM) next_command = world.time + cooldown_meme //GRAB INTENT else if((findtext(message, grabintent_words))) for(var/mob/living/carbon/human/H in listeners) - H.a_intent_change(I_GRAB) + H.a_intent_change(INTENT_GRAB) next_command = world.time + cooldown_meme //HARM INTENT else if((findtext(message, harmintent_words))) for(var/mob/living/carbon/human/H in listeners) - H.a_intent_change(I_HARM) + H.a_intent_change(INTENT_HARM) next_command = world.time + cooldown_meme //THROW/CATCH @@ -452,4 +451,4 @@ var/static/regex/multispin_words = regex("like a record baby") next_command = world.time + cooldown_none message_admins("[key_name_admin(owner)] has said '[log_message]' with a Voice of God, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") - log_game("[key_name(owner)] has said '[log_message]' with a Voice of God, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") \ No newline at end of file + log_game("[key_name(owner)] has said '[log_message]' with a Voice of God, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") diff --git a/code/modules/surgery/organs/wound.dm b/code/modules/surgery/organs/wound.dm index ca5b25dee12..b1f99b34d6b 100644 --- a/code/modules/surgery/organs/wound.dm +++ b/code/modules/surgery/organs/wound.dm @@ -318,15 +318,15 @@ datum/wound/cut/massive /datum/wound/lost_limb/New(var/obj/item/organ/external/lost_limb, var/losstype, var/clean) var/damage_amt = lost_limb.max_damage if(clean) damage_amt /= 2 - + switch(losstype) - if(DROPLIMB_EDGE, DROPLIMB_BLUNT) + if(DROPLIMB_SHARP, DROPLIMB_BLUNT) damage_type = CUT max_bleeding_stage = 3 //clotted stump and above can bleed. stages = list( "ripped stump" = damage_amt*1.3, - "bloody stump" = damage_amt, - "clotted stump" = damage_amt*0.5, + "bloody stump" = damage_amt, + "clotted stump" = damage_amt*0.5, "scarred stump" = 0 ) if(DROPLIMB_BURN) @@ -337,7 +337,7 @@ datum/wound/cut/massive "scarred stump" = damage_amt*0.5, "scarred stump" = 0 ) - + ..(damage_amt) /datum/wound/lost_limb/can_merge(var/datum/wound/other) diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 420d56de43d..da41915249c 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -14,7 +14,7 @@ /datum/surgery/organ_manipulation_boneless name = "Organ Manipulation" - possible_locs = list("chest","head","groin", "eyes", "mouth") + possible_locs = list("chest","head","groin", "eyes", "mouth", "l_arm", "r_arm") steps = list(/datum/surgery_step/generic/cut_open,/datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/internal/manipulate_organs,/datum/surgery_step/generic/cauterize) requires_organic_bodypart = 1 @@ -159,6 +159,11 @@ else if(implement_type in implements_extract) current_type = "extract" var/list/organs = target.get_organs_zone(target_zone) + var/mob/living/simple_animal/borer/B = target.has_brain_worms() + if(target_zone == "head" && B) + user.visible_message("[user] begins to extract [B] from [target]'s [parse_zone(target_zone)].", + "You begin to extract [B] from [target]'s [parse_zone(target_zone)]...") + return TRUE if(!organs.len) to_chat(user, "There are no removeable organs in [target]'s [parse_zone(target_zone)]!") return -1 @@ -262,6 +267,13 @@ I.status &= ~ORGAN_CUT_AWAY else if(current_type == "extract") + var/mob/living/simple_animal/borer/B = target.has_brain_worms() + if(target_zone == "head" && B && B.host == target) + user.visible_message("[user] successfully extracts [B] from [target]'s [parse_zone(target_zone)]!", + "You successfully extract [B] from [target]'s [parse_zone(target_zone)].") + add_logs(user, target, "surgically removed [B] from", addition="INTENT: [uppertext(user.a_intent)]") + B.leave_host() + return FALSE if(I && I.owner == target) user.visible_message(" [user] has separated and extracts [target]'s [I] with [tool].", " You have separated and extracted [target]'s [I] with [tool].") diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm new file mode 100644 index 00000000000..d7fe8b7fb53 --- /dev/null +++ b/code/modules/surgery/remove_embedded_object.dm @@ -0,0 +1,65 @@ +/datum/surgery/embedded_removal + name = "Removal of Embedded Objects" + steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/remove_object,/datum/surgery_step/generic/cauterize) + possible_locs = list("head", "chest", "l_arm", "l_hand", "r_arm", "r_hand","r_leg", "r_foot", "l_leg", "l_foot", "groin") + +/datum/surgery/embedded_removal/synth + steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch,/datum/surgery_step/remove_object,/datum/surgery_step/robotics/external/close_hatch) + +/datum/surgery/embedded_removal/can_start(mob/user, mob/living/carbon/human/target) + if(!istype(target)) + return 0 + var/obj/item/organ/external/affected = target.get_organ(user.zone_sel.selecting) + if(!affected) + return 0 + if(affected.status & ORGAN_ROBOT) + return 0 + return 1 + +/datum/surgery/embedded_removal/synth/can_start(mob/user, mob/living/carbon/human/target) + if(!istype(target)) + return 0 + var/obj/item/organ/external/affected = target.get_organ(user.zone_sel.selecting) + if(!affected) + return 0 + if(!(affected.status & ORGAN_ROBOT)) + return 0 + + return 1 + +/datum/surgery_step/remove_object + name = "Remove Embedded Objects" + time = 32 + accept_hand = 1 + var/obj/item/organ/external/L = null + + +/datum/surgery_step/remove_object/begin_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + L = surgery.organ_ref + if(L) + user.visible_message("[user] looks for objects embedded in [target]'s [parse_zone(user.zone_sel.selecting)].", "You look for objects embedded in [target]'s [parse_zone(user.zone_sel.selecting)]...") + else + user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_sel.selecting)].", "You look for [target]'s [parse_zone(user.zone_sel.selecting)]...") + + +/datum/surgery_step/remove_object/end_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(L) + if(ishuman(target)) + var/mob/living/carbon/human/H = target + var/objects = 0 + for(var/obj/item/I in L.embedded_objects) + objects++ + I.forceMove(get_turf(H)) + L.embedded_objects -= I + if(!H.has_embedded_objects()) + H.clear_alert("embeddedobject") + + if(objects > 0) + user.visible_message("[user] sucessfully removes [objects] objects from [H]'s [L]!", "You successfully remove [objects] objects from [H]'s [L.name].") + else + to_chat(user, "You find no objects embedded in [H]'s [L]!") + + else + to_chat(user, "You can't find [target]'s [parse_zone(user.zone_sel.selecting)], let alone any objects embedded in it!") + + return 1 \ No newline at end of file diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index e1dc252412d..2815905eedc 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -12,7 +12,7 @@ /datum/surgery/cybernetic_repair/internal name = "Internal Component Manipulation" steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch,/datum/surgery_step/robotics/manipulate_robotic_organs) - possible_locs = list("eyes", "chest","head","groin") + possible_locs = list("eyes", "chest","head","groin","l_arm","r_arm") requires_organic_bodypart = 0 /datum/surgery/cybernetic_amputation @@ -538,7 +538,7 @@ add_logs(user, target, "surgically removed [affected.name] from", addition="INTENT: [uppertext(user.a_intent)]")//log it - var/atom/movable/thing = affected.droplimb(1,DROPLIMB_EDGE) + var/atom/movable/thing = affected.droplimb(1,DROPLIMB_SHARP) if(istype(thing,/obj/item)) user.put_in_hands(thing) diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 127077a621d..48ee29f3f45 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -90,7 +90,7 @@ if(target_zone == surgery.location) initiate(user, target, target_zone, tool, surgery) return 1//returns 1 so we don't stab the guy in the dick or wherever. - if(isrobot(user) && user.a_intent != I_HARM) //to save asimov borgs a LOT of heartache + if(isrobot(user) && user.a_intent != INTENT_HARM) //to save asimov borgs a LOT of heartache return 1 return 0 diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index b0014a391a3..b8637c3f797 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -5,7 +5,7 @@ icon_state = "retractor" materials = list(MAT_METAL=6000, MAT_GLASS=3000) flags = CONDUCT - w_class = 2 + w_class = WEIGHT_CLASS_SMALL origin_tech = "materials=1;biotech=1" @@ -16,7 +16,7 @@ icon_state = "hemostat" materials = list(MAT_METAL=5000, MAT_GLASS=2500) flags = CONDUCT - w_class = 1 + w_class = WEIGHT_CLASS_TINY origin_tech = "materials=1;biotech=1" attack_verb = list("attacked", "pinched") @@ -28,7 +28,7 @@ icon_state = "cautery" materials = list(MAT_METAL=2500, MAT_GLASS=750) flags = CONDUCT - w_class = 1 + w_class = WEIGHT_CLASS_TINY origin_tech = "materials=1;biotech=1" attack_verb = list("burnt") @@ -43,8 +43,7 @@ flags = CONDUCT force = 15.0 sharp = 1 - edge = 1 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL origin_tech = "materials=1;biotech=1" attack_verb = list("drilled") @@ -63,8 +62,7 @@ flags = CONDUCT force = 10.0 sharp = 1 - edge = 1 - w_class = 1 + w_class = WEIGHT_CLASS_TINY throwforce = 5.0 throw_speed = 3 throw_range = 5 @@ -123,13 +121,12 @@ flags = CONDUCT force = 15.0 sharp = 1 - edge = 1 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL throwforce = 9.0 throw_speed = 3 throw_range = 5 materials = list(MAT_METAL=10000, MAT_GLASS=6000) - origin_tech = "materials=1;biotech=1" + origin_tech = "biotech=1;combat=1" attack_verb = list("attacked", "slashed", "sawed", "cut") //misc, formerly from code/defines/weapons.dm @@ -138,7 +135,7 @@ icon = 'icons/obj/surgery.dmi' icon_state = "bone-gel" force = 0 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL throwforce = 1.0 origin_tech = "materials=1;biotech=1" @@ -149,7 +146,7 @@ force = 0 throwforce = 1.0 origin_tech = "materials=1;biotech=1" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL /obj/item/weapon/bonesetter name = "bone setter" @@ -159,7 +156,7 @@ throwforce = 9.0 throw_speed = 3 throw_range = 5 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL attack_verb = list("attacked", "hit", "bludgeoned") origin_tech = "materials=1;biotech=1" @@ -168,6 +165,6 @@ desc = "Nanotrasen brand surgical drapes provide optimal safety and infection control." icon = 'icons/obj/surgery.dmi' icon_state = "surgical_drapes" - w_class = 1 + w_class = WEIGHT_CLASS_SMALL origin_tech = "biotech=1" attack_verb = list("slapped") diff --git a/code/modules/telesci/bscrystal.dm b/code/modules/telesci/bscrystal.dm index 113d2abd751..f2d9ad86436 100644 --- a/code/modules/telesci/bscrystal.dm +++ b/code/modules/telesci/bscrystal.dm @@ -4,8 +4,8 @@ desc = "A glowing bluespace crystal, not much is known about how they work. It looks very delicate." icon = 'icons/obj/telescience.dmi' icon_state = "bluespace_crystal" - w_class = 1 - origin_tech = "bluespace=4;materials=3" + w_class = WEIGHT_CLASS_TINY + origin_tech = "bluespace=6;materials=3" points = 50 var/blink_range = 8 // The teleport range when crushed/thrown at someone. refined_type = /obj/item/stack/sheet/bluespace_crystal @@ -44,7 +44,7 @@ /obj/item/weapon/ore/bluespace_crystal/artificial name = "artificial bluespace crystal" desc = "An artificially made bluespace crystal, it looks delicate." - origin_tech = "bluespace=2" + origin_tech = "bluespace=3;plasmatech=4" blink_range = 4 // Not as good as the organic stuff! points = 0 // nice try refined_type = null @@ -58,7 +58,7 @@ var/global/list/datum/stack_recipe/bluespace_crystal_recipes = list(new/datum/st icon = 'icons/obj/telescience.dmi' icon_state = "polycrystal" desc = "A stable polycrystal, made of fused-together bluespace crystals. You could probably break one off." - origin_tech = "bluespace=4;materials=3" + origin_tech = "bluespace=6;materials=3" attack_verb = list("bluespace polybashed", "bluespace polybattered", "bluespace polybludgeoned", "bluespace polythrashed", "bluespace polysmashed") toolspeed = 1 usesound = 'sound/items/Deconstruct.ogg' diff --git a/code/modules/telesci/gps.dm b/code/modules/telesci/gps.dm index 7558fd602ee..8de7977ce2f 100644 --- a/code/modules/telesci/gps.dm +++ b/code/modules/telesci/gps.dm @@ -4,9 +4,9 @@ var/list/GPS_list = list() desc = "Helping lost spacemen find their way through the planets since 2016." icon = 'icons/obj/telescience.dmi' icon_state = "gps-c" - w_class = 2 + w_class = WEIGHT_CLASS_SMALL slot_flags = SLOT_BELT - origin_tech = "programming=2;engineering=2" + origin_tech = "materials=2;magnets=1;bluespace=2" var/gpstag = "COM0" var/emped = 0 var/turf/locked_location @@ -32,7 +32,7 @@ var/list/GPS_list = list() emped = FALSE overlays -= "emp" overlays += "working" - + /obj/item/device/gps/AltClick(mob/user) if(CanUseTopic(user, inventory_state) != STATUS_INTERACTIVE) return 1 //user not valid to use gps @@ -51,7 +51,7 @@ var/list/GPS_list = list() if(!tracking) to_chat(user, "[src] is turned off. Use alt+click to toggle it back on.") return - + var/obj/item/device/gps/t = "" var/gps_window_height = 110 + GPS_list.len * 20 // Variable window height, depending on how many GPS units there are to show if(emped) @@ -82,12 +82,12 @@ var/list/GPS_list = list() /obj/item/device/gps/Topic(href, href_list) if(..(state = inventory_state)) return 1 - + if(href_list["tag"] ) var/a = input("Please enter desired tag.", name, gpstag) as text|null if(!a || ..(state = inventory_state)) return 1 - + a = uppertext(sanitize(copytext(a, 1, 5))) if(src.loc == usr) gpstag = a @@ -112,8 +112,8 @@ var/list/GPS_list = list() gpstag = "BORG0" desc = "A mining cyborg internal positioning system. Used as a recovery beacon for damaged cyborg assets, or a collaboration tool for mining teams." flags = NODROP - -/obj/item/device/gps/internal + +/obj/item/device/gps/internal icon_state = null flags = ABSTRACT gpstag = "Eerie Signal" @@ -162,4 +162,4 @@ var/list/GPS_list = list() clear() tagged = null fast_processing.Remove(src) - . = ..() \ No newline at end of file + . = ..() diff --git a/code/modules/vehicle/janicart.dm b/code/modules/vehicle/janicart.dm index dfdd0ffc03c..ed76e1c2d3d 100644 --- a/code/modules/vehicle/janicart.dm +++ b/code/modules/vehicle/janicart.dm @@ -36,7 +36,7 @@ desc = "An upgrade for mobile janicarts." icon = 'icons/obj/vehicles.dmi' icon_state = "upgrade" - + origin_tech = "materials=3;engineering=4" /obj/vehicle/janicart/Move(atom/OldLoc, Dir) ..() diff --git a/code/modules/vehicle/vehicle.dm b/code/modules/vehicle/vehicle.dm index 2a1ea4c7d64..bdd8ca39c90 100644 --- a/code/modules/vehicle/vehicle.dm +++ b/code/modules/vehicle/vehicle.dm @@ -61,7 +61,7 @@ desc = "A small grey key." icon = 'icons/obj/vehicles.dmi' icon_state = "key" - w_class = 1 + w_class = WEIGHT_CLASS_TINY //BUCKLE HOOKS @@ -159,4 +159,4 @@ spaceworthy = TRUE /obj/vehicle/space/Process_Spacemove(direction) - return 1 \ No newline at end of file + return 1 diff --git a/code/world.dm b/code/world.dm index ebf4865a1a8..e293058cdf6 100644 --- a/code/world.dm +++ b/code/world.dm @@ -244,6 +244,27 @@ var/world_topic_spam_protect_time = world.timeofday for(var/client/C in clients) to_chat(C, "PR: [input["announce"]]") + else if("kick" in input) + /* + We have a kick request over coms. + Only needed portion is the ckey + */ + if(!key_valid) + return keySpamProtect(addr) + + var/client/C + + for(var/client/K in clients) + if(K.ckey == input["kick"]) + C = K + break + if(!C) + return "No client with that name on server" + + del(C) + + return "Kick Successful" + /proc/keySpamProtect(var/addr) if(world_topic_spam_protect_ip == addr && abs(world_topic_spam_protect_time - world.time) < 50) spawn(50) @@ -375,7 +396,7 @@ var/world_topic_spam_protect_time = world.timeofday s += "[station_name()]"; s += " (" - s += "" //Change this to wherever you want the hub to link to. + s += "" //Change this to wherever you want the hub to link to. s += "[game_version]" s += "" s += ")" diff --git a/config/example/admins.txt b/config/example/admins.txt index 0e89ae17e23..c42f756a87d 100644 --- a/config/example/admins.txt +++ b/config/example/admins.txt @@ -5,4 +5,4 @@ # Ranks can be anything defined in admin_ranks.txt # ###################################################################### -# example - Admin +# example - Hosting Provider diff --git a/config/example/config.txt b/config/example/config.txt index 60702180691..5617b5ad039 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -206,9 +206,6 @@ ALLOW_HOLIDAYS ##Defines the ticklag for the world. 0.9 is the normal one, 0.5 is smoother. TICKLAG 0.5 -## Defines if Tick Compensation is used. It results in a minor slowdown of movement of all mobs, but attempts to result in a level movement speed across all ticks. Recommended if tickrate is lowered. -TICKCOMP 1 - ## Whether the server will talk to other processes through socket_talk SOCKET_TALK 0 diff --git a/config/example/game_options.txt b/config/example/game_options.txt index 5d82bfb425d..7246e0773fa 100644 --- a/config/example/game_options.txt +++ b/config/example/game_options.txt @@ -38,17 +38,17 @@ REVIVAL_BRAIN_LIFE -1 ## We suggest editing these variabled in-game to find a good speed for your server. To do this you must be a high level admin. Open the 'debug' tab ingame. Select "Debug Controller" and then, in the popup, select "Configuration". These variables should have the same name. ## These values get directly added to values and totals in-game. To speed things up make the number negative, to slow things down, make the number positive. -## These modify the run/walk speed of all mobs before the mob-specific modifiers are applied. +## These modify the run/walk speed of all mobs before the mob-specific modifiers are applied. RUN_SPEED 1 WALK_SPEED 4 ## The variables below affect the movement of specific mob types. -HUMAN_DELAY 0 -ROBOT_DELAY 0 -MONKEY_DELAY 0 -ALIEN_DELAY 0 -METROID_DELAY 0 -ANIMAL_DELAY 0 +HUMAN_DELAY 1.5 +ROBOT_DELAY 1.5 +MONKEY_DELAY 1.5 +ALIEN_DELAY 1.5 +SLIME_DELAY 1.5 +ANIMAL_DELAY 2.5 ## Comment for "normal" explosions, which ignore obstacles ## Uncomment for explosions that react to doors and walls diff --git a/config/title_screens/LICENSE.txt b/config/title_screens/LICENSE.txt new file mode 100644 index 00000000000..831689b417c --- /dev/null +++ b/config/title_screens/LICENSE.txt @@ -0,0 +1,38 @@ +---LICENSE NOTICE--- + +The server operator(s) is responsible for the copyright status of all images placed within the /config/title_screens/images folder unless otherwise noted. + +If an image requires attribution and/or a specific license it is up to the operator(s) to make this information publicly available on either +a website associated with their server or on the server itself. + +If operators(s) allow these configuration files to be public this file can serve that purpose by keeping it properly updated. + +If in the future new images are published to these folders (i.e. in an online code repository) they must explicitly state their +license if said license is not the same as the default licensing found in README.md in the root directory of the project. + +Do not remove this notice. + +---END NOTICE--- + + + + +---EXAMPLES (NOT PART OF ANY LICENSE)--- + +These are examples of properly attrubuted and licensed images. +They are not an actual part of any license under any circumstance. + +rare+foobar.png was created by Mya Quinn on Feburary 28, 2557. It is licensed under a Combative Clowning 3.0 HO-NK license (http://example.com/license/url/). + +Unless otherwise noted all images were created by Cuban Pete on July 26, 2555. They are licensed under the RUMBABEAT Public License.(http://example.com/license/url/). + +---END EXAMPLES (NOT PART OF ANY LICENSE)--- + + + + +---ADD LICENSING INFORMATION BELOW--- + +blank.png and default.dmi use the default licensing found in README.md in the root directory of the project. + + diff --git a/config/title_screens/README.txt b/config/title_screens/README.txt new file mode 100644 index 00000000000..6e7bf166f8f --- /dev/null +++ b/config/title_screens/README.txt @@ -0,0 +1,50 @@ +The enclosed images folder holds the image files used as the title screen for the game. All common formats such as PNG, JPG, and GIF are supported. +Byond's DMI format is also supported, but if you use a DMI only include one image per file and do not give it an icon_state (the text label below the image). + +Keep in mind that the area a title screen fills is a 480px square so you should scale/crop source images to these dimensions first. +The game won't scale these images for you, so smaller images will not fill the screen and larger ones will be cut off. + +Using unnecessarily huge images can cause client side lag and should be avoided. Extremely large GIFs should preferentially be converted to DMIs. +Placing non-image files in the images folder can cause errors. + +You may add as many title screens as you like, if there is more than one a random screen is chosen (see name conventions for specifics). + +--- + +Naming Conventions: + +Every title screen you add must have a unique name. It is allowed to name two things the same if they have different file types, but this should be discouraged. +Avoid using the plus sign "+" and the period "." in names, as these are used internally to classify images. + + +Common Titles: + +Common titles are in the rotation to be displayed all the time. Any name that does not include the character "+" is considered a common title. + +An example of a common title name is "clown". + +The common title screen named "default" is special. It is only used if no other titles are available. You can overwrite "default" safely, but you +should have a title named "default" somewhere in your DMI file if you don't have any other common titles. Because default only runs in the +absence of other titles, if you want it to also appear in the general rotation you must rename it. + +The common title screen named "blank.png" is also special. It is only used to fill space while the real title screen loads. You should leave this file alone. + + +Map Titles: + +Map titles are tied to a specific in game map. To make a map title you format the name like this "(name of a map)+(name of your title)" + +The spelling of the map name is important. It must match exactly the define MAP_NAME found in the relevant .DM file in the /_maps folder in +the root directory. It can also be seen in game in the status menu. Note that there are no spaces between the two names. + +It is absolutely fine to have more than one title tied to the same map. + +An example of a map title name is "Omegastation+splash". + + +Rare Titles: + +Rare titles are a just for fun feature where they will only have a 1% chance of appear in in the title screen pool of a given round. +Add the phrase "rare+" to the beginning of the name. Again note there are no spaces. A title cannot be rare title and a map title at the same time. + +An example of a rare title name is "rare+explosion" \ No newline at end of file diff --git a/config/title_screens/images/blank.png b/config/title_screens/images/blank.png new file mode 100644 index 00000000000..c3167a923bf Binary files /dev/null and b/config/title_screens/images/blank.png differ diff --git a/icons/misc/fullscreen.dmi b/config/title_screens/images/default.dmi similarity index 100% rename from icons/misc/fullscreen.dmi rename to config/title_screens/images/default.dmi diff --git a/html/changelog.html b/html/changelog.html index 894140feb54..2306d8f02f1 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -26,7 +26,7 @@
    Paradise Station

    - Visit our IRC channel: #crew on neko.sneeza.me + Visit our Discord channel:-Click Here- @@ -55,11 +55,695 @@ -->
    + +

    12 July 2017

    +

    Fox McCloud updated:

    +
      +
    • Fixed advanced scanners showing hidden viruses
    • +
    • Fixed changeling panacea curing beneficial viruses
    • +
    • removed blood decal infections
    • +
    • some diseases now bypasse species virus immunity (kuru, TB, and appendicitis)
    • +
    + +

    11 July 2017

    +

    Fethas and tigercat updated:

    +
      +
    • blood trails
    • +
    • blood is now eaiser to decrease/increase .
    • +
    • revamps about every method of adding blood to something, floors, walls, doors, PEOPLE.
    • +
    + +

    10 July 2017

    +

    AffectedArc07 updated:

    +
      +
    • APC frames now have the correct texture
    • +
    +

    Birdtalon updated:

    +
      +
    • Pool contractors have been back to school and can now spell "safety" on the controller correctly.
    • +
    • Minor change to blob description to address grammar issue.
    • +
    +

    Citinited updated:

    +
      +
    • Superfart once again works ass intended.
    • +
    +

    Fox McCloud updated:

    +
      +
    • Radiation poisoning no longer permastuns, but deals burn damage now and has increased mutation chances
    • +
    • adds in electric guitars
    • +
    • can now craft violins and electric guitars
    • +
    • purchase electric guitars at the cargo store
    • +
    • service borgs now have an electric guitar, too
    • +
    • lowered the price of instruments, at cargo store, to 500
    • +
    • Fixed violins not having an in-hand icon
    • +
    + +

    08 July 2017

    +

    Citinited updated:

    +
      +
    • Rainbow and mime crayons will now change colour as intended.
    • +
    +

    Fox McCloud updated:

    +
      +
    • Advanced mop slightly slower at cleaning and holds less reagents, but now regenerates water if turned on
    • +
    • Blood (on the floor) that has viruses in it will now properly infect you, if you get near
    • +
    +

    Kyep updated:

    +
      +
    • It is no longer possible to prioritize a job with no open slots, or close any job slots for a job that is already prioritized, as either of these actions could lead to a situation where a job is prioritized without people being able to join as it.
    • +
    + +

    05 July 2017

    +

    Purpose2 updated:

    +
      +
    • Anomalies will once again drop cores.
    • +
    + +

    04 July 2017

    +

    Birdtalon updated:

    +
      +
    • Traitor medical chemists can now access syndicate poison bottles.
    • +
    +

    Citinited updated:

    +
      +
    • AIs and cyborgs can now toggle liquid dispensers by ctrl-clicking them, and can make them dispense foam by alt-clicking.
    • +
    +

    Citinited & LightFire53 updated:

    +
      +
    • Adds the plasmaman coroner suit, the plasmaman geneticist suit, and the plasmaman virologist suit. Spooky purple skeletons everywhere rejoice!
    • +
    +

    Fethas updated:

    +
      +
    • Adds medical gowns to medical wardrobes.
    • +
    +

    Fox McCloud updated:

    +
      +
    • Syndicate bombs now have visible timers for observers
    • +
    • Syndicate bombs tick more often
    • +
    • Syndnicate bombs can be deconstructed into plasteel if it is fully defused and has no bomb core
    • +
    • Can make Cryo, Pyro, and time released chemical grenades at R&D
    • +
    • Can make syndicate chemical bombs utilizing crafting
    • +
    • love just got more powerful; it now prevents a mob from being on anything other than help intent
    • +
    • IPCs can now process the love reagent
    • +
    • Adds in radio jammers to the traitor uplink
    • +
    • Adds in breathing tube augment to R&D
    • +
    • Adds in arm toolset augment to R&D
    • +
    • IPC cell charging device is now inside their right arm, as opposed to chest
    • +
    • IPC cell charging device can now be produced in mech fabricators
    • +
    +

    Ionward updated:

    +
      +
    • Greys now have properly fitting sprites for most head clothing items!
    • +
    +

    Kyep updated:

    +
      +
    • Gimmick Teams are now more configurable.
    • +
    +

    Vivalas updated:

    +
      +
    • "Tweaks" SecHUDs to only display criminal status of people if their face is uncovered or they have no ID.
    • +
    + +

    03 July 2017

    +

    Fethas updated:

    +
      +
    • fixes issue with hand teleporter not working in active hands
    • +
    +

    fludd12 updated:

    +
      +
    • Greys are now PROPERLY immune to sulfuric acid.
    • +
    • Greys don't pretend to touch their heads when they don't manage to anymore.
    • +
    + +

    01 July 2017

    +

    Fox McCloud updated:

    +
      +
    • Re-enables object embedding system; embedding objects now cause more damage than before
    • +
    • Adds in throwing stars kit to the traitor uplink
    • +
    • bullets no longer leave shrapnel
    • +
    + +

    30 June 2017

    +

    fludd12 updated:

    +
      +
    • Greys treat Sulfuric Acid as if it were water. They also treat water as if it were sulfuric acid.
    • +
    • Grey language is now Z-level wide, but requires you to be able to put a finger to your temple. (Requires at least one hand not disabled and not stunned.)
    • +
    • Remote Talk is buffed to have a range of two screens, and has some minor formatting changes!
    • +
    • Remote Talk no longer lets you magically know the true name of whoever you speak with.
    • +
    + +

    29 June 2017

    +

    Fox McCloud updated:

    +
      +
    • Fixes limbs being an open wound after augmentation
    • +
    +

    Kluys updated:

    +
      +
    • Bob ross painting in the captains office called "calming painting". +Also changes around the entertainment monitor and light switch to accomodate.
    • +
    • Clown painting was named "\improper mech painting"
    • +
    + +

    28 June 2017

    +

    Fox McCloud updated:

    +
      +
    • Fix's IPC head customization
    • +
    +

    Purpose2 and Re-Opened by Fethas updated:

    +
      +
    • Rare Sentience event, the mice now want coffee!
    • +
    + +

    27 June 2017

    +

    Alexshreds updated:

    +
      +
    • EMPs now disable radios for a period of time
    • +
    +

    Citinited updated:

    +
      +
    • Adds the Rapid Pipe Dispenser (RPD). All Atmospherics Technician lockers and the Chief Engineer's locker get one each.
    • +
    +

    Code Fethas and Sprites Phantasmicdream updated:

    +
      +
    • Fancy Victorian Clothes
    • +
    +

    FlattestGuitar updated:

    +
      +
    • defibs work even if you don't target the chest
    • +
    • Chaplain's soul stone is now opt-in.
    • +
    +

    Fox McCloud updated:

    +
      +
    • Can now augment all non-head limbs with surgery
    • +
    • Can select the company design of a limb by using a robot part in your hands
    • +
    +

    Kyep updated:

    +
      +
    • Gamma ship now looks like a real supply pod/ship, doesn't encourage wizards/vampires to hide in it, and has been updated with a wall-mounted charger and smarter layout.
    • +
    • Fixed a bug causing gamma armory mech recharger to be unusable after gamma alert was declared.
    • +
    • Admins may now spawn 'Gimmick' teams, including Janitorial ERT, Paranormal ERT, and more. Any admin outfit, any mission, spawned anywhere.
    • +
    • Paranormal ERT outfit now exists. It acts like a red security ERT, except with focus on fighting paranormal threats.
    • +
    • Janitorial ERT now gets ERT headset, not centcom headset. Also, they now get a survival box, and a flashlight.
    • +
    • New 'department' shuttle now has more public-access seating.
    • +
    +

    ProperPants updated:

    +
      +
    • Plasmaman virologists now spawn with a medical plasmasuit instead of an assistant one.
    • +
    +

    Purpose2 updated:

    +
      +
    • Water coolers have been fitted with better bolts, enabling them to be loosened and moved.
    • +
    • Antag barbers scissors now have the same name as regular scissors.
    • +
    • AIs door open link is now [O] rather than [OPEN].
    • +
    • The Syndicate once more recognises the Coroner as a member of the medical team for purposes for uplink items.
    • +
    • The chef may now tap into the Syndicate's poison networks for use in his dishes.
    • +
    • The chef's supply crate now comes with another rolling pin. Stop misplacing these.
    • +
    +

    tigercat2000 updated:

    +
      +
    • Karma returned to the Special Verbs tab
    • +
    + +

    26 June 2017

    +

    Crazylemon64 updated:

    +
      +
    • TK can now manipulate adjacent tiles. Use throw mode to override this if you want to move an object a single tile.
    • +
    • TK can now remotely manipulate item stacks.
    • +
    • TK can now remotely operate an RCD
    • +
    • TK now behaves more consistently regarding interacting with various objects remotely
    • +
    +

    Kyep updated:

    +
      +
    • ID card consoles can now be used to prioritize any on-station job, including head jobs and karma jobs.
    • +
    • Playing as a drone now requires 10h of playtime.
    • +
    • Admin-ghosts can now interact with (ie: activate) the drone fab without having to spawn in as engineer to do so.
    • +
    • Prioritized jobs now lose their priority status once all their slots are filled. In the event someone with a formerly prioritized job cryos, the HoP may want to re-prioritize the job.
    • +
    +

    Purpose2 updated:

    +
      +
    • Coroners are more battlehardened, and thus don't throw up around dead bodies anymore.
    • +
    + +

    25 June 2017

    +

    Kyep updated:

    +
      +
    • Trial admins no longer see a permissions error when opening player panel.
    • +
    + +

    24 June 2017

    +

    Allfd updated:

    +
      +
    • Ported growl and howl sounds from Goon
    • +
    • Added growl and howl emotes to Vulpkanin
    • +
    +

    Kyep updated:

    +
      +
    • Activating a dust implant no longer causes NODROP items to drop.
    • +
    +

    Purpose2 updated:

    +
      +
    • The *slap emote now has a cooldown like all other noise making emotes.
    • +
    +

    SamHPurp updated:

    +
      +
    • The Coroner will respect the CMO's Authoritah.
    • +
    + +

    23 June 2017

    +

    Kyep updated:

    +
      +
    • Smite/Bless commands are now restricted to Game Admins. (admins with R_EVENT)
    • +
    • Admins can now access telecomms while ghosted.
    • +
    +

    Vivalas updated:

    +
      +
    • Buckling mobs to beds now displays them correctly.
    • +
    + +

    22 June 2017

    +

    Crazylemon64 updated:

    +
      +
    • Cloners now malfunction if the original comes back to life
    • +
    +

    Purpose2 updated:

    +
      +
    • RCDs can no longer construct multiple airlocks on a single tile
    • +
    + +

    21 June 2017

    +

    tigercat2000 updated:

    +
      +
    • Changelings are now tentacle monsters. Give them a schoolgirl outfit.
    • +
    + +

    20 June 2017

    +

    Purpose2 updated:

    +
      +
    • Fixes Fluorine's non-functionality in plants.
    • +
    + +

    19 June 2017

    +

    Fox McCloud updated:

    +
      +
    • Diona nutrition bar should no longer flicker constantly
    • +
    + +

    18 June 2017

    +

    Citinited updated:

    +
      +
    • Using a screwdriver on a camera console will now deconstruct it instead of opening the camera window.
    • +
    + +

    16 June 2017

    +

    Alffd updated:

    +
      +
    • Makes kittens visible when resting
    • +
    +

    Fethas updated:

    +
      +
    • Public Wiggler Tail
    • +
    • Chaplains have some new clothes in thier locker.
    • +
    +

    Fox McCloud updated:

    +
      +
    • tweaked Revenant and slaughter demon movement speed
    • +
    • Spiderbots have been slowed down to human levels
    • +
    • Spiderbots melee attack consistently deals 2 damage, deals burn, and plays a sparks sound
    • +
    • Spiderbots no longer have a built in camera
    • +
    • Spiderbots now have 40 health (previously 10)
    • +
    • Attacking a spiderbot more consistent with other simple mobs
    • +
    • Healing a spiderbot with a welder now plays a sound and incurs a cooldown
    • +
    • Spiderbots can no longer carry items
    • +
    • Emagging a spiderbot makes it loyal to the person who emagged it. Additionally, it gains 20 extra health, its shocks will do 15 damage, and will explode on death
    • +
    +

    FreeStylaLT updated:

    +
      +
    • Changed Araneus' spawn location so he wouldn't break tables at round-start anymore
    • +
    +

    Kyep updated:

    +
      +
    • HoPs can now set jobs as 'priority'. Priority jobs are highlighted on the latejoin screen. This allows HoPs to proactively broadcast that they need more people to fill those jobs - and reduces the chance of critical crew shortages.
    • +
    +

    Purpose2 updated:

    +
      +
    • Soylen Viridians are now correctly Soylent Viridians. Nanotrasen will still not confirm rumours of the contents of these nor Soylent Greens however.
    • +
    • Nanotrasen is now more consistent with brand management.
    • +
    • An array of typos, grammatical tweaks and other pedantic fixes.
    • +
    • Adds a jobs board to the Newscaster. See what roles are available before seeing the HoP!
    • +
    +

    TullyBurnalot updated:

    +
      +
    • Autopsy Scanners will now print out Coroner Reports when a pen is used on them
    • +
    +

    alexkar598 updated:

    +
      +
    • Rename Spagetti to Spaghetti
    • +
    + +

    13 June 2017

    +

    KasparoVy updated:

    +
      +
    • Moves a hidden emergency locker to where it is visible.
    • +
    +

    Vivalas updated:

    +
      +
    • Brig timers will now update the records of those who are imprisoned in their cell, as long as their name is entered correctly.
    • +
    • Sentences and arresting officers are announced over the security channel by brig timers, as well as the names of those who end timers manually.
    • +
    + +

    10 June 2017

    +

    Alffd updated:

    +
      +
    • Ports Incoming5643's persistence features for Runtime from TG
    • +
    • Ports additional cat NPC emotes from TG
    • +
    +

    Citinited updated:

    +
      +
    • Disconnecting before the shuttle leaves after having spent karma will no longer prompt you to spend karma.
    • +
    +

    FalseIncarnate updated:

    +
      +
    • Adds Highlander Style, granted to the wielder of Highlander Claymores. This martial art allows you to deflect ranged attacks from the weapons of COWARDS. FOR THE HONOR OF THE HIGHLANDERS!
    • +
    • Highlander now equips combatants with a Highlander claymore instead of a normal claymore. FIGHT ON BROTHERS!
    • +
    + +

    09 June 2017

    +

    Alexshreds updated:

    +
      +
    • Taking mhelps no longer gives mhelping players your IC name
    • +
    +

    FlattyPatty updated:

    +
      +
    • Added forensics gloves for the Detective.
    • +
    +

    Fox McCloud updated:

    +
      +
    • Paramedic door is no longer diamond
    • +
    • Fixes the backwards health analyzer sprite
    • +
    • Remove adrenaline and freedom implants from R&D
    • +
    • Added chem and tracking implants to R&D
    • +
    +

    KasparoVy updated:

    +
      +
    • Adds some sanity checking to the RCS.
    • +
    • The cargo shuttle no longer permits RCS telepads.
    • +
    +

    Kyep updated:

    +
      +
    • glowshrooms are now destroyable with two hits from a wirecutter.
    • +
    • New 'department' shuttle, which can be sent by CC instead of the regular evac shuttle.
    • +
    • The gods have grown tired of prayers requesting freebies, and developed some new curses with which to smite those who would treat them like miracle vending machines.
    • +
    +

    alexkar598 updated:

    +
      +
    • Surgury holosign switch has correct icon at roundstart
    • +
    +

    tigercat2000 updated:

    +
      +
    • You can now zoom in with the Set View Range option in your Preferences tab!
    • +
    + +

    08 June 2017

    +

    Alexshreds updated:

    +
      +
    • Hyphema and Ocular Restoration are now possible to evolve from viruses
    • +
    + +

    07 June 2017

    +

    Fethas updated:

    +
      +
    • adds cardboard cutouts..now you can trick the station into thinkings it shadowlings!
    • +
    +

    tigercat2000 updated:

    +
      +
    • Luxury versions of the bluespace shelter capsule! Currently not obtainable.
    • +
    • Black Carpet can now be crafted using a stack of carpet and a crayon.
    • +
    • Black fancy tables can now be crafted using Black Carpet.
    • +
    • Shower curtains can now be recoloured with crayons, unscrewed from the floor, disassembled with wire cutters, and reassembled using cloth, plastic, and a metal rod.
    • +
    + +

    06 June 2017

    +

    DarkPyrolord updated:

    +
      +
    • Plasmamen should be able to become vampires on normal vampire rounds.
    • +
    +

    Fox McCloud updated:

    +
      +
    • adjust the mech tesla, immolator, and disabler techs to bring it in line with the tech refactor
    • +
    +

    Kyep updated:

    +
      +
    • Instagib lasers now work against non-carbon mobs, such as animals and borgs.
    • +
    +

    imsxz updated:

    +
      +
    • Sergeant Araneus now spawns at full HP.
    • +
    + +

    04 June 2017

    +

    Crazylemon64 updated:

    +
      +
    • Clone's hearts now start operational
    • +
    • EMP'd clone pods can now be emptied again
    • +
    +

    FreeStylaLT updated:

    +
      +
    • Cell 6 is now connected to the atmos system properly.
    • +
    + +

    03 June 2017

    +

    FlattestGuitar updated:

    +
      +
    • PACMAN boards and pico manipulators now have proper research levels
    • +
    + +

    01 June 2017

    +

    Alexshreds updated:

    +
      +
    • Ian's hardsuit is no longer invisible
    • +
    +

    FreeStylaLT updated:

    +
      +
    • Gamma armory no longer affected by brig events.
    • +
    • Outer armory windoor access has been lowered to Security Officer+, instead of Warden+.
    • +
    • Removed a redundant door in the brig's main hallway.
    • +
    • Removed a redundant fire alarm, placed it elsewhere in the north hallway.
    • +
    +

    Kyep updated:

    +
      +
    • ERTs no longer start penniless, unable to afford even basic food, or coffee.
    • +
    +

    Purpose2 updated:

    +
      +
    • Adds a build-time on Tables & Racks.
    • +
    +

    tigercat2000 updated:

    +
      +
    • Upgrading the Exosuit Fabricator and Protolathe with the right parts will lower item costs
    • +
    • Added an item to Cargo that RnD can use
    • +
    • Tweaks the tech levels for many items and the required tech levels for their designs. This is to make RnD more of a station-wide effort.
    • +
    • RnD tech level skipping skips 1 level further
    • +
    • The Destructive Analyzer will only prompt the user if tech levels will not be increased.
    • +
    • The Experimentor can no longer raise tech levels of items. It can however discover the tech levels of strange objects.
    • +
    • Removes the Autolathe from the RnD Room.
    • +
    • Removed the Forensic Scanner from RnD. Cargo can order a Forensics crate now.
    • +
    + +

    31 May 2017

    +

    FalseIncarnate updated:

    +
      +
    • Shrimp and electric eels properly lay their own eggs again if they have a suitable partner.
    • +
    +

    Xantholne updated:

    +
      +
    • Virologists actually spawn with their skirt
    • +
    • Coroner now can finally spawn with some Medical loadout clothes.
    • +
    • Medical Doctors will stop spawning with Chemist/Virologist Skirts
    • +
    • CMOs won't spawn with a virologist skirt anymore.
    • +
    • Virologists and Chemists wont spawn with a Medical Doctor skirt anymore.
    • +
    + +

    30 May 2017

    +

    Fruerlund updated:

    +
      +
    • You can now take out pens by CTRL Clicking PDAs
    • +
    + +

    29 May 2017

    +

    Jovaniph updated:

    +
      +
    • Two welding goggles on in the atmos room
    • +
    +

    Purpose2 updated:

    +
      +
    • Increases the size of Megaphones.
    • +
    • Headset encryption keys are now 'small' items.
    • +
    +

    Tayyyyyyy, FlattestGuitar updated:

    +
      +
    • A targeting mode-esque message and sound when you point at something with a gun in your active hand
    • +
    + +

    28 May 2017

    +

    Fox McCloud updated:

    +
      +
    • Fixes various mobs moving around faster than intended
    • +
    + +

    27 May 2017

    +

    Crazylemon64 updated:

    +
      +
    • Cloning now can be halted at any point, but ejecting too early may result in clones with missing body parts.
    • +
    • Slime people now no longer spontaneously die
    • +
    + +

    26 May 2017

    +

    FlattyPatty updated:

    +
      +
    • Removes gateway hotel xeno embryo for the crew's safety.
    • +
    + +

    25 May 2017

    +

    FalseIncarnate updated:

    +
      +
    • Matter Eater now requires your mouth be uncovered before you can eat matter.
    • +
    +

    Fethas updated:

    +
      +
    • PLASMAMAN ATMOS SUITS ARE NOW THE SAME AS REGULAR ATMOS SUITS FLAG WISE! AND SO IS THE CE SUIT
    • +
    +

    Kyep updated:

    +
      +
    • Fixed some mapping bugs on Centcom, e.g: shuttle medbay no longer has black walls.
    • +
    +

    Purpose2 updated:

    +
      +
    • Metastation - Adds the Paramedic's cart and locker.
    • +
    • Metastation - Adds a backup set of paramedic keys in the CMO's office.
    • +
    • Metastation - Engine no longer hotwired.
    • +
    • Metastation - Turbine doors now function properly.
    • +
    • Metastation - Toxin Mixing's Controller is now accessible.
    • +
    • Metastation - Moved Containment out a single tile, to fix irregularities with Singularity setups.
    • +
    • Metastation - Reduced redundant redundancies in the Atmos/Wiring.
    • +
    • Metastation - removed blob spawn that was only a few tiles from Cryostorage....
    • +
    • Drones can now grip Tracker Electronics & Vending Refills
    • +
    +

    Tayyyyyyy, PhantasmicDream updated:

    +
      +
    • Skrell can put a pocket sized item in their head tentacles, which can be dislodged via stunning, stripping, or death
    • +
    • Skrell can no longer have their tentacles shaved off
    • +
    • Minor grammar fix for putting stuff that's too big into containers
    • +
    + +

    24 May 2017

    +

    Kyep updated:

    +
      +
    • Every head of staff now has a Department Management Console in their office. This is a very limited version of the ID console that they can use to demote people out of their departments, or move people between jobs in their department. These consoles cannot be used to hire anyone, or to accept cross-department transfers.
    • +
    + +

    23 May 2017

    +

    Fethas updated:

    +
      +
    • Lockets and necklaces to the loadout. Lockets can hold paper and photos
    • +
    • Fethas fluff item
    • +
    +

    Purpose2 updated:

    +
      +
    • Adds functionality for the Atmos/Engineering Minimap to update to the right station.
    • +
    + +

    22 May 2017

    +

    DarkPyrolord updated:

    +
      +
    • Rubber pellets should no longer embed.
    • +
    • Bananas fired from the staff of the honkmother should no longer embed, or be called bullets.
    • +
    +

    Kyep updated:

    +
      +
    • Adds mech-mounted variants of the existing tesla, immolator, and x-ray laser guns, with the same material and tech requirements. Admin-only Seraph mech also gets better weapons.
    • +
    + +

    21 May 2017

    +

    KasparoVy updated:

    +
      +
    • Fixes a bug where only the fat roundstart disability could be selected.
    • +
    + +

    20 May 2017

    +

    FlattestGuitar updated:

    +
      +
    • Adds a jobban-checking verb to the OOC tab.
    • +
    +

    KasparoVy updated:

    +
      +
    • You can now set your character's auto-accent at character creation. The verb still exists in the OOC tab.
    • +
    +

    Kyep updated:

    +
      +
    • Antag roles now have playtime requirements.
    • +
    +

    Kyep: updated:

    +
      +
    • Updated CC map.
    • +
    +

    Xantholne updated:

    +
      +
    • The Coroner now has an actual job icon.
    • +
    + +

    19 May 2017

    +

    IK3I updated:

    +
      +
    • Empath stops telling you how much it hurts to not be human
    • +
    +

    MarsM0nd updated:

    +
      +
    • NanoUI map now shows the up-to-date map.
    • +
    +

    Purpose2 updated:

    +
      +
    • Coroner no longer alt title for MD
    • +
    • Adds Coroner job as its own job.
    • +
    • Adds a swanky new office for the Coroner.
    • +
    + +

    18 May 2017

    +

    FreeStylaLT updated:

    +
      +
    • Added a Newscaster to Brig Toilet.
    • +
    +

    Purpose2 updated:

    +
      +
    • Adds a subtle chat-window reminder for karma on Shuttle departure. Disable/enable via preferences tab.
    • +
    • Removes the ugly round-end karma popup.
    • +
    +

    TullyBurnalot updated:

    +
      +
    • Deaf people cannot hear tape recordings anymore
    • +
    +

    17 May 2017

    +

    Fethas updated:

    +
      +
    • MORE GREY SPRITES!
    • +

    FlattestGuitar updated:

    • You can now silence shoes just by using some duct tape on them! Shoe rags no longer exist.
    +

    Fox McCloud updated:

    +
      +
    • Neuro-toxin bar drink weakens after 13 cycles as opposed to instantly
    • +
    +

    Purpose2 updated:

    +
      +
    • Makes the new posters actually spawnable.
    • +
    • Fixes far more spelling errors than there ever should have been on the posters.
    • +
    +

    Travelling Merchant updated:

    +
      +
    • Adds a hiss emote for Unathi.
    • +

    16 May 2017

    FlattestGuitar updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 9685dd3258c..ab591a7a784 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -4681,6 +4681,491 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - tweak: You can now resist out of straightjackets - tweak: Straightjacketed people can be handcuffed 2017-05-17: + Fethas: + - rscadd: MORE GREY SPRITES! FlattestGuitar: - tweak: You can now silence shoes just by using some duct tape on them! Shoe rags no longer exist. + Fox McCloud: + - tweak: Neuro-toxin bar drink weakens after 13 cycles as opposed to instantly + Purpose2: + - bugfix: Makes the new posters actually spawnable. + - bugfix: Fixes far more spelling errors than there ever should have been on the + posters. + Travelling Merchant: + - rscadd: Adds a hiss emote for Unathi. +2017-05-18: + FreeStylaLT: + - rscadd: Added a Newscaster to Brig Toilet. + Purpose2: + - rscadd: Adds a subtle chat-window reminder for karma on Shuttle departure. Disable/enable + via preferences tab. + - rscdel: Removes the ugly round-end karma popup. + TullyBurnalot: + - bugfix: Deaf people cannot hear tape recordings anymore +2017-05-19: + IK3I: + - bugfix: Empath stops telling you how much it hurts to not be human + MarsM0nd: + - bugfix: NanoUI map now shows the up-to-date map. + Purpose2: + - rscdel: Coroner no longer alt title for MD + - rscadd: Adds Coroner job as its own job. + - rscadd: Adds a swanky new office for the Coroner. +2017-05-20: + FlattestGuitar: + - rscadd: Adds a jobban-checking verb to the OOC tab. + KasparoVy: + - rscadd: You can now set your character's auto-accent at character creation. The + verb still exists in the OOC tab. + Kyep: + - rscadd: Antag roles now have playtime requirements. + 'Kyep:': + - tweak: Updated CC map. + Xantholne: + - bugfix: The Coroner now has an actual job icon. +2017-05-21: + KasparoVy: + - bugfix: Fixes a bug where only the fat roundstart disability could be selected. +2017-05-22: + DarkPyrolord: + - bugfix: Rubber pellets should no longer embed. + - bugfix: Bananas fired from the staff of the honkmother should no longer embed, + or be called bullets. + Kyep: + - rscadd: Adds mech-mounted variants of the existing tesla, immolator, and x-ray + laser guns, with the same material and tech requirements. Admin-only Seraph + mech also gets better weapons. +2017-05-23: + Fethas: + - rscadd: Lockets and necklaces to the loadout. Lockets can hold paper and photos + - rscadd: Fethas fluff item + Purpose2: + - rscadd: Adds functionality for the Atmos/Engineering Minimap to update to the + right station. +2017-05-24: + Kyep: + - rscadd: Every head of staff now has a Department Management Console in their office. + This is a very limited version of the ID console that they can use to demote + people out of their departments, or move people between jobs in their department. + These consoles cannot be used to hire anyone, or to accept cross-department + transfers. +2017-05-25: + FalseIncarnate: + - tweak: Matter Eater now requires your mouth be uncovered before you can eat matter. + Fethas: + - tweak: PLASMAMAN ATMOS SUITS ARE NOW THE SAME AS REGULAR ATMOS SUITS FLAG WISE! + AND SO IS THE CE SUIT + Kyep: + - bugfix: 'Fixed some mapping bugs on Centcom, e.g: shuttle medbay no longer has + black walls.' + Purpose2: + - rscadd: Metastation - Adds the Paramedic's cart and locker. + - rscadd: Metastation - Adds a backup set of paramedic keys in the CMO's office. + - bugfix: Metastation - Engine no longer hotwired. + - bugfix: Metastation - Turbine doors now function properly. + - bugfix: Metastation - Toxin Mixing's Controller is now accessible. + - tweak: Metastation - Moved Containment out a single tile, to fix irregularities + with Singularity setups. + - rscdel: Metastation - Reduced redundant redundancies in the Atmos/Wiring. + - rscdel: Metastation - removed blob spawn that was only a few tiles from Cryostorage.... + - bugfix: Drones can now grip Tracker Electronics & Vending Refills + Tayyyyyyy, PhantasmicDream: + - rscadd: Skrell can put a pocket sized item in their head tentacles, which can + be dislodged via stunning, stripping, or death + - tweak: Skrell can no longer have their tentacles shaved off + - bugfix: Minor grammar fix for putting stuff that's too big into containers +2017-05-26: + FlattyPatty: + - rscdel: Removes gateway hotel xeno embryo for the crew's safety. +2017-05-27: + Crazylemon64: + - rscadd: Cloning now can be halted at any point, but ejecting too early may result + in clones with missing body parts. + - bugfix: Slime people now no longer spontaneously die +2017-05-28: + Fox McCloud: + - bugfix: Fixes various mobs moving around faster than intended +2017-05-29: + Jovaniph: + - rscadd: Two welding goggles on in the atmos room + Purpose2: + - tweak: Increases the size of Megaphones. + - tweak: Headset encryption keys are now 'small' items. + Tayyyyyyy, FlattestGuitar: + - rscadd: A targeting mode-esque message and sound when you point at something with + a gun in your active hand +2017-05-30: + Fruerlund: + - rscadd: You can now take out pens by CTRL Clicking PDAs +2017-05-31: + FalseIncarnate: + - bugfix: Shrimp and electric eels properly lay their own eggs again if they have + a suitable partner. + Xantholne: + - bugfix: Virologists actually spawn with their skirt + - bugfix: Coroner now can finally spawn with some Medical loadout clothes. + - bugfix: Medical Doctors will stop spawning with Chemist/Virologist Skirts + - bugfix: CMOs won't spawn with a virologist skirt anymore. + - bugfix: Virologists and Chemists wont spawn with a Medical Doctor skirt anymore. +2017-06-01: + Alexshreds: + - bugfix: Ian's hardsuit is no longer invisible + FreeStylaLT: + - bugfix: Gamma armory no longer affected by brig events. + - tweak: Outer armory windoor access has been lowered to Security Officer+, instead + of Warden+. + - tweak: Removed a redundant door in the brig's main hallway. + - tweak: Removed a redundant fire alarm, placed it elsewhere in the north hallway. + Kyep: + - bugfix: ERTs no longer start penniless, unable to afford even basic food, or coffee. + Purpose2: + - tweak: Adds a build-time on Tables & Racks. + tigercat2000: + - tweak: Upgrading the Exosuit Fabricator and Protolathe with the right parts will + lower item costs + - rscadd: Added an item to Cargo that RnD can use + - tweak: Tweaks the tech levels for many items and the required tech levels for + their designs. This is to make RnD more of a station-wide effort. + - tweak: RnD tech level skipping skips 1 level further + - tweak: The Destructive Analyzer will only prompt the user if tech levels will + not be increased. + - rscdel: The Experimentor can no longer raise tech levels of items. It can however + discover the tech levels of strange objects. + - rscdel: Removes the Autolathe from the RnD Room. + - rscdel: Removed the Forensic Scanner from RnD. Cargo can order a Forensics crate + now. +2017-06-03: + FlattestGuitar: + - bugfix: PACMAN boards and pico manipulators now have proper research levels +2017-06-04: + Crazylemon64: + - bugfix: Clone's hearts now start operational + - bugfix: EMP'd clone pods can now be emptied again + FreeStylaLT: + - bugfix: Cell 6 is now connected to the atmos system properly. +2017-06-06: + DarkPyrolord: + - bugfix: Plasmamen should be able to become vampires on normal vampire rounds. + Fox McCloud: + - tweak: adjust the mech tesla, immolator, and disabler techs to bring it in line + with the tech refactor + Kyep: + - bugfix: Instagib lasers now work against non-carbon mobs, such as animals and + borgs. + imsxz: + - bugfix: Sergeant Araneus now spawns at full HP. +2017-06-07: + Fethas: + - rscadd: adds cardboard cutouts..now you can trick the station into thinkings it + shadowlings! + tigercat2000: + - rscadd: Luxury versions of the bluespace shelter capsule! Currently not obtainable. + - rscadd: Black Carpet can now be crafted using a stack of carpet and a crayon. + - rscadd: Black fancy tables can now be crafted using Black Carpet. + - rscadd: Shower curtains can now be recoloured with crayons, unscrewed from the + floor, disassembled with wire cutters, and reassembled using cloth, plastic, + and a metal rod. +2017-06-08: + Alexshreds: + - bugfix: Hyphema and Ocular Restoration are now possible to evolve from viruses +2017-06-09: + Alexshreds: + - tweak: Taking mhelps no longer gives mhelping players your IC name + FlattyPatty: + - rscadd: Added forensics gloves for the Detective. + Fox McCloud: + - tweak: Paramedic door is no longer diamond + - bugfix: Fixes the backwards health analyzer sprite + - rscdel: Remove adrenaline and freedom implants from R&D + - rscadd: Added chem and tracking implants to R&D + KasparoVy: + - bugfix: Adds some sanity checking to the RCS. + - bugfix: The cargo shuttle no longer permits RCS telepads. + Kyep: + - rscadd: glowshrooms are now destroyable with two hits from a wirecutter. + - rscadd: New 'department' shuttle, which can be sent by CC instead of the regular + evac shuttle. + - rscadd: The gods have grown tired of prayers requesting freebies, and developed + some new curses with which to smite those who would treat them like miracle + vending machines. + alexkar598: + - bugfix: Surgury holosign switch has correct icon at roundstart + tigercat2000: + - rscadd: You can now zoom in with the Set View Range option in your Preferences + tab! +2017-06-10: + Alffd: + - rscadd: Ports Incoming5643's persistence features for Runtime from TG + - rscadd: Ports additional cat NPC emotes from TG + Citinited: + - bugfix: Disconnecting before the shuttle leaves after having spent karma will + no longer prompt you to spend karma. + FalseIncarnate: + - rscadd: Adds Highlander Style, granted to the wielder of Highlander Claymores. + This martial art allows you to deflect ranged attacks from the weapons of COWARDS. + FOR THE HONOR OF THE HIGHLANDERS! + - tweak: Highlander now equips combatants with a Highlander claymore instead of + a normal claymore. FIGHT ON BROTHERS! +2017-06-13: + KasparoVy: + - bugfix: Moves a hidden emergency locker to where it is visible. + Vivalas: + - rscadd: Brig timers will now update the records of those who are imprisoned in + their cell, as long as their name is entered correctly. + - rscadd: Sentences and arresting officers are announced over the security channel + by brig timers, as well as the names of those who end timers manually. +2017-06-16: + Alffd: + - bugfix: Makes kittens visible when resting + Fethas: + - tweak: Public Wiggler Tail + - rscadd: Chaplains have some new clothes in thier locker. + Fox McCloud: + - tweak: tweaked Revenant and slaughter demon movement speed + - tweak: Spiderbots have been slowed down to human levels + - tweak: Spiderbots melee attack consistently deals 2 damage, deals burn, and plays + a sparks sound + - tweak: Spiderbots no longer have a built in camera + - tweak: Spiderbots now have 40 health (previously 10) + - tweak: Attacking a spiderbot more consistent with other simple mobs + - tweak: Healing a spiderbot with a welder now plays a sound and incurs a cooldown + - tweak: Spiderbots can no longer carry items + - tweak: Emagging a spiderbot makes it loyal to the person who emagged it. Additionally, + it gains 20 extra health, its shocks will do 15 damage, and will explode on + death + FreeStylaLT: + - tweak: Changed Araneus' spawn location so he wouldn't break tables at round-start + anymore + Kyep: + - rscadd: HoPs can now set jobs as 'priority'. Priority jobs are highlighted on + the latejoin screen. This allows HoPs to proactively broadcast that they need + more people to fill those jobs - and reduces the chance of critical crew shortages. + Purpose2: + - bugfix: Soylen Viridians are now correctly Soylent Viridians. Nanotrasen will + still not confirm rumours of the contents of these nor Soylent Greens however. + - bugfix: Nanotrasen is now more consistent with brand management. + - bugfix: An array of typos, grammatical tweaks and other pedantic fixes. + - rscadd: Adds a jobs board to the Newscaster. See what roles are available before + seeing the HoP! + TullyBurnalot: + - rscadd: Autopsy Scanners will now print out Coroner Reports when a pen is used + on them + alexkar598: + - bugfix: Rename Spagetti to Spaghetti +2017-06-18: + Citinited: + - bugfix: Using a screwdriver on a camera console will now deconstruct it instead + of opening the camera window. +2017-06-19: + Fox McCloud: + - tweak: Diona nutrition bar should no longer flicker constantly +2017-06-20: + Purpose2: + - bugfix: Fixes Fluorine's non-functionality in plants. +2017-06-21: + tigercat2000: + - rscadd: Changelings are now tentacle monsters. Give them a schoolgirl outfit. +2017-06-22: + Crazylemon64: + - rscadd: Cloners now malfunction if the original comes back to life + Purpose2: + - bugfix: RCDs can no longer construct multiple airlocks on a single tile +2017-06-23: + Kyep: + - bugfix: Smite/Bless commands are now restricted to Game Admins. (admins with R_EVENT) + - tweak: Admins can now access telecomms while ghosted. + Vivalas: + - bugfix: Buckling mobs to beds now displays them correctly. +2017-06-24: + Allfd: + - rscadd: Ported growl and howl sounds from Goon + - rscadd: Added growl and howl emotes to Vulpkanin + Kyep: + - bugfix: Activating a dust implant no longer causes NODROP items to drop. + Purpose2: + - tweak: The *slap emote now has a cooldown like all other noise making emotes. + SamHPurp: + - bugfix: The Coroner will respect the CMO's Authoritah. +2017-06-25: + Kyep: + - bugfix: Trial admins no longer see a permissions error when opening player panel. +2017-06-26: + Crazylemon64: + - rscadd: TK can now manipulate adjacent tiles. Use throw mode to override this + if you want to move an object a single tile. + - rscadd: TK can now remotely manipulate item stacks. + - rscadd: TK can now remotely operate an RCD + - bugfix: TK now behaves more consistently regarding interacting with various objects + remotely + Kyep: + - rscadd: ID card consoles can now be used to prioritize any on-station job, including + head jobs and karma jobs. + - rscadd: Playing as a drone now requires 10h of playtime. + - bugfix: 'Admin-ghosts can now interact with (ie: activate) the drone fab without + having to spawn in as engineer to do so.' + - bugfix: Prioritized jobs now lose their priority status once all their slots are + filled. In the event someone with a formerly prioritized job cryos, the HoP + may want to re-prioritize the job. + Purpose2: + - rscadd: Coroners are more battlehardened, and thus don't throw up around dead + bodies anymore. +2017-06-27: + Alexshreds: + - tweak: EMPs now disable radios for a period of time + Citinited: + - rscadd: Adds the Rapid Pipe Dispenser (RPD). All Atmospherics Technician lockers + and the Chief Engineer's locker get one each. + Code Fethas and Sprites Phantasmicdream: + - rscadd: Fancy Victorian Clothes + FlattestGuitar: + - tweak: defibs work even if you don't target the chest + - tweak: Chaplain's soul stone is now opt-in. + Fox McCloud: + - rscadd: Can now augment all non-head limbs with surgery + - rscadd: Can select the company design of a limb by using a robot part in your + hands + Kyep: + - rscadd: Gamma ship now looks like a real supply pod/ship, doesn't encourage wizards/vampires + to hide in it, and has been updated with a wall-mounted charger and smarter + layout. + - bugfix: Fixed a bug causing gamma armory mech recharger to be unusable after gamma + alert was declared. + - rscadd: Admins may now spawn 'Gimmick' teams, including Janitorial ERT, Paranormal + ERT, and more. Any admin outfit, any mission, spawned anywhere. + - rscadd: Paranormal ERT outfit now exists. It acts like a red security ERT, except + with focus on fighting paranormal threats. + - bugfix: Janitorial ERT now gets ERT headset, not centcom headset. Also, they now + get a survival box, and a flashlight. + - tweak: New 'department' shuttle now has more public-access seating. + ProperPants: + - rscadd: Plasmaman virologists now spawn with a medical plasmasuit instead of an + assistant one. + Purpose2: + - rscadd: Water coolers have been fitted with better bolts, enabling them to be + loosened and moved. + - tweak: Antag barbers scissors now have the same name as regular scissors. + - tweak: AIs door open link is now [O] rather than [OPEN]. + - bugfix: The Syndicate once more recognises the Coroner as a member of the medical + team for purposes for uplink items. + - rscadd: The chef may now tap into the Syndicate's poison networks for use in his + dishes. + - rscadd: The chef's supply crate now comes with another rolling pin. Stop misplacing + these. + tigercat2000: + - tweak: Karma returned to the Special Verbs tab +2017-06-28: + Fox McCloud: + - bugfix: Fix's IPC head customization + Purpose2 and Re-Opened by Fethas: + - rscadd: Rare Sentience event, the mice now want coffee! +2017-06-29: + Fox McCloud: + - bugfix: Fixes limbs being an open wound after augmentation + Kluys: + - rscadd: 'Bob ross painting in the captains office called "calming painting". + + Also changes around the entertainment monitor and light switch to accomodate.' + - bugfix: Clown painting was named "\improper mech painting" +2017-06-30: + fludd12: + - tweak: Greys treat Sulfuric Acid as if it were water. They also treat water as + if it were sulfuric acid. + - experiment: Grey language is now Z-level wide, but requires you to be able to + put a finger to your temple. (Requires at least one hand not disabled and not + stunned.) + - tweak: Remote Talk is buffed to have a range of two screens, and has some minor + formatting changes! + - bugfix: Remote Talk no longer lets you magically know the true name of whoever + you speak with. +2017-07-01: + Fox McCloud: + - bugfix: Re-enables object embedding system; embedding objects now cause more damage + than before + - rscadd: Adds in throwing stars kit to the traitor uplink + - rscdel: bullets no longer leave shrapnel +2017-07-03: + Fethas: + - bugfix: fixes issue with hand teleporter not working in active hands + fludd12: + - bugfix: Greys are now PROPERLY immune to sulfuric acid. + - bugfix: Greys don't pretend to touch their heads when they don't manage to anymore. +2017-07-04: + Birdtalon: + - tweak: Traitor medical chemists can now access syndicate poison bottles. + Citinited: + - tweak: AIs and cyborgs can now toggle liquid dispensers by ctrl-clicking them, + and can make them dispense foam by alt-clicking. + Citinited & LightFire53: + - rscadd: Adds the plasmaman coroner suit, the plasmaman geneticist suit, and the + plasmaman virologist suit. Spooky purple skeletons everywhere rejoice! + Fethas: + - rscadd: Adds medical gowns to medical wardrobes. + Fox McCloud: + - rscadd: Syndicate bombs now have visible timers for observers + - rscadd: Syndicate bombs tick more often + - rscadd: Syndnicate bombs can be deconstructed into plasteel if it is fully defused + and has no bomb core + - rscadd: Can make Cryo, Pyro, and time released chemical grenades at R&D + - rscadd: Can make syndicate chemical bombs utilizing crafting + - tweak: love just got more powerful; it now prevents a mob from being on anything + other than help intent + - tweak: IPCs can now process the love reagent + - rscadd: Adds in radio jammers to the traitor uplink + - rscadd: Adds in breathing tube augment to R&D + - rscadd: Adds in arm toolset augment to R&D + - tweak: IPC cell charging device is now inside their right arm, as opposed to chest + - rscadd: IPC cell charging device can now be produced in mech fabricators + Ionward: + - bugfix: Greys now have properly fitting sprites for most head clothing items! + Kyep: + - tweak: Gimmick Teams are now more configurable. + Vivalas: + - bugfix: '"Tweaks" SecHUDs to only display criminal status of people if their face + is uncovered or they have no ID.' +2017-07-05: + Purpose2: + - bugfix: Anomalies will once again drop cores. +2017-07-08: + Citinited: + - bugfix: Rainbow and mime crayons will now change colour as intended. + Fox McCloud: + - tweak: Advanced mop slightly slower at cleaning and holds less reagents, but now + regenerates water if turned on + - bugfix: Blood (on the floor) that has viruses in it will now properly infect you, + if you get near + Kyep: + - bugfix: It is no longer possible to prioritize a job with no open slots, or close + any job slots for a job that is already prioritized, as either of these actions + could lead to a situation where a job is prioritized without people being able + to join as it. +2017-07-10: + AffectedArc07: + - tweak: APC frames now have the correct texture + Birdtalon: + - bugfix: Pool contractors have been back to school and can now spell "safety" on + the controller correctly. + - tweak: Minor change to blob description to address grammar issue. + Citinited: + - bugfix: Superfart once again works ass intended. + Fox McCloud: + - tweak: Radiation poisoning no longer permastuns, but deals burn damage now and + has increased mutation chances + - rscadd: adds in electric guitars + - rscadd: can now craft violins and electric guitars + - rscadd: purchase electric guitars at the cargo store + - rscadd: service borgs now have an electric guitar, too + - tweak: lowered the price of instruments, at cargo store, to 500 + - bugfix: Fixed violins not having an in-hand icon +2017-07-11: + Fethas and tigercat: + - rscadd: blood trails + - rscadd: blood is now eaiser to decrease/increase . + - rscadd: revamps about every method of adding blood to something, floors, walls, + doors, PEOPLE. +2017-07-12: + Fox McCloud: + - bugfix: Fixed advanced scanners showing hidden viruses + - bugfix: Fixed changeling panacea curing beneficial viruses + - rscdel: removed blood decal infections + - tweak: some diseases now bypasse species virus immunity (kuru, TB, and appendicitis) diff --git a/html/changelogs/AutoChangeLog-pr-7313.yml b/html/changelogs/AutoChangeLog-pr-7313.yml deleted file mode 100644 index 876d6261017..00000000000 --- a/html/changelogs/AutoChangeLog-pr-7313.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Travelling Merchant" -delete-after: True -changes: - - rscadd: "Adds a hiss emote for Unathi." diff --git a/html/changelogs/AutoChangeLog-pr-7321.yml b/html/changelogs/AutoChangeLog-pr-7321.yml deleted file mode 100644 index 544e9c5ee23..00000000000 --- a/html/changelogs/AutoChangeLog-pr-7321.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fethas" -delete-after: True -changes: - - rscadd: "MORE GREY SPRITES!" diff --git a/html/changelogs/AutoChangeLog-pr-7329.yml b/html/changelogs/AutoChangeLog-pr-7329.yml deleted file mode 100644 index d05e3354eb5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-7329.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Purpose2" -delete-after: True -changes: - - bugfix: "Makes the new posters actually spawnable." - - bugfix: "Fixes far more spelling errors than there ever should have been on the posters." diff --git a/html/templates/header.html b/html/templates/header.html index bcd9595f02b..fac4d7b280a 100644 --- a/html/templates/header.html +++ b/html/templates/header.html @@ -26,7 +26,7 @@
    Paradise Station

    - Visit our IRC channel: #crew on neko.sneeza.me + Visit our Discord channel:-Click Here- @@ -54,4 +54,4 @@ *** DO NOT FUCK WITH THIS FILE OR YOU WILL CAUSE MERGE CONFLICTS. *** --> -
    \ No newline at end of file +
    diff --git a/icons/effects/beam.dmi b/icons/effects/beam.dmi index ec06922a07d..b45657fff51 100644 Binary files a/icons/effects/beam.dmi and b/icons/effects/beam.dmi differ diff --git a/icons/effects/blood.dmi b/icons/effects/blood.dmi index 28e2fd791ff..855c443a203 100644 Binary files a/icons/effects/blood.dmi and b/icons/effects/blood.dmi differ diff --git a/icons/effects/fluidtracks.dmi b/icons/effects/fluidtracks.dmi index 810ecc7f265..d4152ea83bc 100644 Binary files a/icons/effects/fluidtracks.dmi and b/icons/effects/fluidtracks.dmi differ diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index 1c4472d5299..499d5ec1a0d 100644 Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ diff --git a/icons/mob/corgi_back.dmi b/icons/mob/corgi_back.dmi index ffc5e9428db..e3ed70343a3 100644 Binary files a/icons/mob/corgi_back.dmi and b/icons/mob/corgi_back.dmi differ diff --git a/icons/mob/corgi_head.dmi b/icons/mob/corgi_head.dmi index a92b79d564e..8022b8aaf2e 100644 Binary files a/icons/mob/corgi_head.dmi and b/icons/mob/corgi_head.dmi differ diff --git a/icons/mob/custom_synthetic/custom-synthetic.dmi b/icons/mob/custom_synthetic/custom-synthetic.dmi index 29917049c85..08642abaab9 100644 Binary files a/icons/mob/custom_synthetic/custom-synthetic.dmi and b/icons/mob/custom_synthetic/custom-synthetic.dmi differ diff --git a/icons/mob/custom_synthetic/custom_head.dmi b/icons/mob/custom_synthetic/custom_head.dmi index 76ffcedcc82..c66ecb6c8be 100644 Binary files a/icons/mob/custom_synthetic/custom_head.dmi and b/icons/mob/custom_synthetic/custom_head.dmi differ diff --git a/icons/mob/custom_synthetic/custom_lefthand.dmi b/icons/mob/custom_synthetic/custom_lefthand.dmi index 8d469195434..0005ed032e8 100644 Binary files a/icons/mob/custom_synthetic/custom_lefthand.dmi and b/icons/mob/custom_synthetic/custom_lefthand.dmi differ diff --git a/icons/mob/custom_synthetic/custom_righthand.dmi b/icons/mob/custom_synthetic/custom_righthand.dmi index 8d469195434..df64d269aaa 100644 Binary files a/icons/mob/custom_synthetic/custom_righthand.dmi and b/icons/mob/custom_synthetic/custom_righthand.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 3764c64aa50..c67a2b10167 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index 1de6fc4ac1d..e7deeee2ad9 100644 Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ diff --git a/icons/mob/inhands/fluff_lefthand.dmi b/icons/mob/inhands/fluff_lefthand.dmi index 84380f038ed..417ca1bb107 100644 Binary files a/icons/mob/inhands/fluff_lefthand.dmi and b/icons/mob/inhands/fluff_lefthand.dmi differ diff --git a/icons/mob/inhands/fluff_righthand.dmi b/icons/mob/inhands/fluff_righthand.dmi index d93ab0ffc68..6d4f3a2c76b 100644 Binary files a/icons/mob/inhands/fluff_righthand.dmi and b/icons/mob/inhands/fluff_righthand.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 6d0661c8911..ea3bc388638 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index 7dc7b163c54..5956148a393 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi index 8e37ab08a84..8f2c49b09d7 100644 Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ diff --git a/icons/mob/pets.dmi b/icons/mob/pets.dmi index c47ca000f0c..4f46db21354 100644 Binary files a/icons/mob/pets.dmi and b/icons/mob/pets.dmi differ diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi index 99359f5b079..297f9a9aae2 100644 Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ diff --git a/icons/mob/species/drask/suit.dmi b/icons/mob/species/drask/suit.dmi index 6e608313eda..b323ea5c175 100644 Binary files a/icons/mob/species/drask/suit.dmi and b/icons/mob/species/drask/suit.dmi differ diff --git a/icons/mob/species/drask/uniform.dmi b/icons/mob/species/drask/uniform.dmi index 9dd5a22618c..951a2443fef 100644 Binary files a/icons/mob/species/drask/uniform.dmi and b/icons/mob/species/drask/uniform.dmi differ diff --git a/icons/mob/species/grey/eyes.dmi b/icons/mob/species/grey/eyes.dmi index 929facc86b7..2a1d7c1cd35 100644 Binary files a/icons/mob/species/grey/eyes.dmi and b/icons/mob/species/grey/eyes.dmi differ diff --git a/icons/mob/species/grey/helmet.dmi b/icons/mob/species/grey/helmet.dmi new file mode 100644 index 00000000000..ba1d4f860da Binary files /dev/null and b/icons/mob/species/grey/helmet.dmi differ diff --git a/icons/mob/species/grey/mask.dmi b/icons/mob/species/grey/mask.dmi index 7a64321ed42..d47fd4e7232 100644 Binary files a/icons/mob/species/grey/mask.dmi and b/icons/mob/species/grey/mask.dmi differ diff --git a/icons/mob/species/grey/suit.dmi b/icons/mob/species/grey/suit.dmi index 3d61d72dec8..634acbfbffb 100644 Binary files a/icons/mob/species/grey/suit.dmi and b/icons/mob/species/grey/suit.dmi differ diff --git a/icons/mob/species/grey/uniform.dmi b/icons/mob/species/grey/uniform.dmi index 111efe6de65..fdd6a52144c 100644 Binary files a/icons/mob/species/grey/uniform.dmi and b/icons/mob/species/grey/uniform.dmi differ diff --git a/icons/mob/species/plasmaman/helmet.dmi b/icons/mob/species/plasmaman/helmet.dmi index 880e1e7c5eb..258ea305d23 100644 Binary files a/icons/mob/species/plasmaman/helmet.dmi and b/icons/mob/species/plasmaman/helmet.dmi differ diff --git a/icons/mob/species/plasmaman/suit.dmi b/icons/mob/species/plasmaman/suit.dmi index fb428adaadc..3a4720378f7 100644 Binary files a/icons/mob/species/plasmaman/suit.dmi and b/icons/mob/species/plasmaman/suit.dmi differ diff --git a/icons/mob/species/vox/suit.dmi b/icons/mob/species/vox/suit.dmi index b0e9f61d7bf..8c40cb79347 100644 Binary files a/icons/mob/species/vox/suit.dmi and b/icons/mob/species/vox/suit.dmi differ diff --git a/icons/mob/species/vox/uniform.dmi b/icons/mob/species/vox/uniform.dmi index 05550c74c56..6d6ff4abca4 100644 Binary files a/icons/mob/species/vox/uniform.dmi and b/icons/mob/species/vox/uniform.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 03c1180b1dc..89e3eb94136 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi index 891f725aa07..a482ece8b38 100644 Binary files a/icons/mob/ties.dmi and b/icons/mob/ties.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index 7742bdcc755..02990685d64 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/apc_repair.dmi b/icons/obj/apc_repair.dmi index e2179506dce..4aadcd2ebdc 100644 Binary files a/icons/obj/apc_repair.dmi and b/icons/obj/apc_repair.dmi differ diff --git a/icons/obj/assemblies.dmi b/icons/obj/assemblies.dmi index 2fd457f5638..62a1c314388 100644 Binary files a/icons/obj/assemblies.dmi and b/icons/obj/assemblies.dmi differ diff --git a/icons/obj/cardboard_cutout.dmi b/icons/obj/cardboard_cutout.dmi new file mode 100644 index 00000000000..da5f58d7f7c Binary files /dev/null and b/icons/obj/cardboard_cutout.dmi differ diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi index 82ce8437b28..42f1eda0e74 100644 Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index b82450ab87a..5c34785d51e 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/species/plasmaman/hats.dmi b/icons/obj/clothing/species/plasmaman/hats.dmi index f4ec02bef2b..bb2fa4120e8 100644 Binary files a/icons/obj/clothing/species/plasmaman/hats.dmi and b/icons/obj/clothing/species/plasmaman/hats.dmi differ diff --git a/icons/obj/clothing/species/plasmaman/suits.dmi b/icons/obj/clothing/species/plasmaman/suits.dmi index 86027617d15..ae07299ff8b 100644 Binary files a/icons/obj/clothing/species/plasmaman/suits.dmi and b/icons/obj/clothing/species/plasmaman/suits.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 669e8dff821..92b77524bc4 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/ties.dmi b/icons/obj/clothing/ties.dmi index a894b1b2465..ac64e6facf7 100644 Binary files a/icons/obj/clothing/ties.dmi and b/icons/obj/clothing/ties.dmi differ diff --git a/icons/obj/clothing/ties_overlay.dmi b/icons/obj/clothing/ties_overlay.dmi index 3437e80e00d..a17fed4818c 100644 Binary files a/icons/obj/clothing/ties_overlay.dmi and b/icons/obj/clothing/ties_overlay.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index 1db72be54fa..436d2fa3cea 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi index 9ad68e22072..bbb00650479 100644 Binary files a/icons/obj/computer.dmi and b/icons/obj/computer.dmi differ diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi index cb5d510faa2..9d8f90d250e 100644 Binary files a/icons/obj/custom_items.dmi and b/icons/obj/custom_items.dmi differ diff --git a/icons/obj/decals.dmi b/icons/obj/decals.dmi index 13913aae9bd..98da468fc56 100644 Binary files a/icons/obj/decals.dmi and b/icons/obj/decals.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index afa4f586504..0a142ca7874 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index 283684b9d46..d90a19f00b1 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/grenade.dmi b/icons/obj/grenade.dmi index ad8268ad59d..f33135baec6 100644 Binary files a/icons/obj/grenade.dmi and b/icons/obj/grenade.dmi differ diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi index 9b38b205075..03b8eba0f8c 100644 Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 2735d145ac8..cb535c90165 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/items_cyborg.dmi b/icons/obj/items_cyborg.dmi new file mode 100644 index 00000000000..cddb57303d2 Binary files /dev/null and b/icons/obj/items_cyborg.dmi differ diff --git a/icons/obj/lavaland/survival_pod.dmi b/icons/obj/lavaland/survival_pod.dmi index fae242d524f..a4c207b402c 100644 Binary files a/icons/obj/lavaland/survival_pod.dmi and b/icons/obj/lavaland/survival_pod.dmi differ diff --git a/icons/obj/machineprototype.dmi b/icons/obj/machineprototype.dmi new file mode 100644 index 00000000000..f5312bdba60 Binary files /dev/null and b/icons/obj/machineprototype.dmi differ diff --git a/icons/obj/musician.dmi b/icons/obj/musician.dmi index b5d0526d670..c57114abf63 100644 Binary files a/icons/obj/musician.dmi and b/icons/obj/musician.dmi differ diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi index 316790998c5..8c3d0f2c81f 100644 Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ diff --git a/icons/obj/shards.dmi b/icons/obj/shards.dmi index 1b979682adc..5ce7113bf88 100644 Binary files a/icons/obj/shards.dmi and b/icons/obj/shards.dmi differ diff --git a/icons/obj/smooth_structures/fancy_table.dmi b/icons/obj/smooth_structures/fancy_table.dmi new file mode 100644 index 00000000000..a57b165f4ac Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table.dmi differ diff --git a/icons/obj/smooth_structures/fancy_table_black.dmi b/icons/obj/smooth_structures/fancy_table_black.dmi new file mode 100644 index 00000000000..d4570e8a7c1 Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_black.dmi differ diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi index 85788316c13..2c7fedf90b3 100644 Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 64f049fbdd9..cccdb4d16fb 100644 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi index e4fedae838b..67cc9682cf8 100644 Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index 83276e5ec57..9f9434f0cbe 100644 Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi index cd8a26cea98..6f53bb25da3 100755 Binary files a/icons/turf/areas.dmi and b/icons/turf/areas.dmi differ diff --git a/icons/turf/floors/carpet_black.dmi b/icons/turf/floors/carpet_black.dmi new file mode 100644 index 00000000000..d1174203aa9 Binary files /dev/null and b/icons/turf/floors/carpet_black.dmi differ diff --git a/interface/skin.dmf b/interface/skin.dmf index 6a6d616832f..c64da39f6e6 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -29,7 +29,7 @@ macro "AZERTYoff" is-disabled = false elem "AZRFF-WEST+REP" name = "WEST+REP" - command = ".west" + command = ".moveleft" is-disabled = false elem "AZRFF-CTRL+NORTH" name = "CTRL+NORTH" @@ -37,7 +37,7 @@ macro "AZERTYoff" is-disabled = false elem "AZRFF-NORTH+REP" name = "NORTH+REP" - command = ".north" + command = ".moveup" is-disabled = false elem "AZRFF-CTRL+EAST" name = "CTRL+EAST" @@ -45,7 +45,7 @@ macro "AZERTYoff" is-disabled = false elem "AZRFF-EAST+REP" name = "EAST+REP" - command = ".east" + command = ".moveright" is-disabled = false elem "AZRFF-CTRL+SOUTH" name = "CTRL+SOUTH" @@ -53,7 +53,7 @@ macro "AZERTYoff" is-disabled = false elem "AZRFF-SOUTH+REP" name = "SOUTH+REP" - command = ".south" + command = ".movedown" is-disabled = false elem "AZRFF-INSERT" name = "INSERT" @@ -85,7 +85,7 @@ macro "AZERTYoff" is-disabled = false elem "AZRFF-CTRL+D+REP" name = "CTRL+D+REP" - command = ".east" + command = ".moveright" is-disabled = false elem "AZRFF-CTRL+B" name = "CTRL+B" @@ -105,7 +105,7 @@ macro "AZERTYoff" is-disabled = false elem "AZRFF-CTRL+Q+REP" name = "CTRL+Q+REP" - command = ".west" + command = ".moveleft" is-disabled = false elem "AZRFF-CTRL+R" name = "CTRL+R" @@ -113,7 +113,7 @@ macro "AZERTYoff" is-disabled = false elem "AZRFF-CTRL+S+REP" name = "CTRL+S+REP" - command = ".south" + command = ".movedown" is-disabled = false elem "AZRFF-CTRL+W" name = "CTRL+W" @@ -129,7 +129,7 @@ macro "AZERTYoff" is-disabled = false elem "AZRFF-CTRL+Z+REP" name = "CTRL+Z+REP" - command = ".north" + command = ".moveup" is-disabled = false elem "AZRFF-F1" name = "F1" @@ -215,7 +215,7 @@ macro "AZERTYon" is-disabled = false elem "AZRON-WEST+REP" name = "WEST+REP" - command = ".west" + command = ".moveleft" is-disabled = false elem "AZRON-CTRL+NORTH" name = "CTRL+NORTH" @@ -223,7 +223,7 @@ macro "AZERTYon" is-disabled = false elem "AZRON-NORTH+REP" name = "NORTH+REP" - command = ".north" + command = ".moveup" is-disabled = false elem "AZRON-CTRL+EAST" name = "CTRL+EAST" @@ -231,7 +231,7 @@ macro "AZERTYon" is-disabled = false elem "AZRON-EAST+REP" name = "EAST+REP" - command = ".east" + command = ".moveright" is-disabled = false elem "AZRON-CTRL+SOUTH" name = "CTRL+SOUTH" @@ -239,7 +239,7 @@ macro "AZERTYon" is-disabled = false elem "AZRON-SOUTH+REP" name = "SOUTH+REP" - command = ".south" + command = ".movedown" is-disabled = false elem "AZRON-INSERT" name = "INSERT" @@ -291,11 +291,11 @@ macro "AZERTYon" is-disabled = false elem "AZRON-D+REP" name = "D+REP" - command = ".east" + command = ".moveright" is-disabled = false elem "AZRON-CTRL+D+REP" name = "CTRL+D+REP" - command = ".east" + command = ".moveright" is-disabled = false elem "AZRON-CTRL+B" name = "CTRL+B" @@ -335,11 +335,11 @@ macro "AZERTYon" is-disabled = false elem "AZRON-Q+REP" name = "Q+REP" - command = ".west" + command = ".moveleft" is-disabled = false elem "AZRON-CTRL+Q+REP" name = "CTRL+Q+REP" - command = ".west" + command = ".moveleft" is-disabled = false elem "AZRON-R" name = "R" @@ -351,11 +351,11 @@ macro "AZERTYon" is-disabled = false elem "s_key" name = "S+REP" - command = ".south" + command = ".movedown" is-disabled = false elem "AZRON-CTRL+S+REP" name = "CTRL+S+REP" - command = ".south" + command = ".movedown" is-disabled = false elem "AZRON-T" name = "T" @@ -395,11 +395,11 @@ macro "AZERTYon" is-disabled = false elem "w_key" name = "Z+REP" - command = ".north" + command = ".moveup" is-disabled = false elem "AZRON-CTRL+Z+REP" name = "CTRL+Z+REP" - command = ".north" + command = ".moveup" is-disabled = false elem "AZRON-F1" name = "F1" @@ -481,7 +481,7 @@ macro "borghotkeymode" is-disabled = false elem "BRGHK-WEST+REP" name = "WEST+REP" - command = ".west" + command = ".moveleft" is-disabled = false elem "BRGHK-CTRL+NORTH" name = "CTRL+NORTH" @@ -489,7 +489,7 @@ macro "borghotkeymode" is-disabled = false elem "BRGHK-NORTH+REP" name = "NORTH+REP" - command = ".north" + command = ".moveup" is-disabled = false elem "BRGHK-CTRL+EAST" name = "CTRL+EAST" @@ -497,7 +497,7 @@ macro "borghotkeymode" is-disabled = false elem "BRGHK-EAST+REP" name = "EAST+REP" - command = ".east" + command = ".moveright" is-disabled = false elem "BRGHK-CTRL+SOUTH" name = "CTRL+SOUTH" @@ -505,7 +505,7 @@ macro "borghotkeymode" is-disabled = false elem "BRGHK-SOUTH+REP" name = "SOUTH+REP" - command = ".south" + command = ".movedown" is-disabled = false elem "BRGHK-INSERT" name = "INSERT" @@ -549,11 +549,11 @@ macro "borghotkeymode" is-disabled = false elem "BRGHK-A+REP" name = "A+REP" - command = ".west" + command = ".moveleft" is-disabled = false elem "BRGHK-CTRL+A+REP" name = "CTRL+A+REP" - command = ".west" + command = ".moveleft" is-disabled = false elem "BRGHK-B" name = "B" @@ -581,11 +581,11 @@ macro "borghotkeymode" is-disabled = false elem "BRGHK-D+REP" name = "D+REP" - command = ".east" + command = ".moveright" is-disabled = false elem "BRGHK-CTRL+D+REP" name = "CTRL+D+REP" - command = ".east" + command = ".moveright" is-disabled = false elem "BRGHK-F" name = "F" @@ -613,19 +613,19 @@ macro "borghotkeymode" is-disabled = false elem "s_key" name = "S+REP" - command = ".south" + command = ".movedown" is-disabled = false elem "BRGHK-CTRL+S+REP" name = "CTRL+S+REP" - command = ".south" + command = ".movedown" is-disabled = false elem "w_key" name = "W+REP" - command = ".north" + command = ".moveup" is-disabled = false elem "BRGHK-CTRL+W+REP" name = "CTRL+W+REP" - command = ".north" + command = ".moveup" is-disabled = false elem "BRGHK-X" name = "X" @@ -735,7 +735,7 @@ macro "macro" is-disabled = false elem "MACRO-WEST+REP" name = "WEST+REP" - command = ".west" + command = ".moveleft" is-disabled = false elem "MACRO-CTRL+NORTH" name = "CTRL+NORTH" @@ -743,7 +743,7 @@ macro "macro" is-disabled = false elem "MACRO-NORTH+REP" name = "NORTH+REP" - command = ".north" + command = ".moveup" is-disabled = false elem "MACRO-CTRL+EAST" name = "CTRL+EAST" @@ -751,7 +751,7 @@ macro "macro" is-disabled = false elem "MACRO-EAST+REP" name = "EAST+REP" - command = ".east" + command = ".moveright" is-disabled = false elem "MACRO-CTRL+SOUTH" name = "CTRL+SOUTH" @@ -759,7 +759,7 @@ macro "macro" is-disabled = false elem "MACRO-SOUTH+REP" name = "SOUTH+REP" - command = ".south" + command = ".movedown" is-disabled = false elem "MACRO-INSERT" name = "INSERT" @@ -787,11 +787,11 @@ macro "macro" is-disabled = false elem "MACRO-CTRL+A+REP" name = "CTRL+A+REP" - command = ".west" + command = ".moveleft" is-disabled = false elem "MACRO-CTRL+D+REP" name = "CTRL+D+REP" - command = ".east" + command = ".moveright" is-disabled = false elem "MACRO-CTRL+B" name = "CTRL+B" @@ -819,11 +819,11 @@ macro "macro" is-disabled = false elem "MACRO-CTRL+S+REP" name = "CTRL+S+REP" - command = ".south" + command = ".movedown" is-disabled = false elem "MACRO-CTRL+W+REP" name = "CTRL+W+REP" - command = ".north" + command = ".moveup" is-disabled = false elem "MACRO-CTRL+X" name = "CTRL+X" @@ -921,7 +921,7 @@ macro "hotkeymode" is-disabled = false elem "HKMODE-WEST+REP" name = "WEST+REP" - command = ".west" + command = ".moveleft" is-disabled = false elem "HKMODE-CTRL+NORTH" name = "CTRL+NORTH" @@ -929,7 +929,7 @@ macro "hotkeymode" is-disabled = false elem "HKMODE-NORTH+REP" name = "NORTH+REP" - command = ".north" + command = ".moveup" is-disabled = false elem "HKMODE-CTRL+EAST" name = "CTRL+EAST" @@ -937,7 +937,7 @@ macro "hotkeymode" is-disabled = false elem "HKMODE-EAST+REP" name = "EAST+REP" - command = ".east" + command = ".moveright" is-disabled = false elem "HKMODE-CTRL+SOUTH" name = "CTRL+SOUTH" @@ -945,7 +945,7 @@ macro "hotkeymode" is-disabled = false elem "HKMODE-SOUTH+REP" name = "SOUTH+REP" - command = ".south" + command = ".movedown" is-disabled = false elem "HKMODE-INSERT" name = "INSERT" @@ -1001,19 +1001,19 @@ macro "hotkeymode" is-disabled = false elem "HKMODE-A+REP" name = "A+REP" - command = ".west" + command = ".moveleft" is-disabled = false elem "HKMODE-CTRL+A+REP" name = "CTRL+A+REP" - command = ".west" + command = ".moveleft" is-disabled = false elem "HKMODE-D+REP" name = "D+REP" - command = ".east" + command = ".moveright" is-disabled = false elem "HKMODE-CTRL+D+REP" name = "CTRL+D+REP" - command = ".east" + command = ".moveright" is-disabled = false elem "HKMODE-B" name = "B" @@ -1073,11 +1073,11 @@ macro "hotkeymode" is-disabled = false elem "s_key" name = "S+REP" - command = ".south" + command = ".movedown" is-disabled = false elem "HKMODE-CTRL+S+REP" name = "CTRL+S+REP" - command = ".south" + command = ".movedown" is-disabled = false elem "HKMODE-T" name = "T" @@ -1085,11 +1085,11 @@ macro "hotkeymode" is-disabled = false elem "w_key" name = "W+REP" - command = ".north" + command = ".moveup" is-disabled = false elem "HKMODE-CTRL+W+REP" name = "CTRL+W+REP" - command = ".north" + command = ".moveup" is-disabled = false elem "HKMODE-X" name = "X" @@ -1195,7 +1195,7 @@ macro "borgmacro" is-disabled = false elem "BRGMACRO-WEST+REP" name = "WEST+REP" - command = ".west" + command = ".moveleft" is-disabled = false elem "BRGMACRO-CTRL+NORTH" name = "CTRL+NORTH" @@ -1203,7 +1203,7 @@ macro "borgmacro" is-disabled = false elem "BRGMACRO-NORTH+REP" name = "NORTH+REP" - command = ".north" + command = ".moveup" is-disabled = false elem "BRGMACRO-CTRL+EAST" name = "CTRL+EAST" @@ -1211,7 +1211,7 @@ macro "borgmacro" is-disabled = false elem "BRGMACRO-EAST+REP" name = "EAST+REP" - command = ".east" + command = ".moveright" is-disabled = false elem "BRGMACRO-CTRL+SOUTH" name = "CTRL+SOUTH" @@ -1219,7 +1219,7 @@ macro "borgmacro" is-disabled = false elem "BRGMACRO-SOUTH+REP" name = "SOUTH+REP" - command = ".south" + command = ".movedown" is-disabled = false elem "BRGMACRO-INSERT" name = "INSERT" @@ -1247,7 +1247,7 @@ macro "borgmacro" is-disabled = false elem "BRGMACRO-CTRL+A+REP" name = "CTRL+A+REP" - command = ".west" + command = ".moveleft" is-disabled = false elem "BRGMACRO-CTRL+B" name = "CTRL+B" @@ -1259,7 +1259,7 @@ macro "borgmacro" is-disabled = false elem "BRGMACRO-CTRL+D+REP" name = "CTRL+D+REP" - command = ".east" + command = ".moveright" is-disabled = false elem "BRGMACRO-CTRL+F" name = "CTRL+F" @@ -1275,11 +1275,11 @@ macro "borgmacro" is-disabled = false elem "BRGMACRO-CTRL+S+REP" name = "CTRL+S+REP" - command = ".south" + command = ".movedown" is-disabled = false elem "BRGMACRO-CTRL+W+REP" name = "CTRL+W+REP" - command = ".north" + command = ".moveup" is-disabled = false elem "BRGMACRO-CTRL+X" name = "CTRL+X" diff --git a/nano/assets/nano.js b/nano/assets/nano.js index 2c1b82f898c..6cce62efd26 100644 --- a/nano/assets/nano.js +++ b/nano/assets/nano.js @@ -1 +1 @@ -function NanoStateDefaultClass(){this.key="default",this.key=this.key.toLowerCase(),NanoStateManager.addState(this)}function NanoStatePDAClass(){this.key="pda",this.key=this.key.toLowerCase(),this.current_template="",NanoStateManager.addState(this)}function NanoStateClass(){}var NanoUtility=function(){var e={};return{init:function(){var t=$("body");e=t.data("urlParameters")},generateHref:function(t){var n="?";for(var a in e)e.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+e[a]);for(var a in t)t.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+t[a]);return n},winset:function(e,t,n){var a,r;return null==n&&(n=NanoStateManager.getData().config.window.ref),a={},a[n+"."+e]=t,r=a,location.href=NanoUtility.href("winset",r)},extend:function(e,t){return Object.keys(t).forEach(function(n){var a;return a=t[n],a&&"[object Object]"===Object.prototype.toString.call(a)?(e[n]=e[n]||{},NanoUtility.extend(e[n],a)):e[n]=a}),e},href:function(e,t){return null==e&&(e=""),null==t&&(t={}),e=new Url("byond://"+e),NanoUtility.extend(e.query,t),e},close:function(){var t;return t={command:"nanoclose "+e.src},this.winset("is-visible","false"),location.href=NanoUtility.href("winset",t)}}}();"undefined"==typeof jQuery&&reportError("ERROR: Javascript library failed to load!"),"undefined"==typeof doT&&reportError("ERROR: Template engine failed to load!");var reportError=function(e){window.location="byond://?nano_err="+encodeURIComponent(e),alert(e)};$(document).ready(function(){NanoUtility.init(),NanoStateManager.init(),NanoTemplate.init(),NanoWindow.init()}),Array.prototype.indexOf||(Array.prototype.indexOf=function(e){var t=this.length,n=Number(arguments[1])||0;for(n=n<0?Math.ceil(n):Math.floor(n),n<0&&(n+=t);n=0?e[a]:a===-1?"{":a===-2?"}":""})},String.prototype.format.regex=new RegExp("{-?[0-9]+}","g")),Object.size=function(e){var t,n=0;for(var t in e)e.hasOwnProperty(t)&&n++;return n},window.console||(window.console={log:function(e){return!1}}),String.prototype.toTitleCase=function(){var e=/^(a|an|and|as|at|but|by|en|for|if|in|of|on|or|the|to|vs?\.?|via)$/i;return this.replace(/([^\W_]+[^\s-]*) */g,function(t,n,a,r){return a>0&&a+n.length!==r.length&&n.search(e)>-1&&":"!==r.charAt(a-2)&&r.charAt(a-1).search(/[^\s-]/)<0?t.toLowerCase():n.substr(1).search(/[A-Z]|\../)>-1?t:t.charAt(0).toUpperCase()+t.substr(1)})},$.ajaxSetup({cache:!1}),Function.prototype.inheritsFrom=function(e){return this.prototype=new e,this.prototype.constructor=this,this.prototype.parent=e.prototype,this},String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}),String.prototype.ckey||(String.prototype.ckey=function(){return this.replace(/\W/g,"").toLowerCase()}),NanoStateManager=function(){var e=!1,t=null,n={},a={},r={},o=null,i=function(){t=$("body").data("initialData"),null!=t&&t.hasOwnProperty("config")&&t.hasOwnProperty("data")||reportError("Error: Initial data did not load correctly."+JSON.stringify(t));var n="default";t.config.hasOwnProperty("stateKey")&&t.config.stateKey&&(n=t.config.stateKey.toLowerCase()),NanoStateManager.setCurrentState(n),$(document).on("templatesLoaded",function(){s(t),e=!0})},l=function(n){var a;try{a=jQuery.parseJSON(n)}catch(r){return void reportError("recieveUpdateData failed.
    Error name: "+r.name+"
    Error Message: "+r.message)}a.hasOwnProperty("data")||(t&&t.hasOwnProperty("data")?a.data=t.data:a.data={}),e?s(a):t=a},s=function(e){if(null!=o){if(e=o.onBeforeUpdate(e),e===!1)return void reportError("data is false, return");t=e,o.onUpdate(t),o.onAfterUpdate(t)}},c=function(e,t){for(var n in e)e.hasOwnProperty(n)&&jQuery.isFunction(e[n])&&(t=e[n].call(this,t));return t};return{init:function(){i()},receiveUpdateData:function(e){l(e)},addBeforeUpdateCallback:function(e,t){n[e]=t},addBeforeUpdateCallbacks:function(e){for(var t in e)e.hasOwnProperty(t)&&NanoStateManager.addBeforeUpdateCallback(t,e[t])},removeBeforeUpdateCallback:function(e){n.hasOwnProperty(e)&&delete n[e]},executeBeforeUpdateCallbacks:function(e){return c(n,e)},addAfterUpdateCallback:function(e,t){a[e]=t},addAfterUpdateCallbacks:function(e){for(var t in e)e.hasOwnProperty(t)&&NanoStateManager.addAfterUpdateCallback(t,e[t])},removeAfterUpdateCallback:function(e){a.hasOwnProperty(e)&&delete a[e]},executeAfterUpdateCallbacks:function(e){return c(a,e)},addState:function(e){return e instanceof NanoStateClass?e.key?void(r[e.key]=e):void reportError("ERROR: Attempted to add a state with an invalid stateKey"):void reportError("ERROR: Attempted to add a state which is not instanceof NanoStateClass")},setCurrentState:function(e){if("undefined"==typeof e||!e)return reportError("ERROR: No state key was passed!"),!1;if(!r.hasOwnProperty(e))return reportError("ERROR: Attempted to set a current state which does not exist: "+e),!1;var t=o;return o=r[e],null!=t&&t.onRemove(o),o.onAdd(t),!0},getCurrentState:function(){return o},getData:function(){return t}}}(),NanoBaseCallbacks=function(){var e=!0,t={},n={status:function(t){var n;return 2==t.config.status?(n="good",$(".linkActive").removeClass("inactive")):1==t.config.status?(n="average",$(".linkActive").addClass("inactive")):(n="bad",$(".linkActive").addClass("inactive")),$(".statusicon").removeClass("good bad average").addClass(n),$(".linkActive").stopTime("linkPending"),$(".linkActive").removeClass("linkPending"),$(".linkActive").off("click").on("click",function(n){n.preventDefault();var a=$(this).data("href");null!=a&&e&&(e=!1,$("body").oneTime(300,"enableClick",function(){e=!0}),2==t.config.status&&$(this).oneTime(300,"linkPending",function(){$(this).addClass("linkPending")}),window.location.href=a)}),t},nanomap:function(e){return $(".mapIcon").off("mouseenter mouseleave").on("mouseenter",function(e){$("#uiMapTooltip").html($(this).children(".tooltip").html()).show().stopTime().oneTime(5e3,"hideTooltip",function(){$(this).fadeOut(500)})}),$(".zoomLink").off("click").on("click",function(e){e.preventDefault();var t=$(this).data("zoomLevel"),n=$("#uiMap"),a=n.width()*t,r=n.height()*t;n.css({zoom:t,left:"50%",top:"50%",marginLeft:"-"+Math.floor(a/2)+"px",marginTop:"-"+Math.floor(r/2)+"px"})}),$("#uiMapImage").attr("src","nanomap_z"+e.config.mapZLevel+".png"),e}};return{addCallbacks:function(){NanoStateManager.addBeforeUpdateCallbacks(t),NanoStateManager.addAfterUpdateCallbacks(n)},removeCallbacks:function(){for(var e in t)t.hasOwnProperty(e)&&NanoStateManager.removeBeforeUpdateCallback(e);for(var e in n)n.hasOwnProperty(e)&&NanoStateManager.removeAfterUpdateCallback(e)}}}(),NanoBaseHelpers=function(){var e={syndicateMode:function(){return $("body").css("background-color","#8f1414"),$("body").css("background-image","url('uiBackground-Syndicate.png')"),$("body").css("background-position","50% 0"),$("body").css("background-repeat","repeat-x"),$("#uiTitleFluff").css("background-image","url('uiTitleFluff-Syndicate.png')"),$("#uiTitleFluff").css("background-position","50% 50%"),$("#uiTitleFluff").css("background-repeat","no-repeat"),""},combine:function(e,t){return e&&t?e.concat(t):e||t},dump:function(e){return JSON.stringify(e)},link:function(e,t,n,a,r,o){var i="",l="noIcon";"undefined"!=typeof t&&t&&(i='
    ',l="hasIcon"),"undefined"!=typeof r&&r||(r="link");var s="";"undefined"!=typeof o&&o&&(s='id="'+o+'"');var c=NanoTransition.allocID(s+"_"+e.toString().replace(/[^a-z0-9_]/gi,"_")+"_"+t);return"undefined"!=typeof a&&a?'':'
    "+i+e+'
    '},xor:function(e,t){return e^t},precisionRound:function(e,t){if(0==t)return Math.round(number);var n=Math.pow(10,t);return Math.round(e*n)/n},round:function(e){return Math.round(e)},fixed:function(e){return Math.round(10*e)/10},floor:function(e){return Math.floor(e)},ceil:function(e){return Math.ceil(e)},string:function(){if(0==arguments.length)return"";if(1==arguments.length)return arguments[0];if(arguments.length>1){stringArgs=[];for(var e=1;en&&(e=n):e>t?e=t:e
    '+r+'
    '},dangerToClass:function(e){return 0==e?"good":1==e?"average":"bad"},dangerToSpan:function(e){return 0==e?'"Good"':1==e?'"Minor Alert"':'"Major Alert"'},generateHref:function(e){var t=$("body");_urlParameters=t.data("urlParameters");var n="?";for(var a in _urlParameters)_urlParameters.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+_urlParameters[a]);for(var a in e)e.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+e[a]);return n},displayDNABlocks:function(e,t,n,a,r){if(!e)return'
    Please place a valid subject into the DNA modifier.
    ';var o=e.split(""),i='
    ',l=1,s=1;for(var c in o)if(o.hasOwnProperty(c)&&"object"!=typeof o[c]){var u;u="UI"==r.toUpperCase()?{selectUIBlock:l,selectUISubblock:s}:{selectSEBlock:l,selectSESubblock:s};var d="linkActive";l==t&&s==n&&(d="selected"),i+='",c++,c%a==0&&c
    "):s++}return i+="
    "},cMirror:function(e){CodeMirror.fromTextArea(document.getElementById(e),{lineNumbers:!0,indentUnit:4,indentWithTabs:!0,theme:"lesser-dark"})},smoothNumber:function(e){var t=NanoTransition.allocID("n");return''},smoothRound:function(e,t){var n=NanoTransition.allocID(t);return void 0===t&&(placed=0),''}};return{addHelpers:function(){NanoTemplate.addHelpers(e)},removeHelpers:function(){for(var t in e)e.hasOwnProperty(t)&&NanoTemplate.removeHelper(t)}}}(),NanoStateDefaultClass.inheritsFrom(NanoStateClass);var NanoStateDefault=new NanoStateDefaultClass;NanoStatePDAClass.inheritsFrom(NanoStateClass);var NanoStatePDA=new NanoStatePDAClass;NanoStatePDAClass.prototype.onUpdate=function(e){NanoStateClass.prototype.onUpdate.call(this,e);var t=this;try{if(null!=e.data.app){var n=e.data.app.template;null!=n&&n!=t.current_template?$.when($.ajax({url:n+".tmpl",cache:!1,dataType:"text"})).done(function(a){a+='
    ';try{NanoTemplate.addTemplate("app",a),NanoTemplate.resetTemplate("app"),$("#uiApp").html(NanoTemplate.parse("app",e)),t.current_template=n,t.onAfterUpdate(e)}catch(r){return void reportError("ERROR: An error occurred while loading the PDA App UI: "+r.message)}}).fail(function(){reportError("ERROR: Loading template app("+n+") failed!")}):NanoTemplate.templateExists("app")&&$("#uiApp").html(NanoTemplate.parse("app",e))}}catch(a){return void reportError("ERROR: An error occurred while rendering the PDA App UI: "+a.message)}},NanoStateClass.prototype.key=null,NanoStateClass.prototype.layoutRendered=!1,NanoStateClass.prototype.contentRendered=!1,NanoStateClass.prototype.mapInitialised=!1,NanoStateClass.prototype.isCurrent=function(){return NanoStateManager.getCurrentState()==this},NanoStateClass.prototype.onAdd=function(e){NanoBaseCallbacks.addCallbacks(),NanoBaseHelpers.addHelpers()},NanoStateClass.prototype.onRemove=function(e){NanoBaseCallbacks.removeCallbacks(),NanoBaseHelpers.removeHelpers()},NanoStateClass.prototype.onBeforeUpdate=function(e){return e=NanoStateManager.executeBeforeUpdateCallbacks(e)},NanoStateClass.prototype.onUpdate=function(e){try{(!this.layoutRendered||e.config.hasOwnProperty("autoUpdateLayout")&&e.config.autoUpdateLayout)&&($("#uiLayout").html(NanoTemplate.parse("layout",e)),this.layoutRendered=!0),(!this.contentRendered||e.config.hasOwnProperty("autoUpdateContent")&&e.config.autoUpdateContent)&&($("#uiContent").html(NanoTemplate.parse("main",e)),this.contentRendered=!0),NanoTemplate.templateExists("mapContent")&&(this.mapInitialised||($("#uiMap").draggable(),$("#uiMapTooltip").off("click").on("click",function(e){e.preventDefault(),$(this).fadeOut(400)}),this.mapInitialised=!0),$("#uiMapContent").html(NanoTemplate.parse("mapContent",e)),e.config.hasOwnProperty("showMap")&&e.config.showMap?($("#uiContent").addClass("hidden"),$("#uiMapWrapper").removeClass("hidden")):($("#uiMapWrapper").addClass("hidden"),$("#uiContent").removeClass("hidden"))),NanoTemplate.templateExists("mapHeader")&&$("#uiMapHeader").html(NanoTemplate.parse("mapHeader",e)),NanoTemplate.templateExists("mapFooter")&&$("#uiMapFooter").html(NanoTemplate.parse("mapFooter",e))}catch(t){return void reportError("ERROR: An error occurred while rendering the UI: "+t.message)}},NanoStateClass.prototype.onAfterUpdate=function(e){NanoStateManager.executeAfterUpdateCallbacks(e)},NanoStateClass.prototype.alertText=function(e){alert(e)};var NanoTemplate=function(){var e={},t={},n={},a={},r=function(){e=$("body").data("templateData"),null==e&&reportError("Error: Template data did not load correctly."),o()},o=function(){var t=Object.size(e);if(!t)return void $(document).trigger("templatesLoaded");for(var n in e)if(e.hasOwnProperty(n))return void $.when($.ajax({url:e[n],cache:!1,dataType:"text"})).done(function(t){t+='
    ';try{NanoTemplate.addTemplate(n,t)}catch(a){return void reportError("ERROR: An error occurred while loading the UI: "+a.message)}delete e[n],o()}).fail(function(){reportError("ERROR: Loading template "+n+"("+e[n]+") failed!")})},i=function(){for(var e in t)try{n[e]=doT.template(t[e],null,t)}catch(a){reportError(a.message)}};return{init:function(){r()},addTemplate:function(e,n){t[e]=n},templateExists:function(e){return t.hasOwnProperty(e)},resetTemplate:function(e){n[e]=null},parse:function(e,r){if(!n.hasOwnProperty(e)||!n[e]){if(!t.hasOwnProperty(e))return reportError('ERROR: Template "'+e+'" does not exist in _compiledTemplates!'),"

    Template error (does not exist)

    ";i()}return"function"!=typeof n[e]?(reportError(n[e]),reportError('ERROR: Template "'+e+'" failed to compile!'),"

    Template error (failed to compile)

    "):n[e].call(this,r.data,r.config,a)},addHelper:function(e,t){return jQuery.isFunction(t)?void(a[e]=t):void reportError("NanoTemplate.addHelper failed to add "+e+" as it is not a function.")},addHelpers:function(e){for(var t in e)e.hasOwnProperty(t)&&NanoTemplate.addHelper(t,e[t])},removeHelper:function(e){helpers.hasOwnProperty(e)&&delete a[e]}}}();NanoTransition=function(){var e={},t={},n=0;NanoStateManager.addBeforeUpdateCallback("TransitionReset",function(e){return n=0,e});var a=function(e){return"_Hide_Map_close"==e?"transition__map":(void 0===e&&(e=""),"transition__"+n++ +"_"+e.toString())},r=function(n,a,r){var o,i=e[n];void 0===r&&(r=!1);var l=$("."+n);if(0==l.length)return a;if(l=l[0],i&&i.tagName==l.tagName&&i.tabIndex==l.tabIndex&&i.parent==l.parentNode.tagName&&i.children==l.children.length){if(o=t[n],r){var s={};for(k in o)s[k]=o[k];for(k in a)s[k]=a[k];a=s}}else o=a,e[n]={tagName:l.tagName,tabIndex:l.tabIndex,parent:l.parentNode.tagName,children:l.children.length};return t[n]=a,o},o=function(e,t){var n=$("."+e);return t?$(n).children(t):$(n)},i=function(e,t,n,a,r){var i=o(e,t);void 0===r&&(r=1900),i.css(n).animate(a,{duration:r,queue:!1});var l=n["..class"],s=a["..class"];if(l&&s&&(i.addClass(l),l!=s)){var l=l.split(" "),s=s.split(" "),c=l.filter(function(e){return s.indexOf(e)==-1}),u=s.filter(function(e){return l.indexOf(e)==-1});l=c.join(" "),s=u.join(" "),i.switchClass(l,s,{duration:r,queue:!1})}},l=function(e,t,n,a,r,i){var l=o(e,t);void 0===i&&(i=1900),n==-1?l.text(a.toString()):l.text(a.toFixed(n)),a!=r&&l.animate({i:1},{duration:i,queue:!1,step:function(e,t){n==-1?t.elem.textContent=(a*(1-e)+r*e).toString():t.elem.textContent=(a*(1-e)+r*e).toFixed(n)}})},s=function(e,t,n,a,i){var l=o(e,t);void 0===i&&(i=200),n["..hover"]&&l.addClass("hover"),l.hover(function(){l.stop(1,1).addClass("hover",{duration:i,queue:!1}),r(e,{"..hover":!0},!0)},function(){l.stop(1,1).removeClass("hover",{duration:i,queue:!1}),r(e,{"..hover":!1},!0)})},c=function(e,t,n,a){var o=r(e,n);return i(e,t,o,n,a),o};return{allocID:a,updateElement:r,animateElement:i,animateTextValue:l,animateHover:s,transitionElement:c}}();var NanoWindow=function(){var e,t,n,a,r,o,i=function(e,t){NanoUtility.winset("pos",e+","+t)},l=function(e,t){NanoUtility.winset("size",e+","+t)},s=function(){NanoStateManager.getData().config.user.fancy&&(c(),u(),d())},c=function(){NanoUtility.winset("titlebar",0),NanoUtility.winset("can-resize",0),$(".fancy").show(),$("#uiTitleFluff").css("right","65px")},u=function(){var e=function(){return NanoUtility.close()},t=function(){return NanoUtility.winset("is-minimized","true")};$(".close").on("click",function(t){e()}),$(".minimize").on("click",function(e){t()})},d=function(){$(document).on("mousemove",function(e){p(),f()}),$(document).on("mouseup",function(i){e&&(e=!1,t=null,n=null),a&&(a=!1,r=null,o=null)}),$("#uiTitleWrapper").on("mousedown",function(t){e=!0}),$("#resize").on("mousedown",function(e){a=!0})},p=function(a){var r,o;null==a&&(a=window.event),e&&(null==t&&(t=a.screenX),null==n&&(n=a.screenY),r=a.screenX-t+window.screenLeft,o=a.screenY-n+window.screenTop,i(r,o),t=a.screenX,n=a.screenY)},f=function(){var e,t;null==event&&(event=window.event),a&&(null==r&&(r=event.screenX),null==o&&(o=event.screenY),e=Math.max(150,event.screenX-r+window.innerWidth),t=Math.max(150,event.screenY-o+window.innerHeight),l(e,t),r=event.screenX,o=event.screenY)};return{init:function(){$(document).on("templatesLoaded",function(){s()})}}}(); \ No newline at end of file +function NanoStateDefaultClass(){this.key="default",this.key=this.key.toLowerCase(),NanoStateManager.addState(this)}function NanoStatePDAClass(){this.key="pda",this.key=this.key.toLowerCase(),this.current_template="",NanoStateManager.addState(this)}function NanoStateClass(){}var NanoUtility=function(){var e={};return{init:function(){var t=$("body");e=t.data("urlParameters")},generateHref:function(t){var n="?";for(var a in e)e.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+e[a]);for(var a in t)t.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+t[a]);return n},winset:function(e,t,n){var a,r;return null==n&&(n=NanoStateManager.getData().config.window.ref),a={},a[n+"."+e]=t,r=a,location.href=NanoUtility.href("winset",r)},extend:function(e,t){return Object.keys(t).forEach(function(n){var a;return a=t[n],a&&"[object Object]"===Object.prototype.toString.call(a)?(e[n]=e[n]||{},NanoUtility.extend(e[n],a)):e[n]=a}),e},href:function(e,t){return null==e&&(e=""),null==t&&(t={}),e=new Url("byond://"+e),NanoUtility.extend(e.query,t),e},close:function(){var t;return t={command:"nanoclose "+e.src},this.winset("is-visible","false"),location.href=NanoUtility.href("winset",t)}}}();"undefined"==typeof jQuery&&reportError("ERROR: Javascript library failed to load!"),"undefined"==typeof doT&&reportError("ERROR: Template engine failed to load!");var reportError=function(e){window.location="byond://?nano_err="+encodeURIComponent(e),alert(e)};$(document).ready(function(){NanoUtility.init(),NanoStateManager.init(),NanoTemplate.init(),NanoWindow.init()}),Array.prototype.indexOf||(Array.prototype.indexOf=function(e){var t=this.length,n=Number(arguments[1])||0;for(n=n<0?Math.ceil(n):Math.floor(n),n<0&&(n+=t);n=0?e[a]:a===-1?"{":a===-2?"}":""})},String.prototype.format.regex=new RegExp("{-?[0-9]+}","g")),Object.size=function(e){var t,n=0;for(var t in e)e.hasOwnProperty(t)&&n++;return n},window.console||(window.console={log:function(e){return!1}}),String.prototype.toTitleCase=function(){var e=/^(a|an|and|as|at|but|by|en|for|if|in|of|on|or|the|to|vs?\.?|via)$/i;return this.replace(/([^\W_]+[^\s-]*) */g,function(t,n,a,r){return a>0&&a+n.length!==r.length&&n.search(e)>-1&&":"!==r.charAt(a-2)&&r.charAt(a-1).search(/[^\s-]/)<0?t.toLowerCase():n.substr(1).search(/[A-Z]|\../)>-1?t:t.charAt(0).toUpperCase()+t.substr(1)})},$.ajaxSetup({cache:!1}),Function.prototype.inheritsFrom=function(e){return this.prototype=new e,this.prototype.constructor=this,this.prototype.parent=e.prototype,this},String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}),String.prototype.ckey||(String.prototype.ckey=function(){return this.replace(/\W/g,"").toLowerCase()}),NanoStateManager=function(){var e=!1,t=null,n={},a={},r={},o=null,i=function(){t=$("body").data("initialData"),null!=t&&t.hasOwnProperty("config")&&t.hasOwnProperty("data")||reportError("Error: Initial data did not load correctly."+JSON.stringify(t));var n="default";t.config.hasOwnProperty("stateKey")&&t.config.stateKey&&(n=t.config.stateKey.toLowerCase()),NanoStateManager.setCurrentState(n),$(document).on("templatesLoaded",function(){s(t),e=!0})},l=function(n){var a;try{a=jQuery.parseJSON(n)}catch(r){return void reportError("recieveUpdateData failed.
    Error name: "+r.name+"
    Error Message: "+r.message)}a.hasOwnProperty("data")||(t&&t.hasOwnProperty("data")?a.data=t.data:a.data={}),e?s(a):t=a},s=function(e){if(null!=o){if(e=o.onBeforeUpdate(e),e===!1)return void reportError("data is false, return");t=e,o.onUpdate(t),o.onAfterUpdate(t)}},c=function(e,t){for(var n in e)e.hasOwnProperty(n)&&jQuery.isFunction(e[n])&&(t=e[n].call(this,t));return t};return{init:function(){i()},receiveUpdateData:function(e){l(e)},addBeforeUpdateCallback:function(e,t){n[e]=t},addBeforeUpdateCallbacks:function(e){for(var t in e)e.hasOwnProperty(t)&&NanoStateManager.addBeforeUpdateCallback(t,e[t])},removeBeforeUpdateCallback:function(e){n.hasOwnProperty(e)&&delete n[e]},executeBeforeUpdateCallbacks:function(e){return c(n,e)},addAfterUpdateCallback:function(e,t){a[e]=t},addAfterUpdateCallbacks:function(e){for(var t in e)e.hasOwnProperty(t)&&NanoStateManager.addAfterUpdateCallback(t,e[t])},removeAfterUpdateCallback:function(e){a.hasOwnProperty(e)&&delete a[e]},executeAfterUpdateCallbacks:function(e){return c(a,e)},addState:function(e){return e instanceof NanoStateClass?e.key?void(r[e.key]=e):void reportError("ERROR: Attempted to add a state with an invalid stateKey"):void reportError("ERROR: Attempted to add a state which is not instanceof NanoStateClass")},setCurrentState:function(e){if("undefined"==typeof e||!e)return reportError("ERROR: No state key was passed!"),!1;if(!r.hasOwnProperty(e))return reportError("ERROR: Attempted to set a current state which does not exist: "+e),!1;var t=o;return o=r[e],null!=t&&t.onRemove(o),o.onAdd(t),!0},getCurrentState:function(){return o},getData:function(){return t}}}(),NanoBaseCallbacks=function(){var e=!0,t={},n={status:function(t){var n;return 2==t.config.status?(n="good",$(".linkActive").removeClass("inactive")):1==t.config.status?(n="average",$(".linkActive").addClass("inactive")):(n="bad",$(".linkActive").addClass("inactive")),$(".statusicon").removeClass("good bad average").addClass(n),$(".linkActive").stopTime("linkPending"),$(".linkActive").removeClass("linkPending"),$(".linkActive").off("click").on("click",function(n){n.preventDefault();var a=$(this).data("href");null!=a&&e&&(e=!1,$("body").oneTime(300,"enableClick",function(){e=!0}),2==t.config.status&&$(this).oneTime(300,"linkPending",function(){$(this).addClass("linkPending")}),window.location.href=a)}),t},nanomap:function(e){return $(".mapIcon").off("mouseenter mouseleave").on("mouseenter",function(e){$("#uiMapTooltip").html($(this).children(".tooltip").html()).show().stopTime().oneTime(5e3,"hideTooltip",function(){$(this).fadeOut(500)})}),$(".zoomLink").off("click").on("click",function(e){e.preventDefault();var t=$(this).data("zoomLevel"),n=$("#uiMap"),a=n.width()*t,r=n.height()*t;n.css({zoom:t,left:"50%",top:"50%",marginLeft:"-"+Math.floor(a/2)+"px",marginTop:"-"+Math.floor(r/2)+"px"})}),$("#uiMapImage").attr("src",e.config.map+"_nanomap_z"+e.config.mapZLevel+".png"),e}};return{addCallbacks:function(){NanoStateManager.addBeforeUpdateCallbacks(t),NanoStateManager.addAfterUpdateCallbacks(n)},removeCallbacks:function(){for(var e in t)t.hasOwnProperty(e)&&NanoStateManager.removeBeforeUpdateCallback(e);for(var e in n)n.hasOwnProperty(e)&&NanoStateManager.removeAfterUpdateCallback(e)}}}(),NanoBaseHelpers=function(){var e={syndicateMode:function(){return $("body").css("background-color","#8f1414"),$("body").css("background-image","url('uiBackground-Syndicate.png')"),$("body").css("background-position","50% 0"),$("body").css("background-repeat","repeat-x"),$("#uiTitleFluff").css("background-image","url('uiTitleFluff-Syndicate.png')"),$("#uiTitleFluff").css("background-position","50% 50%"),$("#uiTitleFluff").css("background-repeat","no-repeat"),""},combine:function(e,t){return e&&t?e.concat(t):e||t},dump:function(e){return JSON.stringify(e)},link:function(e,t,n,a,r,o){var i="",l="noIcon";"undefined"!=typeof t&&t&&(i='
    ',l="hasIcon"),"undefined"!=typeof r&&r||(r="link");var s="";"undefined"!=typeof o&&o&&(s='id="'+o+'"');var c=NanoTransition.allocID(s+"_"+e.toString().replace(/[^a-z0-9_]/gi,"_")+"_"+t);return"undefined"!=typeof a&&a?'':'
    "+i+e+'
    '},xor:function(e,t){return e^t},precisionRound:function(e,t){if(0==t)return Math.round(number);var n=Math.pow(10,t);return Math.round(e*n)/n},round:function(e){return Math.round(e)},fixed:function(e){return Math.round(10*e)/10},floor:function(e){return Math.floor(e)},ceil:function(e){return Math.ceil(e)},string:function(){if(0==arguments.length)return"";if(1==arguments.length)return arguments[0];if(arguments.length>1){stringArgs=[];for(var e=1;en&&(e=n):e>t?e=t:e
    '+r+'
    '},dangerToClass:function(e){return 0==e?"good":1==e?"average":"bad"},dangerToSpan:function(e){return 0==e?'"Good"':1==e?'"Minor Alert"':'"Major Alert"'},generateHref:function(e){var t=$("body");_urlParameters=t.data("urlParameters");var n="?";for(var a in _urlParameters)_urlParameters.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+_urlParameters[a]);for(var a in e)e.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+e[a]);return n},displayDNABlocks:function(e,t,n,a,r){if(!e)return'
    Please place a valid subject into the DNA modifier.
    ';var o=e.split(""),i='
    ',l=1,s=1;for(var c in o)if(o.hasOwnProperty(c)&&"object"!=typeof o[c]){var u;u="UI"==r.toUpperCase()?{selectUIBlock:l,selectUISubblock:s}:{selectSEBlock:l,selectSESubblock:s};var d="linkActive";l==t&&s==n&&(d="selected"),i+='",c++,c%a==0&&c
    "):s++}return i+="
    "},cMirror:function(e){CodeMirror.fromTextArea(document.getElementById(e),{lineNumbers:!0,indentUnit:4,indentWithTabs:!0,theme:"lesser-dark"})},smoothNumber:function(e){var t=NanoTransition.allocID("n");return''},smoothRound:function(e,t){var n=NanoTransition.allocID(t);return void 0===t&&(placed=0),''}};return{addHelpers:function(){NanoTemplate.addHelpers(e)},removeHelpers:function(){for(var t in e)e.hasOwnProperty(t)&&NanoTemplate.removeHelper(t)}}}(),NanoStateDefaultClass.inheritsFrom(NanoStateClass);var NanoStateDefault=new NanoStateDefaultClass;NanoStatePDAClass.inheritsFrom(NanoStateClass);var NanoStatePDA=new NanoStatePDAClass;NanoStatePDAClass.prototype.onUpdate=function(e){NanoStateClass.prototype.onUpdate.call(this,e);var t=this;try{if(null!=e.data.app){var n=e.data.app.template;null!=n&&n!=t.current_template?$.when($.ajax({url:n+".tmpl",cache:!1,dataType:"text"})).done(function(a){a+='
    ';try{NanoTemplate.addTemplate("app",a),NanoTemplate.resetTemplate("app"),$("#uiApp").html(NanoTemplate.parse("app",e)),t.current_template=n,t.onAfterUpdate(e)}catch(r){return void reportError("ERROR: An error occurred while loading the PDA App UI: "+r.message)}}).fail(function(){reportError("ERROR: Loading template app("+n+") failed!")}):NanoTemplate.templateExists("app")&&$("#uiApp").html(NanoTemplate.parse("app",e))}}catch(a){return void reportError("ERROR: An error occurred while rendering the PDA App UI: "+a.message)}},NanoStateClass.prototype.key=null,NanoStateClass.prototype.layoutRendered=!1,NanoStateClass.prototype.contentRendered=!1,NanoStateClass.prototype.mapInitialised=!1,NanoStateClass.prototype.isCurrent=function(){return NanoStateManager.getCurrentState()==this},NanoStateClass.prototype.onAdd=function(e){NanoBaseCallbacks.addCallbacks(),NanoBaseHelpers.addHelpers()},NanoStateClass.prototype.onRemove=function(e){NanoBaseCallbacks.removeCallbacks(),NanoBaseHelpers.removeHelpers()},NanoStateClass.prototype.onBeforeUpdate=function(e){return e=NanoStateManager.executeBeforeUpdateCallbacks(e)},NanoStateClass.prototype.onUpdate=function(e){try{(!this.layoutRendered||e.config.hasOwnProperty("autoUpdateLayout")&&e.config.autoUpdateLayout)&&($("#uiLayout").html(NanoTemplate.parse("layout",e)),this.layoutRendered=!0),(!this.contentRendered||e.config.hasOwnProperty("autoUpdateContent")&&e.config.autoUpdateContent)&&($("#uiContent").html(NanoTemplate.parse("main",e)),this.contentRendered=!0),NanoTemplate.templateExists("mapContent")&&(this.mapInitialised||($("#uiMap").draggable(),$("#uiMapTooltip").off("click").on("click",function(e){e.preventDefault(),$(this).fadeOut(400)}),this.mapInitialised=!0),$("#uiMapContent").html(NanoTemplate.parse("mapContent",e)),e.config.hasOwnProperty("showMap")&&e.config.showMap?($("#uiContent").addClass("hidden"),$("#uiMapWrapper").removeClass("hidden")):($("#uiMapWrapper").addClass("hidden"),$("#uiContent").removeClass("hidden"))),NanoTemplate.templateExists("mapHeader")&&$("#uiMapHeader").html(NanoTemplate.parse("mapHeader",e)),NanoTemplate.templateExists("mapFooter")&&$("#uiMapFooter").html(NanoTemplate.parse("mapFooter",e))}catch(t){return void reportError("ERROR: An error occurred while rendering the UI: "+t.message)}},NanoStateClass.prototype.onAfterUpdate=function(e){NanoStateManager.executeAfterUpdateCallbacks(e)},NanoStateClass.prototype.alertText=function(e){alert(e)};var NanoTemplate=function(){var e={},t={},n={},a={},r=function(){e=$("body").data("templateData"),null==e&&reportError("Error: Template data did not load correctly."),o()},o=function(){var t=Object.size(e);if(!t)return void $(document).trigger("templatesLoaded");for(var n in e)if(e.hasOwnProperty(n))return void $.when($.ajax({url:e[n],cache:!1,dataType:"text"})).done(function(t){t+='
    ';try{NanoTemplate.addTemplate(n,t)}catch(a){return void reportError("ERROR: An error occurred while loading the UI: "+a.message)}delete e[n],o()}).fail(function(){reportError("ERROR: Loading template "+n+"("+e[n]+") failed!")})},i=function(){for(var e in t)try{n[e]=doT.template(t[e],null,t)}catch(a){reportError(a.message)}};return{init:function(){r()},addTemplate:function(e,n){t[e]=n},templateExists:function(e){return t.hasOwnProperty(e)},resetTemplate:function(e){n[e]=null},parse:function(e,r){if(!n.hasOwnProperty(e)||!n[e]){if(!t.hasOwnProperty(e))return reportError('ERROR: Template "'+e+'" does not exist in _compiledTemplates!'),"

    Template error (does not exist)

    ";i()}return"function"!=typeof n[e]?(reportError(n[e]),reportError('ERROR: Template "'+e+'" failed to compile!'),"

    Template error (failed to compile)

    "):n[e].call(this,r.data,r.config,a)},addHelper:function(e,t){return jQuery.isFunction(t)?void(a[e]=t):void reportError("NanoTemplate.addHelper failed to add "+e+" as it is not a function.")},addHelpers:function(e){for(var t in e)e.hasOwnProperty(t)&&NanoTemplate.addHelper(t,e[t])},removeHelper:function(e){helpers.hasOwnProperty(e)&&delete a[e]}}}();NanoTransition=function(){var e={},t={},n=0;NanoStateManager.addBeforeUpdateCallback("TransitionReset",function(e){return n=0,e});var a=function(e){return"_Hide_Map_close"==e?"transition__map":(void 0===e&&(e=""),"transition__"+n++ +"_"+e.toString())},r=function(n,a,r){var o,i=e[n];void 0===r&&(r=!1);var l=$("."+n);if(0==l.length)return a;if(l=l[0],i&&i.tagName==l.tagName&&i.tabIndex==l.tabIndex&&i.parent==l.parentNode.tagName&&i.children==l.children.length){if(o=t[n],r){var s={};for(k in o)s[k]=o[k];for(k in a)s[k]=a[k];a=s}}else o=a,e[n]={tagName:l.tagName,tabIndex:l.tabIndex,parent:l.parentNode.tagName,children:l.children.length};return t[n]=a,o},o=function(e,t){var n=$("."+e);return t?$(n).children(t):$(n)},i=function(e,t,n,a,r){var i=o(e,t);void 0===r&&(r=1900),i.css(n).animate(a,{duration:r,queue:!1});var l=n["..class"],s=a["..class"];if(l&&s&&(i.addClass(l),l!=s)){var l=l.split(" "),s=s.split(" "),c=l.filter(function(e){return s.indexOf(e)==-1}),u=s.filter(function(e){return l.indexOf(e)==-1});l=c.join(" "),s=u.join(" "),i.switchClass(l,s,{duration:r,queue:!1})}},l=function(e,t,n,a,r,i){var l=o(e,t);void 0===i&&(i=1900),n==-1?l.text(a.toString()):l.text(a.toFixed(n)),a!=r&&l.animate({i:1},{duration:i,queue:!1,step:function(e,t){n==-1?t.elem.textContent=(a*(1-e)+r*e).toString():t.elem.textContent=(a*(1-e)+r*e).toFixed(n)}})},s=function(e,t,n,a,i){var l=o(e,t);void 0===i&&(i=200),n["..hover"]&&l.addClass("hover"),l.hover(function(){l.stop(1,1).addClass("hover",{duration:i,queue:!1}),r(e,{"..hover":!0},!0)},function(){l.stop(1,1).removeClass("hover",{duration:i,queue:!1}),r(e,{"..hover":!1},!0)})},c=function(e,t,n,a){var o=r(e,n);return i(e,t,o,n,a),o};return{allocID:a,updateElement:r,animateElement:i,animateTextValue:l,animateHover:s,transitionElement:c}}();var NanoWindow=function(){var e,t,n,a,r,o,i=function(e,t){NanoUtility.winset("pos",e+","+t)},l=function(e,t){NanoUtility.winset("size",e+","+t)},s=function(){NanoStateManager.getData().config.user.fancy&&(c(),u(),d())},c=function(){NanoUtility.winset("titlebar",0),NanoUtility.winset("can-resize",0),$(".fancy").show(),$("#uiTitleFluff").css("right","65px")},u=function(){var e=function(){return NanoUtility.close()},t=function(){return NanoUtility.winset("is-minimized","true")};$(".close").on("click",function(t){e()}),$(".minimize").on("click",function(e){t()})},d=function(){$(document).on("mousemove",function(e){p(),f()}),$(document).on("mouseup",function(i){e&&(e=!1,t=null,n=null),a&&(a=!1,r=null,o=null)}),$("#uiTitleWrapper").on("mousedown",function(t){e=!0}),$("#resize").on("mousedown",function(e){a=!0})},p=function(a){var r,o;null==a&&(a=window.event),e&&(null==t&&(t=a.screenX),null==n&&(n=a.screenY),r=a.screenX-t+window.screenLeft,o=a.screenY-n+window.screenTop,i(r,o),t=a.screenX,n=a.screenY)},f=function(){var e,t;null==event&&(event=window.event),a&&(null==r&&(r=event.screenX),null==o&&(o=event.screenY),e=Math.max(150,event.screenX-r+window.innerWidth),t=Math.max(150,event.screenY-o+window.innerHeight),l(e,t),r=event.screenX,o=event.screenY)};return{init:function(){$(document).on("templatesLoaded",function(){s()})}}}(); \ No newline at end of file diff --git a/nano/images/Cyberiad_nanomap_z1.png b/nano/images/Cyberiad_nanomap_z1.png new file mode 100644 index 00000000000..0f064d6a3db Binary files /dev/null and b/nano/images/Cyberiad_nanomap_z1.png differ diff --git a/nano/images/MetaStation_nanomap_z1.png b/nano/images/MetaStation_nanomap_z1.png new file mode 100644 index 00000000000..57bdbda01f9 Binary files /dev/null and b/nano/images/MetaStation_nanomap_z1.png differ diff --git a/nano/images/nanomap_z1.png b/nano/images/nanomap_z1.png deleted file mode 100644 index c22e9bf6fb7..00000000000 Binary files a/nano/images/nanomap_z1.png and /dev/null differ diff --git a/nano/layouts/layout_default.tmpl b/nano/layouts/layout_default.tmpl index 1c270ee4c18..0154c6d31fb 100644 --- a/nano/layouts/layout_default.tmpl +++ b/nano/layouts/layout_default.tmpl @@ -19,7 +19,7 @@
    - +
    diff --git a/nano/layouts/layout_program.tmpl b/nano/layouts/layout_program.tmpl index 66d1605c7c0..d357b4c2ea9 100644 --- a/nano/layouts/layout_program.tmpl +++ b/nano/layouts/layout_program.tmpl @@ -56,7 +56,7 @@
    - +
    diff --git a/nano/scripts/nano/nano_base_callbacks.js b/nano/scripts/nano/nano_base_callbacks.js index 42a901c4783..81b9e4b0530 100644 --- a/nano/scripts/nano/nano_base_callbacks.js +++ b/nano/scripts/nano/nano_base_callbacks.js @@ -85,7 +85,7 @@ NanoBaseCallbacks = function () }); }); - $('#uiMapImage').attr('src', 'nanomap_z' + updateData['config']['mapZLevel'] + '.png'); + $('#uiMapImage').attr('src',updateData['config']['map'] + '_nanomap_z' + updateData['config']['mapZLevel'] + '.png'); return updateData; } diff --git a/nano/styles/_formatting.less b/nano/styles/_formatting.less index e8f65be969c..19ff288dd3f 100644 --- a/nano/styles/_formatting.less +++ b/nano/styles/_formatting.less @@ -156,6 +156,11 @@ float: left; } +.jobValues { + float: left; + width: 30%; +} + // CHROMELESS STUFF .fancy { diff --git a/nano/templates/identification_computer.tmpl b/nano/templates/identification_computer.tmpl index c10ea44ff86..d7696b8630e 100644 --- a/nano/templates/identification_computer.tmpl +++ b/nano/templates/identification_computer.tmpl @@ -8,11 +8,11 @@

    {{else}} {{:helper.link('Access Modification', 'home', {'choice' : 'mode', 'mode_target' : 0}, !data.mode ? 'disabled' : null)}} - {{:helper.link('Job Management', 'gear', {'choice' : 'mode', 'mode_target' : 1}, data.mode == 1 ? 'disabled' : null)}} + {{if !data.target_dept}}{{:helper.link('Job Management', 'gear', {'choice' : 'mode', 'mode_target' : 1}, data.mode == 1 ? 'disabled' : null)}}{{/if}} {{:helper.link('Crew Manifest', 'folder-open', {'choice' : 'mode', 'mode_target' : 2}, data.mode == 2 ? 'disabled' : null)}} - {{:helper.link('Print', 'print', {'choice' : 'print'}, (data.mode == 2 || data.has_modify && !data.mode) ? null : 'disabled')}} + {{if !data.target_dept}}{{:helper.link('Print', 'print', {'choice' : 'print'}, (data.mode == 2 || data.has_modify && !data.mode) ? null : 'disabled')}}{{/if}} - {{if data.mode == 1}} + {{if data.mode == 1 && !data.target_dept}}

    Job Management

    @@ -41,6 +41,7 @@ {{:value.title}}: {{:value.current_positions}}/{{:value.total_positions}} {{:helper.link('-', null, {'choice' : 'make_job_unavailable', 'job' : value.title}, value.can_close == 1 && data.authenticated ? null : 'disabled')}} {{:helper.link('+', null, {'choice' : 'make_job_available', 'job' : value.title}, value.can_open == 1 && data.authenticated ? null : 'disabled')}} + {{:helper.link('*', null, {'choice' : 'prioritize_job', 'job' : value.title}, value.can_prioritize > 0 && data.authenticated ? null : 'disabled')}} {{if value.can_prioritize == 2}}Priority Job {{/if}}
    {{/for}}
    @@ -111,6 +112,7 @@ {{if data.has_modify}} + {{if !data.target_dept}}

    Details

    @@ -142,7 +144,16 @@
    - + {{/if}} +
    +
    + Demotions: +
    +
    + {{:helper.link('Demote ' + data.target_owner, 'gear', {'choice' : 'demote'}, (data.target_rank == "Civilian" || data.target_rank == "Unassigned" || data.target_rank == "Terminated") ? 'disabled' : null, (data.target_rank == "Civilian" || data.target_rank == "Unassigned" || data.target_rank == "Terminated") ? 'disabled' : 'linkDanger')}} +
    +
    + {{if !data.target_dept}}
    Terminations: @@ -156,6 +167,14 @@

    Assignment

    + {{else}} + +
    +

    Assignment for {{:data.target_owner}}

    +
    + + {{/if}} +
    {{:data.target_rank}} @@ -164,6 +183,7 @@