diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql index ed0845ed33f..6e227b211a5 100644 --- a/SQL/paradise_schema.sql +++ b/SQL/paradise_schema.sql @@ -275,6 +275,7 @@ CREATE TABLE `player` ( `show_ghostitem_attack` smallint(4) DEFAULT '1', `lastchangelog` varchar(32) NOT NULL DEFAULT '0', `windowflashing` smallint(4) DEFAULT '1', + `ghost_anonsay` tinyint(1) NOT NULL DEFAULT '0', `exp` mediumtext, PRIMARY KEY (`id`), UNIQUE KEY `ckey` (`ckey`) diff --git a/SQL/paradise_schema_prefixed.sql b/SQL/paradise_schema_prefixed.sql index 216082157d4..a7ad598a143 100644 --- a/SQL/paradise_schema_prefixed.sql +++ b/SQL/paradise_schema_prefixed.sql @@ -274,6 +274,7 @@ CREATE TABLE `SS13_player` ( `show_ghostitem_attack` smallint(4) DEFAULT '1', `lastchangelog` varchar(32) NOT NULL DEFAULT '0', `windowflashing` smallint(4) DEFAULT '1', + `ghost_anonsay` tinyint(1) NOT NULL DEFAULT '0', `exp` mediumtext, PRIMARY KEY (`id`), UNIQUE KEY `ckey` (`ckey`) diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index e0956c3ebe3..77c0a8f0fa3 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -635,7 +635,7 @@ "amk" = (/turf/simulated/wall/r_wall,/area/engine/gravitygenerator) "aml" = (/obj/structure/rack,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/suit/space/vox/stealth,/obj/item/clothing/head/helmet/space/vox/stealth,/obj/item/clothing/mask/breath,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox) "amm" = (/obj/machinery/conveyor{dir = 2; id = "garbage"; layer = 2.7},/obj/machinery/door/poddoor/preopen{id_tag = "Disposal Exit"; layer = 3.1; name = "disposal exit vent"},/turf/simulated/floor/plating,/area/maintenance/disposal) -"amn" = (/obj/machinery/door_control{id = "Disposal Exit"; name = "Disposal Vent Control"; pixel_x = -25; pixel_y = 4; req_access_txt = "12"},/obj/machinery/driver_button{id_tag = "trash"; pixel_x = -26; pixel_y = -6},/obj/structure/stool,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/disposal) +"amn" = (/obj/machinery/door_control{id = "trash"; name = "Disposal Vent Control"; pixel_x = -25; pixel_y = 4; req_access_txt = "12"},/obj/machinery/driver_button{id_tag = "trash"; pixel_x = -26; pixel_y = -6},/obj/structure/stool,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/disposal) "amo" = (/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/disposal) "amp" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plating,/area/maintenance/disposal) "amq" = (/obj/effect/decal/cleanable/blood/oil,/obj/machinery/light_switch{pixel_x = 25; pixel_y = 0},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/disposal) @@ -8072,6 +8072,8 @@ "cZl" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 2; initialize_directions = 11},/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-24"; layer = 4.1; tag = "icon-plant-24"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) "cZm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "chapel"},/area/chapel/main) "cZn" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/medical/research{name = "Research Division"}) +"cZo" = (/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Emergency Shuttle Airlock"; req_access_txt = "0"},/turf/simulated/shuttle/floor,/area/shuttle/escape) +"cZp" = (/obj/docking_port/mobile/emergency{dir = 2; dwidth = 5; height = 14; width = 25},/obj/docking_port/stationary{dir = 2; dwidth = 5; height = 14; id = "emergency_home"; name = "emergency evac bay"; width = 25},/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Emergency Shuttle Airlock"; req_access_txt = "0"},/turf/simulated/shuttle/floor,/area/shuttle/escape) "cZq" = (/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen,/turf/simulated/shuttle/plating{icon_state = "bot"},/area/shuttle/escape) "cZr" = (/turf/simulated/wall,/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cZs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) @@ -8113,7 +8115,6 @@ "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) "daj" = (/obj/structure/sign/nosmoking_2,/turf/simulated/shuttle/wall{icon_state = "swall0"; dir = 2},/area/shuttle/escape) -"dak" = (/obj/docking_port/mobile/emergency{dir = 2; dwidth = 5; height = 14; width = 25},/obj/docking_port/stationary{dir = 2; dwidth = 5; height = 14; id = "emergency_home"; name = "emergency evac bay"; width = 25},/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Emergency Shuttle Airlock"; req_access_txt = "2"},/turf/simulated/shuttle/floor,/area/shuttle/escape) "dal" = (/turf/simulated/shuttle/wall{icon_state = "swall4"; dir = 2},/area/shuttle/escape) "dam" = (/obj/structure/closet/crate{name = "emergency supplies crate"},/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/flashlight/flare{pixel_x = 3; pixel_y = 3},/obj/item/device/flashlight/flare{pixel_x = -6; pixel_y = -2},/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/item/device/radio,/turf/simulated/shuttle/plating{icon_state = "bot"},/area/shuttle/escape) "dao" = (/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/preopen{id_tag = "xenobio1"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) @@ -8662,7 +8663,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabqaaacTZcXjcVMcVRcWNcWNcXkcSOcSOcSOcSOcZwcWzcXmcUXcXncUXcXmcZxcZCcSOcXpcTXcXpcTXcTXcTXcTXcTXcXpcTXcXpcTXaaaabqabqcVGcXqcXrcXscXtcVGcXucXvcVGcVGcXwdeQcXycXzcVGcYccZvcYycXZcYdcYbcYdcYdcYecXZaaaaaaabqauparBaupabqabqabqabqcVJabqabqabqabqabqabearBarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcSOcSOcSOcXEcUXcUXcUXcXFcXGcSOcZQcVacXIcXJcXJcXKcXJcXJcXLcZRcVkcXMcTXcXacTXaaaaaaaaacTXcXNcTXcXacTXaaaabqaaacNzcXOcXPcXQcXRcXRcXScXTcXUcXVcXVcXWcXXcXYcNzcYccZvcYycYGcXBcXCcZycXCcXBcZzaaaaaaabqaaaabqaaaabqaaaaaaaaacYfaaaaaaabqaaaaaaaaaaaaaupaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaacTZcYgcYhcYicYjcYkcXKcYlcYmcSOcSOcSOcSOcUecUecUecUecUecSOcSOcVkcXpcTXcXpcTXaaaabqaaacTXcXpcTXcZUcZTabqabqaaacNzdeBcYpcYqcYrcYrcYscYtcYucYucYucYucYvcYwcNzcYccZvcYycOmcOmcOmcYIcfwaaaaaaaaaaaaabqaaacYAcYAcYAcYAcYAabqcYBabqcYAcYAcYAcYAcYAaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcSOcTZcSOcSOcTZcTZcTZcSOcYCcSOaaaaaacYDcYFcYFcYFcYFdahdaXcYFdaidcbcYFdcbdajcYFcYFcYFdaidakcYFdcbdalcYEcYJaaacVGcYKcYLcYMcYNcYOcYPcYQcYRdgXdgWcYUcYVcYWcVGcYcciccWkdawcOmcZfcZhcOmaaaaaaaaaaaaabqabqcYXcYYcYYcYYcYYcYZcZacZbcZccZccZccZccZdabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcSOcTZcSOcSOcTZcTZcTZcSOcYCcSOaaaaaacYDcYFcYFcYFcYFdahdaXcYFdaicZocYFcZodajcYFcYFcYFdaicZpcYFdcbdalcYEcYJaaacVGcYKcYLcYMcYNcYOcYPcYQcYRdgXdgWcYUcYVcYWcVGcYcciccWkdawcOmcZfcZhcOmaaaaaaaaaaaaabqabqcYXcYYcYYcYYcYYcYZcZacZbcZccZccZccZccZdabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaabqaaaaaaaaaaaaaaaabqabqdazdbadaAdcTdcPdaBcZedcncZBdaCcZBdaDcZBdaCdaCdaDdaCdaEcZBdaCcZBcZBdaKdaJaaacVGcZrcZrcZrcZrcTkcZscZtcZucTkcZrcZrcZrcZrcVGdaLciccWkdaMdaOcZicZncfwaaaaaaaaaaaaabqabqcZAcZAcZAcZAcZAaaacYBaaacZAcZAcZAcZAcZAabqarBabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabqabqabqabqdaVdaZcZedbkcZBddadbqdbhcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZgcYFaaacVGcZGcZHcZHcVbcZJcZKcZLcZMcZNcVlcZPcZPcZPcVGcYcdbudbFdbvcfwcfwcOmcfwaaaaaaaaaaaaabqaaaabqaaaabqabqabqaaacYBaaaabqaaaabqaaaabqaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbNdbOcZedbPddccZBcZBdaJcZBcZBdbQdbYdbQdbQdbQcZBdbQdbQdbQdbYdbQcZBcZBdccdaiabqcVGcZPcZPcZPcZXcZYcZZdaadabdacdadcZPcZPcZPcVGcOmcfwcOmcOmcfwaaaaaaaaaaaaaaaaaaaaaabqaaacYAcYAcYAcYAcYAabqcYBabqcYAcYAcYAcYAcYAabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/MetaStation/z2.dmm b/_maps/map_files/MetaStation/z2.dmm index 69f2d4a567c..ad26c7fb2ec 100644 --- a/_maps/map_files/MetaStation/z2.dmm +++ b/_maps/map_files/MetaStation/z2.dmm @@ -437,7 +437,7 @@ "iu" = (/obj/machinery/door/airlock/centcom{name = "Centcom Security"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac) "iv" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/centcom/evac) "iw" = (/obj/item/weapon/soap/syndie,/obj/structure/mopbucket,/obj/machinery/light{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) -"ix" = (/obj/structure/table/woodentable,/obj/item/pizzabox,/obj/item/device/paicard,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) +"ix" = (/obj/structure/table/woodentable,/obj/item/pizzabox,/obj/item/device/paicard/syndicate,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "iy" = (/obj/structure/table/woodentable,/obj/item/toy/nuke,/turf/unsimulated/floor{dir = 2; icon_state = "wood"},/area/syndicate_mothership) "iz" = (/obj/effect/landmark{name = "Commando"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry) "iA" = (/obj/structure/stool/bed/chair/office/dark,/obj/effect/landmark{name = "Response Team"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index ce097d44c26..532fcd6f9bc 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -2402,14 +2402,14 @@ "aUj" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/computer/monitor{name = "Backup Power Monitoring Console"},/turf/simulated/floor/plating,/area/maintenance/electrical) "aUk" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes{charge = 0},/turf/simulated/floor/plating,/area/maintenance/electrical) "aUl" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/hallway/secondary/entry) -"aUm" = (/obj/machinery/door/firedoor,/obj/machinery/door/window/brigdoor{dir = 1; name = "Security Checkpoint"; req_access_txt = "1"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/security/checkpoint2) +"aUm" = (/obj/item/device/radio,/obj/item/device/radio/intercom/department/security{pixel_x = 0; pixel_y = -28},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/checkpoint2) "aUn" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/hallway/secondary/entry) "aUo" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/entry) "aUp" = (/obj/machinery/camera{c_tag = "Arrivals North"; dir = 1},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/entry) "aUq" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/hallway/secondary/entry) -"aUr" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/security/checkpoint2) -"aUs" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) -"aUt" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/hallway/primary/port) +"aUr" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"}) +"aUs" = (/obj/machinery/door/firedoor,/obj/machinery/door/window/brigdoor{dir = 1; name = "Security Checkpoint"; req_access_txt = "1"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/security/checkpoint2) +"aUt" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/security/checkpoint2) "aUu" = (/obj/machinery/hydroponics/soil,/turf/simulated/floor/grass,/area/hallway/secondary/construction{name = "\improper Garden"}) "aUv" = (/obj/machinery/light{dir = 1},/obj/structure/sink{pixel_y = 30},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"}) "aUw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"}) @@ -2658,7 +2658,7 @@ "aZf" = (/obj/structure/table/reinforced,/obj/machinery/computer/skills,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/checkpoint2) "aZg" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/checkpoint2) "aZh" = (/obj/machinery/recharger{pixel_y = 4},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/checkpoint2) -"aZi" = (/obj/item/device/radio,/obj/item/device/radio/intercom/department/security{pixel_x = 0; pixel_y = -28},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/checkpoint2) +"aZi" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) "aZj" = (/obj/machinery/light/small{dir = 8},/obj/structure/table/glass,/obj/item/weapon/cultivator,/obj/item/weapon/hatchet,/obj/item/weapon/crowbar,/obj/item/device/plant_analyzer,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"}) "aZk" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"}) "aZl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"}) @@ -2757,8 +2757,8 @@ "bba" = (/obj/effect/landmark{name = "Observer-Start"},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station) "bbb" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/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/plasteel{dir = 4; icon_state = "whitecorner"},/area/hallway/secondary/entry) "bbc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/security{name = "Security Checkpoint"; req_access = null; req_access_txt = "1"},/turf/simulated/floor/plasteel,/area/security/checkpoint2) -"bbd" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 2},/area/hallway/secondary/entry) -"bbe" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/hallway/primary/port) +"bbd" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/hallway/primary/port) +"bbe" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 2},/area/hallway/secondary/entry) "bbf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plasteel{icon_state = "green"; dir = 8},/area/maintenance/fpmaint2) "bbg" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"}) "bbh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"}) @@ -2847,7 +2847,7 @@ "bcM" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/shuttle/arrival/station) "bcN" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/arrival/station) "bcO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) -"bcP" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/hallway/primary/port) +"bcP" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/hallway/primary/port) "bcQ" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = 25},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/hallway/secondary/entry) "bcR" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/hallway/secondary/entry) "bcS" = (/turf/simulated/floor/plasteel{icon_state = "bot"},/area/hallway/secondary/entry) @@ -2869,7 +2869,7 @@ "bdi" = (/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/storage/primary) "bdj" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 8; location = "Tool Storage"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/storage/primary) "bdk" = (/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor/plasteel,/area/storage/primary) -"bdl" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable,/turf/simulated/floor/plating,/area/hallway/primary/port) +"bdl" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/hallway/primary/port) "bdm" = (/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{icon_state = "vault"; dir = 5},/area/hallway/primary/port) "bdn" = (/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel,/area/gateway) "bdo" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/machinery/door_control{id = "stationawaygate"; name = "Gateway Shutters Access Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "62"},/turf/simulated/floor/plasteel,/area/gateway) @@ -2947,7 +2947,7 @@ "beI" = (/obj/machinery/requests_console{department = "Arrival Shuttle"; name = "Arrival Shuttle Requests Console"; pixel_y = -30},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station) "beJ" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"; dir = 8},/turf/space,/area/shuttle/arrival/station) "beK" = (/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/plasteel,/area/hallway/secondary/entry) -"beL" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/hallway/primary/port) +"beL" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable,/turf/simulated/floor/plating,/area/hallway/primary/port) "beM" = (/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/hallway/secondary/entry) "beN" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/hallway/secondary/entry) "beO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/secondary/entry) @@ -2957,15 +2957,15 @@ "beS" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Primary Tool Storage"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/storage/primary) "beT" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Primary Tool Storage"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/storage/primary) "beU" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/storage/primary) -"beV" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "Gateway Access"; req_access_txt = "62"},/turf/simulated/floor/plasteel,/area/gateway) -"beW" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "stationawaygate"; name = "Gateway Access Shutters"},/turf/simulated/floor/plasteel,/area/gateway) -"beX" = (/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,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "stationawaygate"; name = "Gateway Access Shutters"},/turf/simulated/floor/plasteel,/area/gateway) +"beV" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/hallway/primary/port) +"beW" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "Gateway Access"; req_access_txt = "62"},/turf/simulated/floor/plasteel,/area/gateway) +"beX" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "stationawaygate"; name = "Gateway Access Shutters"},/turf/simulated/floor/plasteel,/area/gateway) "beY" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/hallway/primary/port) -"beZ" = (/obj/machinery/door/firedoor,/obj/machinery/light{dir = 1},/obj/structure/sign/directions/evac{dir = 4; icon_state = "direction_evac"; pixel_y = 24; tag = "icon-direction_evac (EAST)"},/obj/structure/sign/directions/medical{dir = 4; icon_state = "direction_med"; pixel_y = 32; tag = "icon-direction_med (EAST)"},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) +"beZ" = (/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,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "stationawaygate"; name = "Gateway Access Shutters"},/turf/simulated/floor/plasteel,/area/gateway) "bfa" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/fpmaint) -"bfb" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/port) -"bfc" = (/obj/machinery/light{dir = 1},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 8},/area/hallway/primary/port) -"bfd" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw) +"bfb" = (/obj/machinery/door/firedoor,/obj/machinery/light{dir = 1},/obj/structure/sign/directions/evac{dir = 4; icon_state = "direction_evac"; pixel_y = 24; tag = "icon-direction_evac (EAST)"},/obj/structure/sign/directions/medical{dir = 4; icon_state = "direction_med"; pixel_y = 32; tag = "icon-direction_med (EAST)"},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) +"bfc" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/port) +"bfd" = (/obj/machinery/light{dir = 1},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 8},/area/hallway/primary/port) "bfe" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/gateway) "bff" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fpmaint) "bfg" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) @@ -3037,8 +3037,8 @@ "bgu" = (/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/secondary/entry) "bgv" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hallway/secondary/entry) "bgw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 8},/area/hallway/secondary/entry) -"bgx" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/external{name = "Arrival Airlock"},/turf/simulated/floor/plating,/area/hallway/secondary/entry) -"bgy" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) +"bgx" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw) +"bgy" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/external{name = "Arrival Airlock"},/turf/simulated/floor/plating,/area/hallway/secondary/entry) "bgz" = (/turf/simulated/floor/plasteel,/area/hallway/primary/port) "bgA" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plasteel,/area/hallway/primary/port) "bgB" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/port) @@ -3046,7 +3046,7 @@ "bgD" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/port) "bgE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/primary/port) "bgF" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/port) -"bgG" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/hallway/primary/port) +"bgG" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) "bgH" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/primary/port) "bgI" = (/obj/machinery/camera{c_tag = "Port Hallway 2"; dir = 2},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/primary/port) "bgJ" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/primary/port) @@ -3055,9 +3055,9 @@ "bgM" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/primary/port) "bgN" = (/obj/machinery/light{dir = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/port) "bgO" = (/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/plasteel,/area/hallway/primary/port) -"bgP" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) +"bgP" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/hallway/primary/port) "bgQ" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw) -"bgR" = (/obj/structure/closet/emcloset,/obj/machinery/light{dir = 1; on = 1},/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) +"bgR" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "bgS" = (/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw) "bgT" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 30},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw) "bgU" = (/obj/machinery/camera{c_tag = "Central Hallway North-West"; dir = 2; network = list("SS13")},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw) @@ -3132,7 +3132,7 @@ "bil" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/escape) "bim" = (/obj/machinery/light/spot,/turf/simulated/shuttle/floor,/area/shuttle/escape) "bin" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/escape) -"bio" = (/obj/structure/reagent_dispensers/water_cooler,/obj/machinery/camera{c_tag = "Departure Lounge Security"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) +"bio" = (/obj/structure/closet/emcloset,/obj/machinery/light{dir = 1; on = 1},/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "bip" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/item/device/radio/intercom{dir = 0; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry) "biq" = (/obj/machinery/hologram/holopad,/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/plasteel,/area/hallway/secondary/entry) "bir" = (/obj/structure/table/woodentable,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/entry) @@ -3141,7 +3141,7 @@ "biu" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 8},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/entry) "biv" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hallway/secondary/entry) "biw" = (/turf/simulated/floor/plasteel{desc = "\"This is a plaque in honour of our comrades on the G4407 Stations. Hopefully TG4407 model can live up to your fame and fortune.\" Scratched in beneath that is a crude image of a meteor and a spaceman. The spaceman is laughing. The meteor is exploding."; dir = 4; icon_state = "plaque"; name = "Comemmorative Plaque"},/area/hallway/secondary/entry) -"bix" = (/obj/structure/closet/emcloset,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/effect/decal/warning_stripes/east,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) +"bix" = (/obj/structure/reagent_dispensers/water_cooler,/obj/machinery/camera{c_tag = "Departure Lounge Security"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "biy" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CHW"; location = "Lockers"},/turf/simulated/floor/plasteel,/area/hallway/primary/port) "biz" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel,/area/hallway/primary/port) "biA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/hallway/primary/port) @@ -3152,7 +3152,7 @@ "biF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/port) "biG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/hallway/primary/port) "biH" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/hallway/primary/port) -"biI" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/port) +"biI" = (/obj/structure/closet/emcloset,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/effect/decal/warning_stripes/east,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "biJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/port) "biK" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel,/area/hallway/primary/port) "biL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/hallway/primary/port) @@ -3211,8 +3211,8 @@ "bjM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "bjN" = (/obj/machinery/computer/arcade,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "bjO" = (/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) -"bjP" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/port) -"bjQ" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw) +"bjP" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/port) +"bjQ" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/port) "bjR" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/exit) "bjS" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/escape) "bjT" = (/turf/simulated/shuttle/wall{icon_state = "swall13"; dir = 2},/area/shuttle/escape) @@ -3235,7 +3235,7 @@ "bkk" = (/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/junction{tag = "icon-pipe-j1 (EAST)"; icon_state = "pipe-j1"; dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/port) "bkl" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plasteel,/area/hallway/primary/port) "bkm" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2 (EAST)"; icon_state = "pipe-j2"; dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/port) -"bkn" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) +"bkn" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw) "bko" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/port) "bkp" = (/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/camera{c_tag = "Port Hallway"; dir = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/port) "bkq" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/hallway/primary/port) @@ -3243,9 +3243,9 @@ "bks" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plasteel,/area/hallway/primary/port) "bkt" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel,/area/hallway/primary/port) "bku" = (/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/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/port) -"bkv" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/crew_quarters/locker) +"bkv" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "bkw" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw) -"bkx" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/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/crew_quarters/locker) +"bkx" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/crew_quarters/locker) "bky" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw) "bkz" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=QM"; location = "CHW"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw) "bkA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/nw) @@ -3298,7 +3298,7 @@ "blv" = (/obj/machinery/light{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "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) "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/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 4},/area/hallway/secondary/entry) +"bly" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/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/crew_quarters/locker) "blz" = (/obj/effect/decal/warning_stripes/east,/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "blA" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape) "blB" = (/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) @@ -3313,8 +3313,8 @@ "blK" = (/turf/simulated/wall,/area/hallway/primary/port) "blL" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port) "blM" = (/turf/simulated/wall,/area/crew_quarters/locker) -"blN" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) -"blO" = (/obj/effect/decal/warning_stripes/northeastcorner,/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) +"blN" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 4},/area/hallway/secondary/entry) +"blO" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "blP" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/port) "blQ" = (/turf/simulated/wall,/area/maintenance/port) "blR" = (/turf/simulated/wall,/area/storage/emergency2) @@ -3377,11 +3377,11 @@ "bmW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "bmX" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor4,/area/shuttle/escape) "bmY" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor4,/area/shuttle/escape) -"bmZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Escape Shuttle Cell"; req_access_txt = "2"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) +"bmZ" = (/obj/effect/decal/warning_stripes/northeastcorner,/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "bna" = (/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) "bnb" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "8"},/turf/simulated/floor/plating,/area/shuttle/escape) "bnc" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/closet/walllocker/emerglocker{pixel_x = 28},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape) -"bnd" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Escape Shuttle Cell"; req_access_txt = "2"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) +"bnd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Escape Shuttle Cell"; req_access_txt = "2"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "bne" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry) "bnf" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry) "bng" = (/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 4},/area/hallway/secondary/entry) @@ -3392,7 +3392,7 @@ "bnl" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry) "bnm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 4},/area/hallway/secondary/entry) "bnn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) -"bno" = (/obj/machinery/door/firedoor,/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,/obj/machinery/status_display{pixel_x = 32},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) +"bno" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Escape Shuttle Cell"; req_access_txt = "2"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "bnp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/hallway/secondary/entry) "bnq" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/hallway/secondary/entry) "bnr" = (/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/hallway/secondary/entry) @@ -3453,9 +3453,9 @@ "bou" = (/obj/structure/table,/obj/machinery/kitchen_machine/microwave{pixel_x = -3; pixel_y = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) "bov" = (/obj/machinery/cooker/deepfryer,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) "bow" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/kitchen_machine/oven,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) -"box" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/window/eastleft{name = "Hydroponics Desk"; req_access_txt = "35"},/obj/machinery/door/window/northleft{dir = 8; icon_state = "left"; name = "Kitchen Desk"; req_access_txt = "28"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/hydroponics) +"box" = (/obj/effect/landmark/start{name = "Cargo Technician"},/turf/simulated/floor/plasteel,/area/quartermaster/office) "boy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "green"; dir = 8},/area/hydroponics) -"boz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) +"boz" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/window{base_state = "right"; dir = 8; icon_state = "right"; name = "Mailing Room"; req_access_txt = "50"},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/office) "boA" = (/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel,/area/hydroponics) "boB" = (/turf/simulated/floor/plasteel,/area/hydroponics) "boC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/hydroponics) @@ -3475,7 +3475,7 @@ "boQ" = (/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/hallway/secondary/entry) "boR" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitecorner"},/area/hallway/secondary/entry) "boS" = (/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) -"boT" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) +"boT" = (/obj/machinery/door/firedoor,/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,/obj/machinery/status_display{pixel_x = 32},/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) "boV" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) "boW" = (/obj/machinery/firealarm{dir = 2; pixel_y = -24},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) @@ -3549,8 +3549,8 @@ "bqm" = (/obj/structure/stool/bed/chair,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "bqn" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/floor/plating,/area/hallway/secondary/exit) "bqo" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "15"},/turf/simulated/floor/plating,/area/shuttle/escape) -"bqp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) -"bqq" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) +"bqp" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/window/eastleft{name = "Hydroponics Desk"; req_access_txt = "35"},/obj/machinery/door/window/northleft{dir = 8; icon_state = "left"; name = "Kitchen Desk"; req_access_txt = "28"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/hydroponics) +"bqq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "bqr" = (/turf/simulated/wall,/area/security/vacantoffice) "bqs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/security/vacantoffice) "bqt" = (/obj/effect/decal/cleanable/generic,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port) @@ -3602,7 +3602,7 @@ "brn" = (/obj/structure/table,/obj/item/weapon/kitchen/rollingpin,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) "bro" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) "brp" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) -"brq" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) +"brq" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "brr" = (/turf/simulated/floor/plasteel{icon_state = "green"; dir = 8},/area/hydroponics) "brs" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/hydroponics) "brt" = (/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/hydroponics) @@ -3689,9 +3689,9 @@ "bsW" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) "bsX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) "bsY" = (/obj/machinery/processor,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) -"bsZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) -"bta" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) -"btb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitecorner"},/area/hallway/secondary/exit) +"bsZ" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 4},/area/quartermaster/office) +"bta" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) +"btb" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "btc" = (/obj/machinery/hydroponics/constructable,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) "btd" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "bte" = (/turf/simulated/wall,/area/hallway/primary/starboard/east) @@ -3711,7 +3711,7 @@ "bts" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/stool,/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{icon_state = "chapel"},/area/chapel/main) "btt" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/camera{c_tag = "Chapel South"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) "btu" = (/obj/item/device/radio/intercom{pixel_x = -25},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera{c_tag = "Departure Lounge West"; dir = 4; network = list("SS13")},/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit) -"btv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) +"btv" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "btw" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "btx" = (/obj/item/flag/nt,/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "bty" = (/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},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape) @@ -3934,7 +3934,7 @@ "bxH" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/fancy/donut_box,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "kitchenhall"; name = "Kitchen Shutters"; opacity = 0},/obj/machinery/door/window/westleft{dir = 1; name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) "bxI" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "kitchenhall"; name = "Kitchen Shutters"; opacity = 0},/obj/machinery/door/window/westright{dir = 1; name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) "bxJ" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "kitchenhall"; name = "Kitchen Shutters"; opacity = 0},/obj/machinery/door/window/westleft{dir = 1; name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) -"bxK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) +"bxK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "bxL" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Botanist"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/hydroponics) "bxM" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/hydroponics) "bxN" = (/obj/machinery/camera{c_tag = "Hydroponics South"; dir = 8; network = list("SS13")},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/item/weapon/reagent_containers/glass/bucket,/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) @@ -4015,7 +4015,7 @@ "bzk" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Hydroponics"; req_access_txt = "35"},/turf/simulated/floor/plasteel,/area/hydroponics) "bzl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) "bzm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit) -"bzn" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) +"bzn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "bzo" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/extinguisher,/obj/item/weapon/crowbar,/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape) "bzp" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "bzq" = (/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) @@ -4087,10 +4087,10 @@ "bAE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) "bAF" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/machinery/camera{c_tag = "Starboard Primary Hallway 6"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) "bAG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) -"bAH" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) +"bAH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitecorner"},/area/hallway/secondary/exit) "bAI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/secondary/exit) "bAJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) -"bAK" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/hallway/secondary/exit) +"bAK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "bAL" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "bAM" = (/obj/effect/decal/warning_stripes/northeastsouth,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "bAN" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/hallway/secondary/exit) @@ -4146,7 +4146,7 @@ "bBL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) "bBM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) "bBN" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=HOP2"; location = "Stbd"},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) -"bBO" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/turf/simulated/floor/plasteel{dir = 2; icon_state = "escape"},/area/hallway/secondary/exit) +"bBO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "bBP" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "bBQ" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "bBR" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "14"},/turf/simulated/floor/plating,/area/shuttle/escape) @@ -4224,17 +4224,17 @@ "bDl" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/camera{c_tag = "Starboard Primary Hallway 5"; dir = 1; network = list("SS13")},/obj/item/device/radio/intercom{pixel_y = -28},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) "bDm" = (/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 2; icon_state = "purple"},/area/hallway/primary/starboard/east) "bDn" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "purple"},/area/hallway/primary/starboard/east) -"bDo" = (/obj/machinery/door/firedoor,/obj/machinery/door/window{base_state = "right"; dir = 8; icon_state = "right"; name = "Mailing Room"; req_access_txt = "50"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/office) +"bDo" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "bDp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "escape"},/area/hallway/secondary/exit) "bDq" = (/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 2; icon_state = "escape"},/area/hallway/secondary/exit) "bDr" = (/obj/machinery/newscaster{pixel_y = -32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "escape"},/area/hallway/secondary/exit) "bDs" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "escape"},/area/hallway/secondary/exit) -"bDt" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/research{name = "Mech Bay"; req_access_txt = "29"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/assembly/chargebay) -"bDu" = (/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) +"bDt" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) +"bDu" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/hallway/secondary/exit) "bDv" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/shuttle/floor4,/area/shuttle/escape) "bDw" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape) "bDx" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Escape Shuttle Infirmary"; req_access_txt = "0"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape) -"bDy" = (/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) +"bDy" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/turf/simulated/floor/plasteel{dir = 2; icon_state = "escape"},/area/hallway/secondary/exit) "bDz" = (/turf/simulated/shuttle/floor4,/area/shuttle/escape) "bDA" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops) "bDB" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Hatch"; req_access_txt = "109"},/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 11; id = "specops"; name = "ert shuttle"; roundstart_move = "specops_away"; width = 5},/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 11; id = "specops_home"; name = "port bay 2"; width = 5},/turf/simulated/shuttle/plating,/area/shuttle/specops) @@ -4283,7 +4283,7 @@ "bEs" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/medical/reception) "bEt" = (/turf/simulated/wall,/area/medical/exam_room) "bEu" = (/turf/simulated/wall,/area/medical/morgue) -"bEv" = (/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 = "0"; req_one_access_txt = "6,9"},/turf/simulated/floor/plasteel,/area/medical/morgue) +"bEv" = (/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) "bEw" = (/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) "bEx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/hallway/primary/starboard/east) "bEy" = (/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) @@ -4295,8 +4295,8 @@ "bEE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bEF" = (/turf/simulated/wall,/area/hallway/secondary/exit) "bEG" = (/turf/simulated/wall/r_wall,/area/hallway/secondary/exit) -"bEH" = (/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) -"bEI" = (/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 = "rdlab"; name = "Research and Development Lab Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/lab) +"bEH" = (/obj/machinery/light,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) +"bEI" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/turf/simulated/floor/plasteel{dir = 2; icon_state = "escape"},/area/hallway/secondary/exit) "bEJ" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"; dir = 2},/area/shuttle/escape) "bEK" = (/obj/machinery/computer/communications,/obj/item/device/radio/intercom/specops{pixel_y = -28},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops) "bEL" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops) @@ -4330,9 +4330,9 @@ "bFn" = (/obj/structure/disposalpipe/sortjunction{dir = 4; icon_state = "pipe-j2s"; sortType = 0},/turf/simulated/wall,/area/quartermaster/office) "bFo" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/quartermaster/office) "bFp" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/quartermaster/office) -"bFq" = (/obj/structure/stool/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Cargo Technician"},/turf/simulated/floor/plasteel,/area/quartermaster/office) -"bFr" = (/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 4},/area/quartermaster/office) -"bFs" = (/obj/structure/table/reinforced,/obj/machinery/door/window/eastright{base_state = "left"; dir = 2; icon_state = "left"; name = "Research and Development Desk"; req_access_txt = "47"},/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{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "rdlab"; name = "Research and Development Lab Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/lab) +"bFq" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/research{name = "Mech Bay"; req_access_txt = "29"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/assembly/chargebay) +"bFr" = (/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) +"bFs" = (/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) "bFt" = (/obj/machinery/camera{c_tag = "Central Hallway West"; dir = 8; network = list("SS13")},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/central/west) "bFu" = (/obj/machinery/door/window/eastright{dir = 1; name = "Bridge Delivery"; req_access_txt = "19"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/bridge/meeting_room) "bFv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/bridge/meeting_room) @@ -4384,16 +4384,16 @@ "bGp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plating,/area/maintenance/genetics) "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" = (/obj/machinery/door/window/eastright{dir = 8; name = "Chemistry Desk"; req_access_txt = "33"},/obj/machinery/door/firedoor,/obj/structure/table/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) -"bGt" = (/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) +"bGs" = (/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) +"bGt" = (/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 = "rdlab"; name = "Research and Development Lab Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/lab) "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/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) "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) -"bGx" = (/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) -"bGy" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Delivery Office"; req_access_txt = "50"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/office) +"bGx" = (/obj/structure/table/reinforced,/obj/machinery/door/window/eastright{base_state = "left"; dir = 2; icon_state = "left"; name = "Research and Development Desk"; req_access_txt = "47"},/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{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "rdlab"; name = "Research and Development Lab Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/lab) +"bGy" = (/obj/machinery/door/window/eastright{dir = 8; name = "Chemistry Desk"; req_access_txt = "33"},/obj/machinery/door/firedoor,/obj/structure/table/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) "bGz" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 10; icon_state = "purple"},/area/hallway/primary/starboard/east) -"bGA" = (/obj/machinery/conveyor{dir = 4; id = "packageExternal"},/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/office) -"bGB" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Cargo Bay"; req_access_txt = "31"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel,/area/quartermaster/storage) +"bGA" = (/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) +"bGB" = (/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) "bGC" = (/obj/machinery/autolathe,/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/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) @@ -4451,7 +4451,7 @@ "bHE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) "bHF" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) "bHG" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) -"bHH" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plating,/area/hallway/secondary/entry) +"bHH" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Delivery Office"; req_access_txt = "50"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/office) "bHI" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/reception) "bHJ" = (/obj/structure/stool,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/reception) "bHK" = (/obj/structure/sign/examroom,/turf/simulated/wall,/area/medical/exam_room) @@ -4555,7 +4555,7 @@ "bJE" = (/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) "bJF" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/reception) "bJG" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/reception) -"bJH" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Cargo Bay"; req_access_txt = "31"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/storage) +"bJH" = (/obj/machinery/conveyor{dir = 4; id = "packageExternal"},/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/office) "bJI" = (/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) "bJJ" = (/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) "bJK" = (/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) @@ -4570,7 +4570,7 @@ "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/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/assembly/chargebay) "bJV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/assembly/chargebay) -"bJW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator) +"bJW" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Cargo Bay"; req_access_txt = "31"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel,/area/quartermaster/storage) "bJX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) "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) "bJZ" = (/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) @@ -4604,14 +4604,14 @@ "bKB" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/quartermaster/storage) "bKC" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/quartermaster/office) "bKD" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/quartermaster/office) -"bKE" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/simulated/floor/plating,/area/quartermaster/storage) +"bKE" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plating,/area/hallway/secondary/entry) "bKF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/office) "bKG" = (/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 = 9; pixel_y = 0},/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 0; pixel_y = -32; req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/quartermaster/office) "bKH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/quartermaster/office) "bKI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel,/area/quartermaster/office) "bKJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "loadingarea"},/area/quartermaster/office) "bKK" = (/obj/machinery/conveyor{dir = 4; id = "packageExternal"},/obj/structure/plasticflaps{opacity = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/office) -"bKL" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/window/westleft{name = "Cargo Desk"; req_access_txt = "50"},/obj/structure/noticeboard{pixel_y = 27},/turf/simulated/floor/plasteel,/area/quartermaster/office) +"bKL" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Cargo Bay"; req_access_txt = "31"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/storage) "bKM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/west) "bKN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/west) "bKO" = (/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/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/west) @@ -4690,19 +4690,19 @@ "bMj" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/shuttle/supply) "bMk" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/shuttle/supply) "bMl" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/supply) -"bMm" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "hopqueue"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "loadingarea"; tag = "loading"},/area/hallway/primary/central/sw) +"bMm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator) "bMn" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/status_display/supply_display{pixel_y = 32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/quartermaster/storage) "bMo" = (/obj/structure/closet/emcloset,/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 30},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/storage) "bMp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/quartermaster/storage) "bMq" = (/obj/machinery/light{dir = 1},/obj/machinery/firealarm{pixel_y = 27},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/quartermaster/storage) "bMr" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/quartermaster/storage) "bMs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/quartermaster/storage) -"bMt" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/office) +"bMt" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/simulated/floor/plating,/area/quartermaster/storage) "bMu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/quartermaster/office) "bMv" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel,/area/quartermaster/office) "bMw" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/quartermaster/office) "bMx" = (/obj/machinery/status_display/supply_display,/turf/simulated/wall,/area/quartermaster/office) -"bMy" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "robotics2"; name = "Robotics Lab Shutters"; opacity = 0},/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Robotics Desk"; req_access_txt = "29"},/turf/simulated/floor/plating,/area/assembly/robotics) +"bMy" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/window/westleft{name = "Cargo Desk"; req_access_txt = "50"},/obj/structure/noticeboard{pixel_y = 27},/turf/simulated/floor/plasteel,/area/quartermaster/office) "bMz" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Delivery Office"; req_access_txt = "50"},/turf/simulated/floor/plasteel,/area/quartermaster/office) "bMA" = (/obj/machinery/mineral/ore_redemption,/turf/simulated/floor/plasteel,/area/quartermaster/office) "bMB" = (/obj/machinery/light{dir = 8},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/sw) @@ -4779,9 +4779,9 @@ "bNU" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/research) "bNV" = (/obj/structure/grille,/obj/structure/window/full/shuttle,/turf/simulated/shuttle/plating,/area/shuttle/research) "bNW" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/research) -"bNX" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "rdlab2"; name = "Research and Development Lab Shutters"; opacity = 0},/obj/machinery/door/window/eastright{base_state = "left"; dir = 1; icon_state = "left"; name = "Research and Development Desk"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) -"bNY" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/glass_research{name = "Research and Development"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) -"bNZ" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/external{id_tag = "supply_home"; name = "Cargo Docking Hatch"; req_access_txt = "31"},/turf/simulated/floor/plating,/area/quartermaster/storage) +"bNX" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "hopqueue"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "loadingarea"; tag = "loading"},/area/hallway/primary/central/sw) +"bNY" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/office) +"bNZ" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "robotics2"; name = "Robotics Lab Shutters"; opacity = 0},/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Robotics Desk"; req_access_txt = "29"},/turf/simulated/floor/plating,/area/assembly/robotics) "bOa" = (/obj/machinery/door/poddoor{id_tag = "trash"; name = "disposal bay door"; protected = 0},/obj/structure/fans/tiny,/turf/simulated/floor/plating,/area/maintenance/disposal) "bOb" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/shuttle/supply) "bOc" = (/turf/simulated/shuttle/floor,/area/shuttle/supply) @@ -4792,7 +4792,7 @@ "bOh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/storage) "bOi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/storage) "bOj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/storage) -"bOk" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/quartermaster/office) +"bOk" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "rdlab2"; name = "Research and Development Lab Shutters"; opacity = 0},/obj/machinery/door/window/eastright{base_state = "left"; dir = 1; icon_state = "left"; name = "Research and Development Desk"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) "bOl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/quartermaster/office) "bOm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/office) "bOn" = (/obj/structure/disposalpipe/segment{name = "Sorting Office"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/quartermaster/office) @@ -4811,7 +4811,7 @@ "bOA" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/heads) "bOB" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = -32; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/engine/gravitygenerator) "bOC" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/engine/gravitygenerator) -"bOD" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/research_shuttle_dock) +"bOD" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/glass_research{name = "Research and Development"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) "bOE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/engine/gravitygenerator) "bOF" = (/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/structure/cable{d2 = 8; icon_state = "0-8"},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/engine/gravitygenerator) "bOG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/space,/area/space) @@ -4841,7 +4841,7 @@ "bPe" = (/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) "bPf" = (/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) "bPg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/medical/morgue) -"bPh" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/medical{name = "Morgue"; req_access_txt = "0"; req_one_access_txt = "6,9"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/morgue) +"bPh" = (/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) "bPi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/medical/morgue) "bPj" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/wall,/area/medical/morgue) "bPk" = (/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) @@ -4872,7 +4872,7 @@ "bPJ" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Hatch"; req_access_txt = "106"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration) "bPK" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Hatch"; req_access_txt = "106"},/obj/docking_port/mobile{dir = 2; dwidth = 8; height = 15; id = "admin"; name = "administration shuttle"; roundstart_move = "admin_away"; width = 18},/obj/docking_port/stationary{dir = 2; dwidth = 8; height = 15; id = "admin_home"; name = "port bay 1"; width = 18},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration) "bPL" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/administration) -"bPM" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Cargo Office"; req_access_txt = "50"},/turf/simulated/floor/plasteel,/area/quartermaster/office) +"bPM" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/external{id_tag = "supply_home"; name = "Cargo Docking Hatch"; req_access_txt = "31"},/turf/simulated/floor/plating,/area/quartermaster/storage) "bPN" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/quartermaster/storage) "bPO" = (/obj/machinery/conveyor_switch/oneway{id = "QMLoad2"},/turf/simulated/floor/plasteel,/area/quartermaster/storage) "bPP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/quartermaster/storage) @@ -4882,11 +4882,11 @@ "bPT" = (/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j2"; tag = "icon-pipe-j2"},/turf/simulated/floor/plasteel,/area/quartermaster/office) "bPU" = (/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/quartermaster/office) "bPV" = (/obj/effect/landmark/start{name = "Cargo Technician"},/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/office) -"bPW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{name = "Gravity Generator"; req_access_txt = "0"; req_one_access_txt = "10;30"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator) +"bPW" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/quartermaster/office) "bPX" = (/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/quartermaster/office) "bPY" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel,/area/quartermaster/office) "bPZ" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/hallway/primary/central/sw) -"bQa" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "Teleport Access"; req_access_txt = "17"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/teleporter) +"bQa" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/research_shuttle_dock) "bQb" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/hallway/primary/central/sw) "bQc" = (/obj/structure/table/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/flasher{id = "hopflash"; pixel_y = 28},/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "hop"; name = "Privacy Shutters"; opacity = 0},/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 4; icon_state = "rightsecure"; name = "Head of Personnel's Desk"; req_access_txt = "57"},/obj/machinery/door/window/northleft{dir = 8; icon_state = "left"; name = "Head of Personnel's Desk"; req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/crew_quarters/heads) "bQd" = (/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) @@ -4981,7 +4981,7 @@ "bRO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/office) "bRP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/office) "bRQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/office) -"bRR" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass_research{name = "Robotics Lab"; req_access_txt = "29"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) +"bRR" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Cargo Office"; req_access_txt = "50"},/turf/simulated/floor/plasteel,/area/quartermaster/office) "bRS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/sw) "bRT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw) "bRU" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/central/sw) @@ -5039,15 +5039,15 @@ "bSU" = (/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"; tag = ""},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 4; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitecorner"},/area/assembly/robotics) "bSV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) "bSW" = (/obj/machinery/door_control{id = "robotics2"; name = "Robotics Lab Shutters Control"; pixel_x = 24; pixel_y = -24; req_access_txt = "29"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) -"bSX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/highsecurity{name = "Messaging Server"; req_access_txt = "30"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/server) +"bSX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{name = "Gravity Generator"; req_access_txt = "0"; req_one_access_txt = "10;30"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator) "bSY" = (/obj/machinery/light{dir = 8},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitecorner"},/area/medical/research{name = "Research Division"}) "bSZ" = (/obj/effect/landmark{name = "lightsout"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 2},/area/medical/research{name = "Research Division"}) "bTa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitecorner"},/area/medical/research{name = "Research Division"}) "bTb" = (/turf/simulated/wall,/area/toxins/lab) -"bTc" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "hopqueue"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"; tag = "loading"},/area/hallway/primary/central/sw) +"bTc" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "Teleport Access"; req_access_txt = "17"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/teleporter) "bTd" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/toxins/lab) "bTe" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/toxins/lab) -"bTf" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/mining{name = "Mining Dock"; req_access_txt = "48"},/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/quartermaster/miningdock) +"bTf" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass_research{name = "Robotics Lab"; req_access_txt = "29"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) "bTg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bTh" = (/turf/simulated/wall/r_wall,/area/medical/research_shuttle_dock) "bTi" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating/airless,/area/medical/research_shuttle_dock) @@ -5057,7 +5057,7 @@ "bTm" = (/obj/item/stack/sheet/metal,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration) "bTn" = (/obj/item/stack/sheet/glass,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration) "bTo" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Hatch"; req_access_txt = "31"},/turf/simulated/shuttle/floor,/area/shuttle/supply) -"bTp" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{name = "Gravity Generator"; req_access_txt = "0"; req_one_access_txt = "10;30"},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/engine/gravitygenerator) +"bTp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/highsecurity{name = "Messaging Server"; req_access_txt = "30"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/server) "bTq" = (/turf/simulated/floor/plating,/area/quartermaster/storage) "bTr" = (/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/quartermaster/storage) "bTs" = (/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/quartermaster/storage) @@ -5065,7 +5065,7 @@ "bTu" = (/obj/structure/table,/obj/machinery/requests_console{department = "Cargo Bay"; name = "Cargo Requests Console"; departmentType = 2; pixel_x = -30; pixel_y = 0},/obj/machinery/camera{c_tag = "Cargo Office"; dir = 4; network = list("SS13")},/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/sheet/metal{amount = 50},/obj/item/device/multitool,/turf/simulated/floor/plasteel,/area/quartermaster/office) "bTv" = (/obj/structure/filingcabinet/filingcabinet,/turf/simulated/floor/plasteel,/area/quartermaster/office) "bTw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/office) -"bTx" = (/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) +"bTx" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "hopqueue"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"; tag = "loading"},/area/hallway/primary/central/sw) "bTy" = (/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw) "bTz" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw) "bTA" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = -32},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "hop"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/crew_quarters/heads) @@ -5146,7 +5146,7 @@ "bUX" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research_shuttle_dock) "bUY" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research_shuttle_dock) "bUZ" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research_shuttle_dock) -"bVa" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Toxins Storage"; req_access_txt = "8"},/turf/simulated/floor/plasteel,/area/toxins/storage) +"bVa" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/mining{name = "Mining Dock"; req_access_txt = "48"},/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/quartermaster/miningdock) "bVb" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/research) "bVc" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "External Hatch"; req_access_txt = "65"},/obj/docking_port/mobile{dwidth = 3; height = 5; id = "science"; name = "research shuttle"; rebuildable = 1; width = 7},/obj/docking_port/stationary{dwidth = 3; height = 5; id = "science_home"; name = "research dock"; width = 7},/turf/simulated/shuttle/floor,/area/shuttle/research) "bVd" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/research) @@ -5164,7 +5164,7 @@ "bVp" = (/obj/structure/table,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/folder/yellow,/obj/item/device/eftpos,/obj/item/weapon/book/manual/sop_supply,/turf/simulated/floor/plasteel,/area/quartermaster/office) "bVq" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/office) "bVr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/quartermaster/office) -"bVs" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research_shuttle_dock) +"bVs" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{name = "Gravity Generator"; req_access_txt = "0"; req_one_access_txt = "10;30"},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/engine/gravitygenerator) "bVt" = (/obj/machinery/vending/cart,/turf/simulated/floor/plasteel,/area/quartermaster/office) "bVu" = (/obj/structure/closet/secure_closet/hop2,/turf/simulated/floor/plasteel,/area/crew_quarters/heads) "bVv" = (/turf/simulated/floor/plasteel,/area/crew_quarters/heads) @@ -5175,7 +5175,7 @@ "bVA" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = "0"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/bluegrid,/area/server) "bVB" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/server) "bVC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/server) -"bVD" = (/obj/machinery/door/firedoor,/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 4; icon_state = "rightsecure"; name = "Server Exterior Door"; req_access = null; req_access_txt = "0"},/obj/machinery/door/window/brigdoor{dir = 8; name = "Server Interior Door"; req_access = null; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server) +"bVD" = (/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) "bVE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/wall/r_wall,/area/engine/gravitygenerator) "bVF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/space,/area/space) "bVG" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel,/area/teleporter) @@ -5184,7 +5184,7 @@ "bVJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/bluespace_beacon,/turf/simulated/floor/plasteel,/area/teleporter) "bVK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/teleporter) "bVL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/teleporter) -"bVM" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/quartermaster/miningdock) +"bVM" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Toxins Storage"; req_access_txt = "8"},/turf/simulated/floor/plasteel,/area/toxins/storage) "bVN" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment,/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 = "blue"; dir = 8},/area/hallway/primary/central/se) "bVO" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR: EMERGENCY ENTRANCE'."; name = "KEEP CLEAR: EMERGENCY ENTRANCE"; pixel_x = 32; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se) "bVP" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/backpack/medic,/obj/item/roller,/obj/item/roller,/obj/item/roller,/obj/item/weapon/storage/toolbox/emergency,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/medbay2) @@ -5210,7 +5210,7 @@ "bWj" = (/turf/simulated/wall,/area/assembly/chargebay) "bWk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/assembly/chargebay) "bWl" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/assembly/robotics) -"bWm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "Blueshield's Office"; req_access_txt = "67"},/turf/simulated/floor/wood,/area/blueshield) +"bWm" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research_shuttle_dock) "bWn" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "bWo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bWp" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) @@ -5255,7 +5255,7 @@ "bXc" = (/obj/machinery/computer/message_monitor,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/server) "bXd" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = "0"},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/server) "bXe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/server) -"bXf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "NT Representative's Office"; req_access_txt = "73"},/turf/simulated/floor/wood,/area/ntrep) +"bXf" = (/obj/machinery/door/firedoor,/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 4; icon_state = "rightsecure"; name = "Server Exterior Door"; req_access = null; req_access_txt = "0"},/obj/machinery/door/window/brigdoor{dir = 8; name = "Server Interior Door"; req_access = null; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server) "bXg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator) "bXh" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator) "bXi" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator) @@ -5343,7 +5343,7 @@ "bYM" = (/turf/simulated/wall,/area/quartermaster/qm) "bYN" = (/obj/machinery/camera{c_tag = "Cargo Bay Entrance"; dir = 4; network = list("SS13")},/obj/machinery/atm{pixel_x = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/sw) "bYO" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 4},/area/hallway/primary/central/sw) -"bYP" = (/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"}) +"bYP" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/quartermaster/miningdock) "bYQ" = (/obj/structure/filingcabinet/chestdrawer,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/crew_quarters/heads) "bYR" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Personnel's Desk"; departmentType = 5; name = "Head of Personnel Requests Console"; pixel_y = -30},/obj/machinery/camera{c_tag = "Head of Personnel's Office"; dir = 1; network = list("SS13")},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel,/area/crew_quarters/heads) "bYS" = (/obj/structure/table,/obj/machinery/photocopier/faxmachine{department = "Head of Personnel's Office"},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel,/area/crew_quarters/heads) @@ -5419,16 +5419,16 @@ "cak" = (/obj/machinery/computer/communications,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration) "cal" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "adminshuttleshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end (WEST)"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 8},/turf/simulated/floor/plating,/area/shuttle/administration) "cam" = (/turf/simulated/wall,/area/quartermaster/miningdock) -"can" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) +"can" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "Blueshield's Office"; req_access_txt = "67"},/turf/simulated/floor/wood,/area/blueshield) "cao" = (/obj/structure/filingcabinet,/turf/simulated/floor/plasteel,/area/quartermaster/qm) "cap" = (/obj/machinery/computer/supplycomp,/turf/simulated/floor/plasteel,/area/quartermaster/qm) "caq" = (/obj/machinery/computer/security/mining,/turf/simulated/floor/plasteel,/area/quartermaster/qm) "car" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel,/area/quartermaster/qm) "cas" = (/obj/structure/disposalpipe/segment,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/central/sw) -"cat" = (/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"}) +"cat" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "NT Representative's Office"; req_access_txt = "73"},/turf/simulated/floor/wood,/area/ntrep) "cau" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/server) "cav" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/engine/gravitygenerator) -"caw" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/mixing) +"caw" = (/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"}) "cax" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/primary/central/se) "cay" = (/obj/machinery/camera{c_tag = "Central Hallway South-East"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se) "caz" = (/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"},/turf/simulated/wall,/area/medical/sleeper) @@ -5464,9 +5464,9 @@ "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" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/research{name = "Toxins Mixing Room"; req_access_txt = "7"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/toxins/mixing) +"cbg" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "cbh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/toxins/storage) -"cbi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Toxins Launch Room"; req_access_txt = "7"},/turf/simulated/floor/plasteel,/area/toxins/mixing) +"cbi" = (/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"}) "cbj" = (/turf/simulated/wall/r_wall,/area/toxins/storage) "cbk" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "cbl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) @@ -5478,7 +5478,7 @@ "cbr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/rack,/obj/item/device/aicard,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/crew_quarters/hor) "cbs" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/hor) "cbt" = (/obj/structure/lamarr,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/crew_quarters/hor) -"cbu" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Toxins Storage"; req_access_txt = "8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/toxins/storage) +"cbu" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/mixing) "cbv" = (/obj/machinery/computer/shuttle/science,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research_shuttle_dock) "cbw" = (/obj/machinery/door/airlock/centcom{id_tag = "adminshuttle"; name = "Bridge"; opacity = 1; req_access_txt = "106"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration) "cbx" = (/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration) @@ -5640,7 +5640,7 @@ "cex" = (/obj/machinery/alarm/server{dir = 4; pixel_x = -22; pixel_y = 0},/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom) "cey" = (/obj/effect/landmark{name = "blobstart"},/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom) "cez" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 10},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom) -"ceA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 4; location = "Engineering"},/obj/machinery/door/firedoor,/obj/machinery/door/window/westright{name = "Engineering Monitoring Station"; req_access = null; req_access_txt = "0"; req_one_access_txt = "11;24;34"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/engine/controlroom) +"ceA" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/research{name = "Toxins Mixing Room"; req_access_txt = "7"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/toxins/mixing) "ceB" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server) "ceC" = (/obj/structure/stool/bed/chair/office/light,/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server) "ceD" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server) @@ -5748,7 +5748,7 @@ "cgB" = (/obj/structure/table,/turf/simulated/shuttle/floor,/area/shuttle/mining) "cgC" = (/obj/machinery/computer/shuttle/mining,/turf/simulated/shuttle/floor,/area/shuttle/mining) "cgD" = (/obj/structure/table,/obj/machinery/light/small{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/mining) -"cgE" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "E.X.P.E.R.I-MENTOR Lab"; req_access_txt = "47"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) +"cgE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Toxins Launch Room"; req_access_txt = "7"},/turf/simulated/floor/plasteel,/area/toxins/mixing) "cgF" = (/obj/machinery/computer/shuttle/mining,/turf/simulated/floor/plasteel{dir = 9; icon_state = "brown"},/area/quartermaster/miningdock) "cgG" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/quartermaster/miningdock) "cgH" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock) @@ -5764,11 +5764,11 @@ "cgR" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint) "cgS" = (/turf/simulated/wall,/area/blueshield) "cgT" = (/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) -"cgU" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/window/northleft{dir = 4; icon_state = "left"; name = "Engineering Desk"; req_access_txt = "0"; req_one_access_txt = "11;24"},/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/controlroom) +"cgU" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Toxins Storage"; req_access_txt = "8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/toxins/storage) "cgV" = (/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) "cgW" = (/turf/simulated/wall,/area/ntrep) "cgX" = (/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) -"cgY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{name = "Tech Storage"; req_access_txt = "23"},/turf/simulated/floor/plating,/area/storage/tech) +"cgY" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 4; location = "Engineering"},/obj/machinery/door/firedoor,/obj/machinery/door/window/westright{name = "Engineering Monitoring Station"; req_access = null; req_access_txt = "0"; req_one_access_txt = "11;24;34"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/engine/controlroom) "cgZ" = (/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) "cha" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central/south) "chb" = (/obj/structure/sign/directions/engineering,/obj/structure/sign/directions/science{dir = 4; pixel_x = 0; pixel_y = -7},/obj/structure/sign/directions/medical{dir = 4; pixel_y = 7},/turf/simulated/wall,/area/janitor) @@ -5816,9 +5816,9 @@ "chR" = (/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) "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/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology) -"chV" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology) -"chW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology) +"chU" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "E.X.P.E.R.I-MENTOR Lab"; req_access_txt = "47"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) +"chV" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/window/northleft{dir = 4; icon_state = "left"; name = "Engineering Desk"; req_access_txt = "0"; req_one_access_txt = "11;24"},/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/controlroom) +"chW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{name = "Tech Storage"; req_access_txt = "23"},/turf/simulated/floor/plating,/area/storage/tech) "chX" = (/obj/machinery/atmospherics/pipe/simple/insulated,/obj/machinery/camera{c_tag = "Research Toxins Mixing North"; dir = 2; network = list("Research","SS13"); pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) "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) "chZ" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{dir = 4},/turf/simulated/wall/r_wall/coated,/area/toxins/mixing) @@ -6144,11 +6144,11 @@ "coh" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage) "coi" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage) "coj" = (/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) -"cok" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "0"; req_one_access_txt = "11;24"},/turf/simulated/floor/plasteel,/area/engine/controlroom) +"cok" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology) "col" = (/obj/effect/decal/warning_stripes/west,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/mixing) "com" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/mixing) "con" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/mixing) -"coo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/atmos{name = "Incinerator Access"; req_access_txt = "24"},/turf/simulated/floor/plating,/area/maintenance/incinerator) +"coo" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology) "cop" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/toxins/mixing) "coq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) "cor" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/window/eastright{name = "Toxins Mixing Room"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurple"},/area/toxins/mixing) @@ -6257,7 +6257,7 @@ "cqq" = (/obj/machinery/atmospherics/binary/valve,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) "cqr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) "cqs" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) -"cqt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "0"; req_one_access_txt = "11;24"},/turf/simulated/floor/plasteel,/area/construction) +"cqt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology) "cqu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/toxins/mixing) "cqv" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/toxins/mixing) "cqw" = (/obj/machinery/doppler_array{dir = 4},/turf/simulated/floor/plasteel,/area/toxins/mixing) @@ -6332,7 +6332,7 @@ "crN" = (/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_y = 30},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) "crO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) "crP" = (/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) -"crQ" = (/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/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Test Lab"; req_access_txt = "7"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) +"crQ" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "0"; req_one_access_txt = "11;24"},/turf/simulated/floor/plasteel,/area/engine/controlroom) "crR" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "crS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "crT" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2) @@ -6441,7 +6441,7 @@ "ctS" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2"; icon_state = "pipe-j2"; dir = 2},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft) "ctT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/aft) "ctU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) -"ctV" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "0"; req_one_access_txt = "11;24"},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor/plasteel,/area/engine/controlroom) +"ctV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/atmos{name = "Incinerator Access"; req_access_txt = "24"},/turf/simulated/floor/plating,/area/maintenance/incinerator) "ctW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/window/northleft{dir = 4; icon_state = "left"; name = "Engineering Monitoring Station"; req_access_txt = "0"; req_one_access_txt = "11;24"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/engine/controlroom) "ctX" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"; tag = "loading"},/area/engine/controlroom) "ctY" = (/turf/simulated/floor/plasteel,/area/engine/controlroom) @@ -6479,7 +6479,7 @@ "cuE" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) "cuF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) "cuG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) -"cuH" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "xeno_airlock_control"; name = "Xenobiology Access Button"; pixel_x = -24; pixel_y = 0; req_access_txt = "55"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "xeno_airlock_exterior"; locked = 1; name = "Xenobiology External Airlock"; req_access_txt = "55"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) +"cuH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "0"; req_one_access_txt = "11;24"},/turf/simulated/floor/plasteel,/area/construction) "cuI" = (/obj/machinery/light,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "cuJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "cuK" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) @@ -6599,7 +6599,7 @@ "cwU" = (/obj/structure/disposalpipe/segment,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 1},/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft) "cwV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/aft) "cwW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) -"cwX" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{on = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop) +"cwX" = (/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/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Test Lab"; req_access_txt = "7"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) "cwY" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/controlroom) "cwZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/controlroom) "cxa" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/controlroom) @@ -6753,7 +6753,7 @@ "czS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/storage/tech) "czT" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/storage/tech) "czU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/landmark{name = "blobstart"},/obj/machinery/hologram/holopad,/turf/simulated/floor/plating,/area/storage/tech) -"czV" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Mechanic Workshop"; req_access_txt = "70"; req_one_access_txt = "0"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop) +"czV" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "0"; req_one_access_txt = "11;24"},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor/plasteel,/area/engine/controlroom) "czW" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft) "czX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/aft) "czY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) @@ -6796,9 +6796,9 @@ "cAJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/maintenance/asmaint) "cAK" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cAL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/toxins/xenobiology) -"cAM" = (/obj/machinery/door/firedoor,/obj/structure/table/reinforced,/obj/machinery/door/window/westright{name = "Mechanic's Desk"; req_access = null; req_access_txt = "70"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/cell_charger,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop) -"cAN" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "32"; req_one_access_txt = "0"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/engine/break_room) -"cAO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "xeno_airlock_control"; name = "Xenobiology Access Button"; pixel_x = -28; pixel_y = 8; req_access_txt = "55"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "xeno_airlock_interior"; locked = 1; name = "Xenobiology Internal Airlock"; req_access_txt = "55"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) +"cAM" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "xeno_airlock_control"; name = "Xenobiology Access Button"; pixel_x = -24; pixel_y = 0; req_access_txt = "55"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "xeno_airlock_exterior"; locked = 1; name = "Xenobiology External Airlock"; req_access_txt = "55"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) +"cAN" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{on = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop) +"cAO" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Mechanic Workshop"; req_access_txt = "70"; req_one_access_txt = "0"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop) "cAP" = (/turf/simulated/wall/r_wall,/area/toxins/misc_lab) "cAQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/wall/r_wall,/area/toxins/misc_lab) "cAR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/wall/r_wall,/area/toxins/misc_lab) @@ -6827,7 +6827,7 @@ "cBo" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/powermonitor{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/stationalert_all{pixel_x = 1; pixel_y = -1},/obj/item/weapon/circuitboard/atmos_alert{pixel_x = 3; pixel_y = -3},/obj/item/weapon/circuitboard/thermomachine,/obj/item/weapon/circuitboard/smes{pixel_x = 4},/turf/simulated/floor/plating,/area/storage/tech) "cBp" = (/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/plating,/area/storage/tech) "cBq" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "caution"; dir = 4},/area/hallway/primary/aft) -"cBr" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/door/airlock/atmos{name = "Atmospherics"; req_access_txt = "24"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/atmos/control) +"cBr" = (/obj/machinery/door/firedoor,/obj/structure/table/reinforced,/obj/machinery/door/window/westright{name = "Mechanic's Desk"; req_access = null; req_access_txt = "70"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/cell_charger,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop) "cBs" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/construction) "cBt" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) "cBu" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) @@ -6885,7 +6885,7 @@ "cCu" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Human remains"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "cCv" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/hologram/holopad,/mob/living/simple_animal/mouse,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "cCw" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) -"cCx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/atmos{name = "Atmospherics"; req_access_txt = "24"},/turf/simulated/floor/plasteel,/area/atmos/control) +"cCx" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "32"; req_one_access_txt = "0"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/engine/break_room) "cCy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint) "cCz" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Alternate Construction Area"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/apmaint) "cCA" = (/obj/item/stack/sheet/glass{amount = 10},/turf/simulated/floor/plating,/area/maintenance/consarea) @@ -6971,7 +6971,7 @@ "cEc" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/plasteel,/area/engine/controlroom) "cEd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/engine/controlroom) "cEe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/engine/controlroom) -"cEf" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) +"cEf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "xeno_airlock_control"; name = "Xenobiology Access Button"; pixel_x = -28; pixel_y = 8; req_access_txt = "55"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "xeno_airlock_interior"; locked = 1; name = "Xenobiology Internal Airlock"; req_access_txt = "55"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) "cEg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) "cEh" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) "cEi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) @@ -7002,7 +7002,7 @@ "cEH" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) "cEI" = (/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/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) "cEJ" = (/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{icon_state = "white"},/area/toxins/xenobiology) -"cEK" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) +"cEK" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/door/airlock/atmos{name = "Atmospherics"; req_access_txt = "24"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/atmos/control) "cEL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/toxins/misc_lab) "cEM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) "cEN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) @@ -7097,7 +7097,7 @@ "cGy" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/aft) "cGz" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/scrubber,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "escape"},/area/hallway/primary/aft) "cGA" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/hidden/yellow{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/turf/simulated/wall,/area/engine/controlroom) -"cGB" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "Chief Engineer"; req_access_txt = "56"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) +"cGB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/atmos{name = "Atmospherics"; req_access_txt = "24"},/turf/simulated/floor/plasteel,/area/atmos/control) "cGC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/engine/controlroom) "cGD" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/engine/controlroom) "cGE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/wall,/area/engine/break_room) @@ -7127,7 +7127,7 @@ "cHc" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{dir = 5; icon_state = "blue"},/area/medical/patients_rooms) "cHd" = (/turf/simulated/wall,/area/medical/patients_rooms) "cHe" = (/obj/effect/spawner/lootdrop/maintenance,/obj/effect/decal/cleanable/vomit,/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cHf" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_atmos{name = "Distribution Loop"; req_access_txt = "24"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plasteel,/area/atmos/distribution) +"cHf" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "cHg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/toxins/xenobiology) "cHh" = (/obj/structure/rack,/obj/item/clothing/mask/gas{pixel_x = 2; pixel_y = 2},/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -2; pixel_y = -2},/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) "cHi" = (/obj/structure/closet/l3closet/scientist,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) @@ -7148,8 +7148,8 @@ "cHx" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/engine/mechanic_workshop) "cHy" = (/obj/machinery/hologram/holopad,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/mechanic_workshop) "cHz" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop) -"cHA" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = null},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/engine/engineering) -"cHB" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/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) +"cHA" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) +"cHB" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "Chief Engineer"; req_access_txt = "56"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) "cHC" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/aft) "cHD" = (/turf/simulated/floor/plasteel,/area/hallway/primary/aft) "cHE" = (/obj/machinery/atmospherics/unary/vent_pump{on = 0},/turf/simulated/floor/plasteel,/area/hallway/primary/aft) @@ -7219,7 +7219,7 @@ "cIQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop) "cIR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop) "cIS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/effect/landmark/start{name = "Mechanic"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop) -"cIT" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/secure) +"cIT" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_atmos{name = "Distribution Loop"; req_access_txt = "24"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plasteel,/area/atmos/distribution) "cIU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) "cIV" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) "cIW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) @@ -7290,7 +7290,7 @@ "cKj" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel,/area/hallway/primary/aft) "cKk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/aft) "cKl" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/hallway/primary/aft) -"cKm" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine) +"cKm" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = null},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/engine/engineering) "cKn" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/engine/break_room) "cKo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/engine/break_room) "cKp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/engine/break_room) @@ -7391,7 +7391,7 @@ "cMg" = (/obj/effect/landmark{name = "revenantspawn"},/mob/living/carbon/slime,/turf/simulated/floor/engine,/area/toxins/xenobiology) "cMh" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio3"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access_txt = "55"},/turf/simulated/floor/engine,/area/toxins/xenobiology) "cMi" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology) -"cMj" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{dir = 8; id_tag = "teledoor"; name = "AI Satellite Teleport Access"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior) +"cMj" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/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) "cMk" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/engine,/area/toxins/xenobiology) "cMl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/engine,/area/toxins/test_chamber) "cMm" = (/mob/living/carbon/human/monkey,/turf/simulated/floor/engine,/area/toxins/test_chamber) @@ -7420,7 +7420,7 @@ "cMJ" = (/obj/structure/table,/obj/item/weapon/book/manual/supermatter_engine,/turf/simulated/floor/plasteel,/area/engine/break_room) "cMK" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/obj/effect/landmark/start{name = "Life Support Specialist"},/turf/simulated/floor/plasteel,/area/engine/break_room) "cML" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/engine/break_room) -"cMM" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"}) +"cMM" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/secure) "cMN" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/plasteel,/area/atmos/control) "cMO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{level = 2},/turf/simulated/floor/plasteel,/area/atmos/control) "cMP" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 9; level = 2},/turf/simulated/floor/plasteel,/area/atmos/control) @@ -7528,6 +7528,7 @@ "cON" = (/obj/effect/landmark/start{name = "Station Engineer"},/obj/structure/stool/bed/chair/comfy/black{dir = 8},/turf/simulated/floor/plasteel,/area/engine/break_room) "cOO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel,/area/engine/break_room) "cOP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/wall/r_wall,/area/atmos/control) +"cOQ" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine) "cOR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/wall/r_wall,/area/atmos/control) "cOS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/wall/r_wall,/area/atmos) "cOT" = (/turf/simulated/wall/r_wall,/area/atmos/distribution) @@ -7621,6 +7622,7 @@ "cQD" = (/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) "cQE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/hallway/primary/aft) "cQF" = (/obj/structure/sign/securearea,/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engine/equipmentstorage) +"cQG" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{dir = 8; id_tag = "teledoor"; name = "AI Satellite Teleport Access"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior) "cQH" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engine/equipmentstorage) "cQI" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engine/equipmentstorage) "cQK" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engine/equipmentstorage) @@ -9166,78 +9168,78 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdaRUaSdaSdaSdaSdaSdaSdaRUaSdaUZaLdaVaaVbaVcaVcaVcaVcaVcaVcaVdaTuaUuaVeaUwaVfaVeaVeaUuaTuaVgaUDaViaViaViaViaViaViaViaViaVjaaaaUEaVkaVlaVmaVnaVoaUEaaaaSuaSzaSAaVpaVqaVraVsaUFaSAaPiaRwaVtaVtaTCaVuaVvaTFaTGaTFaVvaVwaVxaTBaTBaRwaSNaFFaSOaEjaVyaKAdqtaPzaLNaLPaMUaUPaUQaVAaVBaVCaVCaUQaVDaVEaVFaUSaVGaVHaVIaUSaVJaGXaaaaVKaVLaVLaVLaVLaVLaVMaaaaGXaGYaVNaVOaHaaHaaGXaGXaHaaHaaVPaVQaHaaGXaHPaGXaGXaHaaHaaVRaVSaGXaGXaGXaQLaUWaGYaMlaGYaUXaHOaHbaOFaYPbcDaVhbcDaYPaYPaYPaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVVaVWaVXaVWaVWaVYaVZaVWaVWaVXaWaaWbaLdaToaWcaVcaWdaWeaWfaWgaWhaWiaTuaUuaVeaUwaWjaVeaVeaUuaTuaWkaWlaWmaWnaWoaWpaWqaWraWsaWtaVjaabaUEaWuaWvaWwaWxaWyaUEaabaSuaSzaSAaWzaWAaWBaWCaWDaSAaPiaRwaSBaSCaWEaWFaULaSCaWGaSCaULaWHaWIaSCaSMaRwaSNaFFaWJaEjaSPaMSaLOaPzaLNaLPaWKaWLaUQaWMaVEaVEaVEaWNaWOaWPaWQaUSaWRaWSaWTaWUaWVaHPaaaaaaaaaaaaaaaaaaaaaaaaaaaaGXaWWaWXaWYaWZaXaaGXaNgaGYaQIaMlaGYaGXaaaaGXaGYaGYaGYaGYaMlaXbaXcaXdaXdaXdaXdaXeaXfaXgaXhaXiaXjaXiaXkaVTaVTaVUaXmaXlaXnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVVaWaaVWaXqaXraXsaXtaXuaXvaXwaXxaXyaXzaXAaXBaSdaToaXCaVcaXDaXEaXFaXGaXFaXHaTuaXIaVeaXJaXKaXLaXKaXMaXNaXOaXPaXQaXQaXQaXQaXQaXQaXRaXSaVjaaaaUEaXTaWvaXUaWxaXVaUEaaaaSuaSzaSAaXWaXXaXYaXZaYaaSAaPiaRwaYbaYbaTCaYcaVvaTFaYdaTFaVvaYeaTJaYfaYfaRwaYgaIraYhaEjaSPaMSaYiaYiaYiaYiaYjaYkaYlaYmaYnaYoaYoaYoaYpaYoaYqaYraYsaYtaYuaYraYvaYwaHPaGXaGXaGXaGXaGXaGXaGXaGXaGXaGXaGXaGXaYxaGXaGXaGXaGXaGYaMlaWWaHNaabaHNaGYaYyaYzaYAaYBaYCaYDaYEaYEaYEaYEaYFaYGaYHaYIaYJaYKaYJaYLaYJaYJaYMaXoaYOaYPaYQaYRaYSaYSaYSaYSaYSaYSaYSaYSaYSafXajcaaaaaaaaaaaaaaaaaaaaaaYTaYUaYVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXAaYWaYXaYYaXzaYZaXsaYZaXsaYZaXsaYZaXzaZaaZbaSdaToaZcaVcaZdaZeaZfaZgaZhaZiaTuaZjcMMaZkaZlaZmaZnaZoaTuaZpaZqaXQaXQaXQaXQaXQaXQaXRaZraVjaabaUEaZsaZtaZuaZvaZwaUEaabaSuaSzaSAaZxaZyaZzaZAaZBaSAaPiaRwaUJaUJaUJaZCaULaSCaUMaSCaULaZDaUJaUJaUJaRwaZEaZFaZGaEjaVyaZHaZIaZIaZIaZJaZKaZLaZMaZNaZOaZMaZPaZQaZRaZMaZSaZTaZUaZVaZWaUSaZXaZYaZZbaabaaaZYbabbacbacbacbacbacbadbaebacbafbagbahbaibajbakbalbambanbaobanbapbaqaGYaGXbarbasbatbaubavbawbaxbaybazbaAbazbaBbaCbaDbaEbaFbaGbaHbaIbaJbaKbaLaYPbaMbaNbaObaPbaQbaRbaSbaTbaUbaVaaaaaaaaaaaaaaaaaaaaaaYTbaWbaXbaYaYVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaZaXsaXsaVXaXzaYZaXsaYZbbaaYZaXsaYZaXzaZaaZbaSdaTobbbaVcaVcbbcaUraUmaUraVcaTuaTuaTuaTubbfbbgbbhbbiaTubbjbbkbblaXQaXQbbmaXQbbnbbobbpaVjaaaaUEaUEbbqbbrbbqaUEaUEaaaaSuaSzaSAbbsbbtbbuaZAbbvaSAaPiaRwaSBaSCbbwaWFaULaSCaUMaSCaULaWHbbxaRwaRwaRwbbybbzbbAbbBbbCbbDatGatGbbEbbFbbGbbHaUQbbIaVEaUQbbJaUQbbKaUQbbLbbMbbNbbObbPbbQbbRbbSbbTbbUbbVbbWbbXbbVbbVbbYbbVbbSbbZbbSaXjbcabbSbcbbccbcdbcebcfbcgbchbcibcjbckbclaXibcmbcnbcobcpbcqbcrbcsbctbaybcubcvbazbcwbcxbcybczbaFbcAbcBbcCbcDbcEbcFaYPbcGbcHbcHbcIbaTbaTbaTbaTbaUbaVaaaaaaaaaaaaaaaaaaaYTbaWbcJbcKbcLbaYaYVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXAbcMbcNaYYaXzaYZaXsaYZaXsaYZaXsaYZaXzaZaaZbaSdaTobcOaUsbcQbcRbcSbcSaSfbcTbcUbcVbcWbcXbcYbcZaVebdaaTubdbbdcbddbdebdfbdgbdhbdibdjbdkaVjaaaaabaaaaUtbdmaUtaaaaabaaaaSuaSzaSAbdnbdobdpbdqbdraSAaPiaRwbdsbdtaTCbdubdvaTFbdwaTFbdxbdybdzaRwbdAbdBbdCbdDbdEbdFbdGbdHaaaaaabbEbdIbdJbdKaUQbdLbdMaVEaVEbdNaVEaVEaVEbdOaUSbdPaUSbdQbdRaUSbdSaUSbdTbdUbdVbdWbdXbdYbdTbdZbeabebbecbebbebbebbebbedbeebebbefbegbehbeibebbejaGYbaubekbcpbelbembenbeobepbeqberbesbazbetbeubevbewbexbcAbcBbcCbcDbaKbeyaYPbezbcHbcHbcIbaTbaTbaTbaTbaUbaVaaaaaaaaaaaaaaaaaaaYUbeAbeBbeCbeBbeDaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeEbeFaVWaXqaXzaXsbeGbeHaXsaXsbeIbeGaXzaXAbeJaSdaTobeKbbdbeMbeNbeMbeMbeMbeMbeMbeOaSfaTubePbeQbePaTuaTubeRbeSbeRaViaViaViaVibeRbeTbeUaVjbcPbbebbebdlbeYbdlbbebbebeLaSubfaaSAbeVaSAbeXbeWbfeaSAbffaRwaRwaRwaRwbfgbfhbfibfjbfibfhbfgaRwaRwbfkbdDbdDbdDbdDbflbfmbfnbfobfpbbEbfqbdJbfraUQaUQaUQaUQaUQaUQaUQaUSaUSbdObfsbftbfubfvbfwbfxbfybfzbdTbfAbfBbfCbfDbfEbdTbfFbfGbfHbfIbfHbfJbfKbfMbfLbfNbfObfPbfQbfRbfSbebbfTbfUbfVbfWbfXbelbfYbfZbeobgabazbgbbgcbgdbgebgfbczbczbazbazbcBbcCbcDbcEbggaYPbghbgibgjbgkbglbgmbaTbaTbgnbaVaaaaaaaaaaaaaaaaYTbaWbgobeCbeCbeCbgpbaYaYVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeEaVWaVXaVWaVWaVYaVZaVWaVWaVXbeFbgqaLdbgrbeKaSdbgsbgsbgtbgsbguaMsbgvbgwaSfbeZbfbbgzbgzbgAbgBbgzbgCbgzbgzbgzbgDbgzbgzbgEbgFbfcbgHbgIbgJbgHbgKbgHbgHbgHbgHbgLbgMbgNbgzbgzbgObfbbgQbfdbgSbgTbgUbgVbgWbgXbgXbgXbgXbgXbgXbgXbgYbgZbhabhbbhcbhdbhebhfbhgbhhbdDbdDbhibhjbhkbhjbhkbhlbhmbhnbhobhpbhqaUSbhrbhsbhtbhubhvbhvbhwbhxbhybhzbdTbhAbhBbhCbhCbhDbdTbhEbhFbhGbhHbhIbhIbhJbhKbhLbfMbhNbhObhPbhQbhRbebbejaTgbaubhSbhTbhTbhUbhVbhTbhWbazbhXbhYbazbhZbiabczbibbazbicbidbiebcDaYPaYPaYPbifbigbihbiibigbigbigbigaYSafXajcaaaaaaaaaaaabijbikbilbeCbeCbimbinbeCbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbgxaSdaSdaSdaSdaSdaSdbgxaSdaUZaLdbipbiqaSdbirbisbitbitbiuaMsbivbgwbiwbgybfbbiybizbiAbiBbiBbiCbiDbiDbiDbiEbiFbiFbiGbiHbgGbiBbiBbiJbiFbiKbiLbiMbiMbiNbiObiPbiQbiQbiQbiRbfbbgQbfdbgSbgSbgSbgSbiSbgSbgSbgSbgSbgSbgSbiTbiUbiVbiWbiXbiYbiZbjabjbbjcbiVbiVbiVbjdbjebjebjebjfbhqbhqbhqbjgbjhbhqaUSbjibjjbhvbhvbjkbhvbjlbjmbhybjnbdTbjobjpbjqbjrbjsbdTbjtbjubjvbjwbjxbjybebbebbjzbebbebbebbjBbjCbjBbebbejaGYbaubjDbcpbcpbcpbjEbcpbjFbazbazbazbazbazbazbazbjGbazbcDbcDbcCbcDbjHbjIaYPbjJbjNbjLblwbgPbiobgRbixbjRaaaaaaaaaaaaaYTbjSbjTbjSbjSbjSbjUbjSbjVbjSbjTbjSaYVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaUlaLdaSdaOQaSdbjWbjXbjYbjZaSdaOQaSdaSdaLdbkabeKaSdbkbbkcbitbitbiuaMsbkdbgwaSfbgybfbbgzbkebkfbkgbkgbkhbkibkjbkgbkkbkgbklbkgbkmbiIbkgbkgbkgbkgbkgbkobkpbkgbkqbkrbksbktbgzbgzbkubjPbkwbjQbkybkzbkybkAbkBbkAbkAbkAbkAbkAbkAbkCbkDbkEbkEbkEbkEbkFbkEbkGbkHbkEbkEbkIbkJbkKbkKbkKbkKbkKbkKbkKbkLbhqbhqaUSbkMbkNbkObkPbkPbkQbkRbjmbhybkSbdTbdTbdTbdTbdTbkTbdTbkUbkVbkWbkXbfHbkYbebbhMblabjAblcbldbleblfblgbebbejaQLbaublhblibcpbljblkbcpbllbllbaublmblnbloaYPblpblqblrbcDbcDblsbltaYPbluaYPblvbjKbjLblxbknbALbjKblzbjRaaaaaaaaaaaabijbmXbnabmYbmYblDbeCblCblDblAblBblCbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaMsaSdbgxaSdaToaSfaSfaTpaSdbgxaSdblEblFblGblHaSdblIblIbgtblIbguaMsblJbgwaSfaMsblKblKblLblMblMblMblMblMblMbkvbkxblMblMblMblMblMblMblPblQblRblRblSblRblTblUblVblTblTblWblXblYblKblZblZbmabmabmabmbbmbbmbbmbbmbbmbbmbbmbbmcbmdbmdbmebmdbmfbmfbmfbmfbmgbmhbmfbmcbmibmibmibmibmibmibmibmibmjbmjbmjaUSbmkbmlbmmbmmbmmbmmbmnbmobmpbmqbmrbmsbmtbmubmvbmwbdTbdTbmxbmybmzbmybmybebbmAbmBbmDbmDbmDbmDbmEbmFbebbmGbmHbaubmIbcpbljbljblkbljbcpbmJbaubmKbmLbmMaYPbcDbmNbmObmPbmPbmQbmRbmSbmTbmUbmVbmWboObzpbjMbjKbjKblzbjRbjRbjRbjRbjRbijbBTbDzbDzbDzbBVbeCblCbnbblAbeCbncbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbneaSfbnfbngbnhbnibnjbnkbnibnlbnmbnibnibnnblybnpbnqbnrbnrbnrbnsbnrbntbnuaMsbnvbnwbnxblMbnybnzbnAbnBbnCbnDbnEbnFbnGbnHbnIbnJblMbnKbnLblRbnMbnNbnOblTbnPbnQbnRblTbnSbnTbnUbnSbnSbnSbnVbgSbnWbmbaaaaaaaaaaaaaaaaaaaaabmcbnXbnYbnZboabobbocbodboebofbogbohbmcaaaaaaaaaaaaaaaaaaaaabmiboibhqbojaUSbokbmlbmqbmqbmqbmqbmqbolbombmqbmqbmqbonbooboobopboqborbosbotboubovbowbebbkZboyboBboAboAboBboCboDbebbejaGYbauboEboFbcpbljblkbcpboGboGbaubauboHbauaYPboIblqbltboJboJboKbltaYPaYPaYPboLbjKbEFblNbjMbjKbjKblObAMbrKbrMbrMbrKbDvbDzbDzbGJbGJbnbbeCblCbnbblAbeCblCaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdboPboQboPboPboPboPboPboPboQboPboPboRaSfboSbgyboUaSfboVaSfboWboXboYboZbpaaMsbnwbnwbpbblMbpcbnDbnDbnDbnDbnDbnEbpdbnDbnDbnDbpeblMbnKbpfblRbpgbphbpiblTbpjbpkbplblTbpmbpnbpobppbpqbnTbnVbgSbnWbmbaaaaaaaaaaaabmcbmcbmcbmcbprbpsbptbpubpvbpwbpxbpybpzbpAbpBbmcbmcbmcbmcaaaaaaaaaaaabmiboibhqbpCbpDbpEbpFbpGbpHbpEbpIbpJbpKbpLbpMbpNbmqbpObpPboobpQbpRboobpSbpTbpUbpVboobpWbpXbpYboBboAboAboBbpZbqabebbejaTgbaubmIbcpbljbljblkbljbcpbcpbqbbqcbcpbqdaYPbqebqfbqgboJboJbqhbqgbqiaYPbqjbqkbjKbjRbjRbmZbndbjRbjRbjRbqnbjRbjRbjRbEJbjSbjSbjSbjSbqobeCblCbqoblAbeCblCbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLdaLdaSdaSdaSdaSdaSdaSdaSdaSdaSdaLdaMsbgybnobqrbqrbqrbqrbqrbqrbqsbqrbqrbqraMsbnwbnKbqtblMbqubnDbnDbqvbqwbqxbqybqvbnDbnDbnDbqzblMbnKbnLblRbqAbqBbqCblTbqDbqEbqFblTbqGbqHbqIbqJbqKbnTbqLbqMbnWbmbbmbbqNbmcbmcbmcbqObqPbqQbqRbqSbqSbqTbqUbqSbqVbqSbqWbqXbqYbqZbrabrbbmcbmcbmcbqNbmibmiboibhqbhqaUSbrcbrdbpMbrebmqbrfbrgbmqbrhbribpNbmqbonbooboobrjbrkbrlbrmbrnbrobrpbooboxbpXbrrboBboAboAbrsbrtbrubebbejaGYbaubrvbrwbrxbljblkbrybcpbcpbrzbcpbrAbrBaYPbrCbrDbrEboJboJbrFbrEbrGaYPbrHbqkbjKbjObGIbjMbjKbjKbrIbrJbrKbrLbrMbrKbrNbeCbeCbeCbeCbeCbeCbeCbeCbeCbeCblCbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrObrPbrPbrQbrPbrPbrPbrRbrPbrPbrSaabaSdaUnaShbrTbqrbrUbrVbrWbrXbrYbrZbsabsbbqrbscbsdbsebsfblMbsgbnDbnDbqvbqxbshbsibqvbnDbnDbsjbskblMbnKbnLblRblRbslblRblTbsmbsnbsoblTbspbqJbsqbqJbsrbnTbnVbssbnWbgXbgXbstbsubsvbmcbswbptbsxbqSbqSbsybszbsAbsBbsAbsCbsDbsEbsFbsGbsHbsIbmcbsJbsubsKbsLbsMboibhqbhqbsNbmqbsObmqbmqbmqbsPbsQbmqbrhbsRbpNbmqbpObooboobsSbsTbsUbsVbsWbsXbrpbsYbebbqabrrboBboAboAboBbrtbtcbebbtdbtebaubtfbaubaubtgblkbthbtibcpbtjbtkbtlbtmbmUbtnbtobtpbtqbtqbtrbtsbttbmUbtubozboTbtwbjKbjMdsfbjKbtxbjRbjRbjRbjRbqnbijbtybeCblCblDblAbeCblCblDblAbeCbtzbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrObtAbtBbtCbtDbtDbtEbtDbtDbtDbtEbrQaSdaSdaSdaToboSbqrbrUbtFbtGbrUbtHbtIbtJbtKbqrbtLbtMbtNblQblMbtObtPbtQbtRbtSbtTbtUbtVbtVbtVbtWbtXblMbnKbsdbtYbtZbuabubblTblTblTblTblTbucbudbuebufbugbnTbnVbssbgSbgSbgSbuhbuibujbukbulbumbqSbunbuobupbuqburbusbutbuubuvbuwbuxbulbuybuzbuAbuBbuCbuDbuEbuEbuFbhqbuGaUSbmqbuHbuIbpNbmqbuJbuKbmqbuLbuMbpNbmqbonboobooboobopboobuNboobsXbrpbuObebbuPbrrboBboAboAboBbrtbuQbebbuRbuSbuTbuUbuVbuWbuXbuYbuZbuZbuZbuZbuZbuZbvabvbbvcboJboJboJboJboJboJbvdbvebvfbqpbjKbjKbjKbqqbALbjKbvgbqnbvhbvhbvhbjRblDblAbeCblCbnbblAbeCblCbnbblAbeCblCblDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvibvjbvjbvjbvjbvjbvjbvjbvjbvjbvjbvkbvlaOQbvlaSfboSbqrbvmbrUbvnbvnbvnbvobrUbvpbqrbvqbvrbtNbvsbvsbvsbvsbvtbvsbvubnDbvvbvwbvxbvxbvybvzblMbvAbvBbvCbvDbvEbvFbvGbvHbvIbvHbvJbvJbvJbvJbvJbvKbvLbnVbvMbvNbvObvPbvQbvRbvSbvTbvUbusbvVbvWbvXbvXbvXbvXbvYbvXbvZbwabwbbwcbvVbwdbwebmcbwfbwgbwhbwibwjbwkbhqbhqbsNbmqbwlbmqbmqbmqaZVbmqbmqbwmbwmbmqbmqbwnbooboobwobwpboobooboobwqbwrbwsbebbqabrrboBboBboBboBbrtbwtbebbwubwvbwvbwwbwvbwxbljbljbljbljbwybljbljbljbwzbveboJboJboJboJboJboJboJbvdbvebvfbqpbjKboMboMboNboMbjKbwAbjRbwBbwCbwDbjRbnbblAbeCblCbnbblAbeCblCbnbblAbeCblCbnbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwEbwFbwGbwHbwIbwIbwJbwIbwIbwIbwJbrQaSdaSdaSdbwKblHbwLbrUbwMbvnbvnbvnbvobwMbrUbqrbwNbwObtNbvsbwPbwQbwRbwSbvsbwTbwUbwVblMbwWbwXbwYbwZblMbnKbxabxbbxbbxcbxbbxbbxbbxbbxdbxebxebxebxfbxebxgbxhbxibxjbxkbxlbxlbxlbxlbxlbxmbxmbxnbxmbvXbvXbxobxpbxqbxrbxsbxtbxobxubvXbxvbxwbxvbxvbxvbxvbxvbxvbxvbwkbhqbhqaUSbxxbmqbxybxzbmqbxAbmqbxBbxCbxDbmqbxEbdTbxFbxGbdTbdTbxHbxIbxJbxIbdTbdTbebblbbxLbxMbxMbxMbxMbxLbxNbebbxObwvbwvbwwbxPbaubxQbxRbxSbxTbxUbxVbxWbxXbxYaYPbxZbcDbyaboJboJbyabcDbybaYPbycbqpbjKbqlbqlbqmbqlbjKbvgbqnbvhbvhbvhbjRbqoblAbeCblCbqoblAbeCblCbqoblAbeCblCbqoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwEbrPbrPbrQbrPbrPbrPbrRbrPbrPbydaabaSdbyebngbyfbqrbtFbtFbtFbrUbygbyhbyibyjbqrbykbylbtNbvsbymbvsbynbyobvsbypbyqbyrblMbwWbwXbwYbskblMbnKbxabxbbysbytbyubyvbywbxbbyxbyybyzbyAbyBbyBbyBbyCbyDbyEbyFbxlbyGbyHbyIbyJbyKbyLbyMbyNbvXbyObxqbxqbyPbyQbyPbxqbxqbyRbvXbySbyTbyUbyVbyWbyXbyYbyZbxvbzabzbbzbbzcaUSaUSaUSaUSbzdbsNbzdbzeaUSbdRaUSaUSbdTbdTbdTbdTbzfbzgbzgbzgbzgbzhbzibebbjBbzjbjBbzkbzkbjBbzjbjBbebbxObwvbwvbzlbxPbaubaubaubaubaubtfbaubaubaubauaYPaYOaYQaYQaYQaYQaYQaYQaYPaYPbzmbrqbtabsZbjKbjMbjKbjKdsgbjRbjRbjRbjRbqnbijbzobeCbeCbeCbeCbeCbeCbeCbeCbeCbeCbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUlaLdaSdaSdaSdaMsaMsaMsaMsaMsaMsbzqbzrbqrbqrbqrbqrbqrbqrbzsbqrbqrbqrbnKbnKbztbvsbzubzvbynbzwbvsbzxbzybzzblMbwWbwXbwYbnDblMbnKbxabxbbzAbzBbzCbyvbzCbxbbyxbzDbzEbzFbzGbzHbzIbzJbzKbzLbyFbzMbzNbzObzPbzQbzQbzPbzRbzSbvXbzTbxqbxqbyPbzUbyPbxqbxqbzVbwbbzWbzXbzYbzZbAabAbbzYbAcbxvbAdbAebAfbAgbAhbAibAjbAkbAkbAkbAkbAkbAkbAlbAmbAnbAkbAkbAobAkbAkbAkbAkbAkbAkbAkbAkbApbAqbArbArbArbArbArbArbAsbAibAtbAubAubAvbAwbAxbAwbAybAwbAzbAAbABbAwbACbADbAEbAFbAGbAGbAGbAGbAGbAGbAGbtbbAIbAJbAJbtvbAJbxKbjKbjKbrIbAMbrKbANbrMbrKbAObeCbeCbeCbeCbAPbeCbAPbeCbeCbeCbeCaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAQbARbARbARbARbASbASbARbARbATaaaaabaSdaUnaShbAUbAVbAWbAXbAXbAXbAXbAYbAZbBablQbnwbBbbBcbvsbvsbvsbBdbyobvsblMblMblMblMbwWbBebBfbBgblMbBhbBibxbbBjbBkbyvbzCbBlbxbbyxbBmbzEbzFbBnbBobBpbzJbBqbzLbyFbzMbBrbBsbBtbBubBvbBwbzRbBxbvXbBybyPbxqbBzbBAbBzbxqbyPbBBbxubBCbzYbzYbzZbBDbAbbzYbBEbxvbBFbAfbAfbAgbAhbAibAkbAkbAkbAkbAkbAkbAkbBGbAkbAkbAkbAkbAkbAkbBHbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBJbBKbBLbAGbAGbBMbwvbwvbwvbwvbwvbwwbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbBNbwvbznbBPbjKbjKbAHbjKbjKbjKbjKbBQbjRbqnbjRbjRbjRbEJbjSdsidshbjSbBUaYUbBUaYUbDxbBRbBSbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBWbBXbBYbBZbCabCbbCbbCcbCdbARbATaSdaSdaSdaTobCebCfbCgbCfbCfbCfbCfbChbCibCjblQblQbCkbClbvsbwPbCmbCnbzwbvsbCobCpbCoblMblMblMblMbCqblMbCrbCsbxbbCtbCubzCbCvbCwbxbbyxbzJbCxbzFbBnbBnbCybzJbCzbzLbyFbzMbCAbBsbBtbCBbCCbBwbzRbCDbvXbCEbCFbxqbCGbCHbCIbxqbCJbCKbCLbCMbCNbCObCPbCQbCRbzYbCSbxvbCTbCUbAfbAgbAhbAibAkbCVbAkbAkbAkbAkbCWbCXbCXbCXbCXbCYbAkbAkbAkbAkbCZbAkbCVbDabAkbDbbDcbDdbAkbDebDfbDfbDgbDhbDibDjbwvbwvbwvbwvbwvbwvbwvbDkbDlbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbDmbDnbDnbAKbDpbDqbDrbDsbDsbBObBObDqblObAMbrKbrMbrMbrKdsjdsldsldsldsnbijaaabijdsobDwbDwdspbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXAaYWaYXaYYaXzaYZaXsaYZaXsaYZaXsaYZaXzaZaaZbaSdaToaZcaVcaZdaZeaZfaZgaZhaUmaTuaZjaUraZkaZlaZmaZnaZoaTuaZpaZqaXQaXQaXQaXQaXQaXQaXRaZraVjaabaUEaZsaZtaZuaZvaZwaUEaabaSuaSzaSAaZxaZyaZzaZAaZBaSAaPiaRwaUJaUJaUJaZCaULaSCaUMaSCaULaZDaUJaUJaUJaRwaZEaZFaZGaEjaVyaZHaZIaZIaZIaZJaZKaZLaZMaZNaZOaZMaZPaZQaZRaZMaZSaZTaZUaZVaZWaUSaZXaZYaZZbaabaaaZYbabbacbacbacbacbacbadbaebacbafbagbahbaibajbakbalbambanbaobanbapbaqaGYaGXbarbasbatbaubavbawbaxbaybazbaAbazbaBbaCbaDbaEbaFbaGbaHbaIbaJbaKbaLaYPbaMbaNbaObaPbaQbaRbaSbaTbaUbaVaaaaaaaaaaaaaaaaaaaaaaYTbaWbaXbaYaYVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaZaXsaXsaVXaXzaYZaXsaYZbbaaYZaXsaYZaXzaZaaZbaSdaTobbbaVcaVcbbcaUtaUsaUtaVcaTuaTuaTuaTubbfbbgbbhbbiaTubbjbbkbblaXQaXQbbmaXQbbnbbobbpaVjaaaaUEaUEbbqbbrbbqaUEaUEaaaaSuaSzaSAbbsbbtbbuaZAbbvaSAaPiaRwaSBaSCbbwaWFaULaSCaUMaSCaULaWHbbxaRwaRwaRwbbybbzbbAbbBbbCbbDatGatGbbEbbFbbGbbHaUQbbIaVEaUQbbJaUQbbKaUQbbLbbMbbNbbObbPbbQbbRbbSbbTbbUbbVbbWbbXbbVbbVbbYbbVbbSbbZbbSaXjbcabbSbcbbccbcdbcebcfbcgbchbcibcjbckbclaXibcmbcnbcobcpbcqbcrbcsbctbaybcubcvbazbcwbcxbcybczbaFbcAbcBbcCbcDbcEbcFaYPbcGbcHbcHbcIbaTbaTbaTbaTbaUbaVaaaaaaaaaaaaaaaaaaaYTbaWbcJbcKbcLbaYaYVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXAbcMbcNaYYaXzaYZaXsaYZaXsaYZaXsaYZaXzaZaaZbaSdaTobcOaZibcQbcRbcSbcSaSfbcTbcUbcVbcWbcXbcYbcZaVebdaaTubdbbdcbddbdebdfbdgbdhbdibdjbdkaVjaaaaabaaabbdbdmbbdaaaaabaaaaSuaSzaSAbdnbdobdpbdqbdraSAaPiaRwbdsbdtaTCbdubdvaTFbdwaTFbdxbdybdzaRwbdAbdBbdCbdDbdEbdFbdGbdHaaaaaabbEbdIbdJbdKaUQbdLbdMaVEaVEbdNaVEaVEaVEbdOaUSbdPaUSbdQbdRaUSbdSaUSbdTbdUbdVbdWbdXbdYbdTbdZbeabebbecbebbebbebbebbedbeebebbefbegbehbeibebbejaGYbaubekbcpbelbembenbeobepbeqberbesbazbetbeubevbewbexbcAbcBbcCbcDbaKbeyaYPbezbcHbcHbcIbaTbaTbaTbaTbaUbaVaaaaaaaaaaaaaaaaaaaYUbeAbeBbeCbeBbeDaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeEbeFaVWaXqaXzaXsbeGbeHaXsaXsbeIbeGaXzaXAbeJaSdaTobeKbbebeMbeNbeMbeMbeMbeMbeMbeOaSfaTubePbeQbePaTuaTubeRbeSbeRaViaViaViaVibeRbeTbeUaVjbdlbcPbcPbeLbeYbeLbcPbcPbeVaSubfaaSAbeWaSAbeZbeXbfeaSAbffaRwaRwaRwaRwbfgbfhbfibfjbfibfhbfgaRwaRwbfkbdDbdDbdDbdDbflbfmbfnbfobfpbbEbfqbdJbfraUQaUQaUQaUQaUQaUQaUQaUSaUSbdObfsbftbfubfvbfwbfxbfybfzbdTbfAbfBbfCbfDbfEbdTbfFbfGbfHbfIbfHbfJbfKbfMbfLbfNbfObfPbfQbfRbfSbebbfTbfUbfVbfWbfXbelbfYbfZbeobgabazbgbbgcbgdbgebgfbczbczbazbazbcBbcCbcDbcEbggaYPbghbgibgjbgkbglbgmbaTbaTbgnbaVaaaaaaaaaaaaaaaaYTbaWbgobeCbeCbeCbgpbaYaYVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeEaVWaVXaVWaVWaVYaVZaVWaVWaVXbeFbgqaLdbgrbeKaSdbgsbgsbgtbgsbguaMsbgvbgwaSfbfbbfcbgzbgzbgAbgBbgzbgCbgzbgzbgzbgDbgzbgzbgEbgFbfdbgHbgIbgJbgHbgKbgHbgHbgHbgHbgLbgMbgNbgzbgzbgObfcbgQbgxbgSbgTbgUbgVbgWbgXbgXbgXbgXbgXbgXbgXbgYbgZbhabhbbhcbhdbhebhfbhgbhhbdDbdDbhibhjbhkbhjbhkbhlbhmbhnbhobhpbhqaUSbhrbhsbhtbhubhvbhvbhwbhxbhybhzbdTbhAbhBbhCbhCbhDbdTbhEbhFbhGbhHbhIbhIbhJbhKbhLbfMbhNbhObhPbhQbhRbebbejaTgbaubhSbhTbhTbhUbhVbhTbhWbazbhXbhYbazbhZbiabczbibbazbicbidbiebcDaYPaYPaYPbifbigbihbiibigbigbigbigaYSafXajcaaaaaaaaaaaabijbikbilbeCbeCbimbinbeCbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbgyaSdaSdaSdaSdaSdaSdbgyaSdaUZaLdbipbiqaSdbirbisbitbitbiuaMsbivbgwbiwbgGbfcbiybizbiAbiBbiBbiCbiDbiDbiDbiEbiFbiFbiGbiHbgPbiBbiBbiJbiFbiKbiLbiMbiMbiNbiObiPbiQbiQbiQbiRbfcbgQbgxbgSbgSbgSbgSbiSbgSbgSbgSbgSbgSbgSbiTbiUbiVbiWbiXbiYbiZbjabjbbjcbiVbiVbiVbjdbjebjebjebjfbhqbhqbhqbjgbjhbhqaUSbjibjjbhvbhvbjkbhvbjlbjmbhybjnbdTbjobjpbjqbjrbjsbdTbjtbjubjvbjwbjxbjybebbebbjzbebbebbebbjBbjCbjBbebbejaGYbaubjDbcpbcpbcpbjEbcpbjFbazbazbazbazbazbazbazbjGbazbcDbcDbcCbcDbjHbjIaYPbjJbjNbjLblwbgRbixbiobiIbjRaaaaaaaaaaaaaYTbjSbjTbjSbjSbjSbjUbjSbjVbjSbjTbjSaYVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaUlaLdaSdaOQaSdbjWbjXbjYbjZaSdaOQaSdaSdaLdbkabeKaSdbkbbkcbitbitbiuaMsbkdbgwaSfbgGbfcbgzbkebkfbkgbkgbkhbkibkjbkgbkkbkgbklbkgbkmbjPbkgbkgbkgbkgbkgbkobkpbkgbkqbkrbksbktbgzbgzbkubjQbkwbknbkybkzbkybkAbkBbkAbkAbkAbkAbkAbkAbkCbkDbkEbkEbkEbkEbkFbkEbkGbkHbkEbkEbkIbkJbkKbkKbkKbkKbkKbkKbkKbkLbhqbhqaUSbkMbkNbkObkPbkPbkQbkRbjmbhybkSbdTbdTbdTbdTbdTbkTbdTbkUbkVbkWbkXbfHbkYbebbhMblabjAblcbldbleblfblgbebbejaQLbaublhblibcpbljblkbcpbllbllbaublmblnbloaYPblpblqblrbcDbcDblsbltaYPbluaYPblvbjKbjLblxbkvbALbjKblzbjRaaaaaaaaaaaabijbmXbnabmYbmYblDbeCblCblDblAblBblCbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaMsaSdbgyaSdaToaSfaSfaTpaSdbgyaSdblEblFblGblHaSdblIblIbgtblIbguaMsblJbgwaSfaMsblKblKblLblMblMblMblMblMblMbkxblyblMblMblMblMblMblMblPblQblRblRblSblRblTblUblVblTblTblWblXblYblKblZblZbmabmabmabmbbmbbmbbmbbmbbmbbmbbmbbmcbmdbmdbmebmdbmfbmfbmfbmfbmgbmhbmfbmcbmibmibmibmibmibmibmibmibmjbmjbmjaUSbmkbmlbmmbmmbmmbmmbmnbmobmpbmqbmrbmsbmtbmubmvbmwbdTbdTbmxbmybmzbmybmybebbmAbmBbmDbmDbmDbmDbmEbmFbebbmGbmHbaubmIbcpbljbljblkbljbcpbmJbaubmKbmLbmMaYPbcDbmNbmObmPbmPbmQbmRbmSbmTbmUbmVbmWboObzpbjMbjKbjKblzbjRbjRbjRbjRbjRbijbBTbDzbDzbDzbBVbeCblCbnbblAbeCbncbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbneaSfbnfbngbnhbnibnjbnkbnibnlbnmbnibnibnnblNbnpbnqbnrbnrbnrbnsbnrbntbnuaMsbnvbnwbnxblMbnybnzbnAbnBbnCbnDbnEbnFbnGbnHbnIbnJblMbnKbnLblRbnMbnNbnOblTbnPbnQbnRblTbnSbnTbnUbnSbnSbnSbnVbgSbnWbmbaaaaaaaaaaaaaaaaaaaaabmcbnXbnYbnZboabobbocbodboebofbogbohbmcaaaaaaaaaaaaaaaaaaaaabmiboibhqbojaUSbokbmlbmqbmqbmqbmqbmqbolbombmqbmqbmqbonbooboobopboqborbosbotboubovbowbebbkZboyboBboAboAboBboCboDbebbejaGYbauboEboFbcpbljblkbcpboGboGbaubauboHbauaYPboIblqbltboJboJboKbltaYPaYPaYPboLbjKbEFblObjMbjKbjKbmZbAMbrKbrMbrMbrKbDvbDzbDzbGJbGJbnbbeCblCbnbblAbeCblCaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdboPboQboPboPboPboPboPboPboQboPboPboRaSfboSbgGboUaSfboVaSfboWboXboYboZbpaaMsbnwbnwbpbblMbpcbnDbnDbnDbnDbnDbnEbpdbnDbnDbnDbpeblMbnKbpfblRbpgbphbpiblTbpjbpkbplblTbpmbpnbpobppbpqbnTbnVbgSbnWbmbaaaaaaaaaaaabmcbmcbmcbmcbprbpsbptbpubpvbpwbpxbpybpzbpAbpBbmcbmcbmcbmcaaaaaaaaaaaabmiboibhqbpCbpDbpEbpFbpGbpHbpEbpIbpJbpKbpLbpMbpNbmqbpObpPboobpQbpRboobpSbpTbpUbpVboobpWbpXbpYboBboAboAboBbpZbqabebbejaTgbaubmIbcpbljbljblkbljbcpbcpbqbbqcbcpbqdaYPbqebqfbqgboJboJbqhbqgbqiaYPbqjbqkbjKbjRbjRbndbnobjRbjRbjRbqnbjRbjRbjRbEJbjSbjSbjSbjSbqobeCblCbqoblAbeCblCbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLdaLdaSdaSdaSdaSdaSdaSdaSdaSdaSdaLdaMsbgGboTbqrbqrbqrbqrbqrbqrbqsbqrbqrbqraMsbnwbnKbqtblMbqubnDbnDbqvbqwbqxbqybqvbnDbnDbnDbqzblMbnKbnLblRbqAbqBbqCblTbqDbqEbqFblTbqGbqHbqIbqJbqKbnTbqLbqMbnWbmbbmbbqNbmcbmcbmcbqObqPbqQbqRbqSbqSbqTbqUbqSbqVbqSbqWbqXbqYbqZbrabrbbmcbmcbmcbqNbmibmiboibhqbhqaUSbrcbrdbpMbrebmqbrfbrgbmqbrhbribpNbmqbonbooboobrjbrkbrlbrmbrnbrobrpboobqpbpXbrrboBboAboAbrsbrtbrubebbejaGYbaubrvbrwbrxbljblkbrybcpbcpbrzbcpbrAbrBaYPbrCbrDbrEboJboJbrFbrEbrGaYPbrHbqkbjKbjObGIbjMbjKbjKbrIbrJbrKbrLbrMbrKbrNbeCbeCbeCbeCbeCbeCbeCbeCbeCbeCblCbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrObrPbrPbrQbrPbrPbrPbrRbrPbrPbrSaabaSdaUnaShbrTbqrbrUbrVbrWbrXbrYbrZbsabsbbqrbscbsdbsebsfblMbsgbnDbnDbqvbqxbshbsibqvbnDbnDbsjbskblMbnKbnLblRblRbslblRblTbsmbsnbsoblTbspbqJbsqbqJbsrbnTbnVbssbnWbgXbgXbstbsubsvbmcbswbptbsxbqSbqSbsybszbsAbsBbsAbsCbsDbsEbsFbsGbsHbsIbmcbsJbsubsKbsLbsMboibhqbhqbsNbmqbsObmqbmqbmqbsPbsQbmqbrhbsRbpNbmqbpObooboobsSbsTbsUbsVbsWbsXbrpbsYbebbqabrrboBboAboAboBbrtbtcbebbtdbtebaubtfbaubaubtgblkbthbtibcpbtjbtkbtlbtmbmUbtnbtobtpbtqbtqbtrbtsbttbmUbtubqqbrqbtwbjKbjMdsfbjKbtxbjRbjRbjRbjRbqnbijbtybeCblCblDblAbeCblCblDblAbeCbtzbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrObtAbtBbtCbtDbtDbtEbtDbtDbtDbtEbrQaSdaSdaSdaToboSbqrbrUbtFbtGbrUbtHbtIbtJbtKbqrbtLbtMbtNblQblMbtObtPbtQbtRbtSbtTbtUbtVbtVbtVbtWbtXblMbnKbsdbtYbtZbuabubblTblTblTblTblTbucbudbuebufbugbnTbnVbssbgSbgSbgSbuhbuibujbukbulbumbqSbunbuobupbuqburbusbutbuubuvbuwbuxbulbuybuzbuAbuBbuCbuDbuEbuEbuFbhqbuGaUSbmqbuHbuIbpNbmqbuJbuKbmqbuLbuMbpNbmqbonboobooboobopboobuNboobsXbrpbuObebbuPbrrboBboAboAboBbrtbuQbebbuRbuSbuTbuUbuVbuWbuXbuYbuZbuZbuZbuZbuZbuZbvabvbbvcboJboJboJboJboJboJbvdbvebvfbtabjKbjKbjKbtbbALbjKbvgbqnbvhbvhbvhbjRblDblAbeCblCbnbblAbeCblCbnbblAbeCblCblDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvibvjbvjbvjbvjbvjbvjbvjbvjbvjbvjbvkbvlaOQbvlaSfboSbqrbvmbrUbvnbvnbvnbvobrUbvpbqrbvqbvrbtNbvsbvsbvsbvsbvtbvsbvubnDbvvbvwbvxbvxbvybvzblMbvAbvBbvCbvDbvEbvFbvGbvHbvIbvHbvJbvJbvJbvJbvJbvKbvLbnVbvMbvNbvObvPbvQbvRbvSbvTbvUbusbvVbvWbvXbvXbvXbvXbvYbvXbvZbwabwbbwcbvVbwdbwebmcbwfbwgbwhbwibwjbwkbhqbhqbsNbmqbwlbmqbmqbmqaZVbmqbmqbwmbwmbmqbmqbwnbooboobwobwpboobooboobwqbwrbwsbebbqabrrboBboBboBboBbrtbwtbebbwubwvbwvbwwbwvbwxbljbljbljbljbwybljbljbljbwzbveboJboJboJboJboJboJboJbvdbvebvfbtabjKboMboMboNboMbjKbwAbjRbwBbwCbwDbjRbnbblAbeCblCbnbblAbeCblCbnbblAbeCblCbnbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwEbwFbwGbwHbwIbwIbwJbwIbwIbwIbwJbrQaSdaSdaSdbwKblHbwLbrUbwMbvnbvnbvnbvobwMbrUbqrbwNbwObtNbvsbwPbwQbwRbwSbvsbwTbwUbwVblMbwWbwXbwYbwZblMbnKbxabxbbxbbxcbxbbxbbxbbxbbxdbxebxebxebxfbxebxgbxhbxibxjbxkbxlbxlbxlbxlbxlbxmbxmbxnbxmbvXbvXbxobxpbxqbxrbxsbxtbxobxubvXbxvbxwbxvbxvbxvbxvbxvbxvbxvbwkbhqbhqaUSbxxbmqbxybxzbmqbxAbmqbxBbxCbxDbmqbxEbdTbxFbxGbdTbdTbxHbxIbxJbxIbdTbdTbebblbbxLbxMbxMbxMbxMbxLbxNbebbxObwvbwvbwwbxPbaubxQbxRbxSbxTbxUbxVbxWbxXbxYaYPbxZbcDbyaboJboJbyabcDbybaYPbycbtabjKbqlbqlbqmbqlbjKbvgbqnbvhbvhbvhbjRbqoblAbeCblCbqoblAbeCblCbqoblAbeCblCbqoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwEbrPbrPbrQbrPbrPbrPbrRbrPbrPbydaabaSdbyebngbyfbqrbtFbtFbtFbrUbygbyhbyibyjbqrbykbylbtNbvsbymbvsbynbyobvsbypbyqbyrblMbwWbwXbwYbskblMbnKbxabxbbysbytbyubyvbywbxbbyxbyybyzbyAbyBbyBbyBbyCbyDbyEbyFbxlbyGbyHbyIbyJbyKbyLbyMbyNbvXbyObxqbxqbyPbyQbyPbxqbxqbyRbvXbySbyTbyUbyVbyWbyXbyYbyZbxvbzabzbbzbbzcaUSaUSaUSaUSbzdbsNbzdbzeaUSbdRaUSaUSbdTbdTbdTbdTbzfbzgbzgbzgbzgbzhbzibebbjBbzjbjBbzkbzkbjBbzjbjBbebbxObwvbwvbzlbxPbaubaubaubaubaubtfbaubaubaubauaYPaYOaYQaYQaYQaYQaYQaYQaYPaYPbzmbtvbznbxKbjKbjMbjKbjKdsgbjRbjRbjRbjRbqnbijbzobeCbeCbeCbeCbeCbeCbeCbeCbeCbeCbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUlaLdaSdaSdaSdaMsaMsaMsaMsaMsaMsbzqbzrbqrbqrbqrbqrbqrbqrbzsbqrbqrbqrbnKbnKbztbvsbzubzvbynbzwbvsbzxbzybzzblMbwWbwXbwYbnDblMbnKbxabxbbzAbzBbzCbyvbzCbxbbyxbzDbzEbzFbzGbzHbzIbzJbzKbzLbyFbzMbzNbzObzPbzQbzQbzPbzRbzSbvXbzTbxqbxqbyPbzUbyPbxqbxqbzVbwbbzWbzXbzYbzZbAabAbbzYbAcbxvbAdbAebAfbAgbAhbAibAjbAkbAkbAkbAkbAkbAkbAlbAmbAnbAkbAkbAobAkbAkbAkbAkbAkbAkbAkbAkbApbAqbArbArbArbArbArbArbAsbAibAtbAubAubAvbAwbAxbAwbAybAwbAzbAAbABbAwbACbADbAEbAFbAGbAGbAGbAGbAGbAGbAGbAHbAIbAJbAJbAKbAJbBObjKbjKbrIbAMbrKbANbrMbrKbAObeCbeCbeCbeCbAPbeCbAPbeCbeCbeCbeCaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAQbARbARbARbARbASbASbARbARbATaaaaabaSdaUnaShbAUbAVbAWbAXbAXbAXbAXbAYbAZbBablQbnwbBbbBcbvsbvsbvsbBdbyobvsblMblMblMblMbwWbBebBfbBgblMbBhbBibxbbBjbBkbyvbzCbBlbxbbyxbBmbzEbzFbBnbBobBpbzJbBqbzLbyFbzMbBrbBsbBtbBubBvbBwbzRbBxbvXbBybyPbxqbBzbBAbBzbxqbyPbBBbxubBCbzYbzYbzZbBDbAbbzYbBEbxvbBFbAfbAfbAgbAhbAibAkbAkbAkbAkbAkbAkbAkbBGbAkbAkbAkbAkbAkbAkbBHbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBJbBKbBLbAGbAGbBMbwvbwvbwvbwvbwvbwwbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbBNbwvbDobBPbjKbjKbDtbjKbjKbjKbjKbBQbjRbqnbjRbjRbjRbEJbjSdsidshbjSbBUaYUbBUaYUbDxbBRbBSbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBWbBXbBYbBZbCabCbbCbbCcbCdbARbATaSdaSdaSdaTobCebCfbCgbCfbCfbCfbCfbChbCibCjblQblQbCkbClbvsbwPbCmbCnbzwbvsbCobCpbCoblMblMblMblMbCqblMbCrbCsbxbbCtbCubzCbCvbCwbxbbyxbzJbCxbzFbBnbBnbCybzJbCzbzLbyFbzMbCAbBsbBtbCBbCCbBwbzRbCDbvXbCEbCFbxqbCGbCHbCIbxqbCJbCKbCLbCMbCNbCObCPbCQbCRbzYbCSbxvbCTbCUbAfbAgbAhbAibAkbCVbAkbAkbAkbAkbCWbCXbCXbCXbCXbCYbAkbAkbAkbAkbCZbAkbCVbDabAkbDbbDcbDdbAkbDebDfbDfbDgbDhbDibDjbwvbwvbwvbwvbwvbwvbwvbDkbDlbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbDmbDnbDnbDubDpbDqbDrbDsbDsbDybEIbEHbmZbAMbrKbrMbrMbrKdsjdsldsldsldsnbijaaabijdsobDwbDwdspbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBWbBXbDAbCbbCbbCbbCbbCbbCbbCbbDBbDCaOQbDCaSfbDDbCfbDEbDFbDGbDHbDIbChbDJbDKbDLbDLbDMbDNbvsbvsbvsbynbDObymblQblQblQblQbDPbnKbnKbCsbnKbCrbCsbxbbDQbDRbDSbDTbyvbxbbDUbzJbDVbzFbBnbBnbDWbDXbDYbzLbDZbxlbEabEbbzPbzPbzPbzPbzRbEcbvXbEdbEebvXbvXbvXbvXbvXbvXbvXbxubxvbEfbEgbEhbEibEjbEkbElbxvbEmbEnbEnbEobEobEobEobEobEobEobEpbEpbEqbErbEsbEsbErbEqbEpbEpbEtbEtbEtbEtbEtbEtbEubEubEvbEubEubEubEubEubEubEwbExbEybwvbwvbEzbEzbEAbEAbEAbEAbEAbEBbDnbDnbDmbDnbwvbDnbDnbDnbDnbECbEDbEDbEDbEDbEEbEFbEFbEGbEGbEGbEGbEGbEGbEGbjRbjRbjRbjRaYUdsqdsldsldsrbijaaabijdssbDwbDwdstbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBWbBXbEKbELbELbCbbELbELbELbARbEMaSdaSdaSdaTobENbCfbEObEPbEPbEPbEQbChbnKbERbESbETbEUbEVbvsbwPbEWbynbEXbymbEYbEZbFabFbbFcbFdbFdbFebFdbFfbFgbxbbFhbFibFjbFkbFlbFmbFnbyBbFobFpbBnbFqbFrbDobDYbzLbFtbxlbFubFvbFwbFxbFybFzbFAbxmbxmbFBbFCbFDbFEbFFbFEbFGbFCaaabFHbxvbFIbFJbFKbFLbEjbzYbFMbxvbFNbFObFPbEobFQbFRbFSbFTbFUbFVbFWbFXbFYbFZbGabGabFZbGbbGcbGdbEtbGebGfbGgbGhbEtbGibGjbGkbGlbGmbGnbGnbGobEubGpbGqbGrbDtbGrbDubDubEAbGubGvbGwbEAbDybEHbDybEAbGzbDnbECbEDbEIbFsbEIbEDbGCbGDbEDbGEbGFbGGbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabijdsudswdsvdsvbijaaabijdsxbDwdsxbDwbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGKbARbARbARbARbARbARbARbARbEMaaaaaaaSdbGLbngbGMbCfbGNbCfbGObEPbGPbGQbChbGRbGSbGTbGUbEVbvsbvsbvsbvsbvsbvsbGVbGWbGXbGYbGZbxbbxbbxbbxbbxbbxbbxbbHabxbbxbbxbbHbbxbbHcbHdbHebBnbBnbBnbHfbDXbHgbzLbHhbxlbHibFvbxlbxlbxlbxmbHjbxmbHkbHlbHmbHnbHobHpbHqbHrbHsbHtbHubxvbHvbzYbHwbHxbEjbHybzYbxvbHzbHAbHBbEobHCbHDbHEbHFbHGbGsbHIbGabGabGabGabGabGabGabGabHJbHKbHLbHMbHNbHObEtbHPbHQbHRbHSbHTbHUbHQbHTbEubHVbGqbHWbHXbHYbHZbHZbIabIbbIcbIdbIebIfbIgbIhbEAbIibIjbIkbEDbIlbImbInbIobIpbIqbEDbIrbGGbIsbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabItbjVbIubIubIubIvaaabIwbIxbIxbIxbjVbIyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUlaLdaSdaSdaSdaSdaSdaSdaSdaSdaSdaToaSfbIzbCfbIAbIBbICbIDbIDbIEbIFbIGbIHbIHbIIbIJbDLbDLbDLbDLbDLbDLbIKbILbILbIMbINbxbbIObIPbIQbIRbISbITbIUbIVbxbbIWbIXbyBbyCbDXbHebBnbBnbIYbzJbzJbIZbJabJbbJcbJdbJebJfbJgbJhbJibJjbJkbJlbJmbHsbJnbJobJnbJobJpbHsbHtbJqbJrbJsbJtbJubJvbJwbJxbJybJrbJzbFObFObEobJAbJBbJCbJDbJEbEobHIbGabGabGabGabGabGabGabJFbJGbGtbJIbJJbHLbJKbEtbJLbJMbJNbHSbHTbHUbJObJPbEubJQbJRbJSbJTbJTbJUbJVbGxbJXbJYbJYbJYbJZbJYbKabKbbKcbKdbKebKfbKgbKhbKibKibKibKjbEDbKkbGGbKlbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabItbKmbKmbKmbIyaaabItbKmbKmbKmbIyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbKnbKobKpaRcaRcaRcbngaSfaSfbCfbKqbCfbKrbKsbKtbKubCfblQbKvbKvbKwbKxbKwbKwbKwbKxbKwblQblQbxbbxbbxbbKybxbbKzbKzbKzbKzbKzbKzbIUbKAbKBbKCbzFbKDbGybKFbKGbKHbKIbKJbKKbGAbKMbKNbKObKPbKQbKQbKRbKSbKTbKUbKVbKWbKXbKYbFCbKZbHqbLabHobLbbFCaaabLcbLdbLebLfbLdbLdbLdbLdbLgbxvbLhbFObLibLjbLkbLlbLmbLnbLobEobLpbLqbLrbLsbLtbLubLvbLwbGabLxbEtbLybJJbLzbLAbEtbLBbLCbHRbHSbHTbHUbHQbHTbEubHVbGqbLDbLEbLFbLGbLHbLIbLJbLKbLLbLMbLNbLObLPbEAbLQbLRbLSbEDbLTbLUbLVbIpbLWbLXbEDbKkbGGbLYbGHaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbLZbMabKpaSeaSebMbbMcaSebMdbCfbMebIBbMfbMgbMhbMibCfaaaaabaabbMjbMkbMkbMkbMkbMkbMlaaaaaabKBbMnbMobMpbMqbKzbKzbKzbKzbKzbKzbMrbMsbGBbMubMvbMwbMxbDXbzJbzJbMzbMAbzJbzJbMBbMCbMDbMEbMFbMGbMGbMHbMGbMIbMJbMGbMKbKYbFCbMLbFEbFEbFEbMMbFCaaabLcbLdbMNbMObMPbMQbMRbMSbMTbMUbMVbFObMWbEobMXbMYbMZbNabNbbNcbNdbNebNfbNgbNhbNibNjbNkbNlbNmbNnbNobJJbNpbNqbEtbNrbNsbNtbNubNvbNwbNxbGobEubNybNzbNAbNBbNBbNCbNDbNEbNFbNGbNHbNIbNJbNKbNLbEAbNMbLRbNNbEDbNObNPbNQbIpbIpbNRbEDbIrbGGbNSbGHaaaaaaaaaaaaaabbNTbNUbNVbNUbNVbNUbNWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbKpbKpbHHaSdaSdaUlaLdaSdaSdbCfbOabIBbIBbIBbCfbCfbCfaaaaaaaaabObbOcbOcbOdbOcbOcbObaaaaaabKBbOebKzbOfbOgbOgbOgbOgbOgbOhbOibOgbOjbJHbOlbOmbOnbOobOpbzJbOqbBnbOrbOsbDXbOtbOubOvbMEbMEbMGbOwbOxbOybOzbOAbMGbFBbKYbFCbOBbOCbJWbOEbOFbFCaaabOGbLdbOHbOIbOJbOKbOLbOKbOMbONbOObFObOPbEobOQbOQbORbOSbOTbOUbOVbOWbOXbOYbOZbOZbPabPbbPcbPdbEtbNobPebPfbEtbEtbEubPgbPhbPibEubEubEubEubPjbPkbGqbPlbLEbLFbPmbNBbNEbPnbPobPobPpbIdbPqbPrbPsbPtbIjbPubEDbPvbPwbIpbPxbPybPzbEDbKkbPAbGHbGHaaaaaaaaaaaaaabbPBbPCbPDbPEbPFbPGbPBaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPHbPIbPIbPIbPIbPJbPKbPIbPIbPIbPIbPLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabObbOcbOcbOcbOcbOcbObbKEbKBbKBbPNbPObPPbPQbPQbPQbPObKzbIUbKAbKzbKzbKBbPRbPSbPTbPUbPVbKLbPXbBnbBnbPYbDXbOtbOubPZbMmbQbbQcbQdbQebQfbQgbQhbMGbQibQjbHmbQkbQlbQmbQnbQobHsbHtbQpbLdbQqbQrbQsbOKbQtbOKbQubONbQvbFObQwbEobQxbQybQzbQAbQBbQCbQDbQEbQFbQFbQGbQHbQFbQFbQIbQJbQKbQLbQMbQNbQObQPbQQbQRbQSbQTbQUbQVbQWbQXbQYbQZbGqbRabRbbRcbRdbRebIabRfbPobPobRgbRhbPqbRibEAbRjbRjbRkbEDbRlbRmbRnbRobIpbRpbEDbKkbRqbGHaaaaaaaaaaaaaaaaabbRrbRsbPDbPFbPDbRtbNVaabaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPHbRubRvbRwbRxbRybRzbRAbRybRBbRCbRDbPIbPIbPLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabObbOcbOcbOcbOcbOcbREbRFbRGbRFbRHbRIbRJbRIbRIbRIbRIbRKbIUbKAbRLbxbbxbbRMbBnbzFbPUbRNbDXbRObRPbRPbRQbMtbRSbRTbRUbRVbRWbRXbRYbRZbSabSbbScbMGbMKbKYbFCbSdbSebSfbSgbShbFCaaabOGbSibSjbSibSibSibSibSibSkbSibSlbFObQwbEobSmbSnbSnbSobSpbOUbSqbSrbSsbStbSubSvbSwbSsbSxbSybSzbSAbSBbSCbSDbSDbSEbSFbSGbSHbSIbSJbSKbSLbSMbSNbSObSPbSPbSQbSRbSSbIabSTbIdbIdbSUbSVbPqbSWbMybSYbSZbTabTbbNXbTdbTebNYbTebEDbEDbTgbPtbThbTibTibTibTibTibThbPBbPFbPDbPFbPFbPGbPBaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPHbPIbRAbRAbRAbTjbRybTkbTkbRybTlbRAbRAbTmbTnbPIbPLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabObbOcbOcbOcbOcbOcbTobNZbTqbNZbTrbKzbPPbPQbPQbPQbKzbKzbIUbKAbTsbTtbxbbTubBnbzFbPUbTvbDXbTwbBnbBobBnbOkbOtbTybTzbRVbRWbTAbTBbTCbTDbTEbTFbTGbTHbTIbTJbTJbTKbTLbTMbFCbFCaaabOGbSibTNbTObTPbTQbTRbTSbTTbTUbTVbFObQwbNcbTWbTXbTYbTZbUabOUbUbbUcbUdbUebUfbUgbUhbUibUjbUkbUlbUmbUnbUobUpbUqbUrbUsbUtbUubUvbQVbUwbQXbUxbUybGrbUzbUAbUBbUCbUCbIabUDbUEbUFbIabUGbPqbUHbIabUIbUJbUKbULbUMbUNbUObUPbUQbURbUSbUTbUUbUVbUWbUWbUXbUYbUZbODbVbbNUbNVbVcbNVbNUbVdaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPHbPIbVebVfbVgbVhbVibRybVjbRAbVkbRAbRAbRAbRAbRAbTjbRyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabObbVlbOcbOcbOcbVmbObbKEbKBbKBbVnbKzbPPbKzbKzbKzbKzbKzbIUbKAbTsbVobxbbVpbBnbVqbVrbBnbPMbzEbBnbBnbVtbDXbOtbTybTzbRVbRWbMGbVubVvbVwbVxbVybMHbVzbVAbVBbVCbHsbPWbVEbHsbHtbHtbVFbSibVGbVHbVIbVJbVKbVKbVLbQabVNbFObVObEobOUbVPbOQbVQbVRbOUbUbbVSbVTbVUbVVbVWbVXbVTbUbbVYbVZbWabWbbWabWcbWabWdbWdbWebWfbWgbWgbWgbWhbWgbWgbWibWibWjbWkbWjbWjbIabIabIabIabIabWlbRRbLIbIabWnbWobWpbWqbWqbWrbWsbWtbWubWvbWwbWxbWybWzbWAbWAbWBbWCbWDbThbODbODbODbWEbThaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWFbWGbRAbRAbWHbWHbWHbRybRAbRAbRybWIbWJbWKbWLbWMbWNbRyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabObbOcbOcbOcbOcbOcbWObNZbTqbNZbPNbWPbWQbKzbKzbKzbWPbKzbIUbKAbTsbWRbxbbWSbBnbzFbPUbBnbzJbWTbBnbBnbWUbDXbOtbTybWVbRVbWWbMGbWXbWYbWZbXabXbbMHbXcbXdbXebSXbXgbXhbXibFCaaaaaaaaabSibXjbXkbXlbXlbXmbXnbXobSibXpbXqbQwbXrbXsbXtbXubXvbXwbXxbXybUcbXzbXAbXBbXCbXDbXzbUbbVYbXEbXFbXGbXHbXIbXJbWdbXKbXLbXMbXNbXObXPbXQbXRbXSbXTbXUbURbXVbWqbWqbXWbXXbWqbXYbXZbYabYbbYcbWqbYdbYebYfbYgbYhbYibYjbYkbYjbYjbYjbTgbPtbThbTibTibThbYlbYmbYnbYobYpbYqbYrbODaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYsbWGbRAbRAbRAbRAbRAbYtbRAbRAbRybPIbPIbPIbPIbPIbPIbYuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabObbOcbOcbOcbOcbOcbYvbYwbYxbYwbYybYzbYAbYAbYAbYAbYAbYBbYCbYDbTsbYEbxbbYFbYGbYHbYIbYJbYKbYLbYLbYLbYMbYMbYNbTybYObTcbRWbMGbYQbYRbYSbVvbYTbMHbYUbYVbYWbTJbYXbQmbYYbFCaaaaaaaaabSibYZbZabZbbZcbXmbXnbXobSibZdbZebZfbZgbZhbZibZjbZkbZlbZmbZnbZobVTbVTbZpbZqbVTbVTbUbbVYbZrbZsbZtbZubZvbZwbWdbZxbZybZzbZAbZBbZCbZDbZDbZEbZFbZGbZHbZIbUMbUMbZJbUMbZKbUMbZLbUMbZMbZNbZNbZObZPbZQbZRbZSbZTbZUbZVbZWbZXbYjbZYbZZaaaaaaaaabThcaabUYcabbYobODcaccadbThaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIcafcagcahcaibRAbRybRAbRAbRybRAcajcakcalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabObbOcbOcbOcbOcbOcbObbKEbKBbKBbxbbxbbKBbKBbKBbKBbKBbxbbxbbKBbKBbKBbxbcamcamcambTfcambYMcaocapcaqcarbYMbOtbTycasbMEbMEbMGbMGbMGbMGbMGbMJbMHbTJbTIcaubTJcavbTpbFCbFCbFCbFCbFCbSibSjbSibSibSibSibSibSibSicaxbFOcaycazcaAcaBcaCcaAcaAcaDcaEcaFcaGcaHcaIcaJcaKcaLbXycaMcaNcaOcaPcaQcaRcaScaTcaUcaVcaWcaXcaYcaZcbacbbcbcbWgbWicbdcbecbdcbfbTxcbfcbfcbfcbhbVacbjcbjcbkcblcbmcbnbZRcbocbpcbqcbrcbscbtbYjbZYbZZaaaaaaaaabThbVscbvbThbODbThbThbODbThaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBWbBXbEKbELbELbCbbELbELbELbARbEMaSdaSdaSdaTobENbCfbEObEPbEPbEPbEQbChbnKbERbESbETbEUbEVbvsbwPbEWbynbEXbymbEYbEZbFabFbbFcbFdbFdbFebFdbFfbFgbxbbFhbFibFjbFkbFlbFmbFnbyBbFobFpbBnboxbsZbozbDYbzLbFtbxlbFubFvbFwbFxbFybFzbFAbxmbxmbFBbFCbFDbFEbFFbFEbFGbFCaaabFHbxvbFIbFJbFKbFLbEjbzYbFMbxvbFNbFObFPbEobFQbFRbFSbFTbFUbFVbFWbFXbFYbFZbGabGabFZbGbbGcbGdbEtbGebGfbGgbGhbEtbGibGjbGkbGlbGmbGnbGnbGobEubGpbGqbGrbFqbGrbFrbFrbEAbGubGvbGwbEAbFsbGsbFsbEAbGzbDnbECbEDbGtbGxbGtbEDbGCbGDbEDbGEbGFbGGbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabijdsudswdsvdsvbijaaabijdsxbDwdsxbDwbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGKbARbARbARbARbARbARbARbARbEMaaaaaaaSdbGLbngbGMbCfbGNbCfbGObEPbGPbGQbChbGRbGSbGTbGUbEVbvsbvsbvsbvsbvsbvsbGVbGWbGXbGYbGZbxbbxbbxbbxbbxbbxbbxbbHabxbbxbbxbbHbbxbbHcbHdbHebBnbBnbBnbHfbDXbHgbzLbHhbxlbHibFvbxlbxlbxlbxmbHjbxmbHkbHlbHmbHnbHobHpbHqbHrbHsbHtbHubxvbHvbzYbHwbHxbEjbHybzYbxvbHzbHAbHBbEobHCbHDbHEbHFbHGbGybHIbGabGabGabGabGabGabGabGabHJbHKbHLbHMbHNbHObEtbHPbHQbHRbHSbHTbHUbHQbHTbEubHVbGqbHWbHXbHYbHZbHZbIabIbbIcbIdbIebIfbIgbIhbEAbIibIjbIkbEDbIlbImbInbIobIpbIqbEDbIrbGGbIsbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabItbjVbIubIubIubIvaaabIwbIxbIxbIxbjVbIyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUlaLdaSdaSdaSdaSdaSdaSdaSdaSdaSdaToaSfbIzbCfbIAbIBbICbIDbIDbIEbIFbIGbIHbIHbIIbIJbDLbDLbDLbDLbDLbDLbIKbILbILbIMbINbxbbIObIPbIQbIRbISbITbIUbIVbxbbIWbIXbyBbyCbDXbHebBnbBnbIYbzJbzJbIZbJabJbbJcbJdbJebJfbJgbJhbJibJjbJkbJlbJmbHsbJnbJobJnbJobJpbHsbHtbJqbJrbJsbJtbJubJvbJwbJxbJybJrbJzbFObFObEobJAbJBbJCbJDbJEbEobHIbGabGabGabGabGabGabGabJFbJGbGAbJIbJJbHLbJKbEtbJLbJMbJNbHSbHTbHUbJObJPbEubJQbJRbJSbJTbJTbJUbJVbGBbJXbJYbJYbJYbJZbJYbKabKbbKcbKdbKebKfbKgbKhbKibKibKibKjbEDbKkbGGbKlbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabItbKmbKmbKmbIyaaabItbKmbKmbKmbIyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbKnbKobKpaRcaRcaRcbngaSfaSfbCfbKqbCfbKrbKsbKtbKubCfblQbKvbKvbKwbKxbKwbKwbKwbKxbKwblQblQbxbbxbbxbbKybxbbKzbKzbKzbKzbKzbKzbIUbKAbKBbKCbzFbKDbHHbKFbKGbKHbKIbKJbKKbJHbKMbKNbKObKPbKQbKQbKRbKSbKTbKUbKVbKWbKXbKYbFCbKZbHqbLabHobLbbFCaaabLcbLdbLebLfbLdbLdbLdbLdbLgbxvbLhbFObLibLjbLkbLlbLmbLnbLobEobLpbLqbLrbLsbLtbLubLvbLwbGabLxbEtbLybJJbLzbLAbEtbLBbLCbHRbHSbHTbHUbHQbHTbEubHVbGqbLDbLEbLFbLGbLHbLIbLJbLKbLLbLMbLNbLObLPbEAbLQbLRbLSbEDbLTbLUbLVbIpbLWbLXbEDbKkbGGbLYbGHaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbLZbMabKpaSeaSebMbbMcaSebMdbCfbMebIBbMfbMgbMhbMibCfaaaaabaabbMjbMkbMkbMkbMkbMkbMlaaaaaabKBbMnbMobMpbMqbKzbKzbKzbKzbKzbKzbMrbMsbJWbMubMvbMwbMxbDXbzJbzJbMzbMAbzJbzJbMBbMCbMDbMEbMFbMGbMGbMHbMGbMIbMJbMGbMKbKYbFCbMLbFEbFEbFEbMMbFCaaabLcbLdbMNbMObMPbMQbMRbMSbMTbMUbMVbFObMWbEobMXbMYbMZbNabNbbNcbNdbNebNfbNgbNhbNibNjbNkbNlbNmbNnbNobJJbNpbNqbEtbNrbNsbNtbNubNvbNwbNxbGobEubNybNzbNAbNBbNBbNCbNDbNEbNFbNGbNHbNIbNJbNKbNLbEAbNMbLRbNNbEDbNObNPbNQbIpbIpbNRbEDbIrbGGbNSbGHaaaaaaaaaaaaaabbNTbNUbNVbNUbNVbNUbNWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbKpbKpbKEaSdaSdaUlaLdaSdaSdbCfbOabIBbIBbIBbCfbCfbCfaaaaaaaaabObbOcbOcbOdbOcbOcbObaaaaaabKBbOebKzbOfbOgbOgbOgbOgbOgbOhbOibOgbOjbKLbOlbOmbOnbOobOpbzJbOqbBnbOrbOsbDXbOtbOubOvbMEbMEbMGbOwbOxbOybOzbOAbMGbFBbKYbFCbOBbOCbMmbOEbOFbFCaaabOGbLdbOHbOIbOJbOKbOLbOKbOMbONbOObFObOPbEobOQbOQbORbOSbOTbOUbOVbOWbOXbOYbOZbOZbPabPbbPcbPdbEtbNobPebPfbEtbEtbEubPgbPhbPibEubEubEubEubPjbPkbGqbPlbLEbLFbPmbNBbNEbPnbPobPobPpbIdbPqbPrbPsbPtbIjbPubEDbPvbPwbIpbPxbPybPzbEDbKkbPAbGHbGHaaaaaaaaaaaaaabbPBbPCbPDbPEbPFbPGbPBaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPHbPIbPIbPIbPIbPJbPKbPIbPIbPIbPIbPLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabObbOcbOcbOcbOcbOcbObbMtbKBbKBbPNbPObPPbPQbPQbPQbPObKzbIUbKAbKzbKzbKBbPRbPSbPTbPUbPVbMybPXbBnbBnbPYbDXbOtbOubPZbNXbQbbQcbQdbQebQfbQgbQhbMGbQibQjbHmbQkbQlbQmbQnbQobHsbHtbQpbLdbQqbQrbQsbOKbQtbOKbQubONbQvbFObQwbEobQxbQybQzbQAbQBbQCbQDbQEbQFbQFbQGbQHbQFbQFbQIbQJbQKbQLbQMbQNbQObQPbQQbQRbQSbQTbQUbQVbQWbQXbQYbQZbGqbRabRbbRcbRdbRebIabRfbPobPobRgbRhbPqbRibEAbRjbRjbRkbEDbRlbRmbRnbRobIpbRpbEDbKkbRqbGHaaaaaaaaaaaaaaaaabbRrbRsbPDbPFbPDbRtbNVaabaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPHbRubRvbRwbRxbRybRzbRAbRybRBbRCbRDbPIbPIbPLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabObbOcbOcbOcbOcbOcbREbRFbRGbRFbRHbRIbRJbRIbRIbRIbRIbRKbIUbKAbRLbxbbxbbRMbBnbzFbPUbRNbDXbRObRPbRPbRQbNYbRSbRTbRUbRVbRWbRXbRYbRZbSabSbbScbMGbMKbKYbFCbSdbSebSfbSgbShbFCaaabOGbSibSjbSibSibSibSibSibSkbSibSlbFObQwbEobSmbSnbSnbSobSpbOUbSqbSrbSsbStbSubSvbSwbSsbSxbSybSzbSAbSBbSCbSDbSDbSEbSFbSGbSHbSIbSJbSKbSLbSMbSNbSObSPbSPbSQbSRbSSbIabSTbIdbIdbSUbSVbPqbSWbNZbSYbSZbTabTbbOkbTdbTebODbTebEDbEDbTgbPtbThbTibTibTibTibTibThbPBbPFbPDbPFbPFbPGbPBaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPHbPIbRAbRAbRAbTjbRybTkbTkbRybTlbRAbRAbTmbTnbPIbPLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabObbOcbOcbOcbOcbOcbTobPMbTqbPMbTrbKzbPPbPQbPQbPQbKzbKzbIUbKAbTsbTtbxbbTubBnbzFbPUbTvbDXbTwbBnbBobBnbPWbOtbTybTzbRVbRWbTAbTBbTCbTDbTEbTFbTGbTHbTIbTJbTJbTKbTLbTMbFCbFCaaabOGbSibTNbTObTPbTQbTRbTSbTTbTUbTVbFObQwbNcbTWbTXbTYbTZbUabOUbUbbUcbUdbUebUfbUgbUhbUibUjbUkbUlbUmbUnbUobUpbUqbUrbUsbUtbUubUvbQVbUwbQXbUxbUybGrbUzbUAbUBbUCbUCbIabUDbUEbUFbIabUGbPqbUHbIabUIbUJbUKbULbUMbUNbUObUPbUQbURbUSbUTbUUbUVbUWbUWbUXbUYbUZbQabVbbNUbNVbVcbNVbNUbVdaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPHbPIbVebVfbVgbVhbVibRybVjbRAbVkbRAbRAbRAbRAbRAbTjbRyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabObbVlbOcbOcbOcbVmbObbMtbKBbKBbVnbKzbPPbKzbKzbKzbKzbKzbIUbKAbTsbVobxbbVpbBnbVqbVrbBnbRRbzEbBnbBnbVtbDXbOtbTybTzbRVbRWbMGbVubVvbVwbVxbVybMHbVzbVAbVBbVCbHsbSXbVEbHsbHtbHtbVFbSibVGbVHbVIbVJbVKbVKbVLbTcbVNbFObVObEobOUbVPbOQbVQbVRbOUbUbbVSbVTbVUbVVbVWbVXbVTbUbbVYbVZbWabWbbWabWcbWabWdbWdbWebWfbWgbWgbWgbWhbWgbWgbWibWibWjbWkbWjbWjbIabIabIabIabIabWlbTfbLIbIabWnbWobWpbWqbWqbWrbWsbWtbWubWvbWwbWxbWybWzbWAbWAbWBbWCbWDbThbQabQabQabWEbThaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWFbWGbRAbRAbWHbWHbWHbRybRAbRAbRybWIbWJbWKbWLbWMbWNbRyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabObbOcbOcbOcbOcbOcbWObPMbTqbPMbPNbWPbWQbKzbKzbKzbWPbKzbIUbKAbTsbWRbxbbWSbBnbzFbPUbBnbzJbWTbBnbBnbWUbDXbOtbTybWVbRVbWWbMGbWXbWYbWZbXabXbbMHbXcbXdbXebTpbXgbXhbXibFCaaaaaaaaabSibXjbXkbXlbXlbXmbXnbXobSibXpbXqbQwbXrbXsbXtbXubXvbXwbXxbXybUcbXzbXAbXBbXCbXDbXzbUbbVYbXEbXFbXGbXHbXIbXJbWdbXKbXLbXMbXNbXObXPbXQbXRbXSbXTbXUbURbXVbWqbWqbXWbXXbWqbXYbXZbYabYbbYcbWqbYdbYebYfbYgbYhbYibYjbYkbYjbYjbYjbTgbPtbThbTibTibThbYlbYmbYnbYobYpbYqbYrbQaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYsbWGbRAbRAbRAbRAbRAbYtbRAbRAbRybPIbPIbPIbPIbPIbPIbYuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabObbOcbOcbOcbOcbOcbYvbYwbYxbYwbYybYzbYAbYAbYAbYAbYAbYBbYCbYDbTsbYEbxbbYFbYGbYHbYIbYJbYKbYLbYLbYLbYMbYMbYNbTybYObTxbRWbMGbYQbYRbYSbVvbYTbMHbYUbYVbYWbTJbYXbQmbYYbFCaaaaaaaaabSibYZbZabZbbZcbXmbXnbXobSibZdbZebZfbZgbZhbZibZjbZkbZlbZmbZnbZobVTbVTbZpbZqbVTbVTbUbbVYbZrbZsbZtbZubZvbZwbWdbZxbZybZzbZAbZBbZCbZDbZDbZEbZFbZGbZHbZIbUMbUMbZJbUMbZKbUMbZLbUMbZMbZNbZNbZObZPbZQbZRbZSbZTbZUbZVbZWbZXbYjbZYbZZaaaaaaaaabThcaabUYcabbYobQacaccadbThaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIcafcagcahcaibRAbRybRAbRAbRybRAcajcakcalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabObbOcbOcbOcbOcbOcbObbMtbKBbKBbxbbxbbKBbKBbKBbKBbKBbxbbxbbKBbKBbKBbxbcamcamcambVacambYMcaocapcaqcarbYMbOtbTycasbMEbMEbMGbMGbMGbMGbMGbMJbMHbTJbTIcaubTJcavbVsbFCbFCbFCbFCbFCbSibSjbSibSibSibSibSibSibSicaxbFOcaycazcaAcaBcaCcaAcaAcaDcaEcaFcaGcaHcaIcaJcaKcaLbXycaMcaNcaOcaPcaQcaRcaScaTcaUcaVcaWcaXcaYcaZcbacbbcbcbWgbWicbdcbecbdcbfbVDcbfcbfcbfcbhbVMcbjcbjcbkcblcbmcbnbZRcbocbpcbqcbrcbscbtbYjbZYbZZaaaaaaaaabThbWmcbvbThbQabThbThbQabThaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPIbPIbPIbPIbPIbPIbRybTlbRAcbwbRAcbxcbycbzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbAcbBbOccbCbOccbDcbEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbFaabaaaaaaaaaaaacamcbGcbHcbIcbJbYMcbKcbLcbMcbNbYMbOtbTycbOcbPcbQcbRcbScbTcbUcbVcbWcbXcbYcbZccaccbcccccdcceccfccgcchcciccjcckcclccmbEnccnbFOccoccpccqbFOccrcaAccscctccuccvccwbUbccxccycczccAccBccCccDccEccFccGccHbWaccIbZuccJccKccLccMccNccObXNccPbXQbXQbXQccQbWgcbdccRccSccTccUccVccWccXcbfccYccZcdacbjcbjcdbcbmcdccddcdecdfcdgcdhcdicdjbYjcdkbGHaaaaaaaaabThbThbThbThaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPHbPIcdlcdmcdncdlcdobRybRAbRAbRybRAcdpcdqcdraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdscdtcducducducdtcdvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacamcdwcdxcdycdzbYLcdAcdBcdCcdDbYMbOtcdEcdFbTybTycdGcdHcdIcdJcclcdKcdLcdKcdMcdNcdNcdOcdPcdQcdNcdNcdRcdNcdScdNcclccmbEncdTcdUcdVcdWcdXcdYbFOcaAcdZcctceaccucebbUbceccedceecefcegcehceicejbUbcekcelbWacemcencenceocepceqcercesbXNcetceubXQcevcewbWgcbdcexceycezbVDceBceCceDcbfceEccZceFceFcbjceGceHceIceJceKceLceMceNceOcePbYjbZYbGHceQaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPHbPIcdlcdmcdncdlcdobRybRAbRAbRybRAcdpcdqcdraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdscdtcducducducdtcdvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacamcdwcdxcdycdzbYLcdAcdBcdCcdDbYMbOtcdEcdFbTybTycdGcdHcdIcdJcclcdKcdLcdKcdMcdNcdNcdOcdPcdQcdNcdNcdRcdNcdScdNcclccmbEncdTcdUcdVcdWcdXcdYbFOcaAcdZcctceaccucebbUbceccedceecefcegcehceicejbUbcekcelbWacemcencenceocepceqcercesbXNcetceubXQcevcewbWgcbdcexceycezbXfceBceCceDcbfceEccZceFceFcbjceGceHceIceJceKceLceMceNceOcePbYjbZYbGHceQaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWFbWGceRceRceRceRceRceSbRAbRAbRybPIbPIbPIbPIbPIbPIbPLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceTceUceUceUceVaaaaaaaaaaaaaaaaaaaaaceWceXceYceXceZaaaaaaaaacamcamcamcfacfbcdycfcbYLcfdcbMcfecffbYMbOtcfgcfhcficfjcfkcflcfmcfncfocfpcfqcfrcfscftcftcfucfvcfvcfvcfvcfvcfvcfwcfxcfycfzcfAcfBcfCcfDcfEcfFcfGcfHcaAcfIcctccucfJcebbUbceccedcfKcfLcfMcfNcfOcfPbUjcfQcfRbWabWacfScfSbWacepbWdcfTcfUbWgcfVcfWcfXcfYcfZbWgcbdcgacgbcgccgdcgecgfcggcbfcghccZceFceFcbjcgicgjcgkcglcgmcgncgocgpcgqcgrbYjbZYcgscgtcgscgucgvcgucgucguaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYsbWGceRceRceRcgwcgxbRybRAbRAbRybRAbRAbRAcgybRAcgzbRyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgAcgBcgCcgDcgAbVMbVMbVMcamcgFcgGcgHcgIcgJcgKcgLcgMcgNcgNcgObYMcgPcgQcgRcgScgScgTbWmcgVcgScgWcgWcgXbXfcgZcgWcgWchacclcclchbchcchcchcchdchechcchcchfchgchhchhchichhchjchkchhchlchmchncaAchochpcecchqchrchschtchuchvchrbUbcekchwchxchychzchAchBchCchDchEchFchGchHchIchJchKchLbWicbdcbdchMchNchOchPchOchQcbfchRchSchTchTcbjbYPcatcanbYjbYjbYjbYjbYjbYjbYjbYjbZYcgschXchYchZciaciacibcguaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcicciccicciccidcidcieciecieciecifaabaabaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIcigceRceRcihciibRybRAbRAcijbRAbRAbRAcikbRAcilbRyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceYcimcincimceYbVMciocipcamciqcfbcirciscitciubYMcivciwcixciybYMcgQcgQcizcgSciAciBciCciDciEcgWciFciGciHciIciJcgWciKciLciMchcciNciOciPciQciRciSciTciUciVciWciXciYciZcjacjbcjccjdcjecjfcjgcjhcjicjjcedcjkcjlcjmcjncjocjpbUjcjqcjrcjscjtchAcjucjucjvcjwbWgcjxcjycjzcjAcjBcjCcjDbWicjEcjFcjGcjHcjGcjGcjIcjJcjKcjLcjMcjNcjOcbjcjPcjQcbnbPtbGGcjRcjScjTcjTcjScjTcjUcgscjVcjWchZciacjXcjYcguaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciccjZckacjZcidciecieckbckcckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYsbWGceRceRceRcgwcgxbRybRAbRAbRybRAbRAbRAcgybRAcgzbRyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgAcgBcgCcgDcgAbYPbYPbYPcamcgFcgGcgHcgIcgJcgKcgLcgMcgNcgNcgObYMcgPcgQcgRcgScgScgTcancgVcgScgWcgWcgXcatcgZcgWcgWchacclcclchbchcchcchcchdchechcchcchfchgchhchhchichhchjchkchhchlchmchncaAchochpcecchqchrchschtchuchvchrbUbcekchwchxchychzchAchBchCchDchEchFchGchHchIchJchKchLbWicbdcbdchMchNchOchPchOchQcbfchRchSchTchTcbjcawcbicbgbYjbYjbYjbYjbYjbYjbYjbYjbZYcgschXchYchZciaciacibcguaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcicciccicciccidcidcieciecieciecifaabaabaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIcigceRceRcihciibRybRAbRAcijbRAbRAbRAcikbRAcilbRyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceYcimcincimceYbYPciocipcamciqcfbcirciscitciubYMcivciwcixciybYMcgQcgQcizcgSciAciBciCciDciEcgWciFciGciHciIciJcgWciKciLciMchcciNciOciPciQciRciSciTciUciVciWciXciYciZcjacjbcjccjdcjecjfcjgcjhcjicjjcedcjkcjlcjmcjncjocjpbUjcjqcjrcjscjtchAcjucjucjvcjwbWgcjxcjycjzcjAcjBcjCcjDbWicjEcjFcjGcjHcjGcjGcjIcjJcjKcjLcjMcjNcjOcbjcjPcjQcbnbPtbGGcjRcjScjTcjTcjScjTcjUcgscjVcjWchZciacjXcjYcguaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciccjZckacjZcidciecieckbckcckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIckdceRceRckebRybRAbRAbRyckfbRAbRAckgckhbPIbYuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgAckicimcimckjckkcfbcfbcklckmcfbcfbciscknckobYMbYMbYMbYMbYMbYMckpcgQckqckrckscktcktcktckucgWckvckwckwckwckxckyckzckAckBckCckDckEckFckGckHckIchcchfckJchhckKckLckMckNckOchhcdZccuceaccuckPckQckRckSckTckUckVckWckXchrckYckZclaclbclccldcleclfclgclhbWgbWgbWgbWgbWgclicljclkbWicllcjGcjGclmclncjGcloclpcbjclqccZclrclrcbjcblclscbnbPtcgscltcgscgscgscgscgscgscgscluclvcguclwclxclycguafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOclzcjZcjZclAciecieckbckbclBckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIclCclDclEbRybRAclFbRyclGclHbRAbPIbPIbYuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceYcincincinceYbVMclIclJclKckmcfbcfbclLclMclNclOclPclPclPclQcgQcgQcgQcizcgSclRcktclScktclTcgWckvckwclUckwclVcgWclWclXclYchcclZcmacmbcmccmdcmecmfcmgcmhcmicmjcmkcmlcmmcmnchhcfIccuccucmockPckQcmpcmqcmrcjlcmscmtcmucmvcmwcmxcmycmzcmAcmBcmCcmDcjucmEchxcmFcmGcmHcmIcmJcmKcmLclpcllcmMcjGcjGcjGcmNcmOclpcbjcmPccZclrclrcbjcmQcmRcbnbPtcmScmTcmUcgscmVcmWcmXcmYcmZcnacnbcgucnccndcnecgucgscgscgscgscgscgscgscgsaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaacnfcieclzciecieckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIbPIbPIbPIbPIbPIbPIbPIbPIbPIbYuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabafOcgQcngcngcgQcngcngcgQaaaaaacgAcnhcnicnjcgAbVMbVMbVMcamcnkcnlcnmcnmcnmcamcamcgQcnncnocnpcnqcgQcnrcnscgSclRcktcktcktcntcgWckvckwckwcnucnvcnwcnxcnycnzchcchcchcchcchccnAchcchccnBcnCchhchhcnDchhchkchhchhcaAcnEcnEcaAcnFcnGcnHcnIcnJcnKcnLcnMcnNcnObQVcnPcmycmzcnQcnRcnScnTcnUcnVchxcnWcnXcnYcnZcoacobcoccodcoecodcofcofcofcodcogcodcodcohcoiclrclrcbjcojclscbncawcolcomconcbgcopcoqcoqcorcoscotcoucovcowcoxcoycozcoAcoBcoCcoDcoEcoFcoGcoHaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaacidciecoIcoJcoJckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaacgQcoKcoLcgQcoKcoLcgQaaaaaacoMceXcoNceXcoOaaaaabaaacamcamcamcamcamcamcamcoPcgQcoQcoRcoScoTclPcoUcoVcgScoWcoXcoYcktcoZcpacpbcpccpdcpecpfcgWcpgcphcpicpjcpkcpkcpkcpkcplcpmcpncpocpocppcppcpqcprcpschfcaAcptcpucpvcpwcpxckQcpycnIcpzcpAcpBcpCceicpDcpEcpFcpGcpHcpHcpIcpHcpHcpHcpJchxcpKcpLcpMcpNcpOcpPcpQcpRcpScpRcpTcpUcpVcpRcpWcpXcodcpYcpZcdacbjcbjcqacqbcqccqdcqecqfcqgcqhcqicqjcqkcqlcqmcqncqocqpcqqcqrcqqcqscqrcqrcqrcbicqucqvcqwcqxaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaacieciecqyckbckbckbckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafOaaaafOcgQcqzcoLcgQcqzcoLcgQaaaaaaaabaabaabaabaabaabaabaabaabcgQcoLcqAcqBcgQcqCcqDcgQcqEcgQcgQcqFcgQcgQcqGcgScqHcqIcqJcqKcqLcqMcqNcqOcqPcqQcqRcpacqScqTcqUcqVcqWcqWcqWcqWcqXcqYcqZcracrbcracrccrdcrecrfcrgcrhcricrjcrkcrlcrmcrncrocrpcrqcrrcrscrtcrucrvcrwcrxcrybXubXucrzcrAcrBcrtcrCcrDcrDcrEcrDcrFcrGcrHcrIcpRcrJcrKcrLcrMcrLcrNcrOcrPcodcbjcbucbjcbjcrRcrSclsbLRbPtcgscrTcgscgscrUcrVcrWcrXcrYcqrcrZcsacsbcqkcsbcqkcsccqkcqkcgscsdcsecsfcsgaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaacieckbckbckbckbckbckbcshckbcsickbckbckbckbckbciecieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIclCclDclEbRybRAclFbRyclGclHbRAbPIbPIbYuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceYcincincinceYbYPclIclJclKckmcfbcfbclLclMclNclOclPclPclPclQcgQcgQcgQcizcgSclRcktclScktclTcgWckvckwclUckwclVcgWclWclXclYchcclZcmacmbcmccmdcmecmfcmgcmhcmicmjcmkcmlcmmcmnchhcfIccuccucmockPckQcmpcmqcmrcjlcmscmtcmucmvcmwcmxcmycmzcmAcmBcmCcmDcjucmEchxcmFcmGcmHcmIcmJcmKcmLclpcllcmMcjGcjGcjGcmNcmOclpcbjcmPccZclrclrcbjcmQcmRcbnbPtcmScmTcmUcgscmVcmWcmXcmYcmZcnacnbcgucnccndcnecgucgscgscgscgscgscgscgscgsaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaacnfcieclzciecieckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIbPIbPIbPIbPIbPIbPIbPIbPIbPIbYuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabafOcgQcngcngcgQcngcngcgQaaaaaacgAcnhcnicnjcgAbYPbYPbYPcamcnkcnlcnmcnmcnmcamcamcgQcnncnocnpcnqcgQcnrcnscgSclRcktcktcktcntcgWckvckwckwcnucnvcnwcnxcnycnzchcchcchcchcchccnAchcchccnBcnCchhchhcnDchhchkchhchhcaAcnEcnEcaAcnFcnGcnHcnIcnJcnKcnLcnMcnNcnObQVcnPcmycmzcnQcnRcnScnTcnUcnVchxcnWcnXcnYcnZcoacobcoccodcoecodcofcofcofcodcogcodcodcohcoiclrclrcbjcojclscbncbucolcomconceAcopcoqcoqcorcoscotcoucovcowcoxcoycozcoAcoBcoCcoDcoEcoFcoGcoHaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaacidciecoIcoJcoJckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaacgQcoKcoLcgQcoKcoLcgQaaaaaacoMceXcoNceXcoOaaaaabaaacamcamcamcamcamcamcamcoPcgQcoQcoRcoScoTclPcoUcoVcgScoWcoXcoYcktcoZcpacpbcpccpdcpecpfcgWcpgcphcpicpjcpkcpkcpkcpkcplcpmcpncpocpocppcppcpqcprcpschfcaAcptcpucpvcpwcpxckQcpycnIcpzcpAcpBcpCceicpDcpEcpFcpGcpHcpHcpIcpHcpHcpHcpJchxcpKcpLcpMcpNcpOcpPcpQcpRcpScpRcpTcpUcpVcpRcpWcpXcodcpYcpZcdacbjcbjcqacqbcqccqdcqecqfcqgcqhcqicqjcqkcqlcqmcqncqocqpcqqcqrcqqcqscqrcqrcqrcgEcqucqvcqwcqxaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaacieciecqyckbckbckbckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafOaaaafOcgQcqzcoLcgQcqzcoLcgQaaaaaaaabaabaabaabaabaabaabaabaabcgQcoLcqAcqBcgQcqCcqDcgQcqEcgQcgQcqFcgQcgQcqGcgScqHcqIcqJcqKcqLcqMcqNcqOcqPcqQcqRcpacqScqTcqUcqVcqWcqWcqWcqWcqXcqYcqZcracrbcracrccrdcrecrfcrgcrhcricrjcrkcrlcrmcrncrocrpcrqcrrcrscrtcrucrvcrwcrxcrybXubXucrzcrAcrBcrtcrCcrDcrDcrEcrDcrFcrGcrHcrIcpRcrJcrKcrLcrMcrLcrNcrOcrPcodcbjcgUcbjcbjcrRcrSclsbLRbPtcgscrTcgscgscrUcrVcrWcrXcrYcqrcrZcsacsbcqkcsbcqkcsccqkcqkcgscsdcsecsfcsgaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaacieckbckbckbckbckbckbcshckbcsickbckbckbckbckbciecieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcsjafOaabaMraMrafOcgQcgQcqFcgQcgQcqFcgQcgQcgQcngcngcngcgQcgQcgQcgQcgQcgQcgQcoLcskcslcgQcsmcgQcgQcsncgQcsocspcoLcgQcsqcgScsrcsscstclRcsucsvcswckvcsxcsycszcsvcsAcsBcsCcsDcsDcsEcsFcsGcsHcsIcsJcsKcsLcsMchfcsNcsLcsLcsOcsPcsQcsRcsScrlcsTcsUcsVcsWcsXcsYcsZctactbcsYcsYctcctdctdctdctdctdctectfctgcthcthctictjctkctlctmctncpRctoctpctqctrctqctscttcrLctuctvctwbLRctxbLRcrSclsbLRbIictyctzctAcgscgscgscgscgsctBcqkctCctDcsccqkctEcqkclucqkctFcgsctGctHctIcgsaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaciectJctJctJctJctJctJctKckbctLctJcsickbckbckbckbcieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabafOafOcngcoLcoLcoLcoLctMctNcoLcoLcoQctOctOctPctOctOctOctOctOctOctOctOctOctOctOctOcoRcgQcskcqzctQcgQcsqctRctRctRctRctRctRcgWcgWcgWcgWcgWcgWcgWctSctTctUceActWctXctYctYctZcuacsJcsLcsLcubcuccudcsLcsLcsLcuecufcugcrjcuhcuicujctdcukculcumcecculcuncuocuocuocupcuqcuqcuqcuqcurcusceccutcuucuvcuwcuxcuycuzcuAcpRcuBcuCcrLcuDcrLcuEcuFcuGcgEcuIcuJcuKbLRcuLcrSclscuMbIibPAcuNcuOcuPcuQbGGbGGcgscuRcuScuTcuUcuVcuWcuXcuYcuZcvacvbcgscvccvdcvecvfaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaacvgcjZcjZcjZcjZcjZcjZcjZcvhcvickbckbckbckbcvjckccieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabafOafOcngcoLcoLcoLcoLctMctNcoLcoLcoQctOctOctPctOctOctOctOctOctOctOctOctOctOctOctOcoRcgQcskcqzctQcgQcsqctRctRctRctRctRctRcgWcgWcgWcgWcgWcgWcgWctSctTctUcgYctWctXctYctYctZcuacsJcsLcsLcubcuccudcsLcsLcsLcuecufcugcrjcuhcuicujctdcukculcumcecculcuncuocuocuocupcuqcuqcuqcuqcurcusceccutcuucuvcuwcuxcuycuzcuAcpRcuBcuCcrLcuDcrLcuEcuFcuGchUcuIcuJcuKbLRcuLcrSclscuMbIibPAcuNcuOcuPcuQbGGbGGcgscuRcuScuTcuUcuVcuWcuXcuYcuZcvacvbcgscvccvdcvecvfaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaacvgcjZcjZcjZcjZcjZcjZcjZcvhcvickbckbckbckbcvjckccieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabafOaabaabafOcngcvkcvlcvmcoLcoLcvncoLcoLcsncgQcgQcgQcgQcgQcgQcqFcgQcgQcgQcgQcvocvocvocvocvocvocvocvocvocgQcsqcvpaaaaaaaaaaaacvqcvrcvscvtcvucvvcvwcvxcvycvzcvAcvBcvCcvDcvEcvEcvFcvGcvHcvIcvIcvIcvIcvJcvIcsLcsLcaAcvKcvLcvMcvNcvOcvPcuxcvQcvRcvScvTcvUcvVcvWcuqcuocvXcvYcvYcvYcvYcvZcwacwbcwccwdcwecwfcwgbQVcwhcwicpRcwjcwkcwlcwmcwncrLcwocpRcpRbIicwpbIibIibIicwqcwrcwsbIibGGcuNcwtcwucuQcuQcuQcgscgscgscgscgscgscgscgscgscgscgscgscgscgscgscgscgsaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaciecoJcoJcoJcoJcoJcoJcwvckbcoIcoJcwwckbckbckbckbcieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcgQcwxcwxcwxcwxcwxcwxcwycwxcsncwzcgQcoLcwAcwBcwCcoLcwCcwDcwEcwBcvocwFcwFcvocwGcvocwHcwIcvocoLcqGcngaaacwJcwKcwLcwMcwNcwOcwPcwQcwRcwScwTcwUcwVcwWcgUcwYcwZcxacxbcxccxdcvHcxecxfcxfcxfcxgcvIcsLcsLcxhcxhcxhcxhcxicxhcxjcxjcxkcxhcxhcxlcxhcxmcxncxocxpcxocxqcxrcxscxtcxucxvcxwcxxcxycxzcxAcxBcxCcxDcpscpRcpRcxEcpRcxFcpRcxGcxHcxIcsMcxJcxKcxLcxMcxNcxOcxPcxQcxNbGGcuNcxRbGGbGGcxScxTcxUctybGGbGGbGGbGGbGGbGGbGGcxVcxWbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacieckbckbckbckbckbckbcshckbcwwckbckbckbckbckbciecieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcgQcwxcwxcwxcwxcwxcwxcwycwxcsncwzcgQcoLcwAcwBcwCcoLcwCcwDcwEcwBcvocwFcwFcvocwGcvocwHcwIcvocoLcqGcngaaacwJcwKcwLcwMcwNcwOcwPcwQcwRcwScwTcwUcwVcwWchVcwYcwZcxacxbcxccxdcvHcxecxfcxfcxfcxgcvIcsLcsLcxhcxhcxhcxhcxicxhcxjcxjcxkcxhcxhcxlcxhcxmcxncxocxpcxocxqcxrcxscxtcxucxvcxwcxxcxycxzcxAcxBcxCcxDcpscpRcpRcxEcpRcxFcpRcxGcxHcxIcsMcxJcxKcxLcxMcxNcxOcxPcxQcxNbGGcuNcxRbGGbGGcxScxTcxUctybGGbGGbGGbGGbGGbGGbGGcxVcxWbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacieckbckbckbckbckbckbcshckbcwwckbckbckbckbckbciecieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxXcxYcxYcxYcxYcxYcxYcxZcyacybcyccydcyecyfcwycsncygcgQcoLcyhcwBcoLcoLcoLcwDcqBcwBcvocwFcyicwIcwIcyjcwIcykcvocylcqGcngaaacymcyncyocypcyqcwOcyrcyscytcyucvxcyvcsBcywcvBcyxctYcyyctYcyzcyAcyBcyCcyDcyDcyDcyEcvIcsLcsLcxhcyFcyGcyHcyIcyJcyKcyKcyLcyMcyNcyOcyPcyQcyRcyScyTcyUcyVcyWcyXcyYcyZczaczbcxBczcczdczecxxczfczgczhczicziczjczkczlczmcznczoczmczmczmczpczmczmczqczrczscztczuczvczwczxczyczyczzczyczyczyczyczAczBczyczyczyczCczDbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacieciecqyckbckbckbckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczEczFczFczFczFczGczHczIczJczKczKczLcwxcsncoLcqFcoLcoLcoLcoLcoLcoLcoLcoLcoLcvocvocwIczMcwIcvocwIczMcvoczNcsqcngaaacymczOczPczQczRczSczTczUczRczRcgYczWczXczYczZczZcAacAbctYcAccAdcyBcyDcyDcyDcyDcAecvIcsLcsLcxhcAfcAgcAhcAicAjcAkcAkcAlcAmcAncAocyKcApcxhcAqcuocArcvYcAscAtcAucAvcAwcAxcxBcAycAzcAAcxBcABcACcADcAEcAEcAEcAEcAEcAFcAGcAHcAIcAJcAJcAKcAKcAJcALchUchWchVcAPcAPcAQcARcAPcAPcAPcAPcAPcAPcAPcAPcAPcAPcAPcAPcAScATcAUbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacnfcieciectJctJckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAVcAWcAXcAYcAXcAZcBacBbcBccBdcBecwxcsncgQcgQcBfcngcngcngcngcngcngcngcBgcvocwIcwIcwIcwIcBhcwIcwIcvocygcqGcngaaacymcBicBjcBkcBlcwOcBmcBncBocBpcvxcyvcsBcnycBqcsDcokcsDcvBcvBcvBcBscBtcyDcyDcBucBvcvIcsLcBwcxhcBxcBycBzcBAcBAcBBcBCcBDcBAcBAcBEcyKcBFcxhcBGcuocBHcvYcvYcBIcvYcvYcAwcBJcxBcBKcBLcBMcxBcBNcBOcBwcBPcBPcBPcBPcBPcBQcBQcBQcBPcBPaaaaaaaaaaaacBRcBScBTcBUcAPcBVcBWcBXcBYcBZcCacCbcCccCdcCecCfcCgcChcCicAPcAScCjcCkcClcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCncCocieclzcieckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAVcCpcCqcCrcCsczJcCtcCucCvczJcCwcoocCycskcgQcoLcngaaaaaaaaaaaaaaacngcoLcCzcwFcCAcwIcwIcwIcwIcCBcCCcCDcCEcngaaacCFcwKcCGcwMcCHcwOcwOcCIcCJcCKcCLcCMcCNcCOcBqcsDcCPcCQcCRcCScCTcvHcCUcyDcyDcyDcCVcvIcsLcsLcCWcCWcCXcCYcCZcCZcDacDbcDccDdcDdcDecDfcDgcDfcAqcuocArcDhcDicDjcDkcDlcAwcDmcxBcDncDocDpcxBcsLcBOcBPcBPaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDqcDrcDscDtcDucDvcDwcDwcDxcDwcDwcDwcDwcDwcDycDzcDAcDBcDCbGHcDDcjUbGHbGHaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciecDEcDFcDGciecieckbckbcDHckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAVcDIcAXcDJcAXcDKcDLcDMcDNcBbcDOcwxcDPcqBcgQcqzcvpaaaaaaaaaaaaaaacvpcDQcvocDRcDRcwFcDScDTcwIcDUcvocoLcqGcvpaaaaaaaaaaaacvqcDVcDWcDXcDXcvxcDYcvxcDZcsBcnycEacEbcEccEdcEecEecEecqtcEgcyDcEhcyDcEicvIcsLcsLcCWcEjcEkcElcEmcEncEocCWcEpcEqcErcEscEtcEucDfcEvcEwcExcDhcEycEzcEAcEBcECczbcxBcEDcEEcEFcxBcsLcBOcBPaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDqcEHcEIcEJcrQcELcEMcENcEOcDwcDwcEPcDwcDwcDycDAcDAcDAcEQbGHcERbGGbGHaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciccEScETclAcidciecieckbckcckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczEczFczFczFczFczGczHczIczJczKczKczLcwxcsncoLcqFcoLcoLcoLcoLcoLcoLcoLcoLcoLcvocvocwIczMcwIcvocwIczMcvoczNcsqcngaaacymczOczPczQczRczSczTczUczRczRchWczWczXczYczZczZcAacAbctYcAccAdcyBcyDcyDcyDcyDcAecvIcsLcsLcxhcAfcAgcAhcAicAjcAkcAkcAlcAmcAncAocyKcApcxhcAqcuocArcvYcAscAtcAucAvcAwcAxcxBcAycAzcAAcxBcABcACcADcAEcAEcAEcAEcAEcAFcAGcAHcAIcAJcAJcAKcAKcAJcALcokcqtcoocAPcAPcAQcARcAPcAPcAPcAPcAPcAPcAPcAPcAPcAPcAPcAPcAScATcAUbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacnfcieciectJctJckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAVcAWcAXcAYcAXcAZcBacBbcBccBdcBecwxcsncgQcgQcBfcngcngcngcngcngcngcngcBgcvocwIcwIcwIcwIcBhcwIcwIcvocygcqGcngaaacymcBicBjcBkcBlcwOcBmcBncBocBpcvxcyvcsBcnycBqcsDcrQcsDcvBcvBcvBcBscBtcyDcyDcBucBvcvIcsLcBwcxhcBxcBycBzcBAcBAcBBcBCcBDcBAcBAcBEcyKcBFcxhcBGcuocBHcvYcvYcBIcvYcvYcAwcBJcxBcBKcBLcBMcxBcBNcBOcBwcBPcBPcBPcBPcBPcBQcBQcBQcBPcBPaaaaaaaaaaaacBRcBScBTcBUcAPcBVcBWcBXcBYcBZcCacCbcCccCdcCecCfcCgcChcCicAPcAScCjcCkcClcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCncCocieclzcieckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAVcCpcCqcCrcCsczJcCtcCucCvczJcCwctVcCycskcgQcoLcngaaaaaaaaaaaaaaacngcoLcCzcwFcCAcwIcwIcwIcwIcCBcCCcCDcCEcngaaacCFcwKcCGcwMcCHcwOcwOcCIcCJcCKcCLcCMcCNcCOcBqcsDcCPcCQcCRcCScCTcvHcCUcyDcyDcyDcCVcvIcsLcsLcCWcCWcCXcCYcCZcCZcDacDbcDccDdcDdcDecDfcDgcDfcAqcuocArcDhcDicDjcDkcDlcAwcDmcxBcDncDocDpcxBcsLcBOcBPcBPaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDqcDrcDscDtcDucDvcDwcDwcDxcDwcDwcDwcDwcDwcDycDzcDAcDBcDCbGHcDDcjUbGHbGHaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciecDEcDFcDGciecieckbckbcDHckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAVcDIcAXcDJcAXcDKcDLcDMcDNcBbcDOcwxcDPcqBcgQcqzcvpaaaaaaaaaaaaaaacvpcDQcvocDRcDRcwFcDScDTcwIcDUcvocoLcqGcvpaaaaaaaaaaaacvqcDVcDWcDXcDXcvxcDYcvxcDZcsBcnycEacEbcEccEdcEecEecEecuHcEgcyDcEhcyDcEicvIcsLcsLcCWcEjcEkcElcEmcEncEocCWcEpcEqcErcEscEtcEucDfcEvcEwcExcDhcEycEzcEAcEBcECczbcxBcEDcEEcEFcxBcsLcBOcBPaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDqcEHcEIcEJcwXcELcEMcENcEOcDwcDwcEPcDwcDwcDycDAcDAcDAcEQbGHcERbGGbGHaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciccEScETclAcidciecieckbckcckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEUcEUcEUcEUcEUcwxcEVcEWcEWcEWcEWcEWaXpcEYcEYcEYcEWcEWcEWcEWcEWcEWcEWcEYcEYcEYcvocvocvocvocvocvocvocqFcEZcFacFacFacFacFacvqcvxcvxcvxcvxcvxcvxcvxcFbcsBcnycFccFdcFecFfcFgcFhcFicFjcFkcFlcFmcFncFocvIcsLcsLcCWcFpcFqcFrcFscFscFtcCWcFucFvcFvcFwcFvcFxcFycFzcFzcFzcFAcFBcFCcFDcDlcFEczbcFFcFFcFFcBPcBPcsLcBOcBQaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaacDqcFHcFIcFJcFKcFLcFMcFNcFOcDwcDwcDwcDwcFPcFQcFRcFScFTcFUbGHcERbGGbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacicciccicciccidcidcieciecieciecifaabaabaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaacFVcFWcFXcFYcFXcFZcFWcGacGbcGccGccGdcGecGfcGgcGhcGicGjcGkcGlcGmcGmcGncGmcGocGpcGpcGqcGrcGscGtcGucGtcGtcGtcGscGtcGtcGvcGwcGxcGycsBcnycGzcGActVcGCcsDcGDczZcGEcGFcGGcGHcGIcGJcGKcsLcsLcCWcGLcGMcGNcGOcGPcGQcCWcGRcGScGTcGUcGVcGWcGXaaaaaaaaacFAcDhcGYcDhcDhcGZcHacHbcHccHdcHechfcsLcBOcBQaaaaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaacBScBRcuHcHgcBScHhcHicHjcHkcHlcHmcHncDwcDwcHocHpcHqcHrcHsbGHcERbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFVcFWcFXcFXcFXcFZcFWcHtcFXcHucFXcHvcHwcHxcHycHzcwXcHzczVcHCcHDcHEcHDcHDcHFcnzcnzcHDcHGcHDcHDcHDcHDcHDcHDcHDcHDcHDcHDcHHcHIcHJcHKcHLcHMcHNcHOcHPcHQcHRcHScHTcHUcHVcHWcHXcHYcHZcAEcIacIbcIccIdcIecIfcIgcIhcDfcIicErcIjcIkcErcIlcGXaaaaaaaaacImcIncIocIpcIqcGZcIrcIscItcIucIvcracrecIwcBQaaaaaaaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaacBRcIxcIycIzcBRcAPcAPcAPcAPcAPcAPcIAcHncIBcICcIDcIEcAPcAPbGHcERbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFVcIFcFXcIGcFXcFZcIHcIIcIJcIKcILcIMcINcIOcIPcIQcIRcIScAMcIUcIVcIWcIXcIYcqVcIZcqVcIUcJacIUcIUcIUcIUcIUcIUcIUcIUcIUcIUcJbcHDcJccJdcJecJfcJgcJhcJicJjcJkcJlcJmcJncJocJpcJqcJrcGHcrecJscJtcJucEmcElcEmcEmcJvcDfcJwcErcErcEscErcJxcGXaaaaaaaaacImcJycJzcJAcJBcJCcJDcJEcJFcHdcsLcuccJGcBOcBPaaaaaaaaaaaaaaaaabcBRcBRcBRcBRcBRcBRcBRcBRcBRcJHcJIcJJcxNcJKcJKcJLcBRaabcAPcAPcJMcAPcJNcJOcJPcAPcJQcuQcERbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJRcJScEWcEWcEWcEWcEXcEYcEYcEYcEYcJTcEYcJUcJVcJVcJWcJXcJYcEYcJZcKacKbcKbcKccKbcKdcKbcKbcKecKfcKbcKbcKfcKfcKfcKbcKbcKbcKbcKgcKhcKicKjcKkcKlcANcKncKocKncKncKncKncKpcKqcKrcKscKtcGKcsLcKucKvcKwcKxcKycKzcKAcKBcDfcKCcKDcKEcKFcKGcKHcFyaaaaaaaaacImcKIcKJcKKcIqcKLcKMcJDcKNcHdcKOchfchfcBOcBPaaaaaaaaaaaaaaaaaacBRcKPcKQcKRcKScKTcKUcKVcxNcKWcKXcKYcxNcJKcKZcLacBRaabaabcLbcLccLdcLecLfcLgcLbbGGbGGcERcLhbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwalwalwalvalvalwalvalvaabamhaabayiaaaayiayicLicLjcLkcLkcLkcLlcLmcEYcLncLocLpcLqcLrcLscEYcLtcLucKfcLvcLwcLxcLycLzcLAcLBcLCcLDcKbcLCcLEcLFcLGcLGcLHcKbcLIcLJcHCcLKcnycLLcLMcLNcLOcLPcLQcLPcLRcLScLTcLUcLVcLWcGKcGKcKucKvcCWcCWcLXcCWcCWcKvcLYcLZcLZcLZcMacLZcMbcFyaaaaaaaaacImcImcImcImcImcFFcMccMdcMecHdcsLcsLcMfcBOcBPaaaaaaaaaaaaaaaaaacBRcJKcMgcJKcMhcMicEHcJIcxNcxQcAOcxQcxNcJKcJKcMkcBRaabaaacLbcMlcMmcLecLecMncLbcMobGGcERbKlcMpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaaaaaaabaabaaaaabaabaaaaaaaabaabaabaabaabcLicLicMqcLicLicMrcMscEYcEYcEYcEYcEYcEYcEYcEYcLicLucKfcMtcMucMvcMwcMwcMwcMwcMxcMycMzcLGcMAcLGcLGcMBcLGcMCcMDcMEcMFcLKcnycMGcHQcMHcLOcMIcMJcMKcLOcMLcBrcMNcMOcMPcMQcMRcMScMTcMUcMUcMVcMWcMXcMYcMZcNacrecrecNbcsLcNccBPcBPcBPcBPcBPaaaaaaaaaaaacNdcNecNfcNgcHdcNhchfchfcBOcBPcBPcBPcBPcBPaaaaaacBRcJKcJKcJKcNicNjcNkcNlcNmcNncNocNpcxNcNqcNrcNscBRaaaaaacLbcNtcLecNucLecNvcLbbGGbGGcERcMpbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaacFVcFWcFXcFYcFXcFZcFWcGacGbcGccGccGdcGecGfcGgcGhcGicGjcGkcGlcGmcGmcGncGmcGocGpcGpcGqcGrcGscGtcGucGtcGtcGtcGscGtcGtcGvcGwcGxcGycsBcnycGzcGAczVcGCcsDcGDczZcGEcGFcGGcGHcGIcGJcGKcsLcsLcCWcGLcGMcGNcGOcGPcGQcCWcGRcGScGTcGUcGVcGWcGXaaaaaaaaacFAcDhcGYcDhcDhcGZcHacHbcHccHdcHechfcsLcBOcBQaaaaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaacBScBRcAMcHgcBScHhcHicHjcHkcHlcHmcHncDwcDwcHocHpcHqcHrcHsbGHcERbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFVcFWcFXcFXcFXcFZcFWcHtcFXcHucFXcHvcHwcHxcHycHzcANcHzcAOcHCcHDcHEcHDcHDcHFcnzcnzcHDcHGcHDcHDcHDcHDcHDcHDcHDcHDcHDcHDcHHcHIcHJcHKcHLcHMcHNcHOcHPcHQcHRcHScHTcHUcHVcHWcHXcHYcHZcAEcIacIbcIccIdcIecIfcIgcIhcDfcIicErcIjcIkcErcIlcGXaaaaaaaaacImcIncIocIpcIqcGZcIrcIscItcIucIvcracrecIwcBQaaaaaaaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaacBRcIxcIycIzcBRcAPcAPcAPcAPcAPcAPcIAcHncIBcICcIDcIEcAPcAPbGHcERbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFVcIFcFXcIGcFXcFZcIHcIIcIJcIKcILcIMcINcIOcIPcIQcIRcIScBrcIUcIVcIWcIXcIYcqVcIZcqVcIUcJacIUcIUcIUcIUcIUcIUcIUcIUcIUcIUcJbcHDcJccJdcJecJfcJgcJhcJicJjcJkcJlcJmcJncJocJpcJqcJrcGHcrecJscJtcJucEmcElcEmcEmcJvcDfcJwcErcErcEscErcJxcGXaaaaaaaaacImcJycJzcJAcJBcJCcJDcJEcJFcHdcsLcuccJGcBOcBPaaaaaaaaaaaaaaaaabcBRcBRcBRcBRcBRcBRcBRcBRcBRcJHcJIcJJcxNcJKcJKcJLcBRaabcAPcAPcJMcAPcJNcJOcJPcAPcJQcuQcERbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJRcJScEWcEWcEWcEWcEXcEYcEYcEYcEYcJTcEYcJUcJVcJVcJWcJXcJYcEYcJZcKacKbcKbcKccKbcKdcKbcKbcKecKfcKbcKbcKfcKfcKfcKbcKbcKbcKbcKgcKhcKicKjcKkcKlcCxcKncKocKncKncKncKncKpcKqcKrcKscKtcGKcsLcKucKvcKwcKxcKycKzcKAcKBcDfcKCcKDcKEcKFcKGcKHcFyaaaaaaaaacImcKIcKJcKKcIqcKLcKMcJDcKNcHdcKOchfchfcBOcBPaaaaaaaaaaaaaaaaaacBRcKPcKQcKRcKScKTcKUcKVcxNcKWcKXcKYcxNcJKcKZcLacBRaabaabcLbcLccLdcLecLfcLgcLbbGGbGGcERcLhbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwalwalwalvalvalwalvalvaabamhaabayiaaaayiayicLicLjcLkcLkcLkcLlcLmcEYcLncLocLpcLqcLrcLscEYcLtcLucKfcLvcLwcLxcLycLzcLAcLBcLCcLDcKbcLCcLEcLFcLGcLGcLHcKbcLIcLJcHCcLKcnycLLcLMcLNcLOcLPcLQcLPcLRcLScLTcLUcLVcLWcGKcGKcKucKvcCWcCWcLXcCWcCWcKvcLYcLZcLZcLZcMacLZcMbcFyaaaaaaaaacImcImcImcImcImcFFcMccMdcMecHdcsLcsLcMfcBOcBPaaaaaaaaaaaaaaaaaacBRcJKcMgcJKcMhcMicEHcJIcxNcxQcEfcxQcxNcJKcJKcMkcBRaabaaacLbcMlcMmcLecLecMncLbcMobGGcERbKlcMpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaaaaaaabaabaaaaabaabaaaaaaaabaabaabaabaabcLicLicMqcLicLicMrcMscEYcEYcEYcEYcEYcEYcEYcEYcLicLucKfcMtcMucMvcMwcMwcMwcMwcMxcMycMzcLGcMAcLGcLGcMBcLGcMCcMDcMEcMFcLKcnycMGcHQcMHcLOcMIcMJcMKcLOcMLcEKcMNcMOcMPcMQcMRcMScMTcMUcMUcMVcMWcMXcMYcMZcNacrecrecNbcsLcNccBPcBPcBPcBPcBPaaaaaaaaaaaacNdcNecNfcNgcHdcNhchfchfcBOcBPcBPcBPcBPcBPaaaaaacBRcJKcJKcJKcNicNjcNkcNlcNmcNncNocNpcxNcNqcNrcNscBRaaaaaacLbcNtcLecNucLecNvcLbbGGbGGcERcMpbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacNwaaaalwaaacNxcNycNzaaacNxcNycNzaaacNxcNycNzaaaaaacLicNAcNBcNCcLicNDcNEcLkcLkcLkcLkcLkcLkcLkcLkcLkcNFcKfcNGcLGcMBcNHcLGcLGcLGcNIcLGcNGcNGcLGcLGcLGcLGcNJcNKcMDcNLcHDcNMcywcHQcHQcNNcLOcNOcNPcNQcLOcNRcHVcNScNTcNUcNVcNWcNXcsLcNYcpscNYcsLcNZcOacObcObcObcObcOccOdcOdcOdcOdcOdcOecBPaaaaaaaaaaaacNdcNecNfcOfcOgcsLcxMchfcBOcsLcsLcsLcsKcBPaaaaaacBRcxNcxNcxNcxNcOhcEHcOicOjcOkcOlcOmcxNcOncOocOpcBRaaaaaacLbcOqcOrcOscLecOtcLbcOubGGcERbGHaabaabaabaabaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaacNxcOvcNzaaacNxcOvcNzaaacNxcOvcNzaaaayicLicNBcNBcNBcLicLicOwcOxcLicLicOxcOxcLicLicOxcOxcLucKfcNGcOycLGcOzcOAcOBcOBcMAcLGcNGcOCcLGcLGcLGcLGcODcOEcOFcOGclXcOHcOIcOJcOKcOLcLOcNOcOMcONcLOcOOcHVcGKcOPcGHcCxcORcOScOTcOUcOVcOWcOTcOXcOTcOTcOTcBPcBPcBPcBPcBPcBPcBPcBPcOYcBPaaaaaaaaaaaacNdcOZcPacPbcHdcsKcPcchfcPdcPecPecPfcsLcBPaaaaaacBRcKPcKQcKRcPgcPhcNkcPicPjcPkcPlcPmcPncPocPmcPpcBRaaaaaacLbcLbcPqcPrcPscLbcLbbGHbGGcPtcuQcuQcuQbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaacNxcOvcNzaaacNxcOvcNzaaacNxcOvcNzaaaayicLicNBcNBcNBcLicLicOwcOxcLicLicOxcOxcLicLicOxcOxcLucKfcNGcOycLGcOzcOAcOBcOBcMAcLGcNGcOCcLGcLGcLGcLGcODcOEcOFcOGclXcOHcOIcOJcOKcOLcLOcNOcOMcONcLOcOOcHVcGKcOPcGHcGBcORcOScOTcOUcOVcOWcOTcOXcOTcOTcOTcBPcBPcBPcBPcBPcBPcBPcBPcOYcBPaaaaaaaaaaaacNdcOZcPacPbcHdcsKcPcchfcPdcPecPecPfcsLcBPaaaaaacBRcKPcKQcKRcPgcPhcNkcPicPjcPkcPlcPmcPncPocPmcPpcBRaaaaaacLbcLbcPqcPrcPscLbcLbbGHbGGcPtcuQcuQcuQbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaayiaabcNxcOvcNzaaacNxcOvcNzaabcNxcOvcNzaaaaabcLicMrcPucNDcLiaaaaabaaaaaaaaaaaaaaaaabaaaaaacOxcLucKbcPvcLGcPwcPxcPycPzcPAcPzcPBcPzcPCcPDcLCcPEcNGcNGcNKcPFcPGcPHcPIcPJcPKcPLcPMcPNcPOcPPcPQcPRcPScPTcPUcPUcPVcPWcPXcPYcPZcQacQbcQccQdcQecQfcQgcQhcQicQicQicQicQicQicQjcBPcOYcQkcQkcQkcQkcQkcQkcQlcQmcQlcQncQkcQkcQkcQkcQkcQkcBOcsLcBPaaaaaacBRcJKcKZcJKcQocMicEHcQpcQqcQrcQscEHcEHcQtcEHcQucBRaaaaabaabcLbcLbcQvcLbcLbaaabGHbGGcERcuQcQwcQxbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaacNxcOvcNzaabcNxcOvcNzaaacNxcOvcNzaabaaacLicLicOxcLicLiaaaaabaabaaaaabaaaaabaabaaaaaacQycQzcKbcQAcQBcQBcQCcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcJZcQDcJZcQEcJZcFacQFcEfcQHcQIcQIcQIcEKcQKcPTcQLcQMcQNcQOcQPcQQcPZcQRcQScQTcQUcQVcQWcQXcQYaabcQZcQZcQZcQZcQZcRacBPcRbcRccRdcRecRfcRgcQkcRhcRicRjcQkcRkcRlcRmcRncRocQkcBOcsLcBPaaaaaacBRcJKcJKcJKcRpcRqcNkcRrcRscRtcRucRvcRvcRwcEHcRxcBRaabaabaaaaaaaaacRyaaaaaaaaabGHbGGcERcuQbGGbGGbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaacNxcOvcNzaabcNxcOvcNzaaacNxcOvcNzaabaaacLicLicOxcLicLiaaaaabaabaaaaabaaaaabaabaaaaaacQycQzcKbcQAcQBcQBcQCcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcJZcQDcJZcQEcJZcFacQFcHfcQHcQIcQIcQIcHAcQKcPTcQLcQMcQNcQOcQPcQQcPZcQRcQScQTcQUcQVcQWcQXcQYaabcQZcQZcQZcQZcQZcRacBPcRbcRccRdcRecRfcRgcQkcRhcRicRjcQkcRkcRlcRmcRncRocQkcBOcsLcBPaaaaaacBRcJKcJKcJKcRpcRqcNkcRrcRscRtcRucRvcRvcRwcEHcRxcBRaabaabaaaaaaaaacRyaaaaaaaaabGHbGGcERcuQbGGbGGbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwalwalvayiaaacNxcOvcNzaabcNxcOvcNzaaacNxcOvcNzaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcRzcRAcRAcRAcRAcQycRBcLucRCcRDcREcREcRFcRGcRHcRIcRIcRIcRIcRJcRKcRLcRMcRMcRNcRNcRMcROcRPcRQcRRcRRcRScRTcRUcRVcRWcRXcRXcRYcRZcSacSbcSccSdcQPcSecPZcSfcSgcShcSicSjcSkcSlcSmcQicSncSocSpcSqcQZcRacBQcOYcQkcSrcSscStcSucSvcSwcSxcSycQkcSzcSAcSBcSAcSCcQkcBOcsLcBPcBPaaacBRcxNcxNcxNcxNcSDcEHcQpcSEcSFcQscEHcSGcSHcSHcSIcSJcSKaabaaaaaaaaaaaaaaaaaaaaabGHbGGcPtbGGbGGcSLbGHaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaaaabaaaaabaabcSMaabaabaabcSMaabaaaaabcSMaabaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcSNcSOcSPcRAcSQcSRcNFcRCcRCcSScSTcKbcKbcMscSUcSUcSUcSUcSVcSWcSXcSWcSWcSWcRRcRRcSYcSZcTacTbcGBcRXcTdcTecRXcRXcRXcRXcTfcPTcTgcThcQNcSdcQPcSdcPZcSfcSgcTicTjcTkcTlcTmcTnaabcTocTpcSqcTqcQZcRacBQcRbcRccTrcTscSAcTtcQkcTucTvcTwcQkcTxcTycSAcTzcTAcQkcBOcsLcTBcBPaaacBRcKPcKQcKRcTCcPhcNkcTDcTEcTFcTGcTGcTHcTIcTJcTKcBRaabaabaabaaaaaaaaaaaaaaaaaabGHcTLcERbGHbGHbGHbGHbGHaabaabaabcTMcTMcTMcTMcTMcTMaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaabcTNcTOcTOcTPcTQcTRcTRcTRcTQcTRcTRcTRcTQcTRcTRcTRcTScTOcTOcTOcTOcTOcTTcTUcTVcTWcTXcTYcTZcUacUbcNBcLucUccRCcKbcKbcKbcUdcMscSUcUecUfcUgcUhcUicUjcUkcUlcUmcUncUocUpcUqcUrcUscUncUtcUucTecUvcRXcRXcRXcUwcPTcUxcUxcSdcUycUzcUAcHfcUCcUDcUEcUFcUGcUHcUIcSmcUJcSncUKcSqcSqcQZcRacBQcOYcQkcULcUMcUNcQncQkcUOcUPcQncQkcUQcURcUScUTcUTcQkcBOcsLcUUcBPaaacBRcJKcMgcJKcUVcMicEHcUWcUXcUYcEHcUZcVacxNcxNcxNcBRaaaaaaaabaabaaaaaaaaaaaaaaabGHcJQcERbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaaaabaaaaabaabcSMaabaabaabcSMaabaaaaabcSMaabaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcSNcSOcSPcRAcSQcSRcNFcRCcRCcSScSTcKbcKbcMscSUcSUcSUcSUcSVcSWcSXcSWcSWcSWcRRcRRcSYcSZcTacTbcHBcRXcTdcTecRXcRXcRXcRXcTfcPTcTgcThcQNcSdcQPcSdcPZcSfcSgcTicTjcTkcTlcTmcTnaabcTocTpcSqcTqcQZcRacBQcRbcRccTrcTscSAcTtcQkcTucTvcTwcQkcTxcTycSAcTzcTAcQkcBOcsLcTBcBPaaacBRcKPcKQcKRcTCcPhcNkcTDcTEcTFcTGcTGcTHcTIcTJcTKcBRaabaabaabaaaaaaaaaaaaaaaaaabGHcTLcERbGHbGHbGHbGHbGHaabaabaabcTMcTMcTMcTMcTMcTMaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaabcTNcTOcTOcTPcTQcTRcTRcTRcTQcTRcTRcTRcTQcTRcTRcTRcTScTOcTOcTOcTOcTOcTTcTUcTVcTWcTXcTYcTZcUacUbcNBcLucUccRCcKbcKbcKbcUdcMscSUcUecUfcUgcUhcUicUjcUkcUlcUmcUncUocUpcUqcUrcUscUncUtcUucTecUvcRXcRXcRXcUwcPTcUxcUxcSdcUycUzcUAcITcUCcUDcUEcUFcUGcUHcUIcSmcUJcSncUKcSqcSqcQZcRacBQcOYcQkcULcUMcUNcQncQkcUOcUPcQncQkcUQcURcUScUTcUTcQkcBOcsLcUUcBPaaacBRcJKcMgcJKcUVcMicEHcUWcUXcUYcEHcUZcVacxNcxNcxNcBRaaaaaaaabaabaaaaaaaaaaaaaaabGHcJQcERbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaaaabaaaaabaabcVbaabaaaaabcVbaabaaaaabcVbaabaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcVccVdcVecRAcVfcNBcNEcSRcSRcSRcSRcVgcSRcUbcSUcVhcVicVjcVkcVlcVmcVncVocVpcVqcVrcVscVtcVucVvcVwcUtcTdcTecVxcVycRXcRXcVzcPTcVAcVBcSdcVCcQPcVDcVEcVFcVGcVHcVIcVJcVKcVJcVLaabcQZcQZcQZcQZcQZcRacBPcOYcQkcVMcVNcVOcVPcVQcVRcVScVTcVUcVVcVWcSAcVXcVYcQkcBOcsLcVZcBPaaacBRcJKcJKcJKcWacWbcWccWdcWecWfcEHcEHcEHcEHcWgcWhcWiaaaaaaaaaaabaabaaaaaaaaaaaabGHbGHcERbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwalwalvalwaabcNxcWjcNzaaacNxcWjcNzaaacNxcWjcNzaabaaaaaaaaaaaaaaaaaaaaaaaaaabaabcRzcRAcRAcRAcRAcWkcWlcWmcNBcWncNBcNBcMscWocNBcSUcWpcWqcVjcWrcUicWscWtcWucWucWvcWwcWxcWycWzcWAcWvcWBcWCcWDcWEcWFcWGcWHcWIcWJcWKcUAcWLcWMcWNcWOcWPcWQcWRcWScWTcWUcWVcWWcWXcQicSncWYcWZcWZcQZcRacBPcOYcQkcQkcQkcQkcQkcXacXbcXccXdcXecXfcXgcXhcXicXjcQkcBOcXkcXlcXlcXlcXmcXmcXmcXmcXmcXncXocXpcXqcXrcNkcXscNkcXscNkcXtcWiaaaaaaaaaaaaaabaabaaaaaaaaaaaabGHcERbGHaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacNxcWjcNzaabcNxcWjcNzaaacNxcWjcNzaaaaaaaaaaaaaabaaaaaaaaaaaaaabaabaabaaaaaaaabaabcXucXucXucXucXucXucXucXvcXucXucSUcXwcXxcVjcWrcUicXycUicUicXzcRRcXAcXBcUrcXCcXDcRRcXEcRXcTecXFcXGcXHcWHcXIcXJcXKcXLcXMcXNcXOcXLcXPcXQcXRcXScSdcXTcXUcXVcXWaabcTocXXcXYcXZcQZcRacBQcYacYbcYbcYbcYccQkcYdcUMcYecYfcURcYgcUTcUTcURcYhcQkcBOcYichfcsLcYjcYkcBPaaaaaacBRcYlcYmcYncYocYlcYmcYpcYqcYlcYmcYrcBRaabaabaabaabaabaabaabaabaabaabbGHcERbGHbGHbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacYsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaabcNxcWjcNzaaacNxcWjcNzaaacNxcWjcNzaabaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaabaabaabcXucYtcYtcYucYvcYwcYwcYxcYycYycYzcYAcYBcVjcWrcVjcYCcVjcVjcVjcRRcYDcYEcYFcYGcYHcYIcYJcHAcYLcYMcYMcYMcYNcYOcYPcYQcYRcYScVCcQPcYTcYUcYVcYWcYXcSdcXTcYYcYZcZacZbcSncZccWZcWZcQZcRacBQcOYchfchfchfckJcQkcZdcZecZfcZgcURcZhcZicUTcZjcZkcQkcBOcYichfcsLcJGcsLcBPaaaaaacBRcZlcZmcZncxNcZocZpcZqcxNcZrcZscZtcBRaabaabaaaaaaaaaaaaaaaaaaaaaaaabGHcERbGGbGGbGHaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaabcNxcWjcNzaaacNxcWjcNzaaacNxcWjcNzaabaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaabaabaabcXucYtcYtcYucYvcYwcYwcYxcYycYycYzcYAcYBcVjcWrcVjcYCcVjcVjcVjcRRcYDcYEcYFcYGcYHcYIcYJcKmcYLcYMcYMcYMcYNcYOcYPcYQcYRcYScVCcQPcYTcYUcYVcYWcYXcSdcXTcYYcYZcZacZbcSncZccWZcWZcQZcRacBQcOYchfchfchfckJcQkcZdcZecZfcZgcURcZhcZicUTcZjcZkcQkcBOcYichfcsLcJGcsLcBPaaaaaacBRcZlcZmcZncxNcZocZpcZqcxNcZrcZscZtcBRaabaabaaaaaaaaaaaaaaaaaaaaaaaabGHcERbGGbGGbGHaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaabcNxcWjcNzaaacNxcWjcNzaabcNxcWjcNzaabaabaabaabaaaaabaaaaaaaabaabaaaaaaaaaaabaaaaaacXucYtcYtcYucZucZucZucZvcZwcZxcSUcZycZzcZAcZBcZCcZDcZEcZFcZFcZGcZHcZIcVjcVjcVjcZJcZKcZLcZMcZNcZOcZPcZQcZRcSUcZScZScZTcVCcQPcZUcZVcZWcZXcZYcSdcZZdaadabdacdadcQZcQZcQZcQZcQZcRacBQcOYdaecsLcsLckJcQkdafcSAcSAdagdahdaidajcUTdakdalcQkcBOcYicMfcsLcuccTBcBPaaaaaacBRcMkcJKcJKcxNcMkcJKcJKcxNcMkcJKcJKcBRaaaaabaabaaaaaaaaaaaaaaacuQcuQbGHdamcuQbGGbGHbGHbGHcTMcTMaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamhaabcNxdancNzaaacNxdancNzaaacNxdancNzaabalvaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaabcXudaodapcZucZucZudaqdardardardardardardardasdatdaudavdawdawdawdaxdaydazdaAdaBdawdaydaCcHBdaEcZOdaFcZQcZRdaGdaHdaIdaJdaKdaLdaMdaNcYXdaOdaPdaQdaRdaSdaTcWXdaUcSndaVdaWdaWcQZcRacBPcOYchfcBNdaXckJcQkdaYcSAdaZdbacURdbbdbccUTdbddbecQkcBOcYichfcsLchfchfcBPaabaabcBRdbfcKZcJKcxNdbfcKZcJKcxNdbfcKZcJKcBRaaaaaaaabaabaaaaaaaaaaaacuQdbgbGGcERcuQdbhcuQdbibGHaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamhaabcNxdancNzaaacNxdancNzaaacNxdancNzaabalvaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaabcXudaodapcZucZucZudaqdardardardardardardardasdatdaudavdawdawdawdaxdaydazdaAdaBdawdaydaCcMjdaEcZOdaFcZQcZRdaGdaHdaIdaJdaKdaLdaMdaNcYXdaOdaPdaQdaRdaSdaTcWXdaUcSndaVdaWdaWcQZcRacBPcOYchfcBNdaXckJcQkdaYcSAdaZdbacURdbbdbccUTdbddbecQkcBOcYichfcsLchfchfcBPaabaabcBRdbfcKZcJKcxNdbfcKZcJKcxNdbfcKZcJKcBRaaaaaaaabaabaaaaaaaaaaaacuQdbgbGGcERcuQdbhcuQdbibGHaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaaaaabaaaaaaaaaaabaabaabaaaaaaaabaabaaaalvaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaabcXudbjcZucZucZucZucZudardbkdbldbmdbndbodardbpdbqdbrcXxcVjcVjdbsdbtdbudbvdbwdbxdbydbzcSUdbAdaEcZOdbBcZQdbCcSUdbDcZSdbEbmCcSddaMdaNdbGcSddaPdaQcXTcXUdbHcXWdbIcTodbJdbKdbLcQZcRacBPcOYchfdbMdbMckJcQkcQkdbNdbOcQkdbPcQkcQkcQkcQkcQkcQkcBOcYichfcsLcsLdbQcBPaaaaaacBRdbRcJKcJKcxNdbRcJKcJKcxNdbRcJKcJKcBRaaaaaaaaaaabaabaaaaaadbScuQbGGbGGcERcuQbGGbGGbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwalwalvalwalwamhalvalvalvalvalwalvalvalwdbTaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacXudbUcZwcZucZucZudbVdardbldbWdbXdbYdbZdcadcbdccdcddcecVjdcfdcgdchdcidcjdckdcldcmdcndcodbrcXxdcpdcqcZMdcrcSUdcscZSdctdcucSddaMdaNcYXcSddcvdaQcXTdcwdcxcZadcycSndczdaWdaWcQZcRacBQcOYdcAcuccABckJdcBcQkcQkdcCcQkdcDdcEdcFchfdcGdcHcsLcBOcYichfcsLdcIcTBcBPaaaaaacBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRaaaaaaaaaaaaaabaabaaaaaabGHbGHbGHcERcuQdcJdcKbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcXucXucXudcLdcMdcMdcMdardcNdcOdcPdcPdcQdcRdawdcSdcTdcUdcVdcWdcXdcYdcZddaddbddcddddcYddeddfddgddhddiddjddkddldbDcZSddmddncSddaMcSdddocSddaPdaQcXTcXUddpcXWdbIcQZcQZcQZcQZcQZcRacBQddqcYccuccTBddrddsddsddsddtchfdduddvddwchfddxcYbcYbddyddzcMfcsLcsLcBPcBPaaaaaaddAaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaabaaabGHcJQddBddCcuQddDddEbGGbZZaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9245,13 +9247,13 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcXucZucZucZudcMaabaaadardesddHdcPdcPdetdardeudevcSUdewdexdexdeycSUdezdeAdeBdeCdeDcSUdexdexdexdewcSUdeEdeucSUdbDcZSdeFdeGdeHdeIdeJdeKdeLdeMcWUdeNcXUdeOcXWdbIcTodePdeQdeRcQZcRacBPcBPcOYcprdeScOYdeTchfcsLdeUdeVdeWdeXddsddsdeYcYichfdeZcBPcBPaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaabGHbGHbGHbGHbGHdfabZYcuQdfbdfcbGGbGHaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacXucXudcMdcLdfdaaaaaadardfedffdcPdcPdfgdardfhdfidfjdfkdfldfmdfndfodfpdfqdfrdfsddkdfodfldfldfldftdfjdfudfvcSUdbDdfwdaMdfxdfydeLdfzdfAdfBdfCdfDdfEdfFdfGcZadcycSndfHdeideicQZcRacBPcsLdfIdfJdfKdeYcsKchfcsLcsLcsLcYidfLcsLcXkdfMddzcuQcERbGHaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaabGHbGGbGGbGGcJQdfNdfOcuQdfPbGGbGGbGHaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfRdfSdfSdfTdfSdfSdfUdardfVdcOdcPdcPdfWdardaGdfXcSUcSUdfodfodfodfodfYdfZdgaddMdgbdfodfodfodfocSUcSUdgcdgdcSUdbDcZSdgedgfdfydggdghcSdcSddgicXPdggcXUdgjcXWdbIcQZcQZcQZcQZcQZcRacBPcTBcsLdgkdglcsLdgmchfchfdgnchfdgocpscJGdgpchfchfcuQcERbGHaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaabGHbGHcuQdgqdgrcJQdfNbZYbGGbGGbGGdgsbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgtdgudgvdgwdgvdgxdgydardgzdgAcITdcPdgBdarcSUdgCcSUdgDafOdgEdfodfodfodfodgFdfodfodfodfodgEafOdgDcSUdgGcSUcSUdbDcZSdgHdeHdgIdgJdgKdgLdgMdgJdgMdgJdgNdeLdgOdbIdgPdgQdgQdgQdgQdgRdgSdgTdgTdgUdgVdgTdgTdgTdgWdgXdgYdgodgZchfdgochfdhacuQcERbGHbZZbZZbZZbGHbZZbZZbZZbZZbGHbZZbZZbZZbZZbGHbGHbGHbGHbGHbGHbGHbGHbGHbGHcMpbGHcJQcuQdhbbGGcQwdfNbZYcuQcuQdbhcuQbGHaabdhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgtdgudgvdgwdgvdgxdgydardgzdgAcMMdcPdgBdarcSUdgCcSUdgDafOdgEdfodfodfodfodgFdfodfodfodfodgEafOdgDcSUdgGcSUcSUdbDcZSdgHdeHdgIdgJdgKdgLdgMdgJdgMdgJdgNdeLdgOdbIdgPdgQdgQdgQdgQdgRdgSdgTdgTdgUdgVdgTdgTdgTdgWdgXdgYdgodgZchfdgochfdhacuQcERbGHbZZbZZbZZbGHbZZbZZbZZbZZbGHbZZbZZbZZbZZbGHbGHbGHbGHbGHbGHbGHbGHbGHbGHcMpbGHcJQcuQdhbbGGcQwdfNbZYcuQcuQdbhcuQbGHaabdhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgtdgudgvdgwdgwdhddhedardhfdhgdcPdcPdhhdardhidhjdhkafOdhldhmdhmdhmdhmdhmdhndhmdhmdhmdhmdhmdhoafOdhpdhqdhrcSUdhsdaIdhtdhudhvdhwdhxdhydhzdhAcSddhBdhCdhDdhEdbIdhFaaaaabaabaaadhGdhHdhIdhJdhKdhLdhMdhNdgTdhOcsLcsLdhPcpsdhQcYicsLcsLcEGaYNdhSdhSdhSdhSdhSdhSdhSdhSdhSdhSdhSdhSdhSdhSdhTdhSdhSdhSdhSczDcuQbPAcAUbGGdhUcMpcuQcuQcuQdbhcuQdfNbZYcuQdhVbGGbGGbGHaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgtdgudgvdhWdgvdhXdhYdardfVdcOdcPdcPdhZdardiadibdibaaadicafOafOafOafOafOafOafOafOafOafOafOdicaaadibdibdiacSUdaGcZSdhEdiddiedifdigdihdhEdifdhEcXWdhEcXWdhEdbIdhFaaaalwalwdiidhHdijdikdildimdindiodipdgTcsLcsLchfdgodiqchfcYicXkdfMdhRcFGditditditditditditdiudivditditditditditditdiwdixdiydizdiAdiBdiCdiCdiCdiCdiDdiEdiFdiCdiCdiCdiCdiGcjUcuQdfcbGGdiHbGHaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiIdfSdfSdfSdfSdfSdiJdardiKdiLdcPdcPdiMdardiNdiOdiPaabdicafOdiQaaaaaaaaaaaadiQaaaaaadiQafOdicaaadiRdiSdiTcSUdaGcSUaabdiUaabdiVdiWdiXdiYdiZdiYdjadiYdjadjbdjcdhFaaaalwaabdjddgSdjedjfdjgdjhdjidjjdjkdgTdjlcsLcsLcYidjmchfcYicYidjnbGHbGHbZZbZZbZZbZZbGHbZZbZZbZZbZZbGHbZZbZZbZZbZZbGHdjobGGcuQcTLbGGcuQcuQbZZbZZcxScuQdjpbGGdjpcuQdjqbZYdjrbGHbGHbGHbGHbGHaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadardjsdiLdcPdcPdjtdardjudibdjvaaadjwdjxaaaaaaaaaaaaaaadjyaaaaaaaaadjzdjAaaadibdibdjucSUdaGcSUcQZdjBcTodjBcQZdjBcTodjBcQZdjCcTodjDcQZaabdhFaaaalwaabdjEdgSdjFdjfdjGdjHdjidjIdjJdjKdirdjLdjMcYicpscsLdjNdgochfcBPaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaabGHdjOcLhcuQdjPbGGcuQaaaaaaaaaaaacuQbGGbGGdbgdjQdjQdjRdjSdjQaaaaabaabaabaabdjTaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadardjUdcOdcPdcPdhZdardjVdjWdibaaadicafOaaaaaaaabaabaabaabaabaaaaaaafOdicaaadibdjXdjYcSUdjZcSUcQZdkadkbdkccQZdkddkedkfcQZdkgdkhdkicQZaabdhFaaaalwaaadjEdkjdkkdkldkmdkndkodkpdkqdgTdkrdgochfdgodkschfdktdgocBNcBPcBQcBQcBQaHQaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaabGHdkucuQcuQcQxbGGcuQcuQbZZbZZcuQcuQbGGdkvcLhdjQdkwdkxdkydjQaaaaaaaabaabaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafOdardardardardardardarcSUdiadibaaadicafOdiQaabaabdkzdkAdkBaabdkCaaaafOdicaaadibdiacSUcSUdaGcSUcQZdkDdkEdkDcQZdkFdkGdkFcQZdkHdkIdkHcQZaabdhFaaaalwaaadjddgSdkJdkKdkLcKmdkMdkNdkOdgTdkPdkQdkRdkSdkTcsLcYicYidkUdkVdkWcsLdkXaHQaaaaabaaabZZbZZbZZbGHbGHbGHbGHbGHbGHdkYcJQcuQdkZbGGbGGcuQbGGbGGbGGbGGdhbbGGdfPdjQdladlbdlcdjQaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafOdardardardardardardarcSUdiadibaaadicafOdiQaabaabdkzdkAdkBaabdkCaaaafOdicaaadibdiacSUcSUdaGcSUcQZdkDdkEdkDcQZdkFdkGdkFcQZdkHdkIdkHcQZaabdhFaaaalwaaadjddgSdkJdkKdkLcOQdkMdkNdkOdgTdkPdkQdkRdkSdkTcsLcYicYidkUdkVdkWcsLdkXaHQaaaaabaaabZZbZZbZZbGHbGHbGHbGHbGHbGHdkYcJQcuQdkZbGGbGGcuQbGGbGGbGGbGGdhbbGGdfPdjQdladlbdlcdjQaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabafOaabafOafOaabaabaabalwalwcSUcSUdlddibaaadjwdjxaaaaaaaabdledlfdlgaabaaaaaadjzdjAaaadibdlhcSUcSUdaGcSUcQZdkDdlidkDcQZdkFdljdkFcQZdkHdlkdkHcQZaabdhFaaaalwaaadjddgSdgSdgSdlldlmdlndlodlndlmdkPdlpcsLdlqdlrdfMddzcYidlscBPcBQcBQcBQdltaabaabaaabZZdludlvcuQbGGdlwdlxdbgcuQdlybGGcuQdlzbGGbGGdlAbGGbGHbGHbGHbZZbZZbGHdjQdlBdlCdlDdjQaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaabaabaaaaaaaabaabalwcSUcSUdiadibaaadicafOaaadlEaabdlFdlGdlHaabaabdiQafOdicaaadibdiacSUcSUdaGcSUcQZcQZcQZcQZcQZcQZcQZcQZcQZcQZcQZcQZcQZaabdhFaaaayiaaadjdaaaaaaaaadlIdlmdlJdlKdlLdlmcsLdlMcsLcsLdlNdlOcXkdlPdlQcBPaaaaaaaaaaaaaaaaabaaabZZdlRdlSdlAbGGdgrbGGbGGdlAdjobGGcuQcuQcuQcuQcuQbGGbGHaabaaaaaaaaaaabdlTdlTdlUdlTdlTaabaabdhcaabaabdjTaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabcSUdjXdjYdibaaadicafOaaaaaaaabaabaabaabaabaaaaaaafOdicaaadibdjVdjWcSUdlVcSUcSUcSUcSUdlWdgQdgQdgQdgQdgQdgQdgQdgQdgQdgQdlXaabaabaabdjEaaaaaaaaadlYdlmdlndlZdlndlmdmadmbdfMdfMdmcdmddmecBPcBPcBPaaaaaaaaaaaaaaaaabaaabZZdludmfcuQdbgbGGbGGdmgcuQdmhbGGbGGbGGbGGbGGbGGbGGbGHaabaaaaaaaaaaabaaadlTdmidlTaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9263,7 +9265,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaacSUcSUdnBdnJdnJdnJdnJdnJdnJdnJdnJdnJdnJdnJdnJdnJdnCcSUcSUcSUdnKdnLcSUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnMdnNdnOdnPdnQdnRdnSdnTaaaaaaaaaaabaHQaHQaHQaHQaHQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaabZZdnUbZZaaaaaaaaaaaaaabaaaaaaaabaaaamWaaadnVdnVdnVdnVdnVaabdnWaabdnVdnVdnVdnVdnVaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSUcSUcSUcSUcSUcSUcSUcSUcSUcSUcSUcSUcSUcSUcSUcSUcSUaaacSUcSUdnXcSUcSUcSUcSUaaaaaaaaaaaaaaaaaaaaaaaadnYdnZdnZdnZdnZdoadobdocdoddoeaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaabZZdofbZZaaaaaaaaaaaaaaaaaaaaaaabaaaamWaabdogdohdohdohdohdoidojdokdoldoldoldoldomaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSUdaGdaGdondoodoodopaaaaaaaaaaaaaaaaaaaaaaaadjdaaadnZdnZdoqdordosdnZdnZdnZdnZdnZaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabdotdoudouaaaaaaaaaaaaaaaaaaaaaaabaaaamWaabdovdovdovdovdovaaadnWaaadovdovdovdovdovaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSUdjZdaGdowdoxdoydozaaaaaaaaaaaaaaaaaaaaaaaadjdaaadnZdoAdoBdoCdoDdoEcMjdoGdoHdnZaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaabaaaamWaaaaabaaaaabaabaabaaadnWaaaaabaaaaabaaaaabaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSUdjZdaGdowdoxdoydozaaaaaaaaaaaaaaaaaaaaaaaadjdaaadnZdoAdoBdoCdoDdoEcQGdoGdoHdnZaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaabaaaamWaaaaabaaaaabaabaabaaadnWaaaaabaaaaabaaaaabaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSUdoJdaGdoKdoodoodoLaaaaaaaaaaaaaaaaaaaaaaaadjdaaadnZdoMdoNdoOdoPdoQdoRdoSdoTdnZaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaamWaaadnVdnVdnVdnVdnVaabdnWaabdnVdnVdnVdnVdnVaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnlcSUcSUcSUcSUcSUcSUaaaaaaaaaaaaaaaaaaaabaabdjEaabdnZdoUdoVdoWdoXdoYdoZdpadpbdnZaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaabdogdohdohdohdohdoidojdokdoldoldoldoldpcaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabdpddpedpddpfdpgdphdpidpjdpkdpfdpfdpfdpfaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaabdovdovdovdovdovaaadnWaabdovdovdovdovdovaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index b832fff59f3..5f561cd6cd3 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -206,19 +206,19 @@ "dX" = (/obj/structure/filingcabinet/filingcabinet,/turf/unsimulated/floor{dir = 5; icon_state = "carpetside"},/area/centcom/control) "dY" = (/turf/unsimulated/floor{dir = 1; icon_state = "carpet15-11"},/area/centcom/control) "dZ" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_y = 5},/obj/item/weapon/pen/multi,/turf/unsimulated/floor{dir = 9; icon_state = "carpetside"},/area/centcom/control) -"ea" = (/obj/machinery/computer/artillerycontrol,/turf/unsimulated/floor{dir = 5; icon_state = "carpetside"},/area/centcom/control) +"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" = (/obj/structure/artilleryplaceholder{tag = "icon-1"; icon_state = "1"},/turf/unsimulated/floor{tag = "icon-warnplate (NORTHWEST)"; icon_state = "warnplate"; dir = 9},/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) -"ef" = (/obj/structure/artilleryplaceholder{tag = "icon-3"; icon_state = "3"},/turf/unsimulated/floor{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/centcom/control) -"eg" = (/obj/structure/artilleryplaceholder{tag = "icon-2"; icon_state = "2"},/turf/unsimulated/floor{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/centcom/control) -"eh" = (/obj/structure/artilleryplaceholder{tag = "icon-5"; icon_state = "5"},/turf/unsimulated/floor{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/centcom/control) -"ei" = (/obj/structure/artilleryplaceholder{tag = "icon-4"; icon_state = "4"},/turf/unsimulated/floor{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/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) +"ei" = (/turf/space,/area/centcom/control) "ej" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/wall{tag = "icon-iron12"; icon_state = "iron12"},/area/space) "ek" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/unsimulated/wall{tag = "icon-iron12"; icon_state = "iron12"},/area/space) "el" = (/turf/unsimulated/wall{tag = "icon-iron11"; icon_state = "iron11"},/area/space) -"em" = (/obj/structure/artilleryplaceholder{tag = "icon-7"; icon_state = "7"},/turf/unsimulated/floor{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/centcom/control) +"em" = (/turf/unsimulated/floor{tag = "icon-warnplate (SOUTHWEST)"; icon_state = "warnplate"; dir = 10},/area/centcom/control) "en" = (/turf/simulated/floor/holofloor{tag = "icon-1 (NORTHEAST)"; icon_state = "1"; dir = 5},/area/holodeck/source_space) "eo" = (/turf/simulated/floor/holofloor{tag = "icon-17 (NORTHEAST)"; icon_state = "17"; dir = 5},/area/holodeck/source_space) "ep" = (/turf/simulated/floor/holofloor{tag = "icon-22 (NORTHEAST)"; icon_state = "22"; dir = 5},/area/holodeck/source_space) @@ -234,7 +234,7 @@ "ez" = (/obj/structure/table/holotable,/obj/item/clothing/gloves/boxing/hologlove,/turf/simulated/floor/holofloor{dir = 9; icon_state = "red"},/area/holodeck/source_boxingcourt) "eA" = (/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/holodeck/source_boxingcourt) "eB" = (/obj/structure/table/holotable,/obj/item/clothing/gloves/boxing/hologlove,/turf/simulated/floor/holofloor{dir = 5; icon_state = "red"},/area/holodeck/source_boxingcourt) -"eC" = (/obj/structure/artilleryplaceholder{tag = "icon-6"; icon_state = "6"},/turf/unsimulated/floor{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/centcom/control) +"eC" = (/turf/unsimulated/floor{tag = "icon-warnplate"; icon_state = "warnplate"; dir = 2},/area/centcom/control) "eD" = (/obj/structure/flora/grass/both,/turf/simulated/floor/holofloor{tag = "icon-snow"; icon_state = "snow"},/area/holodeck/source_snowfield) "eE" = (/turf/simulated/floor/holofloor{tag = "icon-carpet4-0 (EAST)"; icon_state = "carpet4-0"; dir = 4},/area/holodeck/source_meetinghall) "eF" = (/turf/simulated/floor/holofloor{tag = "icon-carpetsymbol (SOUTHEAST)"; icon_state = "carpetsymbol"; dir = 6},/area/holodeck/source_meetinghall) @@ -250,33 +250,20 @@ "eP" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/holodeck/source_boxingcourt) "eQ" = (/turf/simulated/floor/holofloor,/area/holodeck/source_boxingcourt) "eR" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/holodeck/source_boxingcourt) -"eS" = (/obj/structure/artilleryplaceholder{tag = "icon-9"; icon_state = "9"},/turf/unsimulated/floor{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/centcom/control) -"eT" = (/obj/structure/artilleryplaceholder{tag = "icon-8"; icon_state = "8"},/turf/unsimulated/floor{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/centcom/control) -"eU" = (/obj/structure/artilleryplaceholder{tag = "icon-11"; icon_state = "11"},/turf/unsimulated/floor{tag = "icon-warnplate (NORTHEAST)"; icon_state = "warnplate"; dir = 5},/area/centcom/control) -"eV" = (/obj/structure/artilleryplaceholder{tag = "icon-10"; icon_state = "10"},/turf/unsimulated/floor{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/centcom/control) -"eW" = (/obj/structure/artilleryplaceholder{tag = "icon-12"; icon_state = "12"},/turf/space,/area/centcom/control) +"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) "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/artilleryplaceholder{tag = "icon-13"; icon_state = "13"},/turf/unsimulated/floor{tag = "icon-warnplate (SOUTHWEST)"; icon_state = "warnplate"; dir = 10},/area/centcom/control) -"fe" = (/obj/structure/artilleryplaceholder{tag = "icon-15"; icon_state = "15"},/turf/unsimulated/floor{tag = "icon-warnplate"; icon_state = "warnplate"; dir = 2},/area/centcom/control) "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/structure/artilleryplaceholder{tag = "icon-14"; icon_state = "14"},/turf/unsimulated/floor{tag = "icon-warnplate"; icon_state = "warnplate"; dir = 2},/area/centcom/control) -"fm" = (/obj/structure/artilleryplaceholder{tag = "icon-17"; icon_state = "17"},/turf/unsimulated/floor{tag = "icon-warnplate"; icon_state = "warnplate"; dir = 2},/area/centcom/control) -"fn" = (/obj/structure/artilleryplaceholder{tag = "icon-16"; icon_state = "16"},/turf/unsimulated/floor{tag = "icon-warnplate"; icon_state = "warnplate"; dir = 2},/area/centcom/control) -"fo" = (/obj/structure/artilleryplaceholder{tag = "icon-19"; icon_state = "19"},/turf/unsimulated/floor{tag = "icon-warnplate"; icon_state = "warnplate"; dir = 2},/area/centcom/control) -"fp" = (/obj/structure/artilleryplaceholder{tag = "icon-18"; icon_state = "18"},/turf/unsimulated/floor{tag = "icon-warnplate"; icon_state = "warnplate"; dir = 2},/area/centcom/control) -"fq" = (/obj/structure/artilleryplaceholder{tag = "icon-21"; icon_state = "21"},/turf/unsimulated/floor{tag = "icon-warnplate"; icon_state = "warnplate"; dir = 2},/area/centcom/control) -"fr" = (/obj/structure/artilleryplaceholder{tag = "icon-20"; icon_state = "20"},/turf/unsimulated/floor{tag = "icon-warnplate"; icon_state = "warnplate"; dir = 2},/area/centcom/control) -"fs" = (/obj/structure/artilleryplaceholder{tag = "icon-23"; icon_state = "23"},/turf/unsimulated/floor{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area/centcom/control) "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 +275,6 @@ "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/structure/artilleryplaceholder{tag = "icon-22"; icon_state = "22"},/turf/unsimulated/floor{tag = "icon-warnplate"; icon_state = "warnplate"; dir = 2},/area/centcom/control) -"fF" = (/obj/structure/artilleryplaceholder{tag = "icon-24"; icon_state = "24"},/turf/space,/area/centcom/control) "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) @@ -505,7 +490,7 @@ "jK" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/light,/turf/simulated/floor/plating/airless,/area/syndicate_mothership) "jL" = (/obj/docking_port/stationary/transit{dwidth = 3; height = 7; id = "steel_rain_transit"; name = "steel_rain in transit"; width = 7},/turf/space/transit/horizontal,/area/space) "jM" = (/obj/item/weapon/soap/syndie,/obj/structure/mopbucket,/obj/machinery/light{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) -"jN" = (/obj/structure/table/woodentable,/obj/item/pizzabox,/obj/item/device/paicard,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) +"jN" = (/obj/structure/table/woodentable,/obj/item/pizzabox,/obj/item/device/paicard/syndicate,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "jO" = (/obj/structure/table/woodentable,/obj/item/toy/nuke,/turf/unsimulated/floor{dir = 2; icon_state = "wood"},/area/syndicate_mothership) "jP" = (/turf/unsimulated/wall/abductor{icon_state = "alien21"},/area/abductor_ship) "jQ" = (/turf/unsimulated/wall/abductor{icon_state = "alien20"},/area/abductor_ship) @@ -999,7 +984,6 @@ "vJ" = (/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = -27},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "vL" = (/obj/item/device/radio/intercom/specops{pixel_y = -28},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "vM" = (/obj/structure/table/woodentable{dir = 10},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "SPECOPS"; name = "Ready Room"; pixel_y = 16; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "ASSAULT"; name = "Assault Armor"; pixel_y = -4; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "specopsoffice"; name = "Privacy Shutters"; pixel_y = 6; req_access_txt = "114"},/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/centcom/specops) -"vO" = (/obj/machinery/computer/artillerycontrol{luminosity = 255},/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/centcom/specops) "vP" = (/obj/structure/stool/bed/chair{dir = 1},/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/specops) "vQ" = (/obj/machinery/telecomms/processor/preset_cent,/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/control) "vS" = (/obj/machinery/newscaster/security_unit{pixel_x = -32},/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/specops) @@ -1304,7 +1288,6 @@ "Gs" = (/obj/structure/table/woodentable,/obj/item/toy/cards/deck/syndicate,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/admin) "Gt" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/devilskiss,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/admin) "Gu" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/turf/unsimulated/wall{desc = "This window appears to be reinforced, it looks nearly impossible to break."; dir = 8; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; name = "window"; opacity = 0; tag = "icon-window5_end (WEST)"},/area/admin) -"Gv" = (/obj/machinery/computer/artillerycontrol{luminosity = 255},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) "Gx" = (/obj/item/weapon/stool,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/admin) "Gy" = (/obj/structure/table/woodentable,/obj/item/weapon/lighter/zippo/engraved,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/admin) "Gz" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/turf/unsimulated/wall{desc = "This window appears to be reinforced, it looks nearly impossible to break."; dir = 4; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; name = "window"; opacity = 0; tag = "icon-window5 (EAST)"},/area/admin) @@ -1560,8 +1543,8 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXtatbtctdtdtesqsqsqsqsqsEsEmnsMsCmnsEsEsEsEsEsQsQsQsQtfsQsQtgsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititititjtktitititjtltmtntdtdtdsqsrssstsqtosEmnsMtpmnsEsEsEsEsutqsQsQsQtrsQsQtssqsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXtatttutdtdtdsqswsssssxsEsEsEsEsEsEsEsEsEsEsqsusususususususqsqdWdXsqsqsqsqsqsqsqsqsqsqsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititititvtktitititvtwtmtntdtdtdsqsqsqsqsqsqsqtxsqsqsqsqsEsEtysqtztztztztztztzsudZdYebeasuecegefeieheCemeTeSeVeUeWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXtatttutdtdtAsqtBtCtDsqtEtFtFtFtFtGsqsEsEtHsqtztztztztztztzsufbfatLfcsufdflfefnfmfpfofrfqfEfsfFaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititititvtktitititvtwtmtntdtdtdsqsqsqsqsqsqsqtxsqsqsqsqsEsEtysqtztztztztztztzsudZdYebeasuecefefefefefegefefefeheiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXtatttutdtdtAsqtBtCtDsqtEtFtFtFtFtGsqsEsEtHsqtztztztztztztzsufbfatLfcsuemeCeCeCeCeCeCeCeCeCeSeiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititititItktitititItJtmtntdtdtdsqtKtLtMtNtFtFtFtFtFtOsqsusxsusqsusususususususqsqfLsqsqsqsqsqsqsqsqsqsqsqsqsqsqfXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXtatttutdtdtdsqsqsususqsqsqsususususqtQtRtStTtTtTtTtTtTtTtTtTuEtRtZsqfXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititititVtktitititVtWtXtYtdtdtdsqtztztztztztztztztztzsqtQtRtRtRtRtRtRtRtRtRtRtRtRtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN @@ -1574,7 +1557,7 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXuWsXsXujuXuRooonvavbujvcvdvdvdvdvesXuosXsXsXsXsqtQtRtZsuvfuuvgvgvgvhvisutQtRtZsqaNaNohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvjvkvlsXujujvauRvmuRujujvnvdvovpvqvdsXsXsXvrtTtUsqtQtRtZsqsqvsvtvuvvvwsqsqtQtRtZsqaNaNohogogogopogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvkvkvkvxujujujvyvyujujujvzvdvAvBvCbesXvEtTuEtRtRvFtRtRtZsqsqsusususususqsqtQtRtZsqaNaNoqodododododododoraNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXvGvHsXvIvJujujujujvLujsXvdvMmjvOvPsXvQtRtRtRtZsutQtRtStTtTtTtTtTtTtTtTtTuEtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXvGvHsXvIvJujujujujvLujsXvdvMmjeTvPsXvQtRtRtRtZsutQtRtStTtTtTtTtTtTtTtTtTuEtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXbfbfsXsXsXvSvTvUvVvdsXvWtRtRtRvXsutQtRtRtRtRtRtRtRtRtRtRtRtRtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwbwcwdwbwesXiDwgwhwiwjsXwkudududwlsuwmudududududuetRucudududududwnsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwrwswtwrwesXsXsXsXsXsXsXsqsqsqsqsqsqsqsqsqsqsqsqsqwusqsqsqsqsqsqsqsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN @@ -1654,7 +1637,7 @@ aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbW aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDAGaGdGeGfGgGhGiGjGbDAGaDKDKDKDKDKDKGbDwDwDwDwDwGaDKGbDwDwGkDwFWFXFXFXGlFXFXFXFYDAaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIGmlhDKDKlvDKDKDKDKDKGoDKDKGpGpGpGpDKDKDKDKDKDKDKDKDKDKGqFXFXFXFXFXFXGrGsGtFXFXFXGuaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDNDKlwDKDKDKDKDKDKDKDKGoDKDKGpGpGpGpDKDKDKDKDKDKDKDKDKDKGqFXFXFXFXFXGxGyGrGrGxFXFXGzaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfGAGvDKDKlJDKDKDKDKDKGoDKDKGpGpGpGpDKDKDKDKDKDKDKDKDKFkDwDwGkDwGCFXFXGxGxGxFXFXGDDAaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfGADKDKDKlJDKDKDKDKDKGoDKDKGpGpGpGpDKDKDKDKDKDKDKDKDKFkDwDwGkDwGCFXFXGxGxGxFXFXGDDAaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDAEIGEGFGGGHGIGJGKFkDAEIDKDKDKDKDKDKFkDwDwEIDKFkDwDwDwDAEnaNEMDwGCFXFXFXFXFXGDDAEnaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwDwDwDwDwDwDwDwDwDwDwEIDKDKFkDwDwDwDwDwGLDwDwDwDADAaNaNaNEMDwGCFXFXFXGDDwEnaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDvDAGMGMDAaNDAFvGNFvFvFvGNFvDADAaNaNaNaNEMDwFIFJFKDwEnaNaNaNaNaNaNaN diff --git a/_maps/map_files/cyberiad/z5.dmm b/_maps/map_files/cyberiad/z5.dmm index d7b92fbf843..c7b460ab927 100644 --- a/_maps/map_files/cyberiad/z5.dmm +++ b/_maps/map_files/cyberiad/z5.dmm @@ -1152,7 +1152,7 @@ "wh" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel,/area/mine/living_quarters) "wi" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/mining,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel,/area/mine/eva) "wj" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/mining,/turf/simulated/floor/plasteel,/area/mine/eva) -"wk" = (/obj/structure/rack,/obj/item/weapon/storage/backpack/satchel,/obj/item/weapon/pickaxe,/obj/item/weapon/storage/belt/utility,/obj/machinery/light/small{dir = 1},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/mine/eva) +"wk" = (/obj/structure/rack,/obj/machinery/light/small{dir = 1},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/item/clothing/suit/space/rig/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/mining,/turf/simulated/floor/plasteel,/area/mine/eva) "wl" = (/turf/simulated/floor/plasteel/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/mine/dangerous/explored) "wm" = (/obj/structure/table,/obj/item/weapon/storage/backpack/satchel,/obj/item/clothing/glasses/meson,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel,/area/mine/west_outpost) "wn" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Break Room"; req_access_txt = "54"},/turf/simulated/floor/plasteel,/area/mine/west_outpost) @@ -1174,7 +1174,7 @@ "wD" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/living_quarters) "wE" = (/turf/simulated/wall,/area/mine/lobby) "wF" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Mining Station Pod Bay"; req_access_txt = "54"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/lobby) -"wG" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/machinery/camera{c_tag = "Mining Outpost EVA"; dir = 4; network = list("Mining Outpost")},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/mine/eva) +"wG" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/machinery/camera{c_tag = "Mining Outpost EVA"; dir = 4; network = list("Mining Outpost")},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/structure/rack,/obj/item/clothing/suit/space/rig/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/mining,/turf/simulated/floor/plasteel,/area/mine/eva) "wH" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/mine/eva) "wI" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/mine/eva) "wJ" = (/obj/machinery/atmospherics/unary/portables_connector,/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plasteel,/area/mine/eva) @@ -1195,7 +1195,7 @@ "wY" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor/plating,/area/mine/eva) "wZ" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/obj/item/device/gps/mining{gpstag = "MINE2"},/obj/item/device/gps/mining{gpstag = "MINE1"},/obj/item/device/gps/mining,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -3},/turf/simulated/floor/plasteel,/area/mine/eva) "xa" = (/turf/simulated/floor/plasteel,/area/mine/eva) -"xb" = (/obj/structure/dispenser/oxygen,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/eva) +"xb" = (/obj/structure/rack,/obj/item/weapon/storage/backpack/satchel,/obj/item/weapon/pickaxe,/obj/item/weapon/storage/belt/utility,/turf/simulated/floor/plasteel,/area/mine/eva) "xc" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/mine/eva) "xd" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "mining_east_pump"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/eva) "xe" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "mining_east_pump"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/mine/eva) @@ -1258,7 +1258,7 @@ "yj" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/mine/eva) "yk" = (/obj/machinery/power/apc{dir = 2; name = "Mining EVA APC"; pixel_x = 1; pixel_y = -23},/obj/structure/cable,/turf/simulated/floor/plasteel,/area/mine/eva) "yl" = (/obj/machinery/mineral/equipment_vendor,/turf/simulated/floor/plasteel,/area/mine/eva) -"ym" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel,/area/mine/eva) +"ym" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/mine/eva) "yn" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/mine/eva) "yo" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "mining_east_pump"; tag_exterior_door = "mining_east_outer"; frequency = 1379; id_tag = "mining_east_airlock"; tag_interior_door = "mining_east_inner"; pixel_x = 0; pixel_y = -25; req_access_txt = null; tag_chamber_sensor = "mining_east_sensor"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "mining_east_pump"},/turf/simulated/floor/plasteel,/area/mine/eva) "yp" = (/obj/machinery/camera{c_tag = "Mining Outpost Starboard External Airlock"; dir = 1; network = list("Mining Outpost")},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "mining_east_sensor"; pixel_x = 0; pixel_y = -25},/obj/structure/ore_box,/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "mining_east_pump"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/mine/eva) @@ -1373,6 +1373,7 @@ "Au" = (/turf/simulated/wall,/area/mine/living_quarters{name = "Mining Station Break Room"}) "Av" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/wall,/area/mine/living_quarters{name = "Mining Station Break Room"}) "Aw" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/mine/lobby) +"Ax" = (/obj/machinery/light/small,/obj/structure/dispenser/oxygen,/turf/simulated/floor/plasteel,/area/mine/eva) "AB" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/turf/simulated/floor/plasteel,/area/mine/lobby) "AC" = (/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/mine/lobby) "AD" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/disposalpipe/segment,/obj/machinery/camera{c_tag = "Mining Shuttle Airlock"; dir = 8; network = list("Mining Outpost")},/turf/simulated/floor/plasteel,/area/mine/lobby) @@ -1619,10 +1620,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaccsacacacacaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacaaaaaaaaaaaaaaacacacbjbjacaaaaaaaaaeaevkvkvkvkvkvkvlvlvlvkvmvkvkvkaeaeaeafacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacafafaeaeaeaeaeafafafafafacacacacacacacbjbjbjbjuEuEuEuEvnvovpuEuIvquEvruEuEuEuVuVuVuEaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaafafafafaeaeaeaeoapSpUpTpApVphaeaeaeaeaeaeaeaeafafafafafoBoBoBoBoBoBoBoBoBoBafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacaaaaaaaaaaaaaaacacacacacaaaaafaeaeaevkvvvwvxvyvzvAvBvCvDvEvFvGvyrkaeaeafafafafacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacafafaeaeaeaeaeaeaeaeaeaeafafafafafacacacacbjbjbjuEvHvIvJvKvIvIuEuMuNvLuKuEvMvNvOvOvOuVaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaafafafaeaeaeaeqdqcqsqqwXvPvRvRvQvQaeaeaeaeaeaeafafafafoBoBoBoBoBoBoBoBoBoBafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaacacacaaaaacafaeaeaevkvSvTvUvyvTvVvTvTvWvXvYvGvZviaeaeaeaeaeafafafacacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjacacafafnfaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeafafacacacacacacuEwbvIwcwdwewfuEuEuEuEuKuEvMwgwgwgwhuVaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeqdxwzgxFwXwiwjwjwkvQaevjaeaeaenXnfafafafoBoBoBoBoBoBoBoBoBoBafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaaaaaaaaaaaacafaeaeaevkwmvTvTwnvTvVwovTvTvywpwqvyrKaeaeaeaeaeaeaeafafafafacacacacacacbjbjbjbjbjbjbjbjbjacacafafaevbaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeafafafafacacacuEwrwswtvIwuwvwwwhwxwywzuEoTwgwBwCwDuVaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaezRzRwTwFwXwGwHwIwJvQvQvQvQaeaeaeaeafafafafoBoBoBoBoBoBoBoBoBafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacafafaeaevkwKvTwLvEwMwNwOvTvkvkvkvkvkvmrjrkaeaeaeaeaeaeaeaeafafafacacacacacbjbjbjbjbjbjbjacacacafaeaeaeaeaeaeaeaeaeaeaerjrkaeaeaeaeaeaeaeaeaeafafacacwPuEuEuEwQuEuEwRwSwUwRwSuEuEuEuEuExruEuEuVuVaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaexuxuwVAMABwYwZxaxaxbxcxdxexcrkaeaeaenlafafafoBoBoBoBoBoBoBafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaaaaaaaaaaaacafaeaeaevkwmvTvTwnvTvVwovTvTvywpwqvyrKaeaeaeaeaeaeaeafafafafacacacacacacbjbjbjbjbjbjbjbjbjacacafafaevbaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeafafafafacacacuEwrwswtvIwuwvwwwhwxwywzuEoTwgwBwCwDuVaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaezRzRwTwFwXwGwHwIxbvQvQvQvQaeaeaeaeafafafafoBoBoBoBoBoBoBoBoBafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacafafaeaevkwKvTwLvEwMwNwOvTvkvkvkvkvkvmrjrkaeaeaeaeaeaeaeaeafafafacacacacacbjbjbjbjbjbjbjacacacafaeaeaeaeaeaeaeaeaeaeaerjrkaeaeaeaeaeaeaeaeaeafafacacwPuEuEuEwQuEuEwRwSwUwRwSuEuEuEuEuExruEuEuVuVaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaexuxuwVAMABwYwZymxawJxcxdxexcrkaeaeaenlafafafoBoBoBoBoBoBoBafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaevkxfxgxhvyxixjxkxlxmxnxoxpxqxHtStTqJqJqJqJqJqFaeaeaeaeafafafacacacacacbjbjbjacacacacafafaeaetRqJqJqJqJqJqJqJqJtStTqJqJqJqJqFaeaeaeaeaeafacacacacacwQxsxtxRwgwDxvwhwDwwzJxxxywhwDwgxzxAuVuVuVxBxCxCxCxCxCxCxCxDxDxDxDxDxDxDxuxuxuxEwWBQxGybxIxaxaxJxKxLxMxNvsaeaeaenlafafafoBoBoBoBoBoBafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaevkvkvkvkvkxPxQyevkvkxSvkvkvkvkrCrKaeaeaeaeaepuaeaeaeaeafaeafafacacacacacacacacacacafafaeaeaepuaeaeaeaeaeaeaeaerCrKaeaeaeaepuaeaeaeaeaeafafnfafafacuEuEuEuEwgwDxTxUxVwyxWxXxXxYxYxZxXyayExXyEycycycycycycycycydydydydydydydyIyfyIygyfyhyiyjykylymynxcyoypxcrKaeaeaeaeafafafafoBoBoBoBoBafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaevkvkvkvkvkxPxQyevkvkxSvkvkvkvkrCrKaeaeaeaeaepuaeaeaeaeafaeafafacacacacacacacacacacafafaeaeaepuaeaeaeaeaeaeaeaerCrKaeaeaeaepuaeaeaeaeaeafafnfafafacuEuEuEuEwgwDxTxUxVwyxWxXxXxYxYxZxXyayExXyEycycycycycycycycydydydydydydydyIyfyIygyfyhyiyjykylAxynxcyoypxcrKaeaeaeaeafafafafoBoBoBoBoBafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaeaevkyqyrysytvknovtofaeaeaeaeaeqvaeaeaeqEqJqJqFaeaeaeaeafacacacacacacacacacacafaeaetRqJtQaeaeaeaeafaeaeqvaeaeaeaeaeaepuaeaeaeaeaeaeaevbaeafafafafafuEwgywyxyyyyyxyzyAyByyyyyCyxyDyVyVyVyFyFyFyFyFyFyFyFyGyGyGyGyGyGyHyXyXyXyJyKyLyMyNyOyPyOyOyOyOyOyOvuaeaeaeaenlafafafoBoBoBoBafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaevkyRySyTyUvkaeaeaeaeaeaeafafnfafaeaeaeaeaepuaeaeaeaeaeafacacacacacafafafafafaetRtQaeaeaeafafafafafafnfaeaeaeaeaeaepuaeaeaeaeaeaeaeaeaeaeaeafafuEuEwRAnwRuEuEyWAoyYuEuEuEyZwRuEuVaeaeaeaaaaaaaaagaaaaaaagaaaaaaaaaaagaaxuxuwWzazbzczdzezfBRzhziyOuvwaaeaeaeaeaeafafafoBoBoBoBafafafoBafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafafaeaeaevkvkvkvkvkvkaeaeafafafafafacacafafaeaeaeaepuaeaeaeaeaeaeafafafafafafaeaeaeaeaepuaeaeafafafacacacacacafaeaeaeaeaeaepuaeaeaerjrkaeaeaeaeaeaeaeafuEzkwAzmzluEzozpzqzrzsuEztzuzvuEaeaeaeaeaeaeaaaaagaaaaaaagagagagagagagagagwEzwzxzyzzzAzAzBzCzCzDzEwluLaeaeaeaeaeafafafoBoBoBafafoBoBoBafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/shuttles/emergency_meta.dmm b/_maps/map_files/shuttles/emergency_meta.dmm index 350fba4b564..cc8098b35c7 100644 --- a/_maps/map_files/shuttles/emergency_meta.dmm +++ b/_maps/map_files/shuttles/emergency_meta.dmm @@ -6,7 +6,7 @@ "af" = (/turf/simulated/shuttle/wall{icon_state = "swall0"; dir = 2},/area/shuttle/escape) "ag" = (/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Emergency Shuttle Airlock"; req_access_txt = "2"},/turf/simulated/shuttle/floor,/area/shuttle/escape) "ah" = (/obj/structure/sign/nosmoking_2,/turf/simulated/shuttle/wall{icon_state = "swall0"; dir = 2},/area/shuttle/escape) -"ai" = (/obj/docking_port/mobile/emergency{dir = 2; dwidth = 5; height = 14; name = "Meta emergency shuttle"; timid = 1; width = 25},/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Emergency Shuttle Airlock"; req_access_txt = "2"},/turf/simulated/shuttle/floor,/area/shuttle/escape) +"ai" = (/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Emergency Shuttle Airlock"; req_access_txt = "0"},/turf/simulated/shuttle/floor,/area/shuttle/escape) "aj" = (/turf/simulated/shuttle/wall{icon_state = "swall4"; dir = 2},/area/shuttle/escape) "ak" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/shuttle/escape) "al" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/escape) @@ -110,9 +110,10 @@ "cf" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/shuttle/escape) "cg" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"; dir = 2},/area/shuttle/escape) "ch" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/shuttle/escape) +"ci" = (/obj/docking_port/mobile/emergency{dir = 2; dwidth = 5; height = 14; name = "Meta emergency shuttle"; timid = 1; width = 25},/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Emergency Shuttle Airlock"; req_access_txt = "0"},/turf/simulated/shuttle/floor,/area/shuttle/escape) (1,1,1) = {" -aaaaabacacacacadaeacafagacagahacacacafaiacagajakal +aaaaabacacacacadaeacafaiacaiahacacacafciacagajakal aaamanaoapaqarasatauavauawauavavawavaxauavauauayaz aAaBasaCauaDaEaFauauauauauauauauauauauauauauauaGac aHaIasaJaKauauazauauaLaMaLaLaLauaLaLaLaMaLauauaNaf @@ -127,3 +128,4 @@ aOaBasbIbpbpbJaFbKbrbrbLasbMauauaublbNbpbpbpbpbAac aabOanbPbpbpbJasbQbRbSbTasbUbVbWbXbYbZcacbcccdceaV aaaacfacbqbqaccgakacacajcgaeacacajcgakaeacacajakch "} + diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm index 299d0c20e22..a2ba4429ffa 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm @@ -61,6 +61,7 @@ /obj/machinery/atmospherics/unary/vent_pump/New() ..() + all_vent_pumps += src icon = null initial_loc = get_area(loc) area_uid = initial_loc.uid @@ -426,6 +427,7 @@ return ..() /obj/machinery/atmospherics/unary/vent_pump/Destroy() + all_vent_pumps -= src if(initial_loc) initial_loc.air_vent_info -= id_tag initial_loc.air_vent_names -= id_tag diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index b9f32e9b49a..75f953f6c79 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -316,4 +316,7 @@ #define DRAKE_SCORE "Drakes Killed" #define BIRD_SCORE "Hierophants Killed" #define BOSS_SCORE "Bosses Killed" -#define TENDRIL_CLEAR_SCORE "Tendrils Killed" \ No newline at end of file +#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 diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm index 9fa27c93356..1cad4d1a9df 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -625,3 +625,15 @@ proc/dd_sortedObjectList(list/incoming) /datum/alarm/dd_SortValue() return "[sanitize(last_name)]" + +//Picks from the list, with some safeties, and returns the "default" arg if it fails +#define DEFAULTPICK(L, default) ((istype(L, /list) && L:len) ? pick(L) : default) + +#define LAZYINITLIST(L) if (!L) L = list() + +#define UNSETEMPTY(L) if (L && !L.len) L = null +#define LAZYREMOVE(L, I) if(L) { L -= I; if(!L.len) { L = null; } } +#define LAZYADD(L, I) if(!L) { L = list(); } L += I; +#define LAZYACCESS(L, I) (L ? (isnum(I) ? (I > 0 && I <= L.len ? L[I] : null) : L[I]) : null) +#define LAZYLEN(L) length(L) +#define LAZYCLEARLIST(L) if(L) L.Cut() diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 40cc0edbbd5..3cc200ce004 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -250,7 +250,7 @@ Proc for attack log creation, because really why not */ proc/add_logs(mob/user, mob/target, what_done, var/object=null, var/addition=null, var/admin=1, var/print_attack_log = 1)//print_attack_log notifies admins with attack logs on - var/list/ignore=list("shaked", "CPRed", "grabbed", "punched", "disarmed") + var/list/ignore=list("shaked", "CPRed", "grabbed", "disarmed") if(!user) return if(ismob(user)) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 4c6abbd7d0b..84c8ec3656e 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -431,7 +431,7 @@ proc/checkhtml(var/t) text = copytext(text, 1, index) + repl_chars[char] + copytext(text, index+keylength) index = findtext(text, char) return text - + //Checks if any of a given list of needles is in the haystack /proc/text_in_list(haystack, list/needle_list, start=1, end=0) for(var/needle in needle_list) @@ -445,3 +445,97 @@ proc/checkhtml(var/t) if(findtextEx(haystack, needle, start, end)) return 1 return 0 + + +// Pencode +/proc/pencode_to_html(text, mob/user, var/obj/item/weapon/pen/P = null, deffont = "Verdana", signfont = "Times New Roman", crayonfont = "Comic Sans MS") + text = replacetext(text, "\n", "
") + text = replacetext(text, "\[center\]", "
") + text = replacetext(text, "\[/center\]", "
") + text = replacetext(text, "\[br\]", "
") + 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\]", "") + text = replacetext(text, "\[sign\]", "[user ? user.real_name : "Anonymous"]") + text = replacetext(text, "\[field\]", "") + + 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! + text = replacetext(text, "\[*\]", "") + text = replacetext(text, "\[hr\]", "") + text = replacetext(text, "\[small\]", "") + text = replacetext(text, "\[/small\]", "") + text = replacetext(text, "\[list\]", "") + text = replacetext(text, "\[/list\]", "") + text = replacetext(text, "\[table\]", "") + text = replacetext(text, "\[/table\]", "") + text = replacetext(text, "\[row\]", "") + text = replacetext(text, "\[cell\]", "") + text = replacetext(text, "\[logo\]", "") + + text = "[text]" + else // They are using "not a crayon" - formatting is OK and such + text = replacetext(text, "\[*\]", "
  • ") + text = replacetext(text, "\[hr\]", "
    ") + text = replacetext(text, "\[small\]", "") + text = replacetext(text, "\[/small\]", "") + text = replacetext(text, "\[list\]", "") + text = replacetext(text, "\[table\]", "") + text = replacetext(text, "\[/table\]", "
    ") + text = replacetext(text, "\[grid\]", "") + text = replacetext(text, "\[/grid\]", "
    ") + text = replacetext(text, "\[row\]", "") + text = replacetext(text, "\[cell\]", "") + text = replacetext(text, "\[logo\]", "") + + text = "[text]" + + text = copytext(text, 1, MAX_PAPER_MESSAGE_LEN) + return text + +/proc/html_to_pencode(text) + text = replacetext(text, "
    ", "\n") + text = replacetext(text, "
    ", "\[center\]") + text = replacetext(text, "
    ", "\[/center\]") + text = replacetext(text, "
    ", "\[br\]") + 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, "", "\[field\]") + + 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, "
  • ", "\[*\]") + text = replacetext(text, "
    ", "\[hr\]") + text = replacetext(text, "", "\[small\]") + text = replacetext(text, "
      ", "\[list\]") + text = replacetext(text, "
    ", "\[/list\]") + text = replacetext(text, "", "\[table\]") + text = replacetext(text, "
    ", "\[/table\]") + text = replacetext(text, "", "\[grid\]") + text = replacetext(text, "
    ", "\[/grid\]") + text = replacetext(text, "", "\[row\]") + text = replacetext(text, "", "\[cell\]") + text = replacetext(text, "", "\[logo\]") + return text diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 713289c737c..c139b969df1 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -46,4 +46,20 @@ var/list/TAGGERLOCATIONS = list("Disposals", "Robotics", "HoP Office", "Library", "Chapel", "Captain's Office", "Bar", "Kitchen", "Hydroponics", "Janitor Closet","Genetics","Brig Physician") -var/list/hit_appends = list("-OOF", "-ACK", "-UGH", "-HRNK", "-HURGH", "-GLORF") \ No newline at end of file +var/list/hit_appends = list("-OOF", "-ACK", "-UGH", "-HRNK", "-HURGH", "-GLORF") + +var/global/list/greek_letters = list("Alpha", "Beta", "Gamma", "Delta", + "Epsilon", "Zeta", "Eta", "Theta", "Iota", "Kappa", "Lambda", "Mu", + "Nu", "Xi", "Omicron", "Pi", "Rho", "Sigma", "Tau", "Upsilon", "Phi", + "Chi", "Psi", "Omega") + +var/global/list/phonetic_alphabet = list("Alpha", "Bravo", "Charlie", + "Delta", "Echo", "Foxtrot", "Golf", "Hotel", "India", "Juliet", + "Kilo", "Lima", "Mike", "November", "Oscar", "Papa", "Quebec", + "Romeo", "Sierra", "Tango", "Uniform", "Victor", "Whiskey", "X-ray", + "Yankee", "Zulu") + +var/global/list/numbers_as_words = list("One", "Two", "Three", "Four", + "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", + "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", + "Eighteen", "Nineteen") \ No newline at end of file diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 8018fae5681..41588a7b07a 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -23,6 +23,7 @@ var/global/list/rcd_list = list() //list of Rapid Construction Devices. var/global/list/apcs = list() var/global/list/air_alarms = list() var/global/list/power_monitors = list() +var/global/list/all_vent_pumps = list() var/global/list/navbeacons = list() //list of all bot nagivation beacons, used for patrolling. var/global/list/deliverybeacons = list() //list of all MULEbot delivery beacons. @@ -34,8 +35,9 @@ var/global/list/tracked_implants = list() //list of all current implants that var/global/list/pinpointer_list = list() //list of all pinpointers. Used to change stuff they are pointing to all at once. var/global/list/abductor_equipment = list() //list of all abductor equipment - var/global/list/global_intercoms = list() //list of all intercomms, across all z-levels var/global/list/global_radios = list() //list of all radios, across all z-levels -var/global/list/poi_list = list() //list of points of interest for observe/follow \ No newline at end of file +var/global/list/meteor_list = list() //list of all meteors +var/global/list/poi_list = list() //list of points of interest for observe/follow + diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 46368def984..4c9f57d4e4e 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -161,13 +161,13 @@ for(var/mob/O in viewers(messagesource, null)) if(attack_verb.len) - O.show_message("[M] has been [pick(attack_verb)] with [src][showname] ", 1) + O.show_message("[M] has been [pick(attack_verb)] with [src][showname] ", 1) else - O.show_message("[M] has been attacked with [src][showname] ", 1) + O.show_message("[M] has been attacked with [src][showname] ", 1) if(!showname && user) if(user.client) - to_chat(user, "You attack [M] with [src]. ") + to_chat(user, "You attack [M] with [src]. ") diff --git a/code/controllers/Processes/lighting.dm b/code/controllers/Processes/lighting.dm index 15b134ecf44..d92fe8a36b1 100644 --- a/code/controllers/Processes/lighting.dm +++ b/code/controllers/Processes/lighting.dm @@ -86,6 +86,18 @@ overlay_updates++ SCHECK + + + +/datum/controller/process/lighting/statProcess() + ..() + stat(null, "[all_lighting_sources.len] light sources exist") + stat(null, "[all_lighting_corners.len] light corners exist") + stat(null, "[global.all_lighting_overlays.len] light overlays exist") + stat(null, "[lighting_update_lights.len] lighting sources queued") + stat(null, "[lighting_update_corners.len] lighting corners queued") + stat(null, "[lighting_update_overlays.len] lighting overlays queued") + #undef MAX_LIGHT_UPDATES_PER_WORK #undef MAX_CORNER_UPDATES_PER_WORK #undef MAX_OVERLAY_UPDATES_PER_WORK diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 5e1701aacb8..251494d9f89 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -38,7 +38,7 @@ var/continuous_rounds = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke. 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.9 + var/Ticklag = 0.5 var/Tickcomp = 0 var/socket_talk = 0 // use socket_talk to communicate with other processes var/list/resource_urls = null @@ -575,10 +575,10 @@ if("round_abandon_penalty_period") config.round_abandon_penalty_period = MinutesToTicks(text2num(value)) - + if("medal_hub_address") global.medal_hub = value - + if("medal_hub_password") global.medal_pass = value diff --git a/code/datums/beam.dm b/code/datums/beam.dm index 1b48dd37560..7a8c802b42d 100644 --- a/code/datums/beam.dm +++ b/code/datums/beam.dm @@ -15,7 +15,6 @@ 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) endtime = world.time+time origin = beam_origin @@ -30,7 +29,6 @@ icon_state = beam_icon_state beam_type = btype - /datum/beam/proc/Start() Draw() while(!finished && origin && target && world.time < endtime && get_dist(origin,target)[affected_mob] hits [M] with their thrashing!") M.adjustBruteLoss(damage) else - playsound(affected_mob.loc, "sound/weapons/punchmiss.ogg", 25, 1, -1) + playsound(affected_mob.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) affected_mob.visible_message("[affected_mob] fails to hit [M] with their thrashing!") \ No newline at end of file diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 41fdf4a2ad0..27947b9e608 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -54,6 +54,7 @@ var/has_been_rev = 0//Tracks if this mind has been a rev or not var/miming = 0 // Mime's vow of silence + var/speech_span // What span any body this mind has talks in. var/datum/faction/faction //associated faction var/datum/changeling/changeling //changeling holder var/linglink diff --git a/code/datums/progressbar.dm b/code/datums/progressbar.dm index acac430399b..2c0956f4fbb 100644 --- a/code/datums/progressbar.dm +++ b/code/datums/progressbar.dm @@ -1,9 +1,12 @@ +#define PROGRESSBAR_HEIGHT 6 + /datum/progressbar var/goal = 1 var/image/bar var/shown = 0 var/mob/user var/client/client + var/listindex /datum/progressbar/New(mob/User, goal_number, atom/target) . = ..() @@ -11,15 +14,21 @@ EXCEPTION("Invalid target given") if(goal_number) goal = goal_number - bar = image('icons/effects/progessbar.dmi', target, "prog_bar_0") + bar = image('icons/effects/progessbar.dmi', target, "prog_bar_0", HUD_LAYER) + bar.plane = HUD_PLANE bar.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA - bar.pixel_y = 32 user = User if(user) client = user.client + LAZYINITLIST(user.progressbars) + LAZYINITLIST(user.progressbars[bar.loc]) + var/list/bars = user.progressbars[bar.loc] + bars.Add(src) + listindex = bars.len + bar.pixel_y = 32 + (PROGRESSBAR_HEIGHT * (listindex - 1)) + /datum/progressbar/proc/update(progress) -// to_chat(world, "Update [progress] - [goal] - [(progress / goal)] - [((progress / goal) * 100)] - [round(((progress / goal) * 100), 5)]") if(!user || !user.client) shown = 0 return @@ -35,8 +44,24 @@ user.client.images += bar shown = 1 +/datum/progressbar/proc/shiftDown() + --listindex + bar.pixel_y -= PROGRESSBAR_HEIGHT + /datum/progressbar/Destroy() + for(var/I in user.progressbars[bar.loc]) + var/datum/progressbar/P = I + if(P != src && P.listindex > listindex) + P.shiftDown() + + var/list/bars = user.progressbars[bar.loc] + bars.Remove(src) + if(!bars.len) + LAZYREMOVE(user.progressbars, bar.loc) + if(client) client.images -= bar qdel(bar) - . = ..() \ No newline at end of file + . = ..() + +#undef PROGRESSBAR_HEIGHT \ No newline at end of file diff --git a/code/datums/spells/rod_form.dm b/code/datums/spells/rod_form.dm new file mode 100644 index 00000000000..004daf8969e --- /dev/null +++ b/code/datums/spells/rod_form.dm @@ -0,0 +1,43 @@ +/obj/effect/proc_holder/spell/targeted/rod_form + name = "Rod Form" + desc = "Take on the form of an immovable rod, destroying all in your path." + clothes_req = 1 + human_req = 0 + charge_max = 600 + cooldown_min = 200 + range = -1 + include_user = 1 + invocation = "CLANG!" + invocation_type = "shout" + action_icon_state = "immrod" + +/obj/effect/proc_holder/spell/targeted/rod_form/cast(list/targets,mob/user = usr) + for(var/mob/living/M in targets) + var/turf/start = get_turf(M) + var/obj/effect/immovablerod/wizard/W = new(start, get_ranged_target_turf(M, M.dir, (15 + spell_level * 3))) + W.wizard = M + W.max_distance += spell_level * 3 //You travel farther when you upgrade the spell + W.start_turf = start + M.forceMove(W) + M.notransform = 1 + M.status_flags |= GODMODE + +//Wizard Version of the Immovable Rod + +/obj/effect/immovablerod/wizard + var/max_distance = 13 + var/mob/living/wizard + var/turf/start_turf + notify = FALSE + +/obj/effect/immovablerod/wizard/Move() + if(get_dist(start_turf, get_turf(src)) >= max_distance) + qdel(src) + ..() + +/obj/effect/immovablerod/wizard/Destroy() + if(wizard) + wizard.status_flags &= ~GODMODE + wizard.notransform = 0 + wizard.forceMove(get_turf(src)) + return ..() diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index d1159671875..dab251125a7 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -53,6 +53,8 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine var/contraband = 0 var/group = supply_misc var/list/announce_beacons = list() // Particular beacons that we'll notify the relevant department when we reach + var/special = FALSE //Event/Station Goals/Admin enabled packs + var/special_enabled = FALSE /datum/supply_packs/New() @@ -1525,7 +1527,62 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /obj/item/weapon/beach_ball) cost = 20 containername = "polo supply crate" + +///////////// Station Goals + +/datum/supply_packs/misc/bsa + name = "Bluespace Artillery Parts" + cost = 150 + special = TRUE + contains = list(/obj/item/weapon/circuitboard/machine/bsa/front, + /obj/item/weapon/circuitboard/machine/bsa/middle, + /obj/item/weapon/circuitboard/machine/bsa/back, + /obj/item/weapon/circuitboard/computer/bsa_control + ) + containername = "bluespace artillery parts crate" +/datum/supply_packs/misc/dna_vault + name = "DNA Vault Parts" + cost = 120 + special = TRUE + contains = list( + /obj/item/weapon/circuitboard/machine/dna_vault + ) + containername = "dna vault parts crate" + +/datum/supply_packs/misc/dna_probes + name = "DNA Vault Samplers" + cost = 30 + special = TRUE + contains = list(/obj/item/device/dna_probe, + /obj/item/device/dna_probe, + /obj/item/device/dna_probe, + /obj/item/device/dna_probe, + /obj/item/device/dna_probe + ) + containername = "dna samplers crate" + + +/datum/supply_packs/misc/shield_sat + name = "Shield Generator Satellite" + cost = 30 + special = TRUE + contains = list( + /obj/machinery/satellite/meteor_shield, + /obj/machinery/satellite/meteor_shield, + /obj/machinery/satellite/meteor_shield + ) + containername = "shield sat crate" + + +/datum/supply_packs/misc/shield_sat_control + name = "Shield System Control Board" + cost = 50 + special = TRUE + contains = list( + /obj/item/weapon/circuitboard/computer/sat_control + ) + containername = "shield control board crate" ////////////////////////////////////////////////////////////////////////////// //////////////////////////// Vending ///////////////////////////////////////// @@ -1606,4 +1663,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" + containername = "cigarette supply crate" \ No newline at end of file diff --git a/code/defines/procs/admin.dm b/code/defines/procs/admin.dm index fb9bc232e12..2bc6b59e1d0 100644 --- a/code/defines/procs/admin.dm +++ b/code/defines/procs/admin.dm @@ -48,6 +48,12 @@ var/message = "[key_name(whom, 1, include_name)](?)[isAntag(whom) ? "(A)" : ""][isLivingSSD(whom) ? "(SSD!)" : ""] ([admin_jump_link(whom)])" return message +/proc/key_name_mentor(var/whom, var/include_name = 1) + // Same as key_name_admin, but does not include (?) or (A) for antags. + var/message = "[key_name(whom, 1, include_name)] [isLivingSSD(whom) ? "(SSD!)" : ""] ([admin_jump_link(whom)])" + return message + + /proc/log_and_message_admins(var/message as text) log_admin("[key_name(usr)] " + message) message_admins("[key_name_admin(usr)] " + message) diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 59557caea6a..240c53b0025 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -139,6 +139,7 @@ /mob/living/carbon/proc/med_hud_set_status() var/image/holder = hud_list[STATUS_HUD] //var/image/holder2 = hud_list[STATUS_HUD_OOC] + var/mob/living/simple_animal/borer/B = has_brain_worms() if(stat == 2) holder.icon_state = "huddead" //holder2.icon_state = "huddead" @@ -146,13 +147,8 @@ holder.icon_state = "hudxeno" else if(check_virus()) holder.icon_state = "hudill" - else if(has_brain_worms()) - var/mob/living/simple_animal/borer/B = has_brain_worms() - if(B.controlling) - holder.icon_state = "hudbrainworm" - else - holder.icon_state = "hudhealthy" - //holder2.icon_state = "hudhealthy" + else if(has_brain_worms() && B != null && B.controlling) + holder.icon_state = "hudbrainworm" else holder.icon_state = "hudhealthy" //holder2.icon_state = "hudhealthy" diff --git a/code/game/dna/genes/goon_disabilities.dm b/code/game/dna/genes/goon_disabilities.dm index a2ad15e797b..11da3ad6c07 100644 --- a/code/game/dna/genes/goon_disabilities.dm +++ b/code/game/dna/genes/goon_disabilities.dm @@ -135,13 +135,13 @@ message = replacetextEx(message,"w","v") message = replacetextEx(message,"J","Y") message = replacetextEx(message,"j","y") - message = replacetextEx(message,"A",pick("Å","Ä","Æ","A")) - message = replacetextEx(message,"a",pick("å","ä","æ","a")) + message = replacetextEx(message,"A",pick("Ã…","Ä","Æ","A")) + message = replacetextEx(message,"a",pick("Ã¥","ä","æ","a")) message = replacetextEx(message,"BO","BJO") message = replacetextEx(message,"Bo","Bjo") message = replacetextEx(message,"bo","bjo") - message = replacetextEx(message,"O",pick("Ö","Ø","O")) - message = replacetextEx(message,"o",pick("ö","ø","o")) + message = replacetextEx(message,"O",pick("Ö","Ø","O")) + message = replacetextEx(message,"o",pick("ö","ø","o")) if(prob(30)) message += " Bork[pick("",", bork",", bork, bork")]!" return message @@ -259,7 +259,7 @@ action_icon_state = "genetic_incendiary" -/obj/effect/proc_holder/spell/targeted/immolate/cast(list/targets,mob/living/user = usr) +/obj/effect/proc_holder/spell/targeted/immolate/cast(list/targets, mob/living/user = usr) var/mob/living/carbon/L = user L.adjust_fire_stacks(0.5) L.visible_message("[L.name] suddenly bursts into flames!") diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm index 0e8415a15e3..e4c09aeac17 100644 --- a/code/game/dna/genes/goon_powers.dm +++ b/code/game/dna/genes/goon_powers.dm @@ -143,15 +143,15 @@ action_icon_state = "genetic_cryo" -/obj/effect/proc_holder/spell/targeted/cryokinesis/cast(list/targets) +/obj/effect/proc_holder/spell/targeted/cryokinesis/cast(list/targets, mob/user = usr) if(!targets.len) - to_chat(usr, "No target found in range.") + to_chat(user, "No target found in range.") return var/mob/living/carbon/C = targets[1] if(!iscarbon(C)) - to_chat(usr, "This will only work on normal organic beings.") + to_chat(user, "This will only work on normal organic beings.") return if(RESIST_COLD in C.mutations) @@ -164,15 +164,15 @@ if(istype(H.wear_suit, /obj/item/clothing/suit/space)) handle_suit = 1 if(H.internal) - H.visible_message("[usr] sprays a cloud of fine ice crystals, engulfing [H]!", - "[usr] sprays a cloud of fine ice crystals over your [H.head]'s visor.") - log_admin("[key_name(usr)] has used cryokinesis on [key_name(C)] while wearing internals and a suit") - msg_admin_attack("[key_name_admin(usr)] has cast cryokinesis on [key_name_admin(C)]") + H.visible_message("[user] sprays a cloud of fine ice crystals, engulfing [H]!", + "[user] sprays a cloud of fine ice crystals over your [H.head]'s visor.") + log_admin("[key_name(user)] has used cryokinesis on [key_name(C)] while wearing internals and a suit") + msg_admin_attack("[key_name_admin(user)] has cast cryokinesis on [key_name_admin(C)]") else - H.visible_message("[usr] sprays a cloud of fine ice crystals engulfing, [H]!", - "[usr] sprays a cloud of fine ice crystals cover your [H.head]'s visor and make it into your air vents!.") - log_admin("[key_name(usr)] has used cryokinesis on [key_name(C)]") - msg_admin_attack("[key_name_admin(usr)] has cast cryokinesis on [key_name_admin(C)]") + H.visible_message("[user] sprays a cloud of fine ice crystals engulfing, [H]!", + "[user] sprays a cloud of fine ice crystals cover your [H.head]'s visor and make it into your air vents!.") + log_admin("[key_name(user)] has used cryokinesis on [key_name(C)]") + msg_admin_attack("[key_name_admin(user)] has cast cryokinesis on [key_name_admin(C)]") H.bodytemperature = max(0, H.bodytemperature - 50) H.adjustFireLoss(5) if(!handle_suit) @@ -180,11 +180,11 @@ C.adjustFireLoss(10) C.ExtinguishMob() - C.visible_message("\red [usr] sprays a cloud of fine ice crystals, engulfing [C]!") - log_admin("[key_name(usr)] has used cryokinesis on [key_name(C)] without internals or a suit") - msg_admin_attack("[key_name_admin(usr)] has cast cryokinesis on [key_name_admin(C)]") + C.visible_message("\red [user] sprays a cloud of fine ice crystals, engulfing [C]!") + log_admin("[key_name(user)] has used cryokinesis on [key_name(C)] without internals or a suit") + msg_admin_attack("[key_name_admin(user)] has cast cryokinesis on [key_name_admin(C)]") - //playsound(usr.loc, 'bamf.ogg', 50, 0) + //playsound(user.loc, 'bamf.ogg', 50, 0) new/obj/effect/self_deleting(C.loc, icon('icons/effects/genetics.dmi', "cryokinesis")) @@ -294,10 +294,9 @@ revert_cast(user) return - perform(targets) + perform(targets, user = user) -/obj/effect/proc_holder/spell/targeted/eat/cast(list/targets) - var/mob/user = usr +/obj/effect/proc_holder/spell/targeted/eat/cast(list/targets, mob/user = usr) if(!targets.len) to_chat(user, "No target found in range.") return @@ -383,60 +382,60 @@ action_icon_state = "genetic_jump" -/obj/effect/proc_holder/spell/targeted/leap/cast(list/targets) +/obj/effect/proc_holder/spell/targeted/leap/cast(list/targets, mob/user = usr) var/failure = 0 - if(istype(usr.loc,/mob/) || usr.lying || usr.stunned || usr.buckled || usr.stat) - to_chat(usr, "You can't jump right now!") + if(istype(user.loc,/mob/) || user.lying || user.stunned || user.buckled || user.stat) + to_chat(user, "You can't jump right now!") return - if(istype(usr.loc,/turf/)) - if(usr.restrained())//Why being pulled while cuffed prevents you from moving - for(var/mob/M in range(usr, 1)) - if(M.pulling == usr) - if(!M.restrained() && M.stat == 0 && M.canmove && usr.Adjacent(M)) + if(istype(user.loc,/turf/)) + if(user.restrained())//Why being pulled while cuffed prevents you from moving + for(var/mob/M in range(user, 1)) + if(M.pulling == user) + if(!M.restrained() && M.stat == 0 && M.canmove && user.Adjacent(M)) failure = 1 else M.stop_pulling() - if(usr.pinned.len) + if(user.pinned.len) failure = 1 - usr.visible_message("[usr.name] takes a huge leap!") - playsound(usr.loc, 'sound/weapons/thudswoosh.ogg', 50, 1) + user.visible_message("[user.name] takes a huge leap!") + playsound(user.loc, 'sound/weapons/thudswoosh.ogg', 50, 1) if(failure) - usr.Weaken(5) - usr.Stun(5) - usr.visible_message("[usr] attempts to leap away but is slammed back down to the ground!", + user.Weaken(5) + user.Stun(5) + user.visible_message("[user] attempts to leap away but is slammed back down to the ground!", "You attempt to leap away but are suddenly slammed back down to the ground!", "You hear the flexing of powerful muscles and suddenly a crash as a body hits the floor.") return 0 - var/prevLayer = usr.layer - var/prevFlying = usr.flying - usr.layer = 9 + var/prevLayer = user.layer + var/prevFlying = user.flying + user.layer = 9 - usr.flying = 1 + user.flying = 1 for(var/i=0, i<10, i++) - step(usr, usr.dir) - if(i < 5) usr.pixel_y += 8 - else usr.pixel_y -= 8 + step(user, user.dir) + if(i < 5) user.pixel_y += 8 + else user.pixel_y -= 8 sleep(1) - usr.flying = prevFlying + user.flying = prevFlying - if(FAT in usr.mutations && prob(66)) - usr.visible_message("[usr.name] crashes due to their heavy weight!") - //playsound(usr.loc, 'zhit.wav', 50, 1) - usr.AdjustWeakened(10) - usr.AdjustStunned(5) + if(FAT in user.mutations && prob(66)) + user.visible_message("[user.name] crashes due to their heavy weight!") + //playsound(user.loc, 'zhit.wav', 50, 1) + user.AdjustWeakened(10) + user.AdjustStunned(5) - usr.layer = prevLayer + user.layer = prevLayer - if(istype(usr.loc,/obj/)) - var/obj/container = usr.loc - to_chat(usr, "You leap and slam your head against the inside of [container]! Ouch!") - usr.AdjustParalysis(3) - usr.AdjustWeakened(5) - container.visible_message("[usr.loc] emits a loud thump and rattles a bit.") - playsound(usr.loc, 'sound/effects/bang.ogg', 50, 1) + if(istype(user.loc,/obj/)) + var/obj/container = user.loc + to_chat(user, "You leap and slam your head against the inside of [container]! Ouch!") + user.AdjustParalysis(3) + user.AdjustWeakened(5) + container.visible_message("[user.loc] emits a loud thump and rattles a bit.") + playsound(user.loc, 'sound/effects/bang.ogg', 50, 1) var/wiggle = 6 while(wiggle > 0) wiggle-- @@ -446,9 +445,6 @@ container.pixel_x = 0 container.pixel_y = 0 - - return - //////////////////////////////////////////////////////////////////////// // WAS: /datum/bioEffect/polymorphism @@ -475,6 +471,7 @@ charge_max = 1800 clothes_req = 0 + human_req = 1 stat_allowed = 0 invocation_type = "none" range = 1 @@ -482,21 +479,18 @@ action_icon_state = "genetic_poly" -/obj/effect/proc_holder/spell/targeted/polymorph/cast(list/targets) - var/mob/living/M=targets[1] +/obj/effect/proc_holder/spell/targeted/polymorph/cast(list/targets, mob/user = usr) + var/mob/living/M = targets[1] if(!ishuman(M)) to_chat(usr, "You can only change your appearance to that of another human.") return - if(!ishuman(usr)) - return - - usr.visible_message("[usr]'s body shifts and contorts.") + user.visible_message("[user]'s body shifts and contorts.") spawn(10) - if(M && usr) - playsound(usr.loc, 'sound/goonstation/effects/gib.ogg', 50, 1) - var/mob/living/carbon/human/H = usr + if(M && user) + playsound(user.loc, 'sound/goonstation/effects/gib.ogg', 50, 1) + var/mob/living/carbon/human/H = user var/mob/living/carbon/human/target = M H.UpdateAppearance(target.dna.UI) H.real_name = target.real_name @@ -524,6 +518,7 @@ desc = "Read the minds of others for information." charge_max = 180 clothes_req = 0 + human_req = 1 stat_allowed = 0 invocation_type = "none" range = -2 @@ -539,29 +534,26 @@ revert_cast(user) return - perform(targets) - -/obj/effect/proc_holder/spell/targeted/empath/cast(list/targets) - if(!ishuman(usr)) return - + perform(targets, user = user) +/obj/effect/proc_holder/spell/targeted/empath/cast(list/targets, mob/user = usr) for(var/mob/living/carbon/M in targets) if(!iscarbon(M)) - to_chat(usr, "You may only use this on other organic beings.") + to_chat(user, "You may only use this on other organic beings.") return if(PSY_RESIST in M.mutations) - to_chat(usr, "You can't see into [M.name]'s mind at all!") + to_chat(user, "You can't see into [M.name]'s mind at all!") return if(M.stat == 2) - to_chat(usr, "[M.name] is dead and cannot have their mind read.") + to_chat(user, "[M.name] is dead and cannot have their mind read.") return if(M.health < 0) - to_chat(usr, "[M.name] is dying, and their thoughts are too scrambled to read.") + to_chat(user, "[M.name] is dying, and their thoughts are too scrambled to read.") return - to_chat(usr, "Mind Reading of [M.name]:") + to_chat(user, "Mind Reading of [M.name]:") var/pain_condition = M.health // lower health means more pain var/list/randomthoughts = list("what to have for lunch","the future","the past","money", @@ -578,33 +570,33 @@ switch(pain_condition) if(81 to INFINITY) - to_chat(usr, "Condition: [M.name] feels good.") + to_chat(user, "Condition: [M.name] feels good.") if(61 to 80) - to_chat(usr, "Condition: [M.name] is suffering mild pain.") + to_chat(user, "Condition: [M.name] is suffering mild pain.") if(41 to 60) - to_chat(usr, "Condition: [M.name] is suffering significant pain.") + to_chat(user, "Condition: [M.name] is suffering significant pain.") if(21 to 40) - to_chat(usr, "Condition: [M.name] is suffering severe pain.") + to_chat(user, "Condition: [M.name] is suffering severe pain.") else - to_chat(usr, "Condition: [M.name] is suffering excruciating pain.") + to_chat(user, "Condition: [M.name] is suffering excruciating pain.") thoughts = "haunted by their own mortality" switch(M.a_intent) if(I_HELP) - to_chat(usr, "Mood: You sense benevolent thoughts from [M.name].") + to_chat(user, "Mood: You sense benevolent thoughts from [M.name].") if(I_DISARM) - to_chat(usr, "Mood: You sense cautious thoughts from [M.name].") + to_chat(user, "Mood: You sense cautious thoughts from [M.name].") if(I_GRAB) - to_chat(usr, "Mood: You sense hostile thoughts from [M.name].") + to_chat(user, "Mood: You sense hostile thoughts from [M.name].") if(I_HARM) - to_chat(usr, "Mood: You sense cruel thoughts from [M.name].") + to_chat(user, "Mood: You sense cruel thoughts from [M.name].") for(var/mob/living/L in view(7,M)) if(L == M) continue thoughts = "thinking about punching [L.name]" break else - to_chat(usr, "Mood: You sense strange thoughts from [M.name].") + to_chat(user, "Mood: You sense strange thoughts from [M.name].") if(istype(M,/mob/living/carbon/human)) var/numbers[0] @@ -613,11 +605,11 @@ numbers += H.mind.initial_account.account_number numbers += H.mind.initial_account.remote_access_pin if(numbers.len>0) - to_chat(usr, "Numbers: You sense the number[numbers.len>1?"s":""] [english_list(numbers)] [numbers.len>1?"are":"is"] important to [M.name].") - to_chat(usr, "Thoughts: [M.name] is currently [thoughts].") + to_chat(user, "Numbers: You sense the number[numbers.len>1?"s":""] [english_list(numbers)] [numbers.len>1?"are":"is"] important to [M.name].") + to_chat(user, "Thoughts: [M.name] is currently [thoughts].") if(EMPATH in M.mutations) - to_chat(M, "You sense [usr.name] reading your mind.") + to_chat(M, "You sense [user.name] reading your mind.") else if(prob(5) || M.mind.assigned_role=="Chaplain") to_chat(M, "You sense someone intruding upon your thoughts...") return diff --git a/code/game/gamemodes/blob/blob_report.dm b/code/game/gamemodes/blob/blob_report.dm index 9d24e4992df..b937c16e74c 100644 --- a/code/game/gamemodes/blob/blob_report.dm +++ b/code/game/gamemodes/blob/blob_report.dm @@ -8,6 +8,7 @@ ..() return if(1) + interceptname = "Level 5-6 Biohazard Response Procedures" intercepttext += "Nanotrasen Update: Biohazard Alert.
    " intercepttext += "Reports indicate the probable transfer of a biohazardous agent onto [station_name()] during the last crew deployment cycle.
    " intercepttext += "Preliminary analysis of the organism classifies it as a level 5 biohazard. Its origin is unknown.
    " @@ -26,6 +27,7 @@ if(is_station_level(bomb.z)) bomb.r_code = nukecode + interceptname = "Classified [command_name()] Update" intercepttext += "Nanotrasen Update: Biohazard Alert.
    " intercepttext += "Directive 7-12 has been issued for [station_name()].
    " intercepttext += "The biohazard has grown out of control and will soon reach critical mass.
    " @@ -41,17 +43,8 @@ aiPlayer.set_zeroth_law(law) to_chat(aiPlayer, "Laws Updated: [law]") - for(var/obj/machinery/computer/communications/comm in world) - comm.messagetitle.Add(interceptname) - comm.messagetext.Add(intercepttext) - if(!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept) - var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc ) - playsound(comm.loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1) - intercept.name = "Classified Central Command Update" - intercept.info = intercepttext + print_command_report(intercepttext, interceptname) event_announcement.Announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/AI/commandreport.ogg') - return - /datum/station_state var/floor = 0 diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm index 166f3f590ac..cfd72f71a7e 100644 --- a/code/game/gamemodes/blob/powers.dm +++ b/code/game/gamemodes/blob/powers.dm @@ -333,7 +333,7 @@ if(ticker && ticker.mode.name == "blob") var/datum/game_mode/blob/BL = ticker.mode - BL.blobwincount = initial(BL.blobwincount) * 2 + BL.blobwincount += initial(BL.blobwincount) /mob/camera/blob/verb/blob_broadcast() diff --git a/code/game/gamemodes/changeling/powers/panacea.dm b/code/game/gamemodes/changeling/powers/panacea.dm index dd15a313701..4b8e002d576 100644 --- a/code/game/gamemodes/changeling/powers/panacea.dm +++ b/code/game/gamemodes/changeling/powers/panacea.dm @@ -11,6 +11,16 @@ to_chat(user, "We cleanse impurities from our form.") + var/mob/living/simple_animal/borer/B = user.has_brain_worms() + if(B) + if(B.controlling) + B.detatch() + B.leave_host() + if(iscarbon(user)) + var/mob/living/carbon/C = user + C.vomit(0) + to_chat(user, "We expel a parasite from our form.") + var/obj/item/organ/internal/body_egg/egg = user.get_int_organ(/obj/item/organ/internal/body_egg) if(egg) egg.remove(user) diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index cbbe5590475..f7bdc478466 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -245,7 +245,7 @@ var/timer = shuttle_master.emergency.timeLeft(1) + cursetime shuttle_master.emergency.setTimer(timer) to_chat(user,"You shatter the orb! A dark essence spirals into the air, then disappears.") - playsound(user.loc, "sound/effects/Glassbr1.ogg", 50, 1) + playsound(user.loc, 'sound/effects/Glassbr1.ogg', 50, 1) qdel(src) sleep(20) var/global/list/curses diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index b2344639c1d..2a9c9851478 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -37,6 +37,8 @@ var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) var/list/player_draft_log = list() var/list/datum/mind/xenos = list() + + var/list/datum/station_goal/station_goals = list() // A list of all station goals for this game mode /datum/game_mode/proc/announce() //to be calles when round starts to_chat(world, "Notice: [src] did not define announce()") @@ -78,6 +80,7 @@ // if(revdata) // feedback_set_details("revision","[revdata.revision]") feedback_set_details("server_ip","[world.internet_address]:[world.port]") + generate_station_goals() start_state = new /datum/station_state() start_state.count() return 1 @@ -222,7 +225,7 @@ /datum/game_mode/proc/check_win() //universal trigger to be called at mob death, nuke explosion, etc. To be called from everywhere. return 0 - + /datum/game_mode/proc/get_players_for_role(var/role, override_jobbans=0) var/list/players = list() var/list/candidates = list() @@ -475,3 +478,36 @@ proc/get_nt_opposed() text += "
    Objective #[count]: [objective.explanation_text] Fail." count++ return text + +/datum/game_mode/proc/generate_station_goals() + var/list/possible = list() + for(var/T in subtypesof(/datum/station_goal)) + var/datum/station_goal/G = T + if(config_tag in initial(G.gamemode_blacklist)) + continue + possible += T + var/goal_weights = 0 + while(possible.len && goal_weights < STATION_GOAL_BUDGET) + var/datum/station_goal/picked = pick_n_take(possible) + goal_weights += initial(picked.weight) + station_goals += new picked + + if(station_goals.len) + send_station_goals_message() + +/datum/game_mode/proc/send_station_goals_message() + var/message_text = "
    " + message_text += "

    [command_name()] Orders


    " + message_text += "Special Orders for [station_name()]:

    " + + for(var/datum/station_goal/G in station_goals) + G.on_report() + message_text += G.get_report() + message_text += "
    " + + print_command_report(message_text, "[command_name()] Orders") + +/datum/game_mode/proc/declare_station_goal_completion() + for(var/V in station_goals) + var/datum/station_goal/G = V + G.print_result() \ No newline at end of file diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 5a3d0599c8c..8067aabe719 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -416,7 +416,6 @@ var/round_start_time = 0 /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. //Round statistics report var/datum/station_state/end_state = new /datum/station_state() @@ -471,6 +470,9 @@ var/round_start_time = 0 scoreboard() karmareminder() + // Declare the completion of the station goals + mode.declare_station_goal_completion() + //Ask the event manager to print round end information event_manager.RoundEnd() diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 890cc4e151c..e634a47c590 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -118,11 +118,13 @@ return . /obj/effect/meteor/Destroy() + meteor_list -= src walk(src,0) //this cancels the walk_towards() proc return ..() /obj/effect/meteor/New() ..() + meteor_list += src SpinAnimation() /obj/effect/meteor/Bump(atom/A) diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm index 56c52797c0d..16f7a4e0847 100644 --- a/code/game/gamemodes/miniantags/borer/borer.dm +++ b/code/game/gamemodes/miniantags/borer/borer.dm @@ -4,33 +4,33 @@ /mob/living/captive_brain/say(var/message) - if(src.client) + if(client) if(client.prefs.muted & MUTE_IC) to_chat(src, "\red You cannot speak in IC (muted).") return - if(src.client.handle_spam_prevention(message,MUTE_IC)) + if(client.handle_spam_prevention(message,MUTE_IC)) return - if(istype(src.loc,/mob/living/simple_animal/borer)) + if(istype(loc,/mob/living/simple_animal/borer)) message = trim(sanitize(copytext(message, 1, MAX_MESSAGE_LEN))) if(!message) return log_say("[key_name(src)] : [message]") if(stat == DEAD) return say_dead(message) - var/mob/living/simple_animal/borer/B = src.loc + var/mob/living/simple_animal/borer/B = loc to_chat(src, "You whisper silently, \"[message]\"") - to_chat(B.host, "The captive mind of [src] whispers, \"[message]\"") + to_chat(B.host, "The captive mind of [src] whispers, \"[message]\"") for(var/mob/M in mob_list) - if(M.mind && (istype(M, /mob/dead/observer))) + if(M.mind && isobserver(M)) to_chat(M, "Thought-speech, [src] -> [B.truename]: [message]") /mob/living/captive_brain/say_understands(var/mob/other, var/datum/language/speaking = null) - var/mob/living/simple_animal/borer/B = src.loc + var/mob/living/simple_animal/borer/B = loc if(!istype(B)) log_runtime(EXCEPTION("Trapped mind found without a borer!"), src) - return 0 + return FALSE return B.host.say_understands(other, speaking) /mob/living/captive_brain/emote(var/message) @@ -42,20 +42,18 @@ to_chat(src, "You begin doggedly resisting the parasite's control (this will take approximately sixty seconds).") to_chat(B.host, "You feel the captive mind of [src] begin to resist your control.") - spawn(rand(350,450) + B.host.brainloss) + var/delay = (rand(350,450) + B.host.brainloss) + addtimer(src, "return_control", delay) - if(!B || !B.controlling) - return +/mob/living/captive_brain/proc/return_control(mob/living/simple_animal/borer/B) + if(!B || !B.controlling) + return - B.host.adjustBrainLoss(rand(5,10)) - to_chat(src, "With an immense exertion of will, you regain control of your body!") - to_chat(B.host, "You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you.") + B.host.adjustBrainLoss(rand(5,10)) + to_chat(src, "With an immense exertion of will, you regain control of your body!") + to_chat(B.host, "You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you.") - B.detatch() - - verbs -= /mob/living/carbon/proc/release_control - verbs -= /mob/living/carbon/proc/punish_host - verbs -= /mob/living/carbon/proc/spawn_larvae + B.detatch() /mob/living/simple_animal/borer name = "cortical borer" @@ -78,20 +76,83 @@ wander = 0 mob_size = MOB_SIZE_TINY density = 0 - pass_flags = PASSTABLE + pass_flags = PASSTABLE | PASSMOB + mob_size = MOB_SIZE_SMALL + faction = list("creature") ventcrawler = 2 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/talk_inside_host = 0 // So that borers don't accidentally give themselves away on a botched message + minbodytemp = 0 + maxbodytemp = 1500 + var/generation = 1 + var/static/list/borer_names = list( + "Primary", "Secondary", "Tertiary", "Quaternary", "Quinary", "Senary", + "Septenary", "Octonary", "Novenary", "Decenary", "Undenary", "Duodenary", + ) + var/talk_inside_host = FALSE // So that borers don't accidentally give themselves away on a botched message var/used_dominate - var/chemicals = 10 // Chemicals used for reproduction and chemical injection. - var/max_chems = 250 // How many chemicals that can be stored in total - var/mob/living/carbon/human/host // Human host for the brain worm. - var/truename // Name used for brainworm-speak. - var/mob/living/captive_brain/host_brain // Used for swapping control of the body back and forth. - var/controlling // Used in human death check. - var/docile = 0 // Sugar can stop borers from acting. - var/list/borer_injection_chems = list("mannitol","salglu_solution","methamphetamine", "hydrocodone", "spaceacillin", "mitocholide", "charcoal", "salbutamol", "capulettium_plus") + var/chemicals = 10 // Chemicals used for reproduction and chemical injection. + var/max_chems = 250 + var/mob/living/carbon/human/host // Human host for the brain worm. + var/truename // Name used for brainworm-speak. + var/mob/living/captive_brain/host_brain // Used for swapping control of the body back and forth. + var/controlling // Used in human death check. + var/docile = FALSE // Sugar can stop borers from acting. + var/bonding = FALSE + var/leaving = FALSE + var/hiding = FALSE + var/datum/action/innate/borer/talk_to_host/talk_to_host_action = new + var/datum/action/innate/borer/infest_host/infest_host_action = new + var/datum/action/innate/borer/toggle_hide/toggle_hide_action = new + var/datum/action/innate/borer/talk_to_borer/talk_to_borer_action = new + var/datum/action/innate/borer/talk_to_brain/talk_to_brain_action = new + var/datum/action/innate/borer/take_control/take_control_action = new + var/datum/action/innate/borer/give_back_control/give_back_control_action = new + var/datum/action/innate/borer/leave_body/leave_body_action = new + var/datum/action/innate/borer/make_chems/make_chems_action = new + var/datum/action/innate/borer/make_larvae/make_larvae_action = new + var/datum/action/innate/borer/freeze_victim/freeze_victim_action = new + var/datum/action/innate/borer/torment/torment_action = new + +/mob/living/simple_animal/borer/New(atom/newloc, var/gen=1) + ..(newloc) + generation = gen + add_language("Cortical Link") + notify_ghosts("A cortical borer has been created in [get_area(src)]!", enter_link = "(Click to enter)", source = src, action = NOTIFY_ATTACK) + real_name = "Cortical Borer [rand(1000,9999)]" + truename = "[borer_names[min(generation, borer_names.len)]] [rand(1000,9999)]" + GrantBorerActions() + +/mob/living/simple_animal/borer/attack_ghost(mob/user) + if(jobban_isbanned(user, "Syndicate")) + return + if(key) + return + if(stat != CONSCIOUS) + return + var/be_borer = alert("Become a cortical borer? (Warning, You can no longer be cloned!)",,"Yes","No") + if(be_borer == "No" || !src || qdeleted(src)) + return + if(key) + return + transfer_personality(user.client) + +/mob/living/simple_animal/borer/Stat() + ..() + statpanel("Status") + + show_stat_emergency_shuttle_eta() + + if(client.statpanel == "Status") + stat("Chemicals", chemicals) + +/mob/living/simple_animal/borer/say(message) + var/datum/language/dialect = parse_language(message) + if(!dialect) + dialect = get_default_language() + if(!istype(dialect, /datum/language/corticalborer) && loc == host && !talk_inside_host) + to_chat(src, "You've disabled audible speech while inside a host! Re-enable it under the borer tab, or stick to borer communications.") + return + ..() /mob/living/simple_animal/borer/verb/Communicate() set category = "Borer" @@ -107,18 +168,20 @@ return var/input = stripped_input(src, "Please enter a message to tell your host.", "Borer", "") - if(!input) return + if(!input) + return - - var/say_string = (docile) ? "slurs" :"states" - if(host) - to_chat(host, "[src.truename] [say_string]: [input]") - log_say("Borer Communication: [key_name(src)] -> [key_name(host)] : [input]") - for(var/M in dead_mob_list) - if(istype(M, /mob/dead/observer)) - to_chat(M, "Borer Communication from [src.truename] ([ghost_follow_link(src, ghost=M)]): [input]") - to_chat(src, "[src.truename] [say_string]: [input]") - host.verbs += /mob/living/proc/borer_comm + if(src && !qdeleted(src) && !qdeleted(host)) + var/say_string = (docile) ? "slurs" :"states" + if(host) + to_chat(host, "[truename] [say_string]: [input]") + log_say("Borer Communication: [key_name(src)] -> [key_name(host)] : [input]") + for(var/M in dead_mob_list) + if(isobserver(M)) + to_chat(M, "Borer Communication from [truename] ([ghost_follow_link(src, ghost=M)]): [input]") + to_chat(src, "[truename] [say_string]: [input]") + host.verbs += /mob/living/proc/borer_comm + talk_to_borer_action.Grant(host) /mob/living/simple_animal/borer/verb/toggle_silence_inside_host() set name = "Toggle speech inside Host" @@ -126,10 +189,10 @@ set desc = "Toggle whether you will be able to say audible messages while inside your host." if(talk_inside_host) - talk_inside_host = 0 + talk_inside_host = FALSE to_chat(src, "You will no longer talk audibly while inside a host.") else - talk_inside_host = 1 + talk_inside_host = TRUE to_chat(src, "You will now be able to audibly speak from inside of a host.") /mob/living/proc/borer_comm() @@ -138,18 +201,19 @@ set desc = "Communicate mentally with your borer." - var/mob/living/simple_animal/borer/B = src.has_brain_worms() + var/mob/living/simple_animal/borer/B = has_brain_worms() if(!B) return var/input = stripped_input(src, "Please enter a message to tell the borer.", "Message", "") - if(!input) return + if(!input) + return to_chat(B, "[src] says: [input]") log_say("Borer Communication: [key_name(src)] -> [key_name(B)] : [input]") for(var/M in dead_mob_list) - if(istype(M, /mob/dead/observer)) + if(isobserver(M)) to_chat(M, "Borer Communication from [src] ([ghost_follow_link(src, ghost=M)]): [input]") to_chat(src, "[src] says: [input]") @@ -159,18 +223,19 @@ set desc = "Communicate mentally with the trapped mind of your host." - var/mob/living/simple_animal/borer/B = src.has_brain_worms() + var/mob/living/simple_animal/borer/B = has_brain_worms() if(!B || !B.host_brain) return var/mob/living/captive_brain/CB = B.host_brain var/input = stripped_input(src, "Please enter a message to tell the trapped mind.", "Message", "") - if(!input) return + if(!input) + return to_chat(CB, "[B.truename] says: [input]") log_say("Borer Communication: [key_name(B)] -> [key_name(CB)] : [input]") for(var/M in dead_mob_list) - if(istype(M, /mob/dead/observer)) + if(isobserver(M)) to_chat(M, "Borer Communication from [B] ([ghost_follow_link(src, ghost=M)]): [input]") to_chat(src, "[B.truename] says: [input]") @@ -188,14 +253,14 @@ to_chat(host, "\blue You feel the soporific flow of sugar in your host's blood, lulling you into docility.") else to_chat(src, "\blue You feel the soporific flow of sugar in your host's blood, lulling you into docility.") - docile = 1 + docile = TRUE else if(docile) if(controlling) to_chat(host, "\blue You shake off your lethargy as the sugar leaves your host's blood.") else to_chat(src, "\blue You shake off your lethargy as the sugar leaves your host's blood.") - docile = 0 + docile = FALSE if(chemicals < max_chems) chemicals++ @@ -218,36 +283,193 @@ else return ..() -/mob/living/simple_animal/borer/New(var/by_gamemode=0) +/mob/living/simple_animal/borer/UnarmedAttack(mob/living/M) + chemscan(usr, M) + return + +/mob/living/simple_animal/borer/verb/infest() + set category = "Borer" + set name = "Infest" + set desc = "Infest a suitable humanoid host." + + if(host) + to_chat(src, "You are already within a host.") + return + + if(stat) + to_chat(src, "You cannot infest a target in your current state.") + return + + var/list/choices = list() + for(var/mob/living/carbon/human/H in view(1,src)) + var/obj/item/organ/external/head/head = H.get_organ("head") + if(head.status & ORGAN_ROBOT) + continue + if(H.stat != DEAD && Adjacent(H) && !H.has_brain_worms()) + choices += H + + var/mob/living/carbon/human/M = input(src,"Who do you wish to infest?") in null|choices + + if(!M || !src) + return + + if(!Adjacent(M)) + return + + if(M.has_brain_worms()) + to_chat(src, "You cannot infest someone who is already infested!") + return + + to_chat(src, "You slither up [M] and begin probing at their ear canal...") + + if(!do_after(src,50, target = M)) + to_chat(src, "As [M] moves away, you are dislodged and fall to the ground.") + return + + if(!M || !src) + return + + if(stat) + to_chat(src, "You cannot infest a target in your current state.") + return + + if(M.stat == DEAD) + to_chat(src, "That is not an appropriate target.") + return + + if(M in view(1, src)) + to_chat(src, "You wiggle into [M]'s ear.") + /* + if(!M.stat) + to_chat(M, "Something disgusting and slimy wiggles into your ear!") + */ // Let's see how stealthborers work out + + perform_infestation(M) + + return + else + to_chat(src, "They are no longer in range!") + return + +/mob/living/simple_animal/borer/proc/perform_infestation(var/mob/living/carbon/M) + if(!M) + return + + if(M.has_brain_worms()) + to_chat(src, "[M] is already infested!") + return + 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() + GrantInfestActions() + +/mob/living/simple_animal/borer/verb/secrete_chemicals() + set category = "Borer" + set name = "Secrete Chemicals" + set desc = "Push some chemicals into your host's bloodstream." + + if(!host) + to_chat(src, "You are not inside a host body.") + return + + if(stat) + to_chat(src, "You cannot secrete chemicals in your current state.") + + if(docile) + to_chat(src, " You are feeling far too docile to do that.") + return + + var content = "" + + content += "" + + for(var/datum in typesof(/datum/borer_chem)) + var/datum/borer_chem/C = datum + var/cname = initial(C.chemname) + var/datum/reagent/R = chemical_reagents_list[cname] + if(cname) + content += "" + + content += "
    [R.name] ([initial(C.chemuse)])

    [initial(C.chemdesc)]

    " + + var/html = get_html_template(content) + + usr << browse(null, "window=ViewBorer[UID()]Chems;size=585x400") + usr << browse(html, "window=ViewBorer[UID()]Chems;size=585x400") + + return + +/mob/living/simple_animal/borer/Topic(href, href_list, hsrc) + if(href_list["ghostjoin"]) + var/mob/dead/observer/ghost = usr + if(istype(ghost)) + attack_ghost(ghost) + if(href_list["borer_use_chem"]) + locate(href_list["src"]) + if(!istype(src, /mob/living/simple_animal/borer)) + return + + var/topic_chem = href_list["borer_use_chem"] + var/datum/borer_chem/C = null + + for(var/datum in typesof(/datum/borer_chem)) + var/datum/borer_chem/test = datum + if(initial(test.chemname) == topic_chem) + C = new test() + break + + if(!C || !host || controlling || !src || stat) + return + var/datum/reagent/R = chemical_reagents_list[C.chemname] + if(chemicals < C.chemuse) + to_chat(src, "You need [C.chemuse] chemicals stored to secrete [R.name]!") + return + + to_chat(src, "You squirt a measure of [R.name] from your reservoirs into [host]'s bloodstream.") + host.reagents.add_reagent(C.chemname, C.quantity) + chemicals -= C.chemuse + log_game("[src]/([src.ckey]) has injected [R.name] into their host [host]/([host.ckey])") + + // This is used because we use a static set of datums to determine what chems are available, + // instead of a table or something. Thus, when we instance it, we can safely delete it + qdel(C) ..() - add_language("Cortical Link") - updatename() - if(!by_gamemode) - request_player() +/mob/living/simple_animal/borer/verb/hide_borer() + set category = "Borer" + set name = "Hide" + set desc = "Become invisible to the common eye." -/mob/living/simple_animal/borer/proc/updatename() - var/index_num = rand(1000,9999) - real_name = "Cortical Borer ([index_num])" - truename = "[pick("Primary","Secondary","Tertiary","Quaternary")] [index_num]" + if(host) + to_chat(usr, "You cannot do this while you're inside a host.") + return -/mob/living/simple_animal/borer/Stat() - ..() - statpanel("Status") + if(stat != CONSCIOUS) + return - show_stat_emergency_shuttle_eta() - - if(client.statpanel == "Status") - stat("Chemicals", chemicals) - -// VERBS! + if(!hiding) + layer = TURF_LAYER+0.2 + to_chat(src, "\green You are now hiding.") + hiding = TRUE + else + layer = MOB_LAYER + to_chat(src, "\green You stop hiding.") + hiding = FALSE /mob/living/simple_animal/borer/verb/dominate_victim() set category = "Borer" set name = "Dominate Victim" set desc = "Freeze the limbs of a potential host with supernatural fear." - if(world.time - used_dominate < 300) + if(world.time - used_dominate < 150) to_chat(src, "You cannot use that ability again so soon.") return @@ -255,7 +477,7 @@ to_chat(src, "You cannot do that from within a host body.") return - if(src.stat) + if(stat) to_chat(src, "You cannot do that in your current state.") return @@ -270,10 +492,11 @@ var/mob/living/carbon/M = input(src,"Who do you wish to dominate?") in null|choices - if(!M || !src) return + if(!M || !src) + return if(M.has_brain_worms()) - to_chat(src, "You cannot infest someone who is already infested!") + to_chat(src, "You cannot dominate someone who is already infested!") return to_chat(src, "\red You focus your psychic lance on [M] and freeze their limbs with a wave of terrible dread.") @@ -282,125 +505,6 @@ used_dominate = world.time -/mob/living/simple_animal/borer/verb/bond_brain() - set category = "Borer" - set name = "Assume Control" - set desc = "Fully connect to the brain of your host." - - if(!host) - to_chat(src, "You are not inside a host body.") - return - - if(host.stat == DEAD) - to_chat(src, "This host is in no condition to be controlled.") - return - - if(src.stat) - to_chat(src, "You cannot do that in your current state.") - return - - if(docile) - to_chat(src, "\blue You are feeling far too docile to do that.") - return - - to_chat(src, "You begin delicately adjusting your connection to the host brain...") - - spawn(300+(host.getBrainLoss()*5)) - - if(!host || !src || controlling) - return - else - to_chat(src, "You plunge your probosci deep into the cortex of the host brain, interfacing directly with their nervous system.") - to_chat(host, "You feel a strange shifting sensation behind your eyes as an alien consciousness displaces yours.") - var/borer_key = src.key - host.create_attack_log("[key_name(src)] has assumed control of [key_name(host)]") - msg_admin_attack("[key_name_admin(src)] has assumed control of [key_name_admin(host)]") - // host -> brain - var/h2b_id = host.computer_id - var/h2b_ip= host.lastKnownIP - host.computer_id = null - host.lastKnownIP = null - - qdel(host_brain) - host_brain = new(src) - - host_brain.ckey = host.ckey - - host_brain.name = host.name - - if(!host_brain.computer_id) - host_brain.computer_id = h2b_id - - if(!host_brain.lastKnownIP) - host_brain.lastKnownIP = h2b_ip - - // self -> host - var/s2h_id = src.computer_id - var/s2h_ip= src.lastKnownIP - src.computer_id = null - src.lastKnownIP = null - - host.ckey = src.ckey - - if(!host.computer_id) - host.computer_id = s2h_id - - if(!host.lastKnownIP) - host.lastKnownIP = s2h_ip - - controlling = 1 - - host.verbs += /mob/living/carbon/proc/release_control - host.verbs += /mob/living/carbon/proc/punish_host - host.verbs += /mob/living/carbon/proc/spawn_larvae - host.verbs -= /mob/living/proc/borer_comm - host.verbs += /mob/living/proc/trapped_mind_comm - - if(src && !src.key) - src.key = "@[borer_key]" - return - -/mob/living/simple_animal/borer/verb/secrete_chemicals() - set category = "Borer" - set name = "Secrete Chemicals (30)" - set desc = "Push some chemicals into your host's bloodstream." - - var/injection_amount = 9 - var/chem_cost = 30 - if(!host) - to_chat(src, "You are not inside a host body.") - return - - if(stat) - to_chat(src, "You cannot secrete chemicals in your current state.") - - if(docile) - to_chat(src, "\blue You are feeling far too docile to do that.") - return - - if(chemicals < chem_cost) - to_chat(src, "You don't have enough chemicals!") - - var/list/nice_name_chem_list = list() - for(var/rgnt in borer_injection_chems) - var/datum/reagent/R2 = chemical_reagents_list[rgnt] - nice_name_chem_list[R2.name] = rgnt - var/chem_name = input("Select a chemical to secrete.", "Chemicals") as null|anything in nice_name_chem_list - var/chem = nice_name_chem_list[chem_name] - - if(!chem || chemicals < chem_cost || !host || controlling || !src || stat) //Sanity check. - return - - var/chem_amount = host.reagents.get_reagent_amount(chem) - var/datum/reagent/R = chemical_reagents_list[chem] - if(R.overdose_threshold && chem_amount + injection_amount > R.overdose_threshold) - to_chat(src, "Doing so would cause grievous harm to your host, reducing ability to reproduce. Aborting.") - return - - to_chat(src, "You squirt a measure of [chem_name] from your reservoirs into [host]'s bloodstream.") - host.reagents.add_reagent(chem, injection_amount) - chemicals -= chem_cost - /mob/living/simple_animal/borer/verb/release_host() set category = "Borer" set name = "Release Host" @@ -418,34 +522,235 @@ to_chat(src, "\blue You are feeling far too docile to do that.") return - if(!host || !src) return + if(!host || !src) + return + + if(leaving) + leaving = FALSE + to_chat(src, "You decide against leaving your host.") + return to_chat(src, "You begin disconnecting from [host]'s synapses and prodding at their internal ear canal.") - spawn(200) + leaving = TRUE - if(!host || !src) return + addtimer(src, "let_go", 200) - if(src.stat) - to_chat(src, "You cannot release a target in your current state.") - return +/mob/living/simple_animal/borer/proc/let_go() - to_chat(src, "You wiggle out of [host]'s ear and plop to the ground.") + if(!host || !src || qdeleted(host) || qdeleted(src)) + return + if(!leaving) + return + if(controlling) + return + if(stat) + to_chat(src, "You cannot release a target in your current state.") + return + to_chat(src, "You wiggle out of [host]'s ear and plop to the ground.") + + leaving = FALSE + leave_host() + +/mob/living/simple_animal/borer/proc/leave_host() + + if(!host) + return + if(controlling) detatch() - leave_host() + GrantBorerActions() + RemoveInfestActions() + forceMove(get_turf(host)) + + reset_perspective(null) + machine = null + + host.reset_perspective(null) + host.machine = null + + var/mob/living/H = host + H.verbs -= /mob/living/proc/borer_comm + talk_to_borer_action.Remove(host) + H.status_flags &= ~PASSEMOTES + host = null + return + +/mob/living/simple_animal/borer/verb/bond_brain() + set category = "Borer" + set name = "Assume Control" + set desc = "Fully connect to the brain of your host." + + if(!host) + to_chat(src, "You are not inside a host body.") + return + + if(host.stat == DEAD) + to_chat(src, "This host is in no condition to be controlled.") + return + + if(stat) + to_chat(src, "You cannot do that in your current state.") + return + + if(docile) + to_chat(src, "\blue You are feeling far too docile to do that.") + return + + if(bonding) + bonding = FALSE + to_chat(src, "You stop attempting to take control of your host.") + return + + to_chat(src, "You begin delicately adjusting your connection to the host brain...") + + if(qdeleted(src) || qdeleted(host)) + return + + bonding = TRUE + + var/delay = 300+(host.getBrainLoss()*5) + addtimer(src, "assume_control", delay) + +/mob/living/simple_animal/borer/proc/assume_control() + if(!host || !src || controlling) + return + if(!bonding) + return + if(docile) + to_chat(src,"You are feeling far too docile to do that.") + return + else + to_chat(src, "You plunge your probosci deep into the cortex of the host brain, interfacing directly with their nervous system.") + to_chat(host, "You feel a strange shifting sensation behind your eyes as an alien consciousness displaces yours.") + var/borer_key = src.key + host.create_attack_log("[key_name(src)] has assumed control of [key_name(host)]") + msg_admin_attack("[key_name_admin(src)] has assumed control of [key_name_admin(host)]") + // host -> brain + var/h2b_id = host.computer_id + var/h2b_ip= host.lastKnownIP + host.computer_id = null + host.lastKnownIP = null + + qdel(host_brain) + host_brain = new(src) + + host_brain.ckey = host.ckey + + host_brain.name = host.name + + if(!host_brain.computer_id) + host_brain.computer_id = h2b_id + + if(!host_brain.lastKnownIP) + host_brain.lastKnownIP = h2b_ip + + // self -> host + var/s2h_id = src.computer_id + var/s2h_ip= src.lastKnownIP + src.computer_id = null + src.lastKnownIP = null + + host.ckey = src.ckey + + if(!host.computer_id) + host.computer_id = s2h_id + + if(!host.lastKnownIP) + host.lastKnownIP = s2h_ip + + bonding = FALSE + controlling = TRUE + + host.verbs += /mob/living/carbon/proc/release_control + host.verbs += /mob/living/carbon/proc/punish_host + host.verbs += /mob/living/carbon/proc/spawn_larvae + host.verbs -= /mob/living/proc/borer_comm + host.verbs += /mob/living/proc/trapped_mind_comm + + GrantControlActions() + talk_to_borer_action.Remove(host) + host.med_hud_set_status() + + if(src && !src.key) + src.key = "@[borer_key]" + return + +/mob/living/carbon/proc/punish_host() + set category = "Borer" + set name = "Torment Host" + set desc = "Punish your host with agony." + + var/mob/living/simple_animal/borer/B = has_brain_worms() + + if(!B) + return + + if(B.host_brain) + to_chat(src, "You send a punishing spike of psychic agony lancing into your host's brain.") + to_chat(B.host_brain, "Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!") + +//Brain slug proc for voluntary removal of control. +/mob/living/carbon/proc/release_control() + + set category = "Borer" + set name = "Release Control" + set desc = "Release control of your host's body." + + var/mob/living/simple_animal/borer/B = has_brain_worms() + + if(B && B.host_brain) + to_chat(src, "You withdraw your probosci, releasing control of [B.host_brain]") + + B.detatch() + + else + log_runtime(EXCEPTION("Missing borer or missing host brain upon borer release."), src) + +//Check for brain worms in head. +/mob/proc/has_brain_worms() + + for(var/I in contents) + if(istype(I,/mob/living/simple_animal/borer)) + return I + + return FALSE + +/mob/living/carbon/proc/spawn_larvae() + set category = "Borer" + set name = "Reproduce" + set desc = "Spawn several young." + + var/mob/living/simple_animal/borer/B = has_brain_worms() + + if(!B) + return + + if(B.chemicals >= 100) + to_chat(src, "Your host twitches and quivers as you rapdly excrete several larvae from your sluglike body.") + visible_message("[src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!") + B.chemicals -= 100 + + new /obj/effect/decal/cleanable/vomit(get_turf(src)) + playsound(loc, 'sound/effects/splat.ogg', 50, 1) + new /mob/living/simple_animal/borer(get_turf(src),B.generation + 1) + + else + to_chat(src, "You need 100 chemicals to reproduce!") + return /mob/living/simple_animal/borer/proc/detatch() - if(!host) return + if(!host || !controlling) + return - if(istype(host,/mob/living/carbon/human)) + 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 - controlling = 0 - reset_perspective(null) machine = null @@ -455,10 +760,13 @@ host.verbs += /mob/living/proc/borer_comm host.verbs -= /mob/living/proc/trapped_mind_comm + RemoveControlActions() + talk_to_borer_action.Grant(host) + host.med_hud_set_status() if(host_brain) - host.create_attack_log("[host_brain.name] ([host_brain.ckey]) has taken control back from [src.name] ([host.ckey])") - msg_admin_attack("[host_brain.name] ([host_brain.ckey]) has taken control back from [src.name] ([host.ckey]) (JMP)") + host.create_attack_log("[host_brain.name] ([host_brain.ckey]) has taken control back from [name] ([host.ckey])") + msg_admin_attack("[host_brain.name] ([host_brain.ckey]) has taken control back from [name] ([host.ckey]) (JMP)") // host -> self var/h2s_id = host.computer_id var/h2s_ip= host.lastKnownIP @@ -491,213 +799,179 @@ return - -//Brain slug proc for voluntary removal of control. -/mob/living/carbon/proc/release_control() - - set category = "Borer" - set name = "Release Control" - set desc = "Release control of your host's body." - - var/mob/living/simple_animal/borer/B = has_brain_worms() - - if(B && B.host_brain) - to_chat(src, "You withdraw your probosci, releasing control of [B.host_brain]") - - B.detatch() - - else - to_chat(src, "ERROR NO BORER OR BRAINMOB DETECTED IN THIS MOB, THIS IS A BUG !") - -//Brain slug proc for tormenting the host. -/mob/living/carbon/proc/punish_host() - set category = "Borer" - set name = "Torment host" - set desc = "Punish your host with agony." - - var/mob/living/simple_animal/borer/B = has_brain_worms() - - if(!B) - return - - if(B.host_brain.ckey) - to_chat(src, "You send a punishing spike of psychic agony lancing into your host's brain.") - to_chat(B.host_brain, "Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!") - -//Check for brain worms in head. -/mob/proc/has_brain_worms() - - for(var/I in contents) - if(istype(I,/mob/living/simple_animal/borer)) - return I - - return 0 - -/mob/living/carbon/proc/spawn_larvae() - set category = "Borer" - set name = "Reproduce (100)" - set desc = "Spawn several young." - - var/mob/living/simple_animal/borer/B = has_brain_worms() - - if(!B) - return - - if(B.chemicals >= 100) - to_chat(src, "Your host twitches and quivers as you rapdly excrete several larvae from your sluglike body.") - visible_message("[src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!") - B.chemicals -= 100 - - new /obj/effect/decal/cleanable/vomit(get_turf(src)) - playsound(loc, 'sound/effects/splat.ogg', 50, 1) - new /mob/living/simple_animal/borer(get_turf(src)) - - else - to_chat(src, "You do not have enough chemicals stored to reproduce.") - return - -/mob/living/simple_animal/borer/proc/leave_host() - - if(!host) return - - src.forceMove(get_turf(host)) - - reset_perspective(null) - machine = null - - host.reset_perspective(null) - host.machine = null - - var/mob/living/H = host - H.verbs -= /mob/living/proc/borer_comm - H.status_flags &= ~PASSEMOTES - host = null - return - -/mob/living/simple_animal/borer/verb/infest() - set category = "Borer" - set name = "Infest" - set desc = "Infest a suitable humanoid host." - - if(host) - to_chat(src, "You are already within a host.") - return - - if(stat) - to_chat(src, "You cannot infest a target in your current state.") - return - - var/list/choices = list() - for(var/mob/living/carbon/human/H in view(1,src)) - var/obj/item/organ/external/head/head = H.get_organ("head") - if(head.status & ORGAN_ROBOT) - continue - if(H.stat != DEAD && src.Adjacent(H) && !H.has_brain_worms()) - choices += H - - var/mob/living/carbon/human/M = input(src,"Who do you wish to infest?") in null|choices - - if(!M || !src) return - - if(!(src.Adjacent(M))) return - - if(M.has_brain_worms()) - to_chat(src, "You cannot infest someone who is already infested!") - return - - to_chat(src, "You slither up [M] and begin probing at their ear canal...") - - if(!do_after(src,50, target = M)) - to_chat(src, "As [M] moves away, you are dislodged and fall to the ground.") - return - - if(!M || !src) return - - if(src.stat) - to_chat(src, "You cannot infest a target in your current state.") - return - - if(M.stat == DEAD) - to_chat(src, "That is not an appropriate target.") - return - - if(M in view(1, src)) - to_chat(src, "You wiggle into [M]'s ear.") - /* - if(!M.stat) - to_chat(M, "Something disgusting and slimy wiggles into your ear!") - */ // Let's see how stealthborers work out - - perform_infestation(M) - - return - else - to_chat(src, "They are no longer in range!") - return - -/mob/living/simple_animal/borer/proc/perform_infestation(var/mob/living/carbon/M) - src.host = M - src.forceMove(M) - - if(istype(M,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - var/obj/item/organ/external/head = H.get_organ("head") - head.implants += src - - host.status_flags |= PASSEMOTES - /mob/living/simple_animal/borer/can_use_vents() return -//Procs for grabbing players. -/mob/living/simple_animal/borer/proc/request_player() - for(var/mob/O in respawnable_list) - if(jobban_isbanned(O, "Syndicate")) - continue - if(O.client) - if((ROLE_BORER in O.client.prefs.be_special) && !jobban_isbanned(O, ROLE_BORER)) - question(O.client) - -/mob/living/simple_animal/borer/proc/question(var/client/C) - spawn(0) - if(!C) return - var/response = alert(C, "A cortical borer needs a player. Are you interested?", "Cortical borer request", "Yes", "No", "Never for this round") - if(!C || ckey) - return - if(response == "Yes") - transfer_personality(C) - else if(response == "Never for this round") - C.prefs.be_special -= ROLE_BORER - /mob/living/simple_animal/borer/proc/transfer_personality(var/client/candidate) - if(!candidate) + if(!candidate || !candidate.mob) return - src.key = candidate.key - if(src.mind) - src.mind.assigned_role = "Cortical Borer" + if(!qdeleted(candidate) || !qdeleted(candidate.mob)) + var/datum/mind/M = create_borer_mind(candidate.ckey) + M.transfer_to(src) + candidate.mob = src + ckey = candidate.ckey + to_chat(src, "You are a cortical borer!") + to_chat(src, "You are a brain slug that worms its way into the head of its victim. Use stealth, persuasion and your powers of mind control to keep you, your host and your eventual spawn safe and warm.") + to_chat(src, "Sugar nullifies your abilities, avoid it at all costs!") + to_chat(src, "You can speak to your fellow borers by prefixing your messages with ':x'. Check out your Borer tab to see your abilities.") -/mob/living/simple_animal/borer/verb/borerhide() - set category = "Borer" - set name = "Hide" - set desc = "Allows to hide beneath tables or certain items. Toggled on or off." +/proc/create_borer_mind(key) + var/datum/mind/M = new /datum/mind(key) + M.assigned_role = "Cortical Borer" + M.special_role = "Cortical Borer" + return M - if(stat != CONSCIOUS) - return +/mob/living/simple_animal/borer/proc/GrantBorerActions() + infest_host_action.Grant(src) + toggle_hide_action.Grant(src) + freeze_victim_action.Grant(src) - if(layer != TURF_LAYER+0.2) - layer = TURF_LAYER+0.2 - to_chat(src, "\green You are now hiding.") - else - layer = MOB_LAYER - to_chat(src, "\green You have stopped hiding.") +/mob/living/simple_animal/borer/proc/RemoveBorerActions() + infest_host_action.Remove(src) + toggle_hide_action.Remove(src) + freeze_victim_action.Remove(src) -/mob/living/simple_animal/borer/say(var/message) - var/datum/language/dialect = parse_language(message) - if(!dialect) - dialect = get_default_language() - if(!istype(dialect, /datum/language/corticalborer) && loc == host && !talk_inside_host) - to_chat(src, "You've disabled audible speech while inside a host! Re-enable it under the borer tab, or stick to borer communications.") - return - ..() +/mob/living/simple_animal/borer/proc/GrantInfestActions() + talk_to_host_action.Grant(src) + leave_body_action.Grant(src) + take_control_action.Grant(src) + make_chems_action.Grant(src) + +/mob/living/simple_animal/borer/proc/RemoveInfestActions() + talk_to_host_action.Remove(src) + take_control_action.Remove(src) + leave_body_action.Remove(src) + make_chems_action.Remove(src) + +/mob/living/simple_animal/borer/proc/GrantControlActions() + talk_to_brain_action.Grant(host) + give_back_control_action.Grant(host) + make_larvae_action.Grant(host) + torment_action.Grant(host) + +/mob/living/simple_animal/borer/proc/RemoveControlActions() + talk_to_brain_action.Remove(host) + make_larvae_action.Remove(host) + give_back_control_action.Remove(host) + torment_action.Remove(host) + +/datum/action/innate/borer + background_icon_state = "bg_alien" + +/datum/action/innate/borer/talk_to_host + name = "Converse with Host" + desc = "Send a silent message to your host." + button_icon_state = "alien_whisper" + +/datum/action/innate/borer/talk_to_host/Activate() + var/mob/living/simple_animal/borer/B = owner + B.Communicate() + +/datum/action/innate/borer/infest_host + name = "Infest" + desc = "Infest a suitable humanoid host." + button_icon_state = "infest" + +/datum/action/innate/borer/infest_host/Activate() + var/mob/living/simple_animal/borer/B = owner + B.infest() + +/datum/action/innate/borer/toggle_hide + name = "Toggle Hide" + desc = "Become invisible to the common eye. Toggled on or off." + button_icon_state = "borer_hiding_false" + +/datum/action/innate/borer/toggle_hide/Activate() + var/mob/living/simple_animal/borer/B = owner + B.hide_borer() + button_icon_state = "borer_hiding_[B.hiding ? "true" : "false"]" + UpdateButtonIcon() + +/datum/action/innate/borer/talk_to_borer + name = "Converse with Borer" + desc = "Communicate mentally with your borer." + button_icon_state = "alien_whisper" + +/datum/action/innate/borer/talk_to_borer/Activate() + var/mob/living/simple_animal/borer/B = owner.has_brain_worms() + B.host = owner + B.host.borer_comm() + +/datum/action/innate/borer/talk_to_brain + name = "Converse with Trapped Mind" + desc = "Communicate mentally with the trapped mind of your host." + button_icon_state = "alien_whisper" + +/datum/action/innate/borer/talk_to_brain/Activate() + var/mob/living/simple_animal/borer/B = owner.has_brain_worms() + B.host = owner + B.host.trapped_mind_comm() + +/datum/action/innate/borer/take_control + name = "Assume Control" + desc = "Fully connect to the brain of your host." + button_icon_state = "borer_brain" + +/datum/action/innate/borer/take_control/Activate() + var/mob/living/simple_animal/borer/B = owner + B.bond_brain() + +/datum/action/innate/borer/give_back_control + name = "Release Control" + desc = "Release control of your host's body." + button_icon_state = "borer_leave" + +/datum/action/innate/borer/give_back_control/Activate() + var/mob/living/simple_animal/borer/B = owner.has_brain_worms() + B.host = owner + B.host.release_control() + +/datum/action/innate/borer/leave_body + name = "Release Host" + desc = "Slither out of your host." + button_icon_state = "borer_leave" + +/datum/action/innate/borer/leave_body/Activate() + var/mob/living/simple_animal/borer/B = owner + B.release_host() + +/datum/action/innate/borer/make_chems + name = "Secrete Chemicals" + desc = "Push some chemicals into your host's bloodstream." + icon_icon = 'icons/obj/chemical.dmi' + button_icon_state = "minidispenser" + +/datum/action/innate/borer/make_chems/Activate() + var/mob/living/simple_animal/borer/B = owner + B.secrete_chemicals() + +/datum/action/innate/borer/make_larvae + name = "Reproduce" + desc = "Spawn several young." + button_icon_state = "borer_reproduce" + +/datum/action/innate/borer/make_larvae/Activate() + var/mob/living/simple_animal/borer/B = owner.has_brain_worms() + B.host = owner + B.host.spawn_larvae() + +/datum/action/innate/borer/freeze_victim + name = "Dominate Victim" + desc = "Freeze the limbs of a potential host with supernatural fear." + button_icon_state = "genetic_cryo" + +/datum/action/innate/borer/freeze_victim/Activate() + var/mob/living/simple_animal/borer/B = owner + B.dominate_victim() + +/datum/action/innate/borer/torment + name = "Torment Host" + desc = "Punish your host with agony." + button_icon_state = "blind" + +/datum/action/innate/borer/torment/Activate() + var/mob/living/simple_animal/borer/B = owner.has_brain_worms() + B.host = owner + B.host.punish_host() diff --git a/code/game/gamemodes/miniantags/borer/borer_chemicals.dm b/code/game/gamemodes/miniantags/borer/borer_chemicals.dm new file mode 100644 index 00000000000..4176ca15e73 --- /dev/null +++ b/code/game/gamemodes/miniantags/borer/borer_chemicals.dm @@ -0,0 +1,51 @@ +/datum/borer_chem + var/chemname + var/chemdesc = "This is a chemical" + var/chemuse = 30 + var/quantity = 10 + +/datum/borer_chem/capulettium_plus + chemname = "capulettium_plus" + chemdesc = "Silences and masks pulse." + +/datum/borer_chem/charcoal + chemname = "charcoal" + chemdesc = "Slowly heals toxin damage, also slowly removes other chemicals." + +/datum/borer_chem/epinephrine + chemname = "epinephrine" + chemdesc = "Stabilizes critical condition and slowly heals suffocation damage." + +/datum/borer_chem/fliptonium + chemname = "fliptonium" + chemdesc = "Causes uncontrollable flipping." + chemuse = 50 + +/datum/borer_chem/hydrocodone + chemname = "hydrocodone" + chemdesc = "An extremely strong painkiller." + +/datum/borer_chem/mannitol + chemname = "mannitol" + chemdesc = "Heals brain damage." + +/datum/borer_chem/methamphetamine + chemname = "methamphetamine" + chemdesc = "Reduces stun times and increases stamina. Deals small amounts of brain damage." + chemuse = 50 + +/datum/borer_chem/mitocholide + chemname = "mitocholide" + chemdesc = "Heals internal organ damage." + +/datum/borer_chem/salbutamol + chemname = "salbutamol" + chemdesc = "Heals suffocation damage." + +/datum/borer_chem/salglu_solution + chemname = "salglu_solution" + chemdesc = "Slowly heals brute and burn damage, also slowly restores blood." + +/datum/borer_chem/spaceacillin + chemname = "spaceacillin" + chemdesc = "Slows progression of diseases and fights infections." diff --git a/code/game/gamemodes/miniantags/borer/borer_event.dm b/code/game/gamemodes/miniantags/borer/borer_event.dm index b0df1749403..f925a59d9fc 100644 --- a/code/game/gamemodes/miniantags/borer/borer_event.dm +++ b/code/game/gamemodes/miniantags/borer/borer_event.dm @@ -4,11 +4,11 @@ announceWhen = 400 var/spawncount = 5 - var/successSpawn = 0 //So we don't make a command report if nothing gets spawned. + var/successSpawn = FALSE //So we don't make a command report if nothing gets spawned. /datum/event/borer_infestation/setup() announceWhen = rand(announceWhen, announceWhen + 50) - spawncount = rand(1, 3) + spawncount = rand(2, 3) /datum/event/borer_infestation/announce() if(successSpawn) @@ -22,14 +22,8 @@ if(temp_vent.parent.other_atmosmch.len > 50) vents += temp_vent - spawn(0) - var/list/candidates = pollCandidates("Do you want to play as a cortical borer?", ROLE_BORER, 1) - while(spawncount > 0 && vents.len && candidates.len) - var/obj/vent = pick_n_take(vents) - var/mob/C = pick_n_take(candidates) - - var/mob/living/simple_animal/borer/new_borer = new(vent.loc) - new_borer.key = C.key - - spawncount-- - successSpawn = 1 + while(spawncount >= 1 && vents.len) + var/obj/vent = pick_n_take(vents) + new /mob/living/simple_animal/borer(vent.loc) + successSpawn = TRUE + spawncount-- diff --git a/code/game/gamemodes/miniantags/borer/borer_html.dm b/code/game/gamemodes/miniantags/borer/borer_html.dm new file mode 100644 index 00000000000..415438884e9 --- /dev/null +++ b/code/game/gamemodes/miniantags/borer/borer_html.dm @@ -0,0 +1,69 @@ +/mob/living/simple_animal/borer/proc/get_html_template(content) + var/html = {" + + + Borer Chemicals + + + + + + +
    + [content] +
    "} + return html \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm index d93bc601f89..7a16ef17857 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm @@ -1,26 +1,14 @@ /datum/event/spawn_swarmer - //name = "Sawrmer Spawn" - //one_shot = 1 startWhen = 3 //30 minutes announceWhen = 10 - /datum/event/spawn_swarmer/announce() if(prob(25)) //25% chance to announce it to the crew var/swarmer_report = "[command_name()] High-Priority Update
    " swarmer_report += "

    Our long-range sensors have detected an odd signal emanating from your station's gateway. We recommend immediate investigation of your gateway, as something may have come \ through." - for(var/obj/machinery/computer/communications/C in machines) - if(! (C.stat & (BROKEN|NOPOWER) ) ) - var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc ) - P.name = "'Classified [command_name()] Update'" - P.info = swarmer_report - P.update_icon() - C.messagetitle.Add("Classified [command_name()] Update") - C.messagetext.Add(P.info) - command_announcement.Announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/AI/commandreport.ogg') - - + print_command_report(swarmer_report, "Classified [command_name()] Update") + event_announcement.Announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/AI/commandreport.ogg') /datum/event/spawn_swarmer/start() if(find_swarmer()) diff --git a/code/game/gamemodes/nuclear/nuclear_challenge.dm b/code/game/gamemodes/nuclear/nuclear_challenge.dm index 089e91cdbec..5ce318bf273 100644 --- a/code/game/gamemodes/nuclear/nuclear_challenge.dm +++ b/code/game/gamemodes/nuclear/nuclear_challenge.dm @@ -1,5 +1,5 @@ #define CHALLENGE_TIME_LIMIT 6000 -#define MIN_CHALLENGE_PLAYERS 50 +#define CHALLENGE_MIN_PLAYERS 50 #define CHALLENGE_SHUTTLE_DELAY 15000 //25 minutes, so the ops have at least 5 minutes before the shuttle is callable. /obj/item/device/nuclear_challenge @@ -9,33 +9,42 @@ desc = "Use to send a declaration of hostilities to the target, delaying your shuttle departure for 20 minutes while they prepare for your assault. \ Such a brazen move will attract the attention of powerful benefactors within the Syndicate, who will supply your team with a massive amount of bonus telecrystals. \ Must be used within five minutes, or your benefactors will lose interest." - var/declaring_war = 0 - - + var/declaring_war = FALSE /obj/item/device/nuclear_challenge/attack_self(mob/living/user) - if(declaring_war) - return - if(player_list.len < MIN_CHALLENGE_PLAYERS) - to_chat(user, "The enemy crew is too small to be worth declaring war on.") - return - if(!is_admin_level(user.z)) - to_chat(user, "You have to be at your base to use this.") + if(!check_allowed(user)) return - if(world.time > CHALLENGE_TIME_LIMIT) - to_chat(user, "It's too late to declare hostilities. Your benefactors are already busy with other schemes. You'll have to make do with what you have on hand.") + declaring_war = TRUE + var/are_you_sure = alert(user, "Consult your team carefully before you declare war on [station_name()]]. Are you sure you want to alert the enemy crew? You have [-round((world.time-round_start_time - CHALLENGE_TIME_LIMIT)/10)] seconds to decide.", "Declare war?", "Yes", "No") + declaring_war = FALSE + + if(!check_allowed(user)) return - declaring_war = 1 - var/are_you_sure = alert(user, "Consult your team carefully before you declare war on [station_name()]]. Are you sure you want to alert the enemy crew?", "Declare war?", "Yes", "No") if(are_you_sure == "No") to_chat(user, "On second thought, the element of surprise isn't so bad after all.") - declaring_war = 0 return var/war_declaration = "[user.real_name] has declared his intent to utterly destroy [station_name()] with a nuclear device, and dares the crew to try and stop them." + + declaring_war = TRUE + var/custom_threat = alert(user, "Do you want to customize your declaration?", "Customize?", "Yes", "No") + declaring_war = FALSE + + if(!check_allowed(user)) + return + + if(custom_threat == "Yes") + declaring_war = TRUE + war_declaration = stripped_input(user, "Insert your custom declaration", "Declaration") + declaring_war = FALSE + + if(!check_allowed(user) || !war_declaration) + return + event_announcement.Announce(war_declaration, "Declaration of War", 'sound/effects/siren.ogg') + to_chat(user, "You've attracted the attention of powerful forces within the syndicate. A bonus bundle of telecrystals has been granted to your team. Great things await you if you complete the mission.") for(var/obj/machinery/computer/shuttle/syndicate/S in machines) @@ -47,7 +56,25 @@ config.shuttle_refuel_delay = CHALLENGE_SHUTTLE_DELAY qdel(src) +/obj/item/device/nuclear_challenge/proc/check_allowed(mob/living/user) + if(declaring_war) + to_chat(user, "You are already in the process of declaring war! Make your mind up.") + return FALSE + if(player_list.len < CHALLENGE_MIN_PLAYERS) + to_chat(user, "The enemy crew is too small to be worth declaring war on.") + return FALSE + if(!is_admin_level(user.z)) + to_chat(user, "You have to be at your base to use this.") + return FALSE + if(world.time > CHALLENGE_TIME_LIMIT) + to_chat(user, "It's too late to declare hostilities. Your benefactors are already busy with other schemes. You'll have to make do with what you have on hand.") + return FALSE + for(var/obj/machinery/computer/shuttle/syndicate/S in machines) + if(S.moved) + to_chat(user, "The shuttle has already been moved! You have forfeit the right to declare war.") + return FALSE + return TRUE #undef CHALLENGE_TIME_LIMIT -#undef MIN_CHALLENGE_PLAYERS +#undef CHALLENGE_MIN_PLAYERS #undef CHALLENGE_SHUTTLE_DELAY diff --git a/code/game/gamemodes/wizard/godhand.dm b/code/game/gamemodes/wizard/godhand.dm index 3340b044958..55afe36f1d2 100644 --- a/code/game/gamemodes/wizard/godhand.dm +++ b/code/game/gamemodes/wizard/godhand.dm @@ -41,7 +41,7 @@ name = "disintegrating touch" desc = "This hand of mine glows with an awesome power!" catchphrase = "EI NATH!!" - on_use_sound = "sound/magic/Disintegrate.ogg" + on_use_sound = 'sound/magic/Disintegrate.ogg' icon_state = "disintegrate" item_state = "disintegrate" @@ -59,7 +59,7 @@ name = "petrifying touch" desc = "That's the bottom line, because flesh to stone said so!" catchphrase = "STAUN EI!!" - on_use_sound = "sound/magic/FleshToStone.ogg" + on_use_sound = 'sound/magic/FleshToStone.ogg' icon_state = "fleshtostone" item_state = "fleshtostone" @@ -78,7 +78,7 @@ name = "toy plastic hand" desc = "This hand of mine glows with an awesome power! Ok, maybe just batteries." catchphrase = "EI NATH!!" - on_use_sound = "sound/magic/Disintegrate.ogg" + on_use_sound = 'sound/magic/Disintegrate.ogg' icon_state = "disintegrate" item_state = "disintegrate" @@ -95,7 +95,7 @@ name = "cluwne touch" desc = "It's time to start clowning around." catchphrase = "NWOLC EGNEVER" - on_use_sound = "sound/misc/sadtrombone.ogg" + on_use_sound = 'sound/misc/sadtrombone.ogg' icon_state = "cluwnecurse" item_state = "cluwnecurse" diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index 5a2d4ebb411..733c19bc337 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -8,7 +8,7 @@ slot_flags = SLOT_BELT origin_tech = "bluespace=4;materials=4" var/imprinted = "empty" - + 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? @@ -18,7 +18,7 @@ return TRUE return FALSE - + /obj/item/device/soulstone/proc/was_used() if(!reusable) spent = TRUE @@ -26,21 +26,21 @@ desc = "A fragment of the legendary treasure known simply as \ the 'Soul Stone'. The shard lies still, dull and lifeless; \ whatever spark it once held long extinguished." - + /obj/item/device/soulstone/anybody usability = TRUE /obj/item/device/soulstone/anybody/chaplain name = "mysterious old shard" reusable = FALSE - + /obj/item/device/soulstone/pickup(mob/living/user) ..() if(!can_use(user)) to_chat(user, "An overwhelming feeling of dread comes over you as you pick up the soulstone. It would be wise to be rid of this quickly.") user.Dizzy(120) - -//////////////////////////////Capturing//////////////////////////////////////////////////////// + +//////////////////////////////Capturing//////////////////////////////////////////////////////// /obj/item/device/soulstone/attack(mob/living/carbon/human/M as mob, mob/user as mob) if(!can_use(user)) user.Paralyse(5) @@ -53,7 +53,7 @@ if(!ishuman(M) || istype(M, /mob/living/carbon/human/dummy)) //If target is not a human or a dummy return ..() - + if(M.has_brain_worms()) //Borer stuff - RR to_chat(user, "This being is corrupted by an alien intelligence and cannot be soul trapped.") return ..() @@ -62,6 +62,13 @@ to_chat(user, "A mysterious force prevents you from trapping this being's soul.") return ..() + if(iscultist(M)) + to_chat(user, "This soul is already MINE.") + 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)]") + 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)]") @@ -69,7 +76,7 @@ transfer_soul("VICTIM", M, user) return -///////////////////Options for using captured souls/////////////////////////////////////// +///////////////////Options for using captured souls/////////////////////////////////////// /obj/item/device/soulstone/attack_self(mob/user) if(!in_range(src, user)) return @@ -77,8 +84,8 @@ if(!can_use(user)) user.Paralyse(5) to_chat(user, "Your body is wracked with debilitating pain!") - return - + return + user.set_machine(src) var/dat = "Soul Stone
    " for(var/mob/living/simple_animal/shade/A in src) @@ -127,7 +134,7 @@ icon = 'icons/obj/wizard.dmi' icon_state = "construct" desc = "A wicked machine used by those skilled in magical arts. It is inactive" - + /obj/structure/constructshell/examine(mob/user) if(..(user, 0)) if(iscultist(user) || iswizard(user) || user.stat == DEAD) diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 3c59d47f020..fd554e03c85 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -106,6 +106,11 @@ spell_type = /obj/effect/proc_holder/spell/fireball log_name = "FB" +/datum/spellbook_entry/rod_form + name = "Rod Form" + spell_type = /obj/effect/proc_holder/spell/targeted/rod_form + log_name = "RF" + /datum/spellbook_entry/magicm name = "Magic Missile" spell_type = /obj/effect/proc_holder/spell/targeted/projectile/magic_missile @@ -853,7 +858,7 @@ spellname = "disintegrate" icon_state ="bookfireball" desc = "This book feels like it will rip stuff apart." - + /obj/item/weapon/spellbook/oneuse/sacredflame spell = /obj/effect/proc_holder/spell/targeted/sacred_flame spellname = "sacred flame" diff --git a/code/game/jobs/job/silicon.dm b/code/game/jobs/job/silicon.dm index eedb50a8412..1331db02791 100644 --- a/code/game/jobs/job/silicon.dm +++ b/code/game/jobs/job/silicon.dm @@ -8,7 +8,7 @@ supervisors = "your laws" req_admin_notify = 1 minimal_player_age = 30 - exp_requirements = 600 + exp_requirements = 1200 exp_type = EXP_TYPE_CREW equip(var/mob/living/carbon/human/H) diff --git a/code/game/jobs/job/supervisor.dm b/code/game/jobs/job/supervisor.dm index 090fc6681a0..981753c5aee 100644 --- a/code/game/jobs/job/supervisor.dm +++ b/code/game/jobs/job/supervisor.dm @@ -13,7 +13,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0) access = list() //See get_access() minimal_access = list() //See get_access() minimal_player_age = 30 - exp_requirements = 600 + exp_requirements = 1200 exp_type = EXP_TYPE_CREW equip(var/mob/living/carbon/human/H) if(!H) return 0 @@ -237,6 +237,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0) minimal_access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels) alt_titles = list("Lawyer","Public Defender") minimal_player_age = 30 + exp_requirements = 300 + exp_type = EXP_TYPE_CREW idtype = /obj/item/weapon/card/id/security equip(var/mob/living/carbon/human/H) diff --git a/code/game/jobs/job_exp.dm b/code/game/jobs/job_exp.dm index 746dfcacf44..e0b403bfce7 100644 --- a/code/game/jobs/job_exp.dm +++ b/code/game/jobs/job_exp.dm @@ -1,22 +1,49 @@ // Admin Verbs -/client/proc/cmd_admin_check_player_exp() //Allows admins to determine who the newer players are. +/client/proc/cmd_mentor_check_player_exp() //Allows admins to determine who the newer players are. set category = "Admin" set name = "Check Player Playtime" - if(!check_rights(R_ADMIN)) + if(!check_rights(R_ADMIN|R_MOD|R_MENTOR)) return - var/msg = "Playtime ReportPlaytime:
      " + var/msg = "Playtime Report" + var/list/players_new = list() + var/list/players_old = list() + var/pline + var/datum/job/theirjob + var/jtext for(var/client/C in clients) - msg += "
    • [key_name_admin(C.mob)]: " + C.get_exp_living() + "
    • " - msg += "
    " + jtext = "No Job" + if(C.mob.mind.assigned_role) + theirjob = job_master.GetJob(C.mob.mind.assigned_role) + if(theirjob) + jtext = theirjob.title + if(config.use_exp_restrictions && theirjob.exp_requirements && theirjob.exp_type) + jtext += "*" + if(check_rights(R_ADMIN)) + pline = "
  • [key_name_admin(C.mob)]: [jtext]: " + C.get_exp_living() + "
  • " + else + pline = "
  • [key_name_mentor(C.mob)]: [jtext]: " + C.get_exp_living() + "
  • " + if(C.get_exp_living_num() > 1200) + players_old += pline + else + players_new += pline + if(players_new.len) + msg += "
    Players under 20h:
      " + msg += players_new.Join() + msg += "
    " + if(players_old.len) + msg += "
    Players over 20h:
      " + msg += players_old.Join() + msg += "
    " + msg += "" src << browse(msg, "window=Player_playtime_check") -/datum/admins/proc/cmd_show_exp_panel(var/client/C) +/datum/admins/proc/cmd_mentor_show_exp_panel(var/client/C) if(!C) to_chat(usr, "ERROR: Client not found.") return - if(!check_rights(R_ADMIN)) + if(!check_rights(R_ADMIN|R_MOD|R_MENTOR)) return var/body = "Playtime for [C.key]
    Playtime:" body += C.get_exp_report() diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 4f9e357cd61..1222d3e00b3 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -473,7 +473,7 @@ printing = 1 visible_message("\The [src] rattles and prints out a sheet of paper.") var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(loc) - playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1) + playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) P.info = "
    Body Scan - [href_list["name"]]

    " P.info += "Time of scan: [worldtime2text(world.time)]

    " P.info += "[printing_text]" diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 65f6fb7b09d..2ffa9301dd7 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -445,12 +445,12 @@ update_flag else logmsg = "Valve was opened by [usr] ([usr.ckey]), starting the transfer into the air
    " if(air_contents.toxins > 0) - message_admins("[key_name_admin(usr)] opened a canister that contains plasma! (JMP)") - log_admin("[key_name(usr)] opened a canister that contains plasma at [x], [y], [z]") + message_admins("[key_name_admin(usr)] opened a canister that contains plasma in [get_area(src)]! (JMP)") + log_admin("[key_name(usr)] opened a canister that contains plasma at [get_area(src)]: [x], [y], [z]") var/datum/gas/sleeping_agent = locate(/datum/gas/sleeping_agent) in air_contents.trace_gases if(sleeping_agent && (sleeping_agent.moles > 1)) - message_admins("[key_name_admin(usr)] opened a canister that contains N2O! (JMP)") - log_admin("[key_name(usr)] opened a canister that contains N2O at [x], [y], [z]") + message_admins("[key_name_admin(usr)] opened a canister that contains N2O in [get_area(src)]! (JMP)") + log_admin("[key_name(usr)] opened a canister that contains N2O at [get_area(src)]: [x], [y], [z]") investigate_log(logmsg, "atmos") release_log += logmsg valve_open = !valve_open diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 6ae47a3042d..9ed23ae44cd 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -137,7 +137,7 @@ user.visible_message("[user] begins to load \the [O] in \the [src]...", "You begin to load a design from \the [O]...", "You hear the chatter of a floppy drive.") - playsound(get_turf(src), "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1) + playsound(get_turf(src), 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) busy = 1 if(do_after(user, 14.4, target = src)) files.AddDesign2Known(D.blueprint) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 8ba7558d69b..af452dbdbcd 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -124,6 +124,9 @@ buf.dna.unique_enzymes = md5(buf.dna.real_name) buf.dna.UI=list(0x066,0x000,0x033,0x000,0x000,0x000,0xAF0,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x033,0x066,0x0FF,0x4DB,0x002,0x690,0x000,0x000) //buf.dna.UI=list(0x0C8,0x0C8,0x0C8,0x0C8,0x0C8,0x0C8,0x000,0x000,0x000,0x000,0x161,0xFBD,0xDEF) // Farmer Jeff + for(var/i in buf.dna.UI.len to DNA_UI_LENGTH) + buf.dna.UI += 0x000 + buf.dna.ResetSE() buf.dna.UpdateUI() /obj/item/weapon/disk/data/monkey diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index 197008c40f7..0f555a1169b 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -25,7 +25,7 @@ return 1 ui_interact(user) -/obj/machinery/computer/atmoscontrol/emag_act(var/remaining_carges, var/mob/user) +/obj/machinery/computer/atmoscontrol/emag_act(mob/user) if(!emagged) user.visible_message("\The [user] does something \the [src], causing the screen to flash!",\ "You cause the screen to flash as you gain full control.",\ diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 71aad1085ff..d3d7b8cf3d1 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -30,7 +30,12 @@ var/frame_desc = null var/contain_parts = 1 - +/obj/item/weapon/circuitboard/computer + board_type = "computer" + +/obj/item/weapon/circuitboard/machine + board_type = "machine" + /obj/item/weapon/circuitboard/message_monitor name = "Circuit board (Message Monitor)" build_path = /obj/machinery/computer/message_monitor diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 3d1df935cf8..e91286fe422 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -37,18 +37,19 @@ off_action.Activate() /obj/machinery/computer/camera_advanced/attack_hand(mob/user) - if(..()) - return - if(!iscarbon(user)) - return if(current_user) to_chat(user, "The console is already in use!") return - + if(!iscarbon(user)) + return + if(..()) + return user.set_machine(src) + if(!eyeobj) CreateEye() - if(!eyeobj.initialized) + + if(!eyeobj.eye_initialized) var/camera_location for(var/obj/machinery/camera/C in cameranet.cameras) if(!C.can_use()) @@ -57,7 +58,7 @@ camera_location = get_turf(C) break if(camera_location) - eyeobj.initialized = 1 + eyeobj.eye_initialized = 1 give_eye_control(user) eyeobj.setLoc(camera_location) else @@ -66,6 +67,7 @@ user.unset_machine() else give_eye_control(user) + eyeobj.setLoc(eyeobj.loc) /obj/machinery/computer/camera_advanced/proc/give_eye_control(mob/user) @@ -77,7 +79,6 @@ user.remote_view = 1 user.remote_control = eyeobj user.reset_perspective(eyeobj) - eyeobj.setLoc(eyeobj.loc) /mob/camera/aiEye/remote name = "Inactive Camera Eye" @@ -86,10 +87,15 @@ var/acceleration = 1 var/mob/living/carbon/human/eye_user = null var/obj/machinery/computer/camera_advanced/origin - var/initialized = 0 + var/eye_initialized = 0 var/visible_icon = 0 var/image/user_image = null +/mob/camera/aiEye/remote/Destroy() + eye_user = null + origin = null + return ..() + /mob/camera/aiEye/remote/GetViewerClient() if(eye_user) return eye_user.client @@ -102,12 +108,11 @@ T = get_turf(T) loc = T cameranet.visibility(src) - if(eye_user.client) - if(visible_icon) + if(visible_icon) + if(eye_user.client) eye_user.client.images -= user_image user_image = image(icon,loc,icon_state,FLY_LAYER) eye_user.client.images += user_image - eye_user.client.eye = src /mob/camera/aiEye/remote/relaymove(mob/user,direct) var/initial = initial(sprint) @@ -140,14 +145,16 @@ remote_eye.origin.current_user = null remote_eye.origin.jump_action.Remove(C) remote_eye.eye_user = null - C.reset_perspective(null) if(C.client) - C.client.images -= remote_eye.user_image + C.reset_perspective(null) + if(remote_eye.visible_icon) + C.client.images -= remote_eye.user_image for(var/datum/camerachunk/chunk in remote_eye.visibleCameraChunks) C.client.images -= chunk.obscured C.remote_control = null C.unset_machine() src.Remove(C) + playsound(remote_eye.origin, 'sound/machines/terminal_off.ogg', 25, 0) /datum/action/innate/camera_jump name = "Jump To Camera" @@ -175,7 +182,14 @@ T[text("[][]", netcam.c_tag, (netcam.can_use() ? null : " (Deactivated)"))] = netcam + playsound(origin, 'sound/machines/terminal_prompt.ogg', 25, 0) var/camera = input("Choose which camera you want to view", "Cameras") as null|anything in T var/obj/machinery/camera/final = T[camera] + playsound(origin, "terminal_type", 25, 0) if(final) + playsound(origin, 'sound/machines/terminal_prompt_confirm.ogg', 25, 0) remote_eye.setLoc(get_turf(final)) + C.overlay_fullscreen("flash", /obj/screen/fullscreen/flash/noise) + C.clear_fullscreen("flash", 3) //Shorter flash than normal since it's an ~~advanced~~ console! + else + playsound(origin, 'sound/machines/terminal_prompt_deny.ogg', 25, 0) diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 1588d990d80..8ccc505f39f 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -362,7 +362,7 @@ var/time_last_changed_position = 0 if("print") if(!printing) printing = 1 - playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1) + playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) spawn(50) printing = null nanomanager.update_uis(src) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 8b838ceade5..6087bc68d08 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -53,6 +53,24 @@ to_chat(user, "Access denied.") return COMM_AUTHENTICATION_NONE +/obj/machinery/computer/communications/proc/change_security_level(var/new_level) + tmp_alertlevel = new_level + var/old_level = security_level + if(!tmp_alertlevel) tmp_alertlevel = SEC_LEVEL_GREEN + if(tmp_alertlevel < SEC_LEVEL_GREEN) tmp_alertlevel = SEC_LEVEL_GREEN + if(tmp_alertlevel > SEC_LEVEL_BLUE) tmp_alertlevel = SEC_LEVEL_BLUE //Cannot engage delta with this + set_security_level(tmp_alertlevel) + if(security_level != old_level) + //Only notify the admins if an actual change happened + log_game("[key_name(usr)] has changed the security level to [get_security_level()].") + message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].") + switch(security_level) + if(SEC_LEVEL_GREEN) + feedback_inc("alert_comms_green",1) + if(SEC_LEVEL_BLUE) + feedback_inc("alert_comms_blue",1) + tmp_alertlevel = 0 + /obj/machinery/computer/communications/Topic(href, href_list) if(..(href, href_list)) return 1 @@ -100,35 +118,25 @@ if("newalertlevel") if(isAI(usr) || isrobot(usr)) to_chat(usr, "Firewalls prevent you from changing the alert level.") - nanomanager.update_uis(src) return 1 - tmp_alertlevel = text2num(href_list["level"]) + else if(usr.can_admin_interact()) + change_security_level(text2num(href_list["level"])) + return 1 + else if(!ishuman(usr)) + to_chat(usr, "Security measures prevent you from changing the alert level.") + return 1 + var/mob/living/carbon/human/L = usr var/obj/item/card = L.get_active_hand() - var/obj/item/weapon/card/id/I = (card && card.GetID())||L.wear_id||L.wear_pda + var/obj/item/weapon/card/id/I = (card && card.GetID()) || L.wear_id || L.wear_pda if(istype(I, /obj/item/device/pda)) var/obj/item/device/pda/pda = I I = pda.id if(I && istype(I)) if(access_captain in I.access) - var/old_level = security_level - if(!tmp_alertlevel) tmp_alertlevel = SEC_LEVEL_GREEN - if(tmp_alertlevel < SEC_LEVEL_GREEN) tmp_alertlevel = SEC_LEVEL_GREEN - if(tmp_alertlevel > SEC_LEVEL_BLUE) tmp_alertlevel = SEC_LEVEL_BLUE //Cannot engage delta with this - set_security_level(tmp_alertlevel) - if(security_level != old_level) - //Only notify the admins if an actual change happened - log_game("[key_name(usr)] has changed the security level to [get_security_level()].") - message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].") - switch(security_level) - if(SEC_LEVEL_GREEN) - feedback_inc("alert_comms_green",1) - if(SEC_LEVEL_BLUE) - feedback_inc("alert_comms_blue",1) - tmp_alertlevel = 0 + change_security_level(text2num(href_list["level"])) else to_chat(usr, "You are not authorized to do this.") - tmp_alertlevel = 0 setMenuState(usr,COMM_SCREEN_MAIN) else to_chat(usr, "You need to swipe your ID.") @@ -172,24 +180,26 @@ setMenuState(usr,COMM_SCREEN_MAIN) if("messagelist") - src.currmsg = 0 + currmsg = 0 if(href_list["msgid"]) setCurrentMessage(usr, text2num(href_list["msgid"])) setMenuState(usr,COMM_SCREEN_MESSAGES) if("delmessage") if(href_list["msgid"]) - src.currmsg = text2num(href_list["msgid"]) + currmsg = text2num(href_list["msgid"]) var/response = alert("Are you sure you wish to delete this message?", "Confirm", "Yes", "No") if(response == "Yes") - if(src.currmsg) + if(currmsg) var/id = getCurrentMessage() - var/title = src.messagetitle[id] - var/text = src.messagetext[id] - src.messagetitle.Remove(title) - src.messagetext.Remove(text) - if(currmsg==id) currmsg=0 - if(aicurrmsg==id) aicurrmsg=0 + var/title = messagetitle[id] + var/text = messagetext[id] + messagetitle.Remove(title) + messagetext.Remove(text) + if(currmsg == id) + currmsg = 0 + if(aicurrmsg == id) + aicurrmsg = 0 setMenuState(usr,COMM_SCREEN_MESSAGES) if("status") @@ -336,7 +346,7 @@ /obj/machinery/computer/communications/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) var/data[0] - data["is_ai"] = isAI(user)||isrobot(user) + data["is_ai"] = isAI(user) || isrobot(user) data["menu_state"] = data["is_ai"] ? ai_menu_state : menu_state data["emagged"] = emagged data["authenticated"] = is_authenticated(user, 0) @@ -368,16 +378,15 @@ list("id" = SEC_LEVEL_BLUE, "name" = "Blue"), //SEC_LEVEL_RED = list("name"="Red"), ) - - var/msg_data[0] - for(var/i = 1; i <= src.messagetext.len; i++) - var/cur_msg[0] - cur_msg["title"] = messagetitle[i] - cur_msg["body"] = messagetext[i] - msg_data += list(cur_msg) + + var/list/msg_data = list() + for(var/i = 1; i <= messagetext.len; i++) + msg_data.Add(list(list("title" = messagetitle[i], "body" = messagetext[i], "id" = i))) data["messages"] = msg_data - data["current_message"] = data["is_ai"] ? aicurrmsg : currmsg + if((data["is_ai"] && aicurrmsg) || (!data["is_ai"] && currmsg)) + data["current_message"] = data["is_ai"] ? messagetext[aicurrmsg] : messagetext[currmsg] + data["current_message_title"] = data["is_ai"] ? messagetitle[aicurrmsg] : messagetitle[currmsg] data["lastCallLoc"] = shuttle_master.emergencyLastCallLoc ? format_text(shuttle_master.emergencyLastCallLoc.name) : null @@ -403,9 +412,9 @@ /obj/machinery/computer/communications/proc/setCurrentMessage(var/mob/user,var/value) if(isAI(user) || isrobot(user)) - aicurrmsg=value + aicurrmsg = value else - currmsg=value + currmsg = value /obj/machinery/computer/communications/proc/getCurrentMessage(var/mob/user) if(isAI(user) || isrobot(user)) @@ -540,3 +549,13 @@ message_admins("All the AI's, communication consoles and boards are destroyed. Shuttle called.", 1) return ..() + +/proc/print_command_report(text = "", title = "Central Command Update") + for(var/obj/machinery/computer/communications/C in machines) + if(!(C.stat & (BROKEN|NOPOWER)) && is_station_contact(C.z)) + var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(C.loc) + P.name = "paper- '[title]'" + P.info = text + C.messagetitle.Add("[title]") + C.messagetext.Add(text) + P.update_icon() \ No newline at end of file diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 1162735db96..ddbee4c06a9 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -465,7 +465,7 @@ if(href_list["print_p"]) if(!( src.printing )) src.printing = 1 - playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1) + playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) sleep(50) var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( src.loc ) P.info = "
    Medical Record

    " diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index b8b2629b22b..644f9cddec8 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -63,7 +63,7 @@ src.spark_system.start() var/obj/item/weapon/paper/monitorkey/MK = new/obj/item/weapon/paper/monitorkey MK.loc = src.loc - playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1) + playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) // Will help make emagging the console not so easy to get away with. MK.info += "

    £%@%(*$%&(£&?*(%&£/{}" update_icon() diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 2a11b4a8836..77921e171bb 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -318,7 +318,7 @@ What a mess.*/ if("Print Record") if(!( printing )) printing = 1 - playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1) + playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) sleep(50) var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( loc ) P.info = "
    Security Record

    " @@ -341,7 +341,7 @@ What a mess.*/ if("Print Photo") if(!printing) printing = 1 - playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1) + playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) sleep(50) if(istype(active1, /datum/data/record) && data_core.general.Find(active1)) create_record_photo(active1) diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index ee90fcc3b21..384e9e80179 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -253,7 +253,7 @@ What a mess.*/ if("Print Record") if(!( printing )) printing = 1 - playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1) + playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) sleep(50) var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( loc ) P.info = "
    Employment Record

    " diff --git a/code/game/machinery/guestpass.dm b/code/game/machinery/guestpass.dm index a9e7fb72741..e3f0abad69a 100644 --- a/code/game/machinery/guestpass.dm +++ b/code/game/machinery/guestpass.dm @@ -159,7 +159,7 @@ // to_chat(usr, "Printing the log, standby...") //sleep(50) var/obj/item/weapon/paper/P = new/obj/item/weapon/paper( loc ) - playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1) + playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) P.name = "activity log" P.info = dat diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index c75ff304922..471a24078fb 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -46,17 +46,13 @@ ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/teleporter + ME = new /obj/item/mecha_parts/mecha_equipment/teleporter/precise ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay ME.attach(src) -/obj/mecha/combat/gygax/dark/add_cell(var/obj/item/weapon/stock_parts/cell/C=null) - if(C) - C.forceMove(src) - cell = C - return - cell = new(src) +/obj/mecha/combat/gygax/dark/add_cell() + cell = new /obj/item/weapon/stock_parts/cell/bluespace(src) cell.charge = 30000 cell.maxcharge = 30000 diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index cecbc1e5b13..97b442a51da 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -50,6 +50,11 @@ force = 55 max_equip = 5 +/obj/mecha/combat/marauder/seraph/add_cell() + cell = new /obj/item/weapon/stock_parts/cell/bluespace(src) + cell.charge = 40000 + cell.maxcharge = 40000 + /obj/mecha/combat/marauder/seraph/loaded/New() ..()//Let it equip whatever is needed. var/obj/item/mecha_parts/mecha_equipment/ME @@ -61,7 +66,7 @@ ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src) ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/teleporter(src) + ME = new /obj/item/mecha_parts/mecha_equipment/teleporter/precise(src) ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) ME.attach(src) diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index 184766dc3ed..9e2a754bd4c 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -9,17 +9,25 @@ icon_state = "mecha_teleport" origin_tech = "bluespace=10" equip_cooldown = 150 - energy_drain = 1000 + energy_drain = 8000 range = RANGED + var/tele_precision = 4 /obj/item/mecha_parts/mecha_equipment/teleporter/action(atom/target) if(!action_checks(target) || !is_teleport_allowed(loc.z)) return var/turf/T = get_turf(target) if(T) - do_teleport(chassis, T, 4) + chassis.use_power(energy_drain) + do_teleport(chassis, T, tele_precision) return 1 +/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" + energy_drain = 1000 + tele_precision = 1 ////////////////////////////////////////////// WORMHOLE GENERATOR ////////////////////////////////////////// diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 93a86fbe956..0466aa698c6 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -237,7 +237,7 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine/silenced name = "\improper S.H.H. \"Quietus\" Carbine" - fire_sound = "sound/weapons/Gunshot_silenced.ogg" + fire_sound = 'sound/weapons/Gunshot_silenced.ogg' icon_state = "mecha_mime" equip_cooldown = 15 projectile = /obj/item/projectile/bullet/mime diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 95ca2d4f4d8..3da7bb372d4 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -750,7 +750,7 @@ steam.start() -- spawns the effect var/obj/effect/effect/ion_trails/I = new /obj/effect/effect/ion_trails(src.oldposition) I.dir = src.holder.dir flick("ion_fade", I) - I.icon_state = "blank" + I.icon_state = "" spawn( 20 ) if(I) I.delete() @@ -812,8 +812,8 @@ steam.start() -- spawns the effect II.dir = src.holder.dir flick("ion_fade", I) flick("ion_fade", II) - I.icon_state = "blank" - II.icon_state = "blank" + I.icon_state = "" + II.icon_state = "" spawn( 20 ) if(I) I.delete() if(II) II.delete() diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index d805105a906..2a2237559fb 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -77,7 +77,7 @@ drawtype = temp update_window(usr) -/obj/item/toy/crayon/afterattack(atom/target, mob/user as mob, proximity) +/obj/item/toy/crayon/afterattack(atom/target, mob/user, proximity) if(!proximity) return if(is_type_in_list(target,validSurfaces)) var/temp = "rune" @@ -95,17 +95,22 @@ if(!uses) to_chat(user, "You used up your [name]!") qdel(src) - return -/obj/item/toy/crayon/attack(mob/M as mob, mob/user as mob) +/obj/item/toy/crayon/attack(mob/M, mob/user) var/huffable = istype(src,/obj/item/toy/crayon/spraycan) if(M == user) - to_chat(user, "You take a [huffable ? "huff" : "bite"] of the [name]. Delicious!") + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(!H.check_has_mouth()) + to_chat(user, "You do not have a mouth!") + return + playsound(loc, 'sound/items/eatfood.ogg', 50, 0) + to_chat(user, "You take a [huffable ? "huff" : "bite"] of the [name]. Delicious!") user.nutrition += 5 if(uses) uses -= 5 if(uses <= 0) - to_chat(user, "There is no more of [name] left!") + to_chat(user, "There is no more of [name] left!") qdel(src) else ..() diff --git a/code/game/objects/items/devices/autopsy.dm b/code/game/objects/items/devices/autopsy.dm index 2d08b4f582b..81e0f05258a 100644 --- a/code/game/objects/items/devices/autopsy.dm +++ b/code/game/objects/items/devices/autopsy.dm @@ -151,7 +151,7 @@ for(var/mob/O in viewers(usr)) O.show_message("\red \the [src] rattles and prints out a sheet of paper.", 1) - playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1) + playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1) sleep(10) var/obj/item/weapon/paper/P = new(usr.loc) diff --git a/code/game/objects/items/devices/guitar.dm b/code/game/objects/items/devices/guitar.dm index eaf1c668e3c..bb11c5f0a2a 100644 --- a/code/game/objects/items/devices/guitar.dm +++ b/code/game/objects/items/devices/guitar.dm @@ -25,10 +25,7 @@ ui_interact(user) /obj/item/device/guitar/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - if(!user) - return - - if(!isliving(user) || user.stat || user.restrained() || user.lying) + if(!isliving(user) || user.incapacitated()) return song.ui_interact(user, ui_key, ui, force_open) diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index 68b0b8d2dca..ab61008816c 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -11,11 +11,16 @@ var/obj/item/device/radio/radio var/looking_for_personality = 0 var/mob/living/silicon/pai/pai + var/list/faction = list("neutral") // The factions the pAI will inherit from the card + +/obj/item/device/paicard/syndicate + name = "syndicate personal AI device" + faction = list("syndicate") /obj/item/device/paicard/relaymove(var/mob/user, var/direction) if(user.stat || user.stunned) return - var/obj/item/weapon/rig/rig = src.get_rig() + var/obj/item/weapon/rig/rig = get_rig() if(istype(rig)) rig.forced_move(direction, user) @@ -260,7 +265,7 @@ to_chat(usr, "\red The request system is currently offline. Please wait another [cooldown_time] seconds.") return last_request = world.time / 10 - src.looking_for_personality = 1 + looking_for_personality = 1 paiController.findPAI(src, usr) if(href_list["wipe"]) var/confirm = input("Are you CERTAIN you wish to delete the current personality? This action cannot be undone.", "Personality Wipe") in list("Yes", "No") @@ -297,33 +302,33 @@ // WIRE_TRANSMIT = 4 /obj/item/device/paicard/proc/setPersonality(mob/living/silicon/pai/personality) - src.pai = personality - src.overlays += "pai-happy" + pai = personality + overlays += "pai-happy" /obj/item/device/paicard/proc/removePersonality() - src.pai = null - src.overlays.Cut() - src.overlays += "pai-off" + pai = null + overlays.Cut() + overlays += "pai-off" /obj/item/device/paicard var/current_emotion = 1 /obj/item/device/paicard/proc/setEmotion(var/emotion) if(pai) - src.overlays.Cut() + overlays.Cut() switch(emotion) - if(1) src.overlays += "pai-happy" - if(2) src.overlays += "pai-cat" - if(3) src.overlays += "pai-extremely-happy" - if(4) src.overlays += "pai-face" - if(5) src.overlays += "pai-laugh" - if(6) src.overlays += "pai-off" - if(7) src.overlays += "pai-sad" - if(8) src.overlays += "pai-angry" - if(9) src.overlays += "pai-what" + if(1) overlays += "pai-happy" + if(2) overlays += "pai-cat" + if(3) overlays += "pai-extremely-happy" + if(4) overlays += "pai-face" + if(5) overlays += "pai-laugh" + if(6) overlays += "pai-off" + if(7) overlays += "pai-sad" + if(8) overlays += "pai-angry" + if(9) overlays += "pai-what" current_emotion = emotion /obj/item/device/paicard/proc/alertUpdate() - var/turf/T = get_turf_or_move(src.loc) + var/turf/T = get_turf_or_move(loc) for(var/mob/M in viewers(T)) M.show_message("\blue [src] flashes a message across its screen, \"Additional personalities available for download.\"", 3, "\blue [src] bleeps electronically.", 2) diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index d804c874e1a..c573e4ff975 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -231,7 +231,7 @@ return to_chat(usr, "Transcript printed.") - playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1) + playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1) var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(get_turf(src)) var/t1 = "Transcript:

    " for(var/i = 1, mytape.storedinfo.len >= i, i++) diff --git a/code/game/objects/items/devices/violin.dm b/code/game/objects/items/devices/violin.dm index 323fb3db4f4..3ad1e98d6a6 100644 --- a/code/game/objects/items/devices/violin.dm +++ b/code/game/objects/items/devices/violin.dm @@ -30,10 +30,7 @@ ui_interact(user) /obj/item/device/violin/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - if(!user) - return - - if(!isliving(user) || user.stat || user.restrained() || user.lying) + if(!isliving(user) || user.incapacitated()) return song.ui_interact(user, ui_key, ui, force_open) diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index 0bacbaa161e..bb57a4a2cc2 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -7,7 +7,7 @@ RCD /obj/item/weapon/rcd name = "rapid-construction-device (RCD)" desc = "A device used to rapidly build and deconstruct walls and floors." - icon = 'icons/obj/items.dmi' + icon = 'icons/obj/tools.dmi' icon_state = "rcd" opacity = 0 density = 0 @@ -28,6 +28,7 @@ RCD var/canRwall = 0 var/menu = 1 var/door_type = /obj/machinery/door/airlock + var/door_name = "Airlock" req_access = list(access_engine) var/list/door_accesses = list() var/list/door_accesses_list = list() @@ -85,7 +86,7 @@ RCD /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) - ui = new(user, src, ui_key, "rcd.tmpl", "[name]", 400, 400, state = state) + ui = new(user, src, ui_key, "rcd.tmpl", "[name]", 450, 400, state = state) ui.open() ui.set_auto_update(1) @@ -93,6 +94,7 @@ RCD var/data[0] data["mode"] = mode data["door_type"] = door_type + data["door_name"] = door_name data["menu"] = menu data["matter"] = matter data["max_matter"] = max_matter @@ -164,6 +166,11 @@ RCD door_accesses_list[++door_accesses_list.len] = list("name" = get_access_desc(access), "id" = access, "enabled" = (access in door_accesses)) . = 1 + if(href_list["choice"] && !locked) + var/temp_t = sanitize(copytext(input("Enter a custom Airlock Name.","Airlock Name"),1,MAX_MESSAGE_LEN)) + if(temp_t) + door_name = temp_t + /obj/item/weapon/rcd/proc/activate() playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1) @@ -207,6 +214,7 @@ RCD if(!useResource(10, user)) return 0 activate() var/obj/machinery/door/airlock/T = new door_type(A) + T.name = door_name T.autoclose = 1 if(one_access) T.req_one_access = door_accesses.Copy() diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm index 7cbe5783a9a..47cf88f9bbc 100644 --- a/code/game/objects/items/weapons/RSF.dm +++ b/code/game/objects/items/weapons/RSF.dm @@ -6,8 +6,8 @@ RSF /obj/item/weapon/rsf name = "\improper Rapid-Service-Fabricator" desc = "A device used to rapidly deploy service items." - icon = 'icons/obj/items.dmi' - icon_state = "rcd" + icon = 'icons/obj/tools.dmi' + icon_state = "rsf" opacity = 0 density = 0 anchored = 0.0 diff --git a/code/game/objects/items/weapons/scissors.dm b/code/game/objects/items/weapons/scissors.dm index e966f5500e5..00b85d8ebe1 100644 --- a/code/game/objects/items/weapons/scissors.dm +++ b/code/game/objects/items/weapons/scissors.dm @@ -78,7 +78,7 @@ species_hair = hair_styles_list var/h_new_style = input(user, "Select a hair style", "Grooming") as null|anything in species_hair user.visible_message("[user] starts cutting [M]'s hair!", "You start cutting [M]'s hair!") //arguments for this are: 1. what others see 2. what the user sees. --Fixed grammar, (TGameCo) - playsound(loc, "sound/goonstation/misc/Scissor.ogg", 100, 1) + playsound(loc, 'sound/goonstation/misc/Scissor.ogg', 100, 1) if(do_after(user, 50, target = H)) //this is the part that adds a delay. delay is in deciseconds. --Made it 5 seconds, because hair isn't cut in one second in real life, and I want at least a little bit longer time, (TGameCo) if(!(M in view(1))) //Adjacency test user.visible_message("[user] stops cutting [M]'s hair.", "You stop cutting [M]'s hair.") @@ -111,9 +111,9 @@ if(!is_cutting) is_cutting = 1 user.visible_message("[user] starts cutting [M]'s hair!", "You start cutting [M]'s hair!") - playsound(loc, "sound/goonstation/misc/Scissor.ogg", 100, 1) + playsound(loc, 'sound/goonstation/misc/Scissor.ogg', 100, 1) if(do_after(user, 50, target = H)) - playsound(loc, "sound/weapons/bladeslice.ogg", 50, 1, -1) + 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") diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm index fd44bacbf53..74d4093beb5 100644 --- a/code/game/objects/items/weapons/storage/toolbox.dm +++ b/code/game/objects/items/weapons/storage/toolbox.dm @@ -13,7 +13,7 @@ materials = list(MAT_METAL = 500) origin_tech = "combat=1" attack_verb = list("robusted") - hitsound = "sound/weapons/smash.ogg" + hitsound = 'sound/weapons/smash.ogg' New() ..() diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index 122643238ec..428c4885814 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -184,7 +184,6 @@ name = "vox specialized nitrogen tank" desc = "A high-tech nitrogen tank designed specifically for Vox." icon_state = "emergency_vox" - item_state = "emergency_vox" volume = 25 /obj/item/weapon/tank/emergency_oxygen/vox/New() diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index b7f5e370b95..7e0c7296fc9 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -12,47 +12,42 @@ * Revolver Conversion Kit */ -/* - * Wrench - */ +//Wrench /obj/item/weapon/wrench name = "wrench" desc = "A wrench with common uses. Can be found in your hand." - icon = 'icons/obj/items.dmi' + icon = 'icons/obj/tools.dmi' icon_state = "wrench" flags = CONDUCT slot_flags = SLOT_BELT - force = 5.0 - throwforce = 7.0 + force = 5 + throwforce = 7 w_class = 2 materials = list(MAT_METAL=150) origin_tech = "materials=1;engineering=1" attack_verb = list("bashed", "battered", "bludgeoned", "whacked") - -/* - * Screwdriver - */ +//Screwdriver /obj/item/weapon/screwdriver name = "screwdriver" desc = "You can be totally screwy with this." - icon = 'icons/obj/items.dmi' + icon = 'icons/obj/tools.dmi' icon_state = "screwdriver" flags = CONDUCT slot_flags = SLOT_BELT - force = 5.0 + force = 5 w_class = 1 - throwforce = 5.0 + throwforce = 5 throw_speed = 3 throw_range = 5 materials = list(MAT_METAL=75) attack_verb = list("stabbed") hitsound = 'sound/weapons/bladeslice.ogg' - suicide_act(mob/user) - to_chat(viewers(user), pick("[user] is stabbing the [src.name] into \his temple! It looks like \he's trying to commit suicide.", \ - "[user] is stabbing the [src.name] into \his heart! It looks like \he's trying to commit suicide.")) - return(BRUTELOSS) +/obj/item/weapon/screwdriver/suicide_act(mob/user) + to_chat(viewers(user), pick("[user] is stabbing the [name] into \his temple! It looks like \he's trying to commit suicide.", \ + "[user] is stabbing the [name] into \his heart! It looks like \he's trying to commit suicide.")) + return(BRUTELOSS) /obj/item/weapon/screwdriver/New() switch(pick("red","blue","purple","brown","green","cyan","yellow")) @@ -82,7 +77,7 @@ src.pixel_y = rand(0, 16) return -/obj/item/weapon/screwdriver/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) +/obj/item/weapon/screwdriver/attack(mob/living/carbon/M, mob/living/carbon/user) if(!istype(M) || user.a_intent == I_HELP) return ..() if(user.zone_sel.selecting != "eyes" && user.zone_sel.selecting != "head") @@ -91,72 +86,60 @@ M = user return eyestab(M,user) -/* - * Wirecutters - */ +//Wirecutters /obj/item/weapon/wirecutters name = "wirecutters" desc = "This cuts wires." - icon = 'icons/obj/items.dmi' + icon = 'icons/obj/tools.dmi' icon_state = "cutters" flags = CONDUCT slot_flags = SLOT_BELT - force = 6.0 + force = 6 throw_speed = 3 throw_range = 7 w_class = 2 materials = list(MAT_METAL=80) origin_tech = "materials=1;engineering=1" attack_verb = list("pinched", "nipped") - hitsound = "sound/items/Wirecutter.ogg" + hitsound = 'sound/items/Wirecutter.ogg' sharp = 1 edge = 1 -/obj/item/weapon/wirecutters/New(loc, var/param_color = null) +/obj/item/weapon/wirecutters/New(loc, param_color = null) ..() if((!param_color && prob(50)) || param_color == "yellow") icon_state = "cutters-y" item_state = "cutters_yellow" -/obj/item/weapon/wirecutters/attack(mob/living/carbon/human/C as mob, mob/user as mob) - if(istype(C) && C.handcuffed) - if(istype(C.handcuffed, /obj/item/weapon/restraints/handcuffs/cable)) - usr.visible_message("\The [usr] cuts \the [C]'s restraints with \the [src]!",\ - "You cut \the [C]'s restraints with \the [src]!",\ +/obj/item/weapon/wirecutters/attack(mob/living/carbon/human/H, mob/user) + if(istype(H) && H.handcuffed) + if(istype(H.handcuffed, /obj/item/weapon/restraints/handcuffs/cable)) + usr.visible_message("\The [usr] cuts \the [H]'s restraints with \the [src]!",\ + "You cut \the [H]'s restraints with \the [src]!",\ "You hear cable being cut.") - C.handcuffed = null - if(C.buckled && C.buckled.buckle_requires_restraints) - C.buckled.unbuckle_mob() - C.update_handcuffed() + H.handcuffed = null + if(H.buckled && H.buckled.buckle_requires_restraints) + H.buckled.unbuckle_mob() + H.update_handcuffed() return else ..() -/* - * Welding Tool - */ +//Welding Tool /obj/item/weapon/weldingtool name = "welding tool" - icon = 'icons/obj/items.dmi' + icon = 'icons/obj/tools.dmi' icon_state = "welder" item_state = "welder" flags = CONDUCT slot_flags = SLOT_BELT - - //Amount of OUCH when it's thrown force = 3 throwforce = 5 throw_speed = 3 throw_range = 5 w_class = 2 - - //Cost to make in the autolathe materials = list(MAT_METAL=70, MAT_GLASS=30) - - //R&D tech level origin_tech = "engineering=1" - - //Welding tool specific stuff var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2) var/status = 1 //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower) var/max_fuel = 20 //The max amount of fuel the welder can hold @@ -169,7 +152,6 @@ create_reagents(max_fuel) reagents.add_reagent("fuel", max_fuel) update_icon() - return /obj/item/weapon/weldingtool/examine(mob/user) if(..(user, 0)) @@ -196,10 +178,9 @@ else icon_state = "[initial(icon_state)][ratio]" update_torch() - return -/obj/item/weapon/weldingtool/attackby(obj/item/I as obj, mob/user as mob, params) - if(istype(I, /obj/item/weapon/screwdriver)) +/obj/item/weapon/weldingtool/attackby(obj/item/I, mob/user, params) + if(isscrewdriver(I)) flamethrower_screwdriver(I, user) if(istype(I, /obj/item/stack/rods)) flamethrower_rods(I, user) @@ -231,7 +212,7 @@ if(isturf(location)) location.hotspot_expose(700, 5) -/obj/item/weapon/weldingtool/attack(mob/M as mob, mob/user as mob) +/obj/item/weapon/weldingtool/attack(mob/M, mob/user) if(ishuman(M)) var/mob/living/carbon/human/H = M var/obj/item/organ/external/S = H.organs_by_name[user.zone_sel.selecting] @@ -289,7 +270,7 @@ return reagents.get_reagent_amount("fuel") //Removes fuel from the welding tool. If a mob is passed, it will try to flash the mob's eyes. This should probably be renamed to use() -/obj/item/weapon/weldingtool/proc/remove_fuel(var/amount = 1, var/mob/living/M = null) +/obj/item/weapon/weldingtool/proc/remove_fuel(amount = 1, mob/living/M = null) if(!welding || !check_fuel()) return 0 if(get_fuel() >= amount) @@ -402,7 +383,7 @@ /obj/item/weapon/weldingtool/hugetank name = "Upgraded Welding Tool" - desc = "An upgraded welder based of the industrial welder." + desc = "An upgraded welder based off the industrial welder." icon_state = "upindwelder" item_state = "upindwelder" max_fuel = 80 @@ -419,10 +400,10 @@ w_class = 3 materials = list(MAT_METAL=70, MAT_GLASS=120) origin_tech = "engineering=4;plasmatech=3" - var/last_gen = 0 change_icons = 0 can_off_process = 1 light_intensity = 1 + var/last_gen = 0 /obj/item/weapon/weldingtool/experimental/proc/fuel_gen() if(!welding && !last_gen) @@ -436,19 +417,16 @@ if(reagents.total_volume < max_fuel) fuel_gen() -/* - * Crowbar - */ - +//Crowbar /obj/item/weapon/crowbar name = "pocket crowbar" desc = "A small crowbar. This handy tool is useful for lots of things, such as prying floor tiles or opening unpowered doors." - icon = 'icons/obj/items.dmi' + icon = 'icons/obj/tools.dmi' icon_state = "crowbar" flags = CONDUCT slot_flags = SLOT_BELT - force = 5.0 - throwforce = 7.0 + force = 5 + throwforce = 7 item_state = "crowbar" w_class = 2 materials = list(MAT_METAL=50) @@ -456,7 +434,6 @@ attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked") /obj/item/weapon/crowbar/red - icon = 'icons/obj/items.dmi' icon_state = "red_crowbar" item_state = "crowbar_red" @@ -480,14 +457,14 @@ origin_tech = "combat=2" var/open = 0 - New() - ..() - update_icon() - +/obj/item/weapon/conversion_kit/New() + ..() update_icon() - icon_state = "[initial(icon_state)]_[open]" - attack_self(mob/user as mob) - open = !open - to_chat(user, "\blue You [open?"open" : "close"] the conversion kit.") - update_icon() +/obj/item/weapon/conversion_kit/update_icon() + icon_state = "[initial(icon_state)]_[open]" + +/obj/item/weapon/conversion_kit/attack_self(mob/user) + open = !open + to_chat(user, "\blue You [open?"open" : "close"] the conversion kit.") + update_icon() diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm index e859c0348f1..89aef25f24f 100644 --- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm +++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm @@ -1,6 +1,7 @@ /obj/structure/closet/cardboard name = "large cardboard box" desc = "Just a box..." + icon = 'icons/obj/cardboard_boxes.dmi' icon_state = "cardboard" icon_opened = "cardboard_open" icon_closed = "cardboard" @@ -43,7 +44,7 @@ /mob/living/proc/do_alert_animation(atom/A) var/image/I - I = image('icons/obj/closet.dmi', A, "cardboard_special", A.layer+1) + I = image('icons/obj/cardboard_boxes.dmi', A, "cardboard_special", A.layer+1) var/list/viewing = list() for(var/mob/M in viewers(A)) if(M.client) @@ -52,6 +53,7 @@ I.alpha = 0 animate(I, pixel_z = 32, alpha = 255, time = 5, easing = ELASTIC_EASING) + /obj/structure/closet/cardboard/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(src.opened) if(istype(W, /obj/item/weapon/weldingtool)) @@ -62,3 +64,25 @@ for(var/mob/M in viewers(src)) M.show_message("\The [src] has been cut apart by [user] with \the [WC].", 3, "You hear cutting.", 2) qdel(src) + return + if(istype(W, /obj/item/weapon/pen)) + var/decalselection = input("Please select a decal") as null|anything in list("Atmospherics", "Bartender", "Barber", "Blueshield", "Brig Physician", "Captain", + "Cargo", "Chief Engineer", "Chaplain", "Chef", "Chemist", "Civilian", "Clown", "CMO", "Coroner", "Detective", "Engineering", "Genetics", "HOP", + "HOS", "Hydroponics", "Internal Affairs Agent", "Janitor", "Magistrate", "Mechanic", "Medical", "Mime", "Mining", "NT Representative", "Paramedic", "Pod Pilot", + "Prisoner", "Research Director", "Security", "Syndicate", "Therapist", "Virology", "Warden", "Xenobiology") + if(!decalselection) + return + if(user.incapacitated()) + to_chat(user, "You're in no condition to perform this action.") + return + if(W != user.get_active_hand()) + to_chat(user, "You must be holding the pen to perform this action.") + return + if(! Adjacent(user)) + to_chat(user, "You have moved too far away from the cardboard box.") + return + decalselection = replacetext(decalselection, " ", "_") + decalselection = lowertext(decalselection) + icon_opened = ("cardboard_open_"+decalselection) + icon_closed = ("cardboard_"+decalselection) + update_icon() // a proc declared in the closets parent file used to update opened/closed sprites on normal closets diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index d14b4bbda21..31ab9c94ca2 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -79,7 +79,7 @@ if(victim.buckled) return 0 var/mob/living/H = victim - playsound(loc, "sound/effects/splat.ogg", 25, 1) + 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 diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index f1d9b6ac578..9b4059f1d1d 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -138,10 +138,10 @@ return data /datum/song/Topic(href, href_list) - if(!in_range(instrumentObj, usr) || (issilicon(usr) && instrumentObj.loc != usr) || !isliving(usr) || !usr.canmove || usr.restrained()) + if(!in_range(instrumentObj, usr) || (issilicon(usr) && instrumentObj.loc != usr) || !isliving(usr) || usr.incapacitated()) usr << browse(null, "window=instrument") usr.unset_machine() - return + return 1 instrumentObj.add_fingerprint(usr) @@ -168,6 +168,8 @@ //split into lines spawn() lines = splittext(t, "\n") + if(lines.len == 0) + return 1 if(copytext(lines[1],1,6) == "BPM: ") tempo = sanitize_tempo(600 / text2num(copytext(lines[1],6))) lines.Cut(1,2) @@ -291,7 +293,7 @@ ui_interact(user) /obj/structure/piano/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - if(!user || !anchored) + if(!isliving(user) || user.incapacitated() || !anchored) return song.ui_interact(user, ui_key, ui, force_open) diff --git a/code/game/response_team.dm b/code/game/response_team.dm index 6cf81f70180..1ce1165a8a5 100644 --- a/code/game/response_team.dm +++ b/code/game/response_team.dm @@ -5,6 +5,9 @@ #define ERT_TYPE_RED 2 #define ERT_TYPE_GAMMA 3 +/datum/game_mode + var/list/datum/mind/ert = list() + var/list/response_team_members = list() var/responseteam_age = 21 // Minimum account age to play as an ERT member var/datum/response_team/active_team = null @@ -93,7 +96,7 @@ var/ert_request_answered = 0 if(response_team_members.len > 6) to_chat(src, "The emergency response team is already full!") return 0 - + return 1 /proc/trigger_armed_response_team(var/datum/response_team/response_team_type) @@ -106,7 +109,7 @@ var/ert_request_answered = 0 active_team.cannot_send_team() send_emergency_team = 0 return 0 - + // Respawnable players get first dibs for(var/mob/dead/observer/M in ert_candidates) if((M in respawnable_list) && M.JoinResponseTeam()) @@ -115,7 +118,7 @@ var/ert_request_answered = 0 for(var/mob/dead/observer/M in (ert_candidates - respawnable_list)) if(M.JoinResponseTeam()) response_team_members |= M - + if(!response_team_members.len) active_team.cannot_send_team() send_emergency_team = 0 @@ -125,14 +128,14 @@ var/ert_request_answered = 0 for(var/mob/M in response_team_members) if(index > emergencyresponseteamspawn.len) index = 1 - + var/client/C = M.client var/mob/living/carbon/human/new_commando = C.create_response_team(emergencyresponseteamspawn[index]) new_commando.mind.key = M.key new_commando.key = M.key new_commando.update_icons() index++ - + send_emergency_team = 0 active_team.announce_team() return 1 @@ -170,8 +173,8 @@ var/ert_request_answered = 0 head_organ.b_hair = color2B(hair_c) M.change_eye_color(color2R(eye_c), color2G(eye_c), color2B(eye_c)) M.s_tone = skin_tone - head_organ.h_style = random_hair_style(M.gender, head_organ.species.name) - head_organ.f_style = random_facial_hair_style(M.gender, head_organ.species.name) + head_organ.h_style = random_hair_style(M.gender, head_organ.species.name) + head_organ.f_style = random_facial_hair_style(M.gender, head_organ.species.name) M.real_name = "[pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant First Class", "Master Sergeant", "Sergeant Major")] [pick(last_names)]" M.name = M.real_name @@ -187,6 +190,7 @@ var/ert_request_answered = 0 M.mind.special_role = SPECIAL_ROLE_ERT if(!(M.mind in ticker.minds)) ticker.minds += M.mind //Adds them to regular mind list. + ticker.mode.ert += M.mind M.forceMove(spawn_location) active_team.equip_officer(class, M) @@ -256,6 +260,7 @@ var/ert_request_answered = 0 pda.name = "PDA-[M.real_name] ([pda.ownjob])" pda.icon_state = "pda-engineer" M.equip_to_slot_or_del(pda, slot_wear_pda) + M.job = "ERT Engineering" if("Security") @@ -280,7 +285,7 @@ var/ert_request_answered = 0 pda.name = "PDA-[M.real_name] ([pda.ownjob])" pda.icon_state = "pda-security" M.equip_to_slot_or_del(pda, slot_wear_pda) - + M.job = "ERT Security" if("Medic") medical_slots -= 1 @@ -302,7 +307,7 @@ var/ert_request_answered = 0 pda.name = "PDA-[M.real_name] ([pda.ownjob])" pda.icon_state = "pda-medical" M.equip_to_slot_or_del(pda, slot_wear_pda) - + M.job = "ERT Medical" if("Commander") command_slots = 0 @@ -329,6 +334,7 @@ var/ert_request_answered = 0 pda.ownjob = "Emergency Response Team Leader" pda.name = "PDA-[M.real_name] ([pda.ownjob])" M.equip_to_slot_or_del(pda, slot_wear_pda) + M.job = "ERT Commander" /datum/response_team/proc/cannot_send_team() event_announcement.Announce("[station_name()], we are unfortunately unable to send you an Emergency Response Team at this time.", "ERT Unavailable") diff --git a/code/game/sound.dm b/code/game/sound.dm index ed5f0d15b4c..14269acb81f 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -12,6 +12,9 @@ var/list/page_sound = list('sound/effects/pageturn1.ogg', 'sound/effects/pagetur var/list/gun_sound = list('sound/weapons/Gunshot.ogg', 'sound/weapons/Gunshot2.ogg','sound/weapons/Gunshot3.ogg','sound/weapons/Gunshot4.ogg') var/list/computer_ambience = list('sound/goonstation/machines/ambicomp1.ogg', 'sound/goonstation/machines/ambicomp2.ogg', 'sound/goonstation/machines/ambicomp3.ogg') var/list/ricochet = list('sound/weapons/effects/ric1.ogg', 'sound/weapons/effects/ric2.ogg','sound/weapons/effects/ric3.ogg','sound/weapons/effects/ric4.ogg','sound/weapons/effects/ric5.ogg') +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') /proc/playsound(var/atom/source, soundin, vol as num, vary, extrarange as num, falloff, var/is_global, var/pitch) @@ -137,4 +140,6 @@ var/list/ricochet = list('sound/weapons/effects/ric1.ogg', 'sound/weapons/effect soundin = pick(computer_ambience) if("ricochet") soundin = pick(ricochet) + if("terminal_type") + soundin = pick(terminal_type) return soundin diff --git a/code/game/turfs/simulated/floor/mineral.dm b/code/game/turfs/simulated/floor/mineral.dm index f4f67b9007b..5af7cf30673 100644 --- a/code/game/turfs/simulated/floor/mineral.dm +++ b/code/game/turfs/simulated/floor/mineral.dm @@ -73,10 +73,10 @@ icons = list("bananium","bananium_dam") var/spam_flag = 0 -/turf/simulated/floor/mineral/bananium/Entered(mob/AM) +/turf/simulated/floor/mineral/bananium/Entered(mob/living/M) .=..() if(!.) - if(istype(AM)) + if(istype(M)) squeek() /turf/simulated/floor/mineral/bananium/attackby(obj/item/weapon/W, mob/user, params) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index ab2b6beb9e7..a029e529856 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -2,7 +2,8 @@ var/list/admin_verbs_default = list( /client/proc/deadmin_self, /*destroys our own admin datum so we can play as a regular player*/ /client/proc/hide_verbs, /*hides all our adminverbs*/ - /client/proc/cmd_mentor_check_new_players + /client/proc/cmd_mentor_check_new_players, + /client/proc/cmd_mentor_check_player_exp /* shows players by playtime */ ) var/list/admin_verbs_admin = list( /client/proc/check_antagonists, /*shows all antags*/ @@ -75,7 +76,6 @@ var/list/admin_verbs_admin = list( /client/proc/debug_variables, /client/proc/show_snpc_verbs, /client/proc/reset_all_tcs, /*resets all telecomms scripts*/ - /client/proc/cmd_admin_check_player_exp, /* shows players by playtime */ /client/proc/toggle_mentor_chat, /client/proc/toggle_advanced_interaction, /*toggle admin ability to interact with not only machines, but also atoms such as buttons and doors*/ ) @@ -111,7 +111,8 @@ var/list/admin_verbs_event = list( /client/proc/response_team, // Response Teams admin verb /client/proc/cmd_admin_create_centcom_report, /client/proc/fax_panel, - /client/proc/event_manager_panel + /client/proc/event_manager_panel, + /client/proc/modify_goals ) var/list/admin_verbs_spawn = list( @@ -167,7 +168,7 @@ var/list/admin_verbs_debug = list( /client/proc/admin_serialize, /client/proc/admin_deserialize, /client/proc/jump_to_ruin, - /client/proc/toggle_medal_disable + /client/proc/toggle_medal_disable ) var/list/admin_verbs_possess = list( /proc/possess, @@ -214,6 +215,10 @@ var/list/admin_verbs_snpc = list( /client/proc/hide_snpc_verbs ) +/client/proc/on_holder_add() + if(chatOutput && chatOutput.loaded) + chatOutput.loadAdmin() + /client/proc/add_admin_verbs() if(holder) verbs += admin_verbs_default diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index 7ee714090cc..de22d5ea098 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -32,6 +32,7 @@ var/list/admin_datums = list() if(istype(C)) owner = C owner.holder = src + owner.on_holder_add() owner.add_admin_verbs() //TODO owner.verbs -= /client/proc/readmin admins |= C diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index dc5754836d9..1f76781b90d 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -531,6 +531,16 @@ if(ticker.mode.greyshirts.len) dat += check_role_table("Greyshirts", ticker.mode.greyshirts) + if(ts_spiderlist.len) + var/list/spider_minds = list() + for(var/mob/living/simple_animal/hostile/poison/terror_spider/S in ts_spiderlist) + if(S.ckey) + spider_minds += S.mind + dat += check_role_table("Terror Spiders", spider_minds) + + if(ticker.mode.ert.len) + dat += check_role_table("ERT", ticker.mode.ert) + dat += "" usr << browse(dat, "window=roundstatus;size=400x500") else diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 4a01b1161e8..ef3199b3484 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1533,6 +1533,23 @@ else if(href_list["check_antagonist"]) check_antagonists() + else if(href_list["take_question"]) + var/mob/M = locateUID(href_list["take_question"]) + var/is_mhelp = href_list["is_mhelp"] + if(ismob(M)) + var/helptype = "ADMINHELP" + if(is_mhelp) + helptype = "MENTORHELP" + var/take_msg = "[helptype]: [key_name(usr.client)] is attending to [key_name(M)]'s question." + for(var/client/X in admins) + if(check_rights(R_ADMIN, 0, X.mob)) + 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!") + else + to_chat(usr, "Unable to locate mob.") + else if(href_list["cult_nextobj"]) if(alert(usr, "Validate the current Cult objective and unlock the next one?", "Cult Cheat Code", "Yes", "No") != "Yes") return @@ -1710,6 +1727,103 @@ to_chat(src.owner, "You sent a [eviltype] fax to [H]") 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)) + return + var/mob/living/M = locateUID(href_list["Bless"]) + if(!istype(M)) + to_chat(usr, "This can only be used on instances of type /mob/living") + return + var/btypes = list("To Arrivals", "Moderate Heal") + var/mob/living/carbon/human/H + if(ishuman(M)) + H = M + btypes += "Heal Over Time" + btypes += "Permanent Regeneration" + btypes += "Super Powers" + var/blessing = input(src.owner, "How would you like to bless [M]?", "Its good to be good...", "") as null|anything in btypes + if(!(blessing in btypes)) + return + switch(blessing) + if("To Arrivals") + M.forceMove(pick(latejoin)) + to_chat(M, "You are abruptly pulled through space!") + if("Moderate Heal") + M.adjustBruteLoss(-25) + M.adjustFireLoss(-25) + M.adjustToxLoss(-25) + M.adjustOxyLoss(-25) + to_chat(M,"You feel invigorated!") + if("Heal Over Time") + H.reagents.add_reagent("salglu_solution", 30) + H.reagents.add_reagent("salbutamol", 20) + H.reagents.add_reagent("spaceacillin", 20) + if("Permanent Regeneration") + H.dna.SetSEState(REGENERATEBLOCK, 1) + genemutcheck(H, REGENERATEBLOCK, null, MUTCHK_FORCED) + H.update_mutations() + if("Super Powers") + var/list/default_genes = list(REGENERATEBLOCK, NOBREATHBLOCK, COLDBLOCK) + for(var/gene in default_genes) + H.dna.SetSEState(gene, 1) + genemutcheck(H, gene, null, MUTCHK_FORCED) + H.update_mutations() + else if(href_list["Smite"]) + if(!check_rights(R_ADMIN)) + return + var/mob/living/M = locateUID(href_list["Smite"]) + var/mob/living/carbon/human/H + if(!istype(M)) + to_chat(usr, "This can only be used on instances of type /mob/living") + return + var/ptypes = list("Lightning bolt", "Fire Death", "Gib") + if(ishuman(M)) + H = M + ptypes += "Brain Damage" + ptypes += "Honk Tumor" + ptypes += "Cluwne" + ptypes += "Mutagen Cookie" + ptypes += "Hellwater Cookie" + var/punishment = input(src.owner, "How would you like to smite [M]?", "Its good to be baaaad...", "") as null|anything in ptypes + if(!(punishment in ptypes)) + return + switch(punishment) + if("Lightning bolt") + M.electrocute_act(5, "Lightning Bolt", safety=1) + playsound(get_turf(M), 'sound/magic/LightningShock.ogg', 50, 1, -1) + M.adjustFireLoss(75) + M.Weaken(5) + to_chat(M, "The gods have punished you for your sins!") + if("Brain Damage") + H.adjustBrainLoss(75) + if("Fire Death") + to_chat(M,"You feel hotter than usual. Maybe you should lowe-wait, is that your hand melting?") + var/turf/simulated/T = get_turf(M) + new /obj/effect/hotspot(T) + M.adjustFireLoss(150) + if("Honk Tumor") + if(!H.get_int_organ(/obj/item/organ/internal/honktumor)) + var/obj/item/organ/internal/organ = new /obj/item/organ/internal/honktumor + to_chat(H, "Life seems funnier, somehow.") + organ.insert(H) + if("Cluwne") + H.makeCluwne() + if("Mutagen Cookie") + var/obj/item/weapon/reagent_containers/food/snacks/cookie/evilcookie = new /obj/item/weapon/reagent_containers/food/snacks/cookie + evilcookie.reagents.add_reagent("mutagen", 10) + evilcookie.desc = "It has a faint green glow." + evilcookie.bitesize = 100 + H.drop_l_hand() + H.equip_to_slot_or_del(evilcookie, slot_l_hand) + if("Hellwater Cookie") + var/obj/item/weapon/reagent_containers/food/snacks/cookie/evilcookie = new /obj/item/weapon/reagent_containers/food/snacks/cookie + evilcookie.reagents.add_reagent("hell_water", 25) + evilcookie.desc = "Sulphur-flavored." + evilcookie.bitesize = 100 + H.drop_l_hand() + H.equip_to_slot_or_del(evilcookie, slot_l_hand) + if("Gib") + M.gib(FALSE) else if(href_list["FaxReplyTemplate"]) if(!check_rights(R_ADMIN)) return @@ -2031,7 +2145,7 @@ if(!M) to_chat(usr, "ERROR: Mob not found.") return - cmd_show_exp_panel(M.client) + cmd_mentor_show_exp_panel(M.client) else if(href_list["jumpto"]) if(!check_rights(R_ADMIN)) return @@ -3018,6 +3132,80 @@ error_viewer.showTo(usr, locate(href_list["viewruntime_backto"]), href_list["viewruntime_linear"]) else error_viewer.showTo(usr, null, href_list["viewruntime_linear"]) + + else if(href_list["add_station_goal"]) + if(!check_rights(R_EVENT)) + return + var/list/type_choices = typesof(/datum/station_goal) + var/picked = input("Choose goal type") in type_choices|null + if(!picked) + return + var/datum/station_goal/G = new picked() + if(picked == /datum/station_goal) + var/newname = input("Enter goal name:") as text|null + if(!newname) + return + G.name = newname + var/description = input("Enter [command_name()] message contents:") as message|null + if(!description) + return + G.report_message = description + message_admins("[key_name_admin(usr)] created \"[G.name]\" station goal.") + ticker.mode.station_goals += G + modify_goals() + + // Library stuff + else if(href_list["library_book_id"]) + var/isbn = sanitizeSQL(href_list["library_book_id"]) + + if(href_list["view_library_book"]) + var/DBQuery/query_view_book = dbcon.NewQuery("SELECT content, title FROM [format_table_name("library")] WHERE id=[isbn]") + if(!query_view_book.Execute()) + var/err = query_view_book.ErrorMsg() + log_game("SQL ERROR viewing book. Error : \[[err]\]\n") + return + + var/content = "" + var/title = "" + while(query_view_book.NextRow()) + content = query_view_book.item[1] + title = html_encode(query_view_book.item[2]) + + var/dat = "
    "
    +			dat += "[html_encode(html_to_pencode(content))]"
    +			dat += "
    " + + var/datum/browser/popup = new(usr, "admin_view_book", "[title]", 700, 400) + popup.set_content(dat) + popup.open(0) + + log_admin("[key_name(usr)] has viewed the book [isbn].") + message_admins("[key_name_admin(usr)] has viewed the book [isbn].") + return + + else if(href_list["unflag_library_book"]) + var/DBQuery/query_unflag_book = dbcon.NewQuery("UPDATE [format_table_name("library")] SET flagged = 0 WHERE id=[isbn]") + if(!query_unflag_book.Execute()) + var/err = query_unflag_book.ErrorMsg() + log_game("SQL ERROR unflagging book. Error : \[[err]\]\n") + return + + log_admin("[key_name(usr)] has unflagged the book [isbn].") + message_admins("[key_name_admin(usr)] has unflagged the book [isbn].") + + else if(href_list["delete_library_book"]) + var/DBQuery/query_delbook = dbcon.NewQuery("DELETE FROM [format_table_name("library")] WHERE id=[isbn]") + if(!query_delbook.Execute()) + var/err = query_delbook.ErrorMsg() + log_game("SQL ERROR deleting book. Error : \[[err]\]\n") + return + + log_admin("[key_name(usr)] has deleted the book [isbn].") + message_admins("[key_name_admin(usr)] has deleted the book [isbn].") + + // Refresh the page + src.view_flagged_books() + /proc/admin_jump_link(var/atom/target) if(!target) return diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 73b481bbc6b..972406bbdb3 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -109,13 +109,13 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," switch(selected_type) if("Mentorhelp") - msg = "[selected_type]: [key_name(src, 1, 1, selected_type)] (?) (PP) (VV) (SM) ([admin_jump_link(mob)]) (CA) (REJT) [ai_found ? " (CL)" : ""]: [msg]" + msg = "[selected_type]: [key_name(src, 1, 1, selected_type)] (?) (PP) (VV) (SM) ([admin_jump_link(mob)]) (CA) (REJT) [ai_found ? " (CL)" : ""] (PP) (TAKE) : [msg]" for(var/client/X in mentorholders + modholders + adminholders) if(X.prefs.sound & SOUND_ADMINHELP) X << 'sound/effects/adminhelp.ogg' to_chat(X, msg) if("Adminhelp") - msg = "[selected_type]: [key_name(src, 1, 1, selected_type)] (?) (PP) (VV) (SM) ([admin_jump_link(mob)]) (CA) (REJT) [ai_found ? " (CL)" : ""]: [msg]" + msg = "[selected_type]: [key_name(src, 1, 1, selected_type)] (?) (PP) (VV) (SM) ([admin_jump_link(mob)]) (CA) (REJT) [ai_found ? " (CL)" : ""] (PP) (TAKE) : [msg]" for(var/client/X in modholders + adminholders) if(X.prefs.sound & SOUND_ADMINHELP) X << 'sound/effects/adminhelp.ogg' diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 486b95f5a1b..ad926d61de7 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -13,7 +13,7 @@ return var/image/cross = image('icons/obj/storage.dmi',"bible") - msg = "\blue [bicon(cross)] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) ([admin_jump_link(src)]) (CA) (SC): [msg]" + msg = "\blue [bicon(cross)] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) ([admin_jump_link(src)]) (CA) (SC) (BLESS) (SMITE): [msg]" for(var/client/X in admins) if(check_rights(R_EVENT,0,X.mob)) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 79ee34fb635..9cacaefbd3f 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -88,7 +88,10 @@ missing_ages = 1 continue if(C.player_age < age) - msg += "[key_name_admin(C)]: account is [C.player_age] days old
    " + if(check_rights(R_ADMIN)) + msg += "[key_name_admin(C.mob)]: [C.player_age] days old
    " + else + msg += "[key_name_mentor(C.mob)]: [C.player_age] days old
    " if(missing_ages) to_chat(src, "Some accounts did not have proper ages set in their clients. This function requires database to be present") @@ -561,36 +564,22 @@ Traitors and the like can also be revived with the previous role mostly intact. if("Yes") communications_announcement.Announce(input, customname, , , , from); if("No") - to_chat(world, "\red [from] available at all communications consoles.") - - for(var/obj/machinery/computer/communications/C in machines) - if(! (C.stat & (BROKEN|NOPOWER) ) ) - var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc ) - P.name = "[from]" - P.info = input - P.update_icon() - C.messagetitle.Add("[from]") - C.messagetext.Add(P.info) + to_chat(world, "[from] available at all communications consoles.") + print_command_report(input, from) if(type == "Centcom Report") if(!customname) customname = "Nanotrasen Update" - switch(alert("Should this be announced to the general population?",,"Yes","No")) + var/announce = alert("Should this be announced to the general population?",,"Yes","No") + switch(announce) if("Yes") command_announcement.Announce(input, customname); if("No") - to_chat(world, "\red New Nanotrasen Update available at all communication consoles.") + to_chat(world, "New Nanotrasen Update available at all communication consoles.") - for(var/obj/machinery/computer/communications/C in machines) - if(! (C.stat & (BROKEN|NOPOWER) ) ) - var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc ) - P.name = "'[command_name()] Update.'" - P.info = input - P.update_icon() - C.messagetitle.Add("[command_name()] Update") - C.messagetext.Add(P.info) + print_command_report(input, "[announce == "No" ? "Classified " : ""][command_name()] Update") // world << sound('sound/AI/commandreport.ogg') log_admin("[key_name(src)] has created a communications report: [input]") @@ -892,7 +881,6 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("[key_name_admin(usr)] blanked all telecomms scripts.") feedback_add_details("admin_verb","RAT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - /client/proc/toggle_ert_calling() set category = "Event" set name = "Toggle ERT" @@ -911,3 +899,19 @@ Traitors and the like can also be revived with the previous role mostly intact. to_chat(usr, "\red ERT has been Disabled.") log_admin("Admin [key_name(src)] has disabled ERT calling.") message_admins("Admin [key_name_admin(usr)] has disabled ERT calling.", 1) + +/client/proc/modify_goals() + set category = "Event" + set name = "Modify Station Goals" + + if(!check_rights(R_EVENT)) + return + + holder.modify_goals() + +/datum/admins/proc/modify_goals() + var/dat = "" + for(var/datum/station_goal/S in ticker.mode.station_goals) + dat += "[S.name] - Announce | Remove
    " + dat += "
    Add New Goal" + usr << browse(dat, "window=goals;size=400x400") \ No newline at end of file diff --git a/code/modules/awaymissions/bluespaceartillery.dm b/code/modules/awaymissions/bluespaceartillery.dm deleted file mode 100644 index 1da3d3bfc55..00000000000 --- a/code/modules/awaymissions/bluespaceartillery.dm +++ /dev/null @@ -1,79 +0,0 @@ -/obj/machinery/computer/artillerycontrol - name = "bluespace artillery control" - icon_screen = "accelerator" - icon_keyboard = "accelerator_key" - icon_state = "computer-wires" - req_access = list(access_cent_commander) - var/last_fire = 0 - var/reload_cooldown = 180 // 3 minute cooldown - var/area/targetarea - - light_color = LIGHT_COLOR_LIGHTBLUE - -/obj/machinery/computer/artillerycontrol/attack_ai(user as mob) - to_chat(user, "Access denied.") - return - -/obj/machinery/computer/artillerycontrol/attack_hand(user as mob) - ui_interact(user) - -/obj/machinery/computer/artillerycontrol/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open) - if(!ui) - ui = new(user, src, ui_key, "bluespace_artillery.tmpl", "Bluespace Control", 400, 260) - ui.open() - ui.set_auto_update(1) - -/obj/machinery/computer/artillerycontrol/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) - var/data[0] - - var/time_to_wait = round(reload_cooldown - ((world.time / 10) - last_fire), 1) - var/mins = round(time_to_wait / 60) - var/seconds = time_to_wait - (60*mins) - data["reloadtime_mins"] = mins - data["reloadtime_secs"] = (seconds < 10) ? "0[seconds]" : seconds - if(targetarea) - var/areaname = sanitize(targetarea.name) - data["target"] = "Locked on to [areaname]" - else - data["target"] = "No Lock" - - return data - -/obj/machinery/computer/artillerycontrol/Topic(href, href_list) - if(..()) - return 1 - - if(href_list["area"]) - var/A - A = input("Select the target area.", "Select Area", A) in ghostteleportlocs|null - var/area/thearea = ghostteleportlocs[A] - if(..() || !istype(thearea)) - return - - targetarea = thearea - - if(href_list["fire"]) - var/delta = (world.time / 10) - last_fire - if(reload_cooldown > delta) - return 1 - - event_announcement.Announce("Bluespace artillery fire detected. Brace for impact.") - message_admins("[key_name_admin(usr)] has launched an artillery strike.", 1) - var/list/L = list() - for(var/turf/T in get_area_turfs(targetarea.type)) - L += T - var/loc = pick(L) - explosion(loc,2,5,11) - last_fire = world.time / 10 - - nanomanager.update_uis(src) - -/obj/structure/artilleryplaceholder - name = "artillery" - icon = 'icons/obj/machines/artillery.dmi' - anchored = 1 - density = 1 - -/obj/structure/artilleryplaceholder/decorative - density = 0 diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index a5e64a29c7f..7313de43815 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -335,6 +335,7 @@ world.update_status() if(holder) + on_holder_add() add_admin_verbs() admin_memo_output("Show", 0, 1) @@ -408,10 +409,12 @@ if(IsGuestKey(key)) return + establish_db_connection() if(!dbcon.IsConnected()) return + var/DBQuery/query = dbcon.NewQuery("SELECT id, datediff(Now(),firstseen) as age FROM [format_table_name("player")] WHERE ckey = '[ckey]'") query.Execute() var/sql_id = 0 @@ -421,6 +424,7 @@ player_age = text2num(query.item[2]) break + var/DBQuery/query_ip = dbcon.NewQuery("SELECT ckey FROM [format_table_name("player")] WHERE ip = '[address]'") query_ip.Execute() related_accounts_ip = list() @@ -428,6 +432,7 @@ if(ckey != query_ip.item[1]) related_accounts_ip.Add("[query_ip.item[1]]") + var/DBQuery/query_cid = dbcon.NewQuery("SELECT ckey FROM [format_table_name("player")] WHERE computerid = '[computer_id]'") query_cid.Execute() related_accounts_cid = list() @@ -435,6 +440,7 @@ if(ckey != query_cid.item[1]) related_accounts_cid.Add("[query_cid.item[1]]") + var/admin_rank = "Player" if(holder) admin_rank = holder.rank @@ -443,15 +449,18 @@ if(check_randomizer(connectiontopic)) return + //Log all the alts if(related_accounts_cid.len) log_access("Alts: [key_name(src)]:[jointext(related_accounts_cid, " - ")]") + var/watchreason = check_watchlist(ckey) if(watchreason) message_admins("Notice: [key_name_admin(src)] is on the watchlist and has just connected - Reason: [watchreason]") send2irc(config.admin_notify_irc, "Watchlist - [key_name(src)] is on the watchlist and has just connected - Reason: [watchreason]") + //Just the standard check to see if it's actually a number if(sql_id) if(istext(sql_id)) @@ -467,17 +476,24 @@ if(sql_id) //Player already identified previously, we need to just update the 'lastseen', 'ip' and 'computer_id' variables var/DBQuery/query_update = dbcon.NewQuery("UPDATE [format_table_name("player")] SET lastseen = Now(), ip = '[sql_ip]', computerid = '[sql_computerid]', lastadminrank = '[sql_admin_rank]' WHERE id = [sql_id]") - query_update.Execute() + if(!query_update.Execute()) + var/err = query_update.ErrorMsg() + log_game("SQL ERROR during log_client_to_db (update). Error : \[[err]\]\n") + message_admins("SQL ERROR during log_client_to_db (update). Error : \[[err]\]\n") else //New player!! Need to insert all the stuff var/DBQuery/query_insert = dbcon.NewQuery("INSERT INTO [format_table_name("player")] (id, ckey, firstseen, lastseen, ip, computerid, lastadminrank) VALUES (null, '[ckey]', Now(), Now(), '[sql_ip]', '[sql_computerid]', '[sql_admin_rank]')") - query_insert.Execute() + if(!query_insert.Execute()) + var/err = query_insert.ErrorMsg() + log_game("SQL ERROR during log_client_to_db (insert). Error : \[[err]\]\n") + message_admins("SQL ERROR during log_client_to_db (insert). Error : \[[err]\]\n") //Logging player access var/serverip = "[world.internet_address]:[world.port]" var/DBQuery/query_accesslog = dbcon.NewQuery("INSERT INTO `[format_table_name("connection_log")]`(`id`,`datetime`,`serverip`,`ckey`,`ip`,`computerid`) VALUES(null,Now(),'[serverip]','[ckey]','[sql_ip]','[sql_computerid]');") query_accesslog.Execute() + #undef TOPIC_SPAM_DELAY #undef UPLOAD_LIMIT #undef MIN_CLIENT_VERSION diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index 764e88f02fa..15af19c19e4 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -95,6 +95,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts var/UI_style_alpha = 255 var/windowflashing = TRUE + //ghostly preferences + var/ghost_anonsay = 0 //character preferences var/real_name //our character's name @@ -283,6 +285,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts dat += "Species: [species]
    " if(species == "Vox") dat += "N2 Tank: [speciesprefs ? "Large N2 Tank" : "Specialized N2 Tank"]
    " + if(species == "Grey") + dat += "Voice: [speciesprefs ? "Wingdings" : "Normal"]
    " dat += "Secondary Language: [language]
    " dat += "Blood Type: [b_type]
    " if(species in list("Human", "Drask", "Vox")) @@ -444,6 +448,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts dat += "Ghost ears: [(toggles & CHAT_GHOSTEARS) ? "Nearest Creatures" : "All Speech"]
    " dat += "Ghost sight: [(toggles & CHAT_GHOSTSIGHT) ? "Nearest Creatures" : "All Emotes"]
    " dat += "Ghost radio: [(toggles & CHAT_GHOSTRADIO) ? "Nearest Speakers" : "All Chatter"]
    " + dat += "Deadchat anonymity: [ghost_anonsay ? "Anonymous" : "Not Anonymous"]
    " dat += "" dat += "

    Special Role Settings

    " @@ -1334,6 +1339,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts b_skin = 0 alt_head = "None" //No alt heads on species that don't have them. + speciesprefs = 0 //My Vox tank shouldn't change how my future Grey talks. body_accessory = null //no vulptail on humans damnit @@ -1994,6 +2000,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if("ghost_radio") toggles ^= CHAT_GHOSTRADIO + if("ghost_anonsay") + ghost_anonsay = !ghost_anonsay + if("save") save_preferences(user) save_character(user) @@ -2040,6 +2049,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts character.add_language(language) + character.real_name = real_name character.dna.real_name = real_name character.name = character.real_name diff --git a/code/modules/client/preference/preferences_mysql.dm b/code/modules/client/preference/preferences_mysql.dm index f00c9f5d735..a945af5ba2f 100644 --- a/code/modules/client/preference/preferences_mysql.dm +++ b/code/modules/client/preference/preferences_mysql.dm @@ -14,8 +14,9 @@ nanoui_fancy, show_ghostitem_attack, lastchangelog, - exp, - windowflashing + windowflashing, + ghost_anonsay, + exp FROM [format_table_name("player")] WHERE ckey='[C.ckey]'"} ) @@ -42,8 +43,9 @@ nanoui_fancy = text2num(query.item[11]) show_ghostitem_attack = text2num(query.item[12]) lastchangelog = query.item[13] - exp = query.item[14] - windowflashing = text2num(query.item[15]) + windowflashing = text2num(query.item[14]) + ghost_anonsay = text2num(query.item[15]) + exp = query.item[16] //Sanitize ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor)) @@ -58,8 +60,9 @@ nanoui_fancy = sanitize_integer(nanoui_fancy, 0, 1, initial(nanoui_fancy)) show_ghostitem_attack = sanitize_integer(show_ghostitem_attack, 0, 1, initial(show_ghostitem_attack)) lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog)) - exp = sanitize_text(exp, initial(exp)) windowflashing = sanitize_integer(windowflashing, 0, 1, initial(windowflashing)) + ghost_anonsay = sanitize_integer(ghost_anonsay, 0, 1, initial(ghost_anonsay)) + exp = sanitize_text(exp, initial(exp)) return 1 /datum/preferences/proc/save_preferences(client/C) @@ -84,7 +87,9 @@ volume='[volume]', nanoui_fancy='[nanoui_fancy]', show_ghostitem_attack='[show_ghostitem_attack]', - lastchangelog='[lastchangelog]' + lastchangelog='[lastchangelog]', + windowflashing='[windowflashing]', + ghost_anonsay='[ghost_anonsay]' WHERE ckey='[C.ckey]'"} ) diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 00bd068e067..140b5f1a999 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -327,8 +327,8 @@ flash_protect = 0 tint = 0 var/mob/living/carbon/user = usr - user.update_inv_glasses() user.update_tint() + user.update_inv_glasses() for(var/X in actions) var/datum/action/A = X @@ -492,4 +492,4 @@ else to_chat(user, "The eye winks at you and vanishes into the abyss, you feel really unlucky.") qdel(src) - ..() \ No newline at end of file + ..() \ No newline at end of file diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 88638abde76..6cfce8c0051 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -383,7 +383,7 @@ /obj/item/clothing/head/griffin/proc/caw() if(cooldown < world.time - 20) // A cooldown, to stop people being jerks - playsound(src.loc, "sound/misc/caw.ogg", 50, 1) + playsound(src.loc, 'sound/misc/caw.ogg', 50, 1) cooldown = world.time diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 67e4f697eff..4d9970adba3 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -67,9 +67,9 @@ to_chat(usr, "You push the [src] up out of your face.") flash_protect = 0 tint = 0 - var/mob/living/carbon/C = usr - C.update_tint() - usr.update_inv_head() //so our mob-overlays update + var/mob/living/carbon/user = usr + user.update_tint() + user.update_inv_head() //so our mob-overlays update for(var/X in actions) var/datum/action/A = X diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index e539b2cae77..ccf9552a5e6 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -52,7 +52,9 @@ to_chat(usr, "You push the [src] up out of your face.") flash_protect = 0 tint = 0 - usr.update_inv_wear_mask() //so our mob-overlays update + var/mob/living/carbon/user = usr + user.update_tint() + user.update_inv_wear_mask() //so our mob-overlays update for(var/X in actions) var/datum/action/A = X @@ -182,7 +184,7 @@ /obj/item/clothing/mask/gas/owl_mask/proc/hoot() if(cooldown < world.time - 35) // A cooldown, to stop people being jerks - playsound(src.loc, "sound/misc/hoot.ogg", 50, 1) + playsound(src.loc, 'sound/misc/hoot.ogg', 50, 1) cooldown = world.time // ******************************************************************** diff --git a/code/modules/detective_work/evidence.dm b/code/modules/detective_work/evidence.dm index 6f62a7eecac..e457d73fb87 100644 --- a/code/modules/detective_work/evidence.dm +++ b/code/modules/detective_work/evidence.dm @@ -40,8 +40,7 @@ if(!isturf(I.loc)) //If it isn't on the floor. Do some checks to see if it's in our hands or a box. Otherwise give up. if(istype(I.loc,/obj/item/weapon/storage)) //in a container. var/obj/item/weapon/storage/U = I.loc - user.client.screen -= I - U.contents.Remove(I) + U.remove_from_storage(I, src) else if(user.l_hand == I) //in a hand user.drop_l_hand() else if(user.r_hand == I) //in a hand @@ -59,6 +58,7 @@ I.pixel_x = 0 //then remove it so it'll stay within the evidence bag I.pixel_y = 0 var/image/img = image("icon"=I, "layer"=FLOAT_LAYER) //take a snapshot. (necessary to stop the underlays appearing under our inventory-HUD slots ~Carn + img.plane = FLOAT_PLANE I.pixel_x = xx //and then return it I.pixel_y = yy overlays += img @@ -69,7 +69,7 @@ w_class = I.w_class return 1 -/obj/item/weapon/evidencebag/attack_self(mob/user as mob) +/obj/item/weapon/evidencebag/attack_self(mob/user) if(contents.len) var/obj/item/I = contents[1] user.visible_message("[user] takes [I] out of [src].", "You take [I] out of [src].",\ @@ -83,17 +83,16 @@ else to_chat(user, "[src] is empty.") icon_state = "evidenceobj" - return /obj/item/weapon/storage/box/evidence name = "evidence bag box" desc = "A box claiming to contain evidence bags." - New() - new /obj/item/weapon/evidencebag(src) - new /obj/item/weapon/evidencebag(src) - new /obj/item/weapon/evidencebag(src) - new /obj/item/weapon/evidencebag(src) - new /obj/item/weapon/evidencebag(src) - new /obj/item/weapon/evidencebag(src) - ..() - return \ No newline at end of file + +/obj/item/weapon/storage/box/evidence/New() + new /obj/item/weapon/evidencebag(src) + new /obj/item/weapon/evidencebag(src) + new /obj/item/weapon/evidencebag(src) + 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/scanner.dm b/code/modules/detective_work/scanner.dm index be8e7d147a2..69aeb643263 100644 --- a/code/modules/detective_work/scanner.dm +++ b/code/modules/detective_work/scanner.dm @@ -66,7 +66,7 @@ if(log.len && !scanning) scanning = 1 to_chat(usr, "Printing report, please wait...") - playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1) + playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1) spawn(100) // Create our paper diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index b583c04702f..0ff4af7b405 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -335,7 +335,7 @@ log transactions to_chat(usr, "The [src.name] flashes an error on its display.") return lastprint = world.timeofday - playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1) + playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1) var/obj/item/weapon/paper/R = new(src.loc) R.name = "Account balance: [authenticated_account.owner_name]" R.info = {"NT Automated Teller Account Statement

    diff --git a/code/modules/economy/Accounts.dm b/code/modules/economy/Accounts.dm index 6079e62c54f..620396f7da2 100644 --- a/code/modules/economy/Accounts.dm +++ b/code/modules/economy/Accounts.dm @@ -89,7 +89,7 @@ var/global/list/all_money_accounts = list() var/obj/item/smallDelivery/P = new /obj/item/smallDelivery(source_db.loc) var/obj/item/weapon/paper/R = new /obj/item/weapon/paper(P) - playsound(source_db.loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1) + playsound(source_db.loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1) P.wrapped = R R.name = "Account information: [M.owner_name]" diff --git a/code/modules/economy/Accounts_DB.dm b/code/modules/economy/Accounts_DB.dm index 44299826454..1c9291083d7 100644 --- a/code/modules/economy/Accounts_DB.dm +++ b/code/modules/economy/Accounts_DB.dm @@ -220,7 +220,7 @@ if("print") var/text - playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1) + playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1) var/obj/item/weapon/paper/P = new(loc) if(detailed_account_view) P.name = "account #[detailed_account_view.account_number] details" diff --git a/code/modules/economy/EFTPOS.dm b/code/modules/economy/EFTPOS.dm index 8f408767f72..bd7a25d12b3 100644 --- a/code/modules/economy/EFTPOS.dm +++ b/code/modules/economy/EFTPOS.dm @@ -26,7 +26,7 @@ linked_account = station_account /obj/item/device/eftpos/proc/print_reference() - playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1) + playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1) var/obj/item/weapon/paper/R = new(src.loc) R.name = "Reference: [eftpos_name]" diff --git a/code/modules/economy/POS.dm b/code/modules/economy/POS.dm index 09c6bdcf205..6baf7103338 100644 --- a/code/modules/economy/POS.dm +++ b/code/modules/economy/POS.dm @@ -201,7 +201,7 @@ var/const/POS_HEADER = {" "} receipt += "" - playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1) + playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1) var/obj/item/weapon/paper/P = new(loc) P.name="Receipt #[id]-[++sales]" P.info=receipt diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 90889ef7eba..bece706a653 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -191,7 +191,8 @@ var/list/event_last_fired = list() new /datum/event_meta(EVENT_LEVEL_MAJOR, "Abductor Visit", /datum/event/abductor, 80, is_one_shot = 1), new /datum/event_meta/alien(EVENT_LEVEL_MAJOR, "Alien Infestation", /datum/event/alien_infestation, 0, list(ASSIGNMENT_SECURITY = 30), 1), new /datum/event_meta(EVENT_LEVEL_MAJOR, "Traders", /datum/event/traders, 0, is_one_shot = 1), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Slaughter Demon", /datum/event/spawn_slaughter, 15, is_one_shot = 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Terror Spiders", /datum/event/spider_terror, 0, is_one_shot = 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Slaughter Demon", /datum/event/spawn_slaughter, 15, is_one_shot = 1) ) diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm index 2dc2c8a17dd..04c9d3be5d4 100644 --- a/code/modules/events/immovable_rod.dm +++ b/code/modules/events/immovable_rod.dm @@ -29,14 +29,16 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 anchored = 1 var/z_original = 0 var/destination + var/notify = TRUE /obj/effect/immovablerod/New(atom/start, atom/end) loc = start z_original = z destination = end - notify_ghosts("\A [src] is inbound!", - enter_link="(Click to follow)", - source=src, action=NOTIFY_FOLLOW) + if(notify) + notify_ghosts("\A [src] is inbound!", + enter_link="(Click to follow)", + source=src, action=NOTIFY_FOLLOW) poi_list |= src if(end && end.z==z_original) walk_towards(src, destination, 1) diff --git a/code/modules/events/meaty_ops.dm b/code/modules/events/meaty_ops.dm index d92e79edea9..87d58ae7dbb 100644 --- a/code/modules/events/meaty_ops.dm +++ b/code/modules/events/meaty_ops.dm @@ -15,5 +15,5 @@ -/datum/event/meteor_wave/goreops/end() +/datum/event/meteor_wave/goreop/end() event_announcement.Announce("All MeteorOps are dead. Major Station Victory.", "MeteorOps") \ No newline at end of file diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 61ba1b5350d..d232342042a 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -66,6 +66,9 @@ /datum/spacevine_mutation/proc/on_explosion(severity, obj/effect/spacevine/holder) return +/datum/spacevine_mutation/proc/on_search(severity, obj/effect/spacevine/holder) + return + /datum/spacevine_mutation/space_covering name = "space protective" @@ -150,6 +153,7 @@ /datum/spacevine_mutation/bluespace/on_spread(obj/effect/spacevine/holder, turf/target) if(holder.energy > 1 && !locate(/obj/effect/spacevine) in target) holder.master.spawn_spacevine_piece(target, holder) + . = TRUE /datum/spacevine_mutation/light name = "light" @@ -218,6 +222,7 @@ var/obj/effect/spacevine/prey = locate() in target if(prey && !prey.mutations.Find(src)) //Eat all vines that are not of the same origin qdel(prey) + . = TRUE /datum/spacevine_mutation/aggressive_spread //very OP, but im out of other ideas currently name = "aggressive spreading" @@ -227,6 +232,7 @@ /datum/spacevine_mutation/aggressive_spread/on_spread(obj/effect/spacevine/holder, turf/target) target.ex_act(severity) // vine immunity handled at /mob/ex_act + . = TRUE /datum/spacevine_mutation/aggressive_spread/on_buckle(obj/effect/spacevine/holder, mob/living/buckled) buckled.ex_act(severity) @@ -291,6 +297,14 @@ holder.entangle(crosser) +/datum/spacevine_mutation/virulent_spread + name = "virulently spreading" + hue = "#FF8080" + quality = MINOR_NEGATIVE + +/datum/spacevine_mutation/virulent_spread/on_search(obj/effect/spacevine/holder) + return 1 + // SPACE VINES (Note that this code is very similar to Biomass code) /obj/effect/spacevine name = "space vines" @@ -428,8 +442,8 @@ if(potency != null) mutativeness = potency / 10 if(production != null) - spread_cap *= production / 5 - spread_multiplier /= production / 5 + spread_cap /= production / 5 + spread_multiplier *= production / 5 ..() @@ -532,15 +546,24 @@ buckle_mob(V, 1) /obj/effect/spacevine/proc/spread() - var/direction = pick(cardinal) - var/turf/stepturf = get_step(src,direction) + var/list/dir_list = cardinal.Copy() + var/spread_search = FALSE // Whether to exhaustive search all 4 cardinal dirs for an open direction for(var/datum/spacevine_mutation/SM in mutations) - SM.on_spread(src, stepturf) - stepturf = get_step(src,direction) //in case turf changes, to make sure no runtimes happen - if(!locate(/obj/effect/spacevine, stepturf)) - if(stepturf.Enter(src)) - if(master) - master.spawn_spacevine_piece(stepturf, src) + spread_search |= SM.on_search(src) + while(dir_list.len) + var/direction = pick(dir_list) + dir_list -= direction + var/turf/stepturf = get_step(src,direction) + var/spread_success = FALSE + for(var/datum/spacevine_mutation/SM in mutations) + spread_success |= SM.on_spread(src, stepturf) // If this returns 1, spreading succeeded + if(!locate(/obj/effect/spacevine, stepturf)) + if(stepturf.Enter(src)) + if(master) + master.spawn_spacevine_piece(stepturf, src) + spread_success = TRUE + if(spread_success || !spread_search) + break /obj/effect/spacevine/ex_act(severity) var/i @@ -567,4 +590,4 @@ if(isliving(A)) var/mob/living/M = A if(("vines" in M.faction) || ("plants" in M.faction)) - . = TRUE \ No newline at end of file + . = TRUE diff --git a/code/modules/events/spider_terror.dm b/code/modules/events/spider_terror.dm new file mode 100644 index 00000000000..2556c369470 --- /dev/null +++ b/code/modules/events/spider_terror.dm @@ -0,0 +1,44 @@ + +/datum/event/spider_terror + announceWhen = 400 + var/spawncount = 1 + +/datum/event/spider_terror/setup() + announceWhen = rand(announceWhen, announceWhen + 50) + spawncount = 1 + +/datum/event/spider_infestation/announce() + command_announcement.Announce("Confirmed outbreak of level 3 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/effects/siren.ogg') + +/datum/event/spider_terror/start() + + var/list/vents = list() + for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in all_vent_pumps) + if(is_station_level(temp_vent.loc.z) && !temp_vent.welded) + if(temp_vent.parent.other_atmosmch.len > 50) + vents += temp_vent + + var/spider_type + var/infestation_type = pick(1, 2, 3, 4) + switch(infestation_type) + if(1) + spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/green + spawncount = pick(2,3) + if(2) + spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/white + spawncount = 1 + if(3) + spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/prince + spawncount = 1 + if(4) + spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/queen + spawncount = 1 + + while(spawncount >= 1 && vents.len) + var/obj/vent = pick(vents) + var/obj/effect/spider/spiderling/terror_spiderling/S = new(vent.loc) + S.name = "evil-looking spiderling" + S.grow_as = spider_type + S.amount_grown = 75 + vents -= vent + spawncount-- \ No newline at end of file diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index ff684c3296b..add4e7c474f 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -1218,13 +1218,6 @@ user.drop_item() forceMove(get_turf(O)) return Expand() - if(istype(O, /obj/machinery/computer/camera_advanced/xenobio)) - var/obj/machinery/computer/camera_advanced/xenobio/X = O - X.monkeys++ - to_chat(user, "You feed [src] to the [X]. It now has [X.monkeys] monkey cubes stored.") - user.drop_item() - qdel(src) - return ..() /obj/item/weapon/reagent_containers/food/snacks/monkeycube/water_act(volume, temperature) diff --git a/code/modules/library/admin.dm b/code/modules/library/admin.dm index 7e3abd91db9..83268c5eecb 100644 --- a/code/modules/library/admin.dm +++ b/code/modules/library/admin.dm @@ -29,13 +29,36 @@ to_chat(src, "Only administrators may use this command.") return + holder.view_flagged_books() + +/datum/admins/proc/view_flagged_books() + if(!usr.client.holder) + return + + var/dat = "" + var/DBQuery/query = dbcon.NewQuery("SELECT id, title, flagged FROM [format_table_name("library")] WHERE flagged > 0 ORDER BY flagged DESC") if(!query.Execute()) var/err = query.ErrorMsg() log_game("SQL ERROR getting flagged books. Error : \[[err]\]\n") return - var/i - for(i = 0, query.NextRow(), i++) - to_chat(usr, "[add_zero(query.item[1], 4)] ([query.item[2]]) - flagged [query.item[3]] times.") - to_chat(usr, "[i] flagged books total.") \ No newline at end of file + var/books = 0 + while(query.NextRow()) + books++ + var/isbn = query.item[1] + dat += "" + + dat += "
    ISBNTitleTotal FlagsOptions
    [add_zero(isbn, 4)][query.item[2]][query.item[3]]" + dat += "View Content" + dat += "Unflag" + dat += "Delete" + dat += "
    " + + if(!books) + dat = "

    No flagged books! :)

    " + + var/datum/browser/popup = new(usr, "admin_view_flagged_books", "Flagged Books", 700, 400) + popup.set_content(dat) + popup.open(0) + diff --git a/code/modules/lighting/lighting_overlay.dm b/code/modules/lighting/lighting_overlay.dm index 7c2e1a55842..b6e4b8b066b 100644 --- a/code/modules/lighting/lighting_overlay.dm +++ b/code/modules/lighting/lighting_overlay.dm @@ -59,21 +59,14 @@ var/list/all_lighting_overlays = list() // Global list of lighting overlays. var/max = max(cr.cache_mx, cg.cache_mx, cb.cache_mx, ca.cache_mx) - var/list/new_matrix = list( + color = list( cr.cache_r, cr.cache_g, cr.cache_b, 0, cg.cache_r, cg.cache_g, cg.cache_b, 0, cb.cache_r, cb.cache_g, cb.cache_b, 0, ca.cache_r, ca.cache_g, ca.cache_b, 0, 0, 0, 0, 1 - ) - var/lum = max > LIGHTING_SOFT_THRESHOLD - - if(lum) - luminosity = 1 - animate(src, color = new_matrix, time = 5) - else - animate(src, color = new_matrix, time = 5) - animate(luminosity = 0, time = 0) + ) + luminosity = max > LIGHTING_SOFT_THRESHOLD diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm index c26522dc5a7..01f967a0544 100644 --- a/code/modules/lighting/lighting_source.dm +++ b/code/modules/lighting/lighting_source.dm @@ -1,3 +1,4 @@ +/var/list/datum/light_source/all_lighting_sources = list() // This is where the fun begins. // These are the main datums that emit light. @@ -31,6 +32,7 @@ var/force_update /datum/light_source/New(var/atom/owner, var/atom/top) + all_lighting_sources += src source_atom = owner // Set our new owner. if(!source_atom.light_sources) source_atom.light_sources = list() @@ -55,14 +57,19 @@ update() + return ..() // Kill ourselves. /datum/light_source/proc/destroy() + all_lighting_sources -= src destroyed = TRUE force_update() if(source_atom) - source_atom.light_sources -= src + if(!source_atom.light_sources) + log_runtime(EXCEPTION("Atom [source_atom] was a light source, but lacked a light source list!\n"), source_atom) + else + source_atom.light_sources -= src if(top_atom) top_atom.light_sources -= src diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index cc6529f665d..54ecf32cf74 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -701,310 +701,6 @@ new /mob/living/simple_animal/hostile/mining_drone(get_turf(src)) qdel(src) -/**********************Mining drone**********************/ -#define MINEDRONE_COLLECT 1 -#define MINEDRONE_ATTACK 2 - -/mob/living/simple_animal/hostile/mining_drone - name = "nanotrasen minebot" - desc = "The instructions printed on the side read: This is a small robot used to support miners, can be set to search and collect loose ore, or to help fend off wildlife. A mining scanner can instruct it to drop loose ore. Field repairs can be done with a welder." - icon = 'icons/obj/aibots.dmi' - icon_state = "mining_drone" - icon_living = "mining_drone" - status_flags = CANSTUN|CANWEAKEN|CANPUSH - mouse_opacity = 1 - faction = list("neutral") - a_intent = I_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 - idle_vision_range = 5 - move_to_delay = 10 - retreat_distance = 1 - minimum_distance = 2 - health = 125 - maxHealth = 125 - melee_damage_lower = 15 - melee_damage_upper = 15 - environment_smash = 0 - check_friendly_fire = 1 - stop_automated_movement_when_pulled = 1 - attacktext = "drills" - attack_sound = 'sound/weapons/circsawhit.ogg' - ranged = 1 - sentience_type = SENTIENCE_MINEBOT - ranged_message = "shoots" - ranged_cooldown_time = 30 - projectiletype = /obj/item/projectile/kinetic - projectilesound = 'sound/weapons/Gunshot4.ogg' - speak_emote = list("states") - wanted_objects = list(/obj/item/weapon/ore/diamond, /obj/item/weapon/ore/gold, /obj/item/weapon/ore/silver, - /obj/item/weapon/ore/plasma, /obj/item/weapon/ore/uranium, /obj/item/weapon/ore/iron, - /obj/item/weapon/ore/bananium, /obj/item/weapon/ore/tranquillite, /obj/item/weapon/ore/glass) - healable = 0 - var/mode = MINEDRONE_COLLECT - var/light_on = 0 - var/mesons_active - - var/datum/action/innate/minedrone/toggle_light/toggle_light_action - var/datum/action/innate/minedrone/toggle_meson_vision/toggle_meson_vision_action - var/datum/action/innate/minedrone/toggle_mode/toggle_mode_action - var/datum/action/innate/minedrone/dump_ore/dump_ore_action - -/mob/living/simple_animal/hostile/mining_drone/New() - ..() - toggle_light_action = new() - toggle_light_action.Grant(src) - toggle_meson_vision_action = new() - toggle_meson_vision_action.Grant(src) - toggle_mode_action = new() - toggle_mode_action.Grant(src) - dump_ore_action = new() - dump_ore_action.Grant(src) - - SetCollectBehavior() - -/mob/living/simple_animal/hostile/mining_drone/sentience_act() - AIStatus = AI_OFF - check_friendly_fire = 0 - -/mob/living/simple_animal/hostile/mining_drone/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/W = I - if(W.welding && !stat) - if(AIStatus != AI_OFF && AIStatus != AI_IDLE) - to_chat(user, "[src] is moving around too much to repair!") - return - if(maxHealth == health) - to_chat(user, "[src] is at full integrity.") - else - adjustBruteLoss(-10) - to_chat(user, "You repair some of the armor on [src].") - return - if(istype(I, /obj/item/device/mining_scanner) || istype(I, /obj/item/device/t_scanner/adv_mining_scanner)) - to_chat(user, "You instruct [src] to drop any collected ore.") - DropOre() - return - ..() - -/mob/living/simple_animal/hostile/mining_drone/death() - ..() - visible_message("[src] is destroyed!") - new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc) - DropOre(0) - qdel(src) - return - -/mob/living/simple_animal/hostile/mining_drone/attack_hand(mob/living/carbon/human/M) - if(M.a_intent == I_HELP) - toggle_mode() - switch(mode) - if(MINEDRONE_COLLECT) - to_chat(M, "[src] has been set to search and store loose ore.") - if(MINEDRONE_ATTACK) - to_chat(M, "[src] has been set to attack hostile wildlife.") - return - ..() - -/mob/living/simple_animal/hostile/mining_drone/proc/SetCollectBehavior() - mode = MINEDRONE_COLLECT - idle_vision_range = 9 - search_objects = 2 - wander = 1 - ranged = 0 - minimum_distance = 1 - retreat_distance = null - icon_state = "mining_drone" - to_chat(src, "You are set to collect mode. You can now collect loose ore.") - -/mob/living/simple_animal/hostile/mining_drone/proc/SetOffenseBehavior() - mode = MINEDRONE_ATTACK - idle_vision_range = 7 - search_objects = 0 - wander = 0 - ranged = 1 - retreat_distance = 1 - minimum_distance = 2 - icon_state = "mining_drone_offense" - to_chat(src, "You are set to attack mode. You can now attack from range.") - -/mob/living/simple_animal/hostile/mining_drone/AttackingTarget() - if(istype(target, /obj/item/weapon/ore) && mode == MINEDRONE_COLLECT) - CollectOre() - return - ..() - -/mob/living/simple_animal/hostile/mining_drone/proc/CollectOre() - var/obj/item/weapon/ore/O - for(O in src.loc) - O.forceMove(src) - for(var/dir in alldirs) - var/turf/T = get_step(src,dir) - for(O in T) - O.forceMove(src) - return - -/mob/living/simple_animal/hostile/mining_drone/proc/DropOre(message = 1) - if(!contents.len) - if(message) - to_chat(src, "You attempt to dump your stored ore, but you have none.") - return - if(message) - to_chat(src, "You dump your stored ore.") - for(var/obj/item/weapon/ore/O in contents) - contents -= O - O.forceMove(loc) - return - -/mob/living/simple_animal/hostile/mining_drone/adjustHealth(amount) - if(mode != MINEDRONE_ATTACK && amount > 0) - SetOffenseBehavior() - . = ..() - -/mob/living/simple_animal/hostile/mining_drone/proc/toggle_mode() - switch(mode) - if(MINEDRONE_COLLECT) - SetOffenseBehavior() - if(MINEDRONE_ATTACK) - SetCollectBehavior() - else //This should never happen. - mode = MINEDRONE_COLLECT - SetCollectBehavior() - - -/mob/living/simple_animal/hostile/mining_drone/update_sight() - if(!client) - return - if(stat == DEAD) - grant_death_vision() - return - - if(mesons_active) - sight |= SEE_TURFS - see_invisible = SEE_INVISIBLE_MINIMUM - else - sight &= ~SEE_TURFS - see_invisible = SEE_INVISIBLE_LIVING - - see_in_dark = initial(see_in_dark) - - if(client.eye != src) - var/atom/A = client.eye - if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. - return - -//Actions for sentient minebots - -/datum/action/innate/minedrone - check_flags = AB_CHECK_CONSCIOUS - background_icon_state = "bg_default" - -/datum/action/innate/minedrone/toggle_light - name = "Toggle Light" - button_icon_state = "mech_lights_off" - -/datum/action/innate/minedrone/toggle_light/Activate() - var/mob/living/simple_animal/hostile/mining_drone/user = owner - - if(user.light_on) - user.set_light(0) - else - user.set_light(6) - user.light_on = !user.light_on - to_chat(user, "You toggle your light [user.light_on ? "on" : "off"].") - -/datum/action/innate/minedrone/toggle_meson_vision - name = "Toggle Meson Vision" - button_icon_state = "meson" - -/datum/action/innate/minedrone/toggle_meson_vision/Activate() - var/mob/living/simple_animal/hostile/mining_drone/user = owner - user.mesons_active = !user.mesons_active - user.update_sight() - - to_chat(user, "You toggle your meson vision [(user.mesons_active) ? "on" : "off"].") - -/datum/action/innate/minedrone/toggle_mode - name = "Toggle Mode" - button_icon_state = "mech_cycle_equip_off" - -/datum/action/innate/minedrone/toggle_mode/Activate() - var/mob/living/simple_animal/hostile/mining_drone/user = owner - user.toggle_mode() - -/datum/action/innate/minedrone/dump_ore - name = "Dump Ore" - button_icon_state = "mech_eject" - -/datum/action/innate/minedrone/dump_ore/Activate() - var/mob/living/simple_animal/hostile/mining_drone/user = owner - user.DropOre() - - -/**********************Minebot Upgrades**********************/ - -//Melee - -/obj/item/device/mine_bot_upgrade - name = "minebot melee upgrade" - desc = "A minebot upgrade." - icon_state = "door_electronics" - icon = 'icons/obj/doors/door_assembly.dmi' - -/obj/item/device/mine_bot_upgrade/afterattack(mob/living/simple_animal/hostile/mining_drone/M, mob/user, proximity) - if(!istype(M) || !proximity) - return - upgrade_bot(M, user) - -/obj/item/device/mine_bot_upgrade/proc/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/M, mob/user) - if(M.melee_damage_upper != initial(M.melee_damage_upper)) - to_chat(user, "[M] already has a combat upgrade installed!") - return - M.melee_damage_lower = 22 - M.melee_damage_upper = 22 - to_chat(user, "You upgrade [M]'s combat module.") - qdel(src) - -//Health - -/obj/item/device/mine_bot_upgrade/health - name = "minebot chassis upgrade" - -/obj/item/device/mine_bot_upgrade/health/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/M, mob/user) - if(M.maxHealth != initial(M.maxHealth)) - to_chat(user, "[M] already has a reinforced chassis!") - return - M.maxHealth = 170 - to_chat(user, "You reinforce [M]'s chassis.") - qdel(src) - - -//Cooldown - -/obj/item/device/mine_bot_upgrade/cooldown - name = "minebot cooldown upgrade" - -/obj/item/device/mine_bot_upgrade/cooldown/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/M, mob/user) - if(M.ranged_cooldown_time != initial(M.ranged_cooldown_time)) - to_chat(user, "[M] already has a decreased weapon cooldown!") - return - M.ranged_cooldown_time = 10 - to_chat(user, "You upgrade [M]'s ranged weaponry, reducing its cooldown.") - qdel(src) - - -//AI -/obj/item/slimepotion/sentience/mining - name = "minebot AI upgrade" - desc = "Can be used to grant sentience to minebots." - icon_state = "door_electronics" - icon = 'icons/obj/doors/door_assembly.dmi' - sentience_type = SENTIENCE_MINEBOT - origin_tech = "programming=6" - -#undef MINEDRONE_COLLECT -#undef MINEDRONE_ATTACK - /**********************Mining drone kit**********************/ /obj/item/weapon/storage/box/drone_kit diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm new file mode 100644 index 00000000000..575fbf3b5b6 --- /dev/null +++ b/code/modules/mining/minebot.dm @@ -0,0 +1,303 @@ +/**********************Mining drone**********************/ +#define MINEDRONE_COLLECT 1 +#define MINEDRONE_ATTACK 2 + +/mob/living/simple_animal/hostile/mining_drone + name = "nanotrasen minebot" + desc = "The instructions printed on the side read: This is a small robot used to support miners, can be set to search and collect loose ore, or to help fend off wildlife. A mining scanner can instruct it to drop loose ore. Field repairs can be done with a welder." + icon = 'icons/obj/aibots.dmi' + icon_state = "mining_drone" + icon_living = "mining_drone" + status_flags = CANSTUN|CANWEAKEN|CANPUSH + mouse_opacity = 1 + faction = list("neutral") + a_intent = I_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 + idle_vision_range = 5 + move_to_delay = 10 + retreat_distance = 1 + minimum_distance = 2 + health = 125 + maxHealth = 125 + melee_damage_lower = 15 + melee_damage_upper = 15 + environment_smash = 0 + check_friendly_fire = 1 + stop_automated_movement_when_pulled = 1 + attacktext = "drills" + attack_sound = 'sound/weapons/circsawhit.ogg' + ranged = 1 + sentience_type = SENTIENCE_MINEBOT + ranged_message = "shoots" + ranged_cooldown_time = 30 + projectiletype = /obj/item/projectile/kinetic + projectilesound = 'sound/weapons/Gunshot4.ogg' + speak_emote = list("states") + wanted_objects = list(/obj/item/weapon/ore/diamond, /obj/item/weapon/ore/gold, /obj/item/weapon/ore/silver, + /obj/item/weapon/ore/plasma, /obj/item/weapon/ore/uranium, /obj/item/weapon/ore/iron, + /obj/item/weapon/ore/bananium, /obj/item/weapon/ore/tranquillite, /obj/item/weapon/ore/glass) + healable = 0 + var/mode = MINEDRONE_COLLECT + var/light_on = 0 + var/mesons_active + + var/datum/action/innate/minedrone/toggle_light/toggle_light_action + var/datum/action/innate/minedrone/toggle_meson_vision/toggle_meson_vision_action + var/datum/action/innate/minedrone/toggle_mode/toggle_mode_action + var/datum/action/innate/minedrone/dump_ore/dump_ore_action + +/mob/living/simple_animal/hostile/mining_drone/New() + ..() + toggle_light_action = new() + toggle_light_action.Grant(src) + toggle_meson_vision_action = new() + toggle_meson_vision_action.Grant(src) + toggle_mode_action = new() + toggle_mode_action.Grant(src) + dump_ore_action = new() + dump_ore_action.Grant(src) + + SetCollectBehavior() + +/mob/living/simple_animal/hostile/mining_drone/sentience_act() + AIStatus = AI_OFF + check_friendly_fire = 0 + +/mob/living/simple_animal/hostile/mining_drone/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/W = I + if(W.welding && !stat) + if(AIStatus != AI_OFF && AIStatus != AI_IDLE) + to_chat(user, "[src] is moving around too much to repair!") + return + if(maxHealth == health) + to_chat(user, "[src] is at full integrity.") + else + adjustBruteLoss(-10) + to_chat(user, "You repair some of the armor on [src].") + return + if(istype(I, /obj/item/device/mining_scanner) || istype(I, /obj/item/device/t_scanner/adv_mining_scanner)) + to_chat(user, "You instruct [src] to drop any collected ore.") + DropOre() + return + ..() + +/mob/living/simple_animal/hostile/mining_drone/death() + ..() + visible_message("[src] is destroyed!") + new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc) + DropOre(0) + qdel(src) + return + +/mob/living/simple_animal/hostile/mining_drone/attack_hand(mob/living/carbon/human/M) + if(M.a_intent == I_HELP) + toggle_mode() + switch(mode) + if(MINEDRONE_COLLECT) + to_chat(M, "[src] has been set to search and store loose ore.") + if(MINEDRONE_ATTACK) + to_chat(M, "[src] has been set to attack hostile wildlife.") + return + ..() + +/mob/living/simple_animal/hostile/mining_drone/proc/SetCollectBehavior() + mode = MINEDRONE_COLLECT + idle_vision_range = 9 + search_objects = 2 + wander = 1 + ranged = 0 + minimum_distance = 1 + retreat_distance = null + icon_state = "mining_drone" + to_chat(src, "You are set to collect mode. You can now collect loose ore.") + +/mob/living/simple_animal/hostile/mining_drone/proc/SetOffenseBehavior() + mode = MINEDRONE_ATTACK + idle_vision_range = 7 + search_objects = 0 + wander = 0 + ranged = 1 + retreat_distance = 1 + minimum_distance = 2 + icon_state = "mining_drone_offense" + to_chat(src, "You are set to attack mode. You can now attack from range.") + +/mob/living/simple_animal/hostile/mining_drone/AttackingTarget() + if(istype(target, /obj/item/weapon/ore) && mode == MINEDRONE_COLLECT) + CollectOre() + return + ..() + +/mob/living/simple_animal/hostile/mining_drone/proc/CollectOre() + var/obj/item/weapon/ore/O + for(O in src.loc) + O.forceMove(src) + for(var/dir in alldirs) + var/turf/T = get_step(src,dir) + for(O in T) + O.forceMove(src) + return + +/mob/living/simple_animal/hostile/mining_drone/proc/DropOre(message = 1) + if(!contents.len) + if(message) + to_chat(src, "You attempt to dump your stored ore, but you have none.") + return + if(message) + to_chat(src, "You dump your stored ore.") + for(var/obj/item/weapon/ore/O in contents) + contents -= O + O.forceMove(loc) + return + +/mob/living/simple_animal/hostile/mining_drone/adjustHealth(amount) + if(mode != MINEDRONE_ATTACK && amount > 0) + SetOffenseBehavior() + . = ..() + +/mob/living/simple_animal/hostile/mining_drone/proc/toggle_mode() + switch(mode) + if(MINEDRONE_COLLECT) + SetOffenseBehavior() + if(MINEDRONE_ATTACK) + SetCollectBehavior() + else //This should never happen. + mode = MINEDRONE_COLLECT + SetCollectBehavior() + + +/mob/living/simple_animal/hostile/mining_drone/update_sight() + if(!client) + return + if(stat == DEAD) + grant_death_vision() + return + + if(mesons_active) + sight |= SEE_TURFS + see_invisible = SEE_INVISIBLE_MINIMUM + else + sight &= ~SEE_TURFS + see_invisible = SEE_INVISIBLE_LIVING + + see_in_dark = initial(see_in_dark) + + if(client.eye != src) + var/atom/A = client.eye + if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. + return + +//Actions for sentient minebots + +/datum/action/innate/minedrone + check_flags = AB_CHECK_CONSCIOUS + background_icon_state = "bg_default" + +/datum/action/innate/minedrone/toggle_light + name = "Toggle Light" + button_icon_state = "mech_lights_off" + +/datum/action/innate/minedrone/toggle_light/Activate() + var/mob/living/simple_animal/hostile/mining_drone/user = owner + + if(user.light_on) + user.set_light(0) + else + user.set_light(6) + user.light_on = !user.light_on + to_chat(user, "You toggle your light [user.light_on ? "on" : "off"].") + +/datum/action/innate/minedrone/toggle_meson_vision + name = "Toggle Meson Vision" + button_icon_state = "meson" + +/datum/action/innate/minedrone/toggle_meson_vision/Activate() + var/mob/living/simple_animal/hostile/mining_drone/user = owner + user.mesons_active = !user.mesons_active + user.update_sight() + + to_chat(user, "You toggle your meson vision [(user.mesons_active) ? "on" : "off"].") + +/datum/action/innate/minedrone/toggle_mode + name = "Toggle Mode" + button_icon_state = "mech_cycle_equip_off" + +/datum/action/innate/minedrone/toggle_mode/Activate() + var/mob/living/simple_animal/hostile/mining_drone/user = owner + user.toggle_mode() + +/datum/action/innate/minedrone/dump_ore + name = "Dump Ore" + button_icon_state = "mech_eject" + +/datum/action/innate/minedrone/dump_ore/Activate() + var/mob/living/simple_animal/hostile/mining_drone/user = owner + user.DropOre() + + +/**********************Minebot Upgrades**********************/ + +//Melee + +/obj/item/device/mine_bot_upgrade + name = "minebot melee upgrade" + desc = "A minebot upgrade." + icon_state = "door_electronics" + icon = 'icons/obj/doors/door_assembly.dmi' + +/obj/item/device/mine_bot_upgrade/afterattack(mob/living/simple_animal/hostile/mining_drone/M, mob/user, proximity) + if(!istype(M) || !proximity) + return + upgrade_bot(M, user) + +/obj/item/device/mine_bot_upgrade/proc/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/M, mob/user) + if(M.melee_damage_upper != initial(M.melee_damage_upper)) + to_chat(user, "[M] already has a combat upgrade installed!") + return + M.melee_damage_lower = 22 + M.melee_damage_upper = 22 + to_chat(user, "You upgrade [M]'s combat module.") + qdel(src) + +//Health + +/obj/item/device/mine_bot_upgrade/health + name = "minebot chassis upgrade" + +/obj/item/device/mine_bot_upgrade/health/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/M, mob/user) + if(M.maxHealth != initial(M.maxHealth)) + to_chat(user, "[M] already has a reinforced chassis!") + return + M.maxHealth = 170 + to_chat(user, "You reinforce [M]'s chassis.") + qdel(src) + + +//Cooldown + +/obj/item/device/mine_bot_upgrade/cooldown + name = "minebot cooldown upgrade" + +/obj/item/device/mine_bot_upgrade/cooldown/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/M, mob/user) + if(M.ranged_cooldown_time != initial(M.ranged_cooldown_time)) + to_chat(user, "[M] already has a decreased weapon cooldown!") + return + M.ranged_cooldown_time = 10 + to_chat(user, "You upgrade [M]'s ranged weaponry, reducing its cooldown.") + qdel(src) + + +//AI +/obj/item/slimepotion/sentience/mining + name = "minebot AI upgrade" + desc = "Can be used to grant sentience to minebots." + icon_state = "door_electronics" + icon = 'icons/obj/doors/door_assembly.dmi' + sentience_type = SENTIENCE_MINEBOT + origin_tech = "programming=6" + +#undef MINEDRONE_COLLECT +#undef MINEDRONE_ATTACK \ No newline at end of file diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 56c5e33ee1c..d84e434456d 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -22,7 +22,6 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi //Note that this is not a reliable way to determine if admins started as observers, since they change mobs a lot. universal_speak = 1 var/atom/movable/following = null - var/anonsay = 0 var/image/ghostimage = null //this mobs ghost image, for deleting and stuff var/ghostvision = 1 //is the ghost able to see things humans can't? var/seedarkness = 1 @@ -596,15 +595,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp //END TELEPORT HREF CODE /mob/dead/observer/verb/toggle_anonsay() + set name = "Toggle Anonymous Dead-chat" set category = "Ghost" - set name = "Toggle Anonymous Chat" set desc = "Toggles showing your key in dead chat." - - src.anonsay = !src.anonsay - if(anonsay) - to_chat(src, "Your key won't be shown when you speak in dead chat.") - else - to_chat(src, "Your key will be publicly visible again.") + client.prefs.ghost_anonsay = !client.prefs.ghost_anonsay + to_chat(src, "As a ghost, your key will [(client.prefs.ghost_anonsay) ? "no longer" : "now"] be shown when you speak in dead chat.") + client.prefs.save_preferences(src) /mob/dead/observer/verb/toggle_ghostsee() set name = "Toggle Ghost Vision" diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index 3b5b415964d..4e2c7acb2b2 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -1,6 +1,6 @@ /obj/item/device/mmi/posibrain name = "positronic brain" - desc = "A cube of shining metal, four inches to a side and covered in shallow grooves. The speaker switch is set to 'on'." + 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 @@ -15,11 +15,14 @@ var/silenced = 0 //if set to 1, they can't talk. var/next_ping_at = 0 +/obj/item/device/mmi/posibrain/examine(mob/user) + if(..(user, 1)) + to_chat(user, "Its speaker is turned [silenced ? "off" : "on"].") -/obj/item/device/mmi/posibrain/attack_self(mob/user as mob) +/obj/item/device/mmi/posibrain/attack_self(mob/user) if(brainmob && !brainmob.key && searching == 0) //Start the process of searching for a new user. - to_chat(user, "\blue You carefully locate the manual activation switch and start the positronic brain's boot process.") + to_chat(user, "You carefully locate the manual activation switch and start the positronic brain's boot process.") icon_state = "posibrain-searching" ghost_volunteers.Cut() src.searching = 1 @@ -31,18 +34,10 @@ transfer_personality(O) reset_search() else - if(silenced) - silenced = 0 - to_chat(user, "You toggle the speaker to 'on', on the [src].") - desc = "A cube of shining metal, four inches to a side and covered in shallow grooves. The speaker switch is set to 'on'." - if(brainmob && brainmob.key) - to_chat(brainmob, "Your internal speaker has been toggled to 'on'.") - else - silenced = 1 - to_chat(user, "You toggle the speaker to 'off', on the [src].") - desc = "A cube of shining metal, four inches to a side and covered in shallow grooves. The speaker switch is set to 'off'." - if(brainmob && brainmob.key) - to_chat(brainmob, "Your internal speaker has been toggled to 'off'.") + 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"].") /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/brain/say.dm b/code/modules/mob/living/carbon/brain/say.dm index a343d245424..2a789acae0e 100644 --- a/code/modules/mob/living/carbon/brain/say.dm +++ b/code/modules/mob/living/carbon/brain/say.dm @@ -1,23 +1,33 @@ //TODO: Convert this over for languages. /mob/living/carbon/brain/say(var/message, var/datum/language/speaking = null) - if(silent) + if(!can_speak(warning = TRUE)) + return + + if(prob(emp_damage * 4)) + if(prob(10)) //10% chance to drop the message entirely + return + else + message = Gibberish(message, (emp_damage*6))//scrambles the message, gets worse when emp_damage is higher + + ..(message) + +/mob/living/carbon/brain/whisper(message as text) + if(!can_speak(warning = TRUE)) return - if(!(container && istype(container, /obj/item/device/mmi))) - return //No MMI, can't speak, bucko./N - else - if(container && istype(container, /obj/item/device/mmi/posibrain)) - var/obj/item/device/mmi/posibrain/P = container - if(P && P.silenced) - to_chat(usr, "You cannot speak, as your internal speaker has been toggled to 'off'.") - return - if(prob(emp_damage*4)) - if(prob(10))//10% chane to drop the message entirely - return - else - message = Gibberish(message, (emp_damage*6))//scrambles the message, gets worse when emp_damage is higher + ..() + +/mob/living/carbon/brain/can_speak(var/warning = FALSE) + . = ..() - ..(message) + if(!istype(container, /obj/item/device/mmi)) + . = FALSE + else if(istype(container, /obj/item/device/mmi/posibrain)) + var/obj/item/device/mmi/posibrain/P = container + if(P && P.silenced) + if(warning) + to_chat(usr, "You cannot speak, as your internal speaker is turned off.") + . = FALSE /mob/living/carbon/brain/handle_message_mode(var/message_mode, var/message, var/verb, var/speaking, var/used_radios, var/alt_name) switch(message_mode) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index d0289e1f32e..0756ba600ba 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -174,7 +174,7 @@ "The [source] arc flashes and electrocutes you!", \ "You hear a lightning-like crack!" \ ) - playsound(loc, "sound/effects/eleczap.ogg", 50, 1, -1) + playsound(loc, 'sound/effects/eleczap.ogg', 50, 1, -1) explosion(src.loc,-1,0,2,2) if(override) return override diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index f9315966d27..ac1d98e848f 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -57,6 +57,10 @@ 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") + on_CD = handle_emote_CD() + if("sneeze", "sneezes") + on_CD = handle_emote_CD() //Everything else, including typos of the above emotes else on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown @@ -399,6 +403,12 @@ if(!muzzled) message = "[src] coughs!" m_type = 2 + if(gender == FEMALE) + if(species.female_cough_sounds) + playsound(src, pick(species.female_cough_sounds), 120) + else + if(species.male_cough_sounds) + playsound(src, pick(species.male_cough_sounds), 120) else message = "[src] makes a strong noise." m_type = 2 @@ -654,6 +664,10 @@ else if(!muzzled) message = "[src] sneezes." + if(gender == FEMALE) + playsound(src, species.female_sneeze_sound, 70) + else + playsound(src, species.male_sneeze_sound, 70) m_type = 2 else message = "[src] makes a strange noise." diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index c2e2f090bb2..7e54aebf396 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1246,7 +1246,6 @@ return 0 return 1 - /mob/living/carbon/human/proc/get_visible_gender() if(wear_suit && wear_suit.flags_inv & HIDEJUMPSUIT && ((head && head.flags_inv & HIDEMASK) || wear_mask)) return NEUTER @@ -1515,6 +1514,8 @@ if(oldspecies.default_genes.len) oldspecies.handle_dna(src,1) // Remove any genes that belong to the old species + tail = species.tail + if(vessel) vessel = null make_blood() @@ -2051,6 +2052,10 @@ return . +/mob/living/carbon/human/proc/change_icobase(var/new_icobase, var/new_deform, var/owner_sensitive) + for(var/obj/item/organ/external/O in organs) + O.change_organ_icobase(new_icobase, new_deform, owner_sensitive) //Change the icobase/deform of all our organs. If owner_sensitive is set, that means the proc won't mess with frankenstein limbs. + /mob/living/carbon/human/serialize() // Currently: Limbs/organs only var/list/data = ..() diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 986a3ffb9c4..7685e5ab898 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -57,7 +57,7 @@ emp_act organ.add_autopsy_data(P.name, P.damage) // Add the bullet's name to the autopsy data return (..(P , def_zone)) - + /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)) @@ -67,7 +67,7 @@ emp_act damtype = DROPLIMB_BLUNT if(BURN) damtype = DROPLIMB_BURN - + affecting.droplimb(FALSE, damtype) /mob/living/carbon/human/getarmor(var/def_zone, var/type) @@ -86,6 +86,7 @@ emp_act for(var/obj/item/organ/external/organ in organs) armorval += getarmor_organ(organ, type) organnum++ + return (armorval/max(organnum, 1)) @@ -99,7 +100,8 @@ emp_act if(bp && istype(bp ,/obj/item/clothing)) var/obj/item/clothing/C = bp if(C.body_parts_covered & def_zone.body_part) - protection += C.armor[type] + protection += C.armor[type] + return protection //this proc returns the Siemens coefficient of electrical resistivity for a particular external organ. @@ -226,9 +228,9 @@ emp_act if(! I.discrete) if(I.attack_verb.len) - visible_message("[src] has been [pick(I.attack_verb)] in the [hit_area] with [I.name] by [user]!") + visible_message("[src] has been [pick(I.attack_verb)] in the [hit_area] with [I.name] by [user]!") else - visible_message("[src] has been attacked in the [hit_area] with [I.name] by [user]!") + visible_message("[src] has been attacked in the [hit_area] with [I.name] by [user]!") 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) @@ -264,8 +266,8 @@ emp_act if("head")//Harder to score a stun but if you do it lasts a bit longer if(stat == CONSCIOUS && armor < 50) if(prob(I.force)) - visible_message("[src] has been knocked down!", \ - "[src] has been knocked down!") + visible_message("[src] has been knocked down!", \ + "[src] has been knocked down!") apply_effect(5, WEAKEN, armor) AdjustConfused(15) if(prob(I.force + ((100 - health)/2)) && src != user && I.damtype == BRUTE) @@ -284,8 +286,8 @@ emp_act 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!", \ - "[src] has been knocked down!") + visible_message("[src] has been knocked down!", \ + "[src] has been knocked down!") apply_effect(5, WEAKEN, armor) if(bloody) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 0d30c5c8265..63378d1a776 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -72,3 +72,4 @@ var/global/default_martial_art = new/datum/martial_art var/fire_sprite = "Standing" var/datum/body_accessory/body_accessory = null + var/tail // Name of tail image in species effects icon file. diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 8448c786302..b2e609c92f2 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -171,7 +171,7 @@ if(gene.is_active(src)) speech_problem_flag = 1 gene.OnMobLife(src) - if(gene_stability < GENETIC_DAMAGE_STAGE_1) + if(!ignore_gene_stability && gene_stability < GENETIC_DAMAGE_STAGE_1) var/instability = DEFAULT_GENE_STABILITY - gene_stability if(prob(instability * 0.1)) adjustFireLoss(min(5, instability * 0.67)) diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 7384ccc6796..63982b86948 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -105,6 +105,9 @@ /mob/living/carbon/human/handle_speech_problems(var/message, var/verb) var/list/returns[3] var/speech_problem_flag = 0 + var/span = "" + if(mind) + span = mind.speech_span if(silent || (disabilities & MUTE)) message = "" @@ -143,8 +146,10 @@ verb = "yells loudly" if((COMIC in mutations) || (locate(/obj/item/organ/internal/cyberimp/brain/clown_voice) in internal_organs)) - message = "[message]" + span = "sans" + if(span) + message = "[message]" returns[1] = message returns[2] = verb returns[3] = speech_problem_flag @@ -225,4 +230,4 @@ if(istype(r_ear, /obj/item/device/radio/headset)) R = r_ear if(R.translate_binary) - . = TRUE \ No newline at end of file + . = TRUE diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index d8769a3acea..54f68f2b101 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -128,6 +128,10 @@ var/scream_verb = "screams" var/male_scream_sound = 'sound/goonstation/voice/male_scream.ogg' var/female_scream_sound = 'sound/goonstation/voice/female_scream.ogg' + var/male_cough_sounds = list('sound/effects/mob_effects/m_cougha.ogg','sound/effects/mob_effects/m_coughb.ogg', 'sound/effects/mob_effects/m_coughc.ogg') + var/female_cough_sounds = list('sound/effects/mob_effects/f_cougha.ogg','sound/effects/mob_effects/f_coughb.ogg') + var/male_sneeze_sound = 'sound/effects/mob_effects/sneeze.ogg' + var/female_sneeze_sound = 'sound/effects/mob_effects/f_sneeze.ogg' //Default hair/headacc style vars. var/default_hair //Default hair style for newly created humans unless otherwise set. @@ -676,4 +680,4 @@ It'll return null if the organ doesn't correspond, so include null checks when u H.see_invisible = SEE_INVISIBLE_MINIMUM if(H.see_override) //Override all - H.see_invisible = H.see_override \ No newline at end of file + H.see_invisible = H.see_override diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 1ea4387e477..fcdd8ac40ea 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -298,6 +298,10 @@ scream_verb = "shrieks" male_scream_sound = 'sound/voice/shriek1.ogg' female_scream_sound = 'sound/voice/shriek1.ogg' + male_cough_sounds = list('sound/voice/shriekcough.ogg') + female_cough_sounds = list('sound/voice/shriekcough.ogg') + male_sneeze_sound = 'sound/voice/shrieksneeze.ogg' + female_sneeze_sound = 'sound/voice/shrieksneeze.ogg' icon_skin_tones = list( 1 = "Default Green", @@ -360,34 +364,35 @@ //H.verbs += /mob/living/carbon/human/proc/leap ..() -/datum/species/vox/updatespeciescolor(var/mob/living/carbon/human/H) //Handling species-specific skin-tones for the Vox race. +/datum/species/vox/updatespeciescolor(var/mob/living/carbon/human/H, var/owner_sensitive = 1) //Handling species-specific skin-tones for the Vox race. if(H.species.name == "Vox") //Making sure we don't break Armalis. + var/new_icobase = 'icons/mob/human_races/vox/r_vox.dmi' //Default Green Vox. + var/new_deform = 'icons/mob/human_races/vox/r_def_vox.dmi' //Default Green Vox. switch(H.s_tone) if(6) //Azure Vox. - icobase = 'icons/mob/human_races/vox/r_voxazu.dmi' - deform = 'icons/mob/human_races/vox/r_def_voxazu.dmi' - tail = "voxtail_azu" + new_icobase = 'icons/mob/human_races/vox/r_voxazu.dmi' + new_deform = 'icons/mob/human_races/vox/r_def_voxazu.dmi' + H.tail = "voxtail_azu" if(5) //Emerald Vox. - icobase = 'icons/mob/human_races/vox/r_voxemrl.dmi' - deform = 'icons/mob/human_races/vox/r_def_voxemrl.dmi' - tail = "voxtail_emrl" + new_icobase = 'icons/mob/human_races/vox/r_voxemrl.dmi' + new_deform = 'icons/mob/human_races/vox/r_def_voxemrl.dmi' + H.tail = "voxtail_emrl" if(4) //Grey Vox. - icobase = 'icons/mob/human_races/vox/r_voxgry.dmi' - deform = 'icons/mob/human_races/vox/r_def_voxgry.dmi' - tail = "voxtail_gry" + new_icobase = 'icons/mob/human_races/vox/r_voxgry.dmi' + new_deform = 'icons/mob/human_races/vox/r_def_voxgry.dmi' + H.tail = "voxtail_gry" if(3) //Brown Vox. - icobase = 'icons/mob/human_races/vox/r_voxbrn.dmi' - deform = 'icons/mob/human_races/vox/r_def_voxbrn.dmi' - tail = "voxtail_brn" + new_icobase = 'icons/mob/human_races/vox/r_voxbrn.dmi' + new_deform = 'icons/mob/human_races/vox/r_def_voxbrn.dmi' + H.tail = "voxtail_brn" if(2) //Dark Green Vox. - icobase = 'icons/mob/human_races/vox/r_voxdgrn.dmi' - deform = 'icons/mob/human_races/vox/r_def_voxdgrn.dmi' - tail = "voxtail_dgrn" + new_icobase = 'icons/mob/human_races/vox/r_voxdgrn.dmi' + new_deform = 'icons/mob/human_races/vox/r_def_voxdgrn.dmi' + H.tail = "voxtail_dgrn" else //Default Green Vox. - icobase = 'icons/mob/human_races/vox/r_vox.dmi' - deform = 'icons/mob/human_races/vox/r_def_vox.dmi' - tail = "voxtail" //Ensures they get an appropriately coloured tail depending on the skin-tone. + H.tail = "voxtail" //Ensures they get an appropriately coloured tail depending on the skin-tone. + H.change_icobase(new_icobase, new_deform, owner_sensitive) //Update the icobase/deform of all our organs, but make sure we don't mess with frankenstein limbs in doing so. H.update_dna() /datum/species/vox/armalis/handle_post_spawn(var/mob/living/carbon/human/H) @@ -509,6 +514,9 @@ oxy_mod = 0 brain_mod = 2.5 + male_cough_sounds = list('sound/effects/slime_squish.ogg') + female_cough_sounds = list('sound/effects/slime_squish.ogg') + flags = IS_WHITELISTED | NO_BREATHE | HAS_LIPS | NO_INTORGANS | NO_SCAN clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = HAS_SKIN_COLOR | NO_EYES @@ -720,6 +728,11 @@ genemutcheck(C,REMOTETALKBLOCK,null,MUTCHK_FORCED) ..() +/datum/species/grey/equip(var/mob/living/carbon/human/H) + var/speech_pref = H.client.prefs.speciesprefs + if(speech_pref) + H.mind.speech_span = "wingdings" + /datum/species/diona name = "Diona" name_plural = "Dionaea" @@ -733,6 +746,7 @@ slowdown = 5 remains_type = /obj/effect/decal/cleanable/ash + warning_low_pressure = 50 hazard_low_pressure = -1 @@ -822,7 +836,7 @@ if(H.nutrition > NUTRITION_LEVEL_WELL_FED) H.nutrition = NUTRITION_LEVEL_WELL_FED - + if(light_amount > 0) H.clear_alert("nolight") else @@ -876,6 +890,10 @@ reagent_tag = PROCESS_SYN male_scream_sound = 'sound/goonstation/voice/robot_scream.ogg' female_scream_sound = 'sound/goonstation/voice/robot_scream.ogg' + male_cough_sounds = list('sound/effects/mob_effects/m_machine_cougha.ogg','sound/effects/mob_effects/m_machine_coughb.ogg', 'sound/effects/mob_effects/m_machine_coughc.ogg') + female_cough_sounds = list('sound/effects/mob_effects/f_machine_cougha.ogg','sound/effects/mob_effects/f_machine_coughb.ogg') + male_sneeze_sound = 'sound/effects/mob_effects/machine_sneeze.ogg' + female_sneeze_sound = 'sound/effects/mob_effects/f_machine_sneeze.ogg' butt_sprite = "machine" has_organ = list( @@ -935,6 +953,10 @@ speech_chance = 20 male_scream_sound = 'sound/voice/DraskTalk2.ogg' female_scream_sound = 'sound/voice/DraskTalk2.ogg' + male_cough_sounds = null //whale cough when + female_cough_sounds = null + male_sneeze_sound = null + female_sneeze_sound = null burn_mod = 2 //exotic_blood = "cryoxadone" @@ -1017,4 +1039,4 @@ H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat") if(heat_level_3_breathe to INFINITY) - H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat") \ No newline at end of file + H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat") diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 48555229aad..d24471dc7e2 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -298,9 +298,9 @@ var/global/list/damage_icon_parts = list() base_icon.MapColors(rgb(tone[1],0,0),rgb(0,tone[2],0),rgb(0,0,tone[3])) //Handle husk overlay. - if(husk && ("overlay_husk" in icon_states(species.icobase))) + if(husk && ("overlay_husk" in icon_states(chest.icobase))) var/icon/mask = new(base_icon) - var/icon/husk_over = new(species.icobase,"overlay_husk") + var/icon/husk_over = new(chest.icobase,"overlay_husk") mask.MapColors(0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,0) husk_over.Blend(mask, ICON_ADD) base_icon.Blend(husk_over, ICON_OVERLAY) @@ -1197,9 +1197,9 @@ var/global/list/damage_icon_parts = list() else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation. overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset) - else if(species.tail && species.bodyflags & HAS_TAIL) //no tailless tajaran + else if(tail && species.bodyflags & HAS_TAIL) //no tailless tajaran if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space)) - var/icon/tail_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_s") + var/icon/tail_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[tail]_s") if(species.bodyflags & HAS_SKIN_COLOR) tail_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) if(tail_marking_icon) @@ -1266,8 +1266,8 @@ var/global/list/damage_icon_parts = list() else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation. overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset) - else if(species.tail && species.bodyflags & HAS_TAIL) - var/icon/tailw_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]w_s") + else if(tail && species.bodyflags & HAS_TAIL) + var/icon/tailw_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[tail]w_s") if(species.bodyflags & HAS_SKIN_COLOR) tailw_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) if(tail_marking_icon) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 2aff4a71d85..6f4ad8840c7 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -6,7 +6,8 @@ /mob/living/ghostize(can_reenter_corpse = 1) var/prev_client = client - if(..()) + . = ..() + if(.) if(ranged_ability && prev_client) ranged_ability.remove_mousepointer(prev_client) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index e1488648731..23b7abe06d3 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -52,6 +52,7 @@ var/list/surgeries = list() //a list of surgery datums. generally empty, they're added when the player wants them. var/gene_stability = DEFAULT_GENE_STABILITY + var/ignore_gene_stability = 0 var/obj/effect/proc_holder/ranged_ability //Any ranged ability the mob has, as a click override diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index a81dae5234a..125eb110c66 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -83,12 +83,14 @@ var/current_pda_messaging = null /mob/living/silicon/pai/New(var/obj/item/device/paicard) - src.loc = paicard + loc = paicard card = paicard + if(card) + faction = card.faction.Copy() sradio = new(src) if(card) if(!card.radio) - card.radio = new /obj/item/device/radio(src.card) + card.radio = new /obj/item/device/radio(card) radio = card.radio //Default languages without universal translator software @@ -122,7 +124,7 @@ // this function shows the information about being silenced as a pAI in the Status panel /mob/living/silicon/pai/proc/show_silenced() - if(src.silence_time) + if(silence_time) var/timeleft = round((silence_time - world.timeofday)/10 ,1) stat(null, "Communications system reboot in -[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]") @@ -130,7 +132,7 @@ /mob/living/silicon/pai/Stat() ..() statpanel("Status") - if(src.client.statpanel == "Status") + if(client.statpanel == "Status") show_silenced() if(proc_holder_list.len)//Generic list for proc_holder objects. @@ -138,20 +140,20 @@ statpanel("[P.panel]","",P) /mob/living/silicon/pai/check_eye(var/mob/user as mob) - if(!src.current) + if(!current) return null - user.reset_perspective(src.current) + user.reset_perspective(current) return 1 /mob/living/silicon/pai/blob_act() - if(src.stat != 2) - src.adjustBruteLoss(60) - src.updatehealth() + if(stat != 2) + adjustBruteLoss(60) + updatehealth() return 1 return 0 /mob/living/silicon/pai/restrained() - if(istype(src.loc,/obj/item/device/paicard)) + if(istype(loc,/obj/item/device/paicard)) return 0 ..() @@ -165,18 +167,18 @@ // 33% chance to change prime directive (based on severity) // 33% chance of no additional effect - src.silence_time = world.timeofday + 120 * 10 // Silence for 2 minutes + silence_time = world.timeofday + 120 * 10 // Silence for 2 minutes to_chat(src, "Communication circuit overload. Shutting down and reloading communication circuits - speech and messaging functionality will be unavailable until the reboot is complete.") if(prob(20)) - var/turf/T = get_turf_or_move(src.loc) + var/turf/T = get_turf_or_move(loc) for(var/mob/M in viewers(T)) M.show_message("\red A shower of sparks spray from [src]'s inner workings.", 3, "\red You hear and smell the ozone hiss of electrical sparks being expelled violently.", 2) - return src.death(0) + return death(0) switch(pick(1,2,3)) if(1) - src.master = null - src.master_dna = null + master = null + master_dna = null to_chat(src, "You feel unbound.") if(2) var/command @@ -184,7 +186,7 @@ command = pick("Serve", "Love", "Fool", "Entice", "Observe", "Judge", "Respect", "Educate", "Amuse", "Entertain", "Glorify", "Memorialize", "Analyze") else command = pick("Serve", "Kill", "Love", "Hate", "Disobey", "Devour", "Fool", "Enrage", "Entice", "Observe", "Judge", "Respect", "Disrespect", "Consume", "Educate", "Destroy", "Disgrace", "Amuse", "Entertain", "Ignite", "Glorify", "Memorialize", "Analyze") - src.pai_law0 = "[command] your master." + pai_law0 = "[command] your master." to_chat(src, "Pr1m3 d1r3c71v3 uPd473D.") if(3) to_chat(src, "You feel an electric surge run through your circuitry and become acutely aware at how lucky you are that you can still feel at all.") @@ -194,15 +196,15 @@ switch(severity) if(1.0) - if(src.stat != 2) + if(stat != 2) adjustBruteLoss(100) adjustFireLoss(100) if(2.0) - if(src.stat != 2) + if(stat != 2) adjustBruteLoss(60) adjustFireLoss(60) if(3.0) - if(src.stat != 2) + if(stat != 2) adjustBruteLoss(30) return @@ -219,8 +221,8 @@ playsound(loc, M.attack_sound, 50, 1, 1) for(var/mob/O in viewers(src, null)) O.show_message("[M] [M.attacktext] [src]!", 1) - M.create_attack_log("attacked [src.name] ([src.ckey])") - src.create_attack_log("was attacked by [M.name] ([M.ckey])") + M.create_attack_log("attacked [name] ([ckey])") + create_attack_log("was attacked by [M.name] ([M.ckey])") var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) adjustBruteLoss(damage) updatehealth() @@ -230,7 +232,7 @@ to_chat(M, "You cannot attack people before the game has started.") return - if(istype(src.loc, /turf) && istype(src.loc.loc, /area/start)) + if(istype(loc, /turf) && istype(loc.loc, /area/start)) to_chat(M, "You cannot attack someone in the spawn area.") return @@ -245,16 +247,16 @@ M.do_attack_animation(src) var/damage = rand(10, 20) if(prob(90)) - playsound(src.loc, 'sound/weapons/slash.ogg', 25, 1, -1) + playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1) for(var/mob/O in viewers(src, null)) if((O.client && !( O.blinded ))) O.show_message(text("[] has slashed at []!", M, src), 1) if(prob(8)) flash_eyes(affect_silicon = 1) - src.adjustBruteLoss(damage) - src.updatehealth() + adjustBruteLoss(damage) + updatehealth() else - playsound(src.loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1) + playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1) for(var/mob/O in viewers(src, null)) if((O.client && !( O.blinded ))) O.show_message(text("[] took a swipe at []!", M, src), 1) @@ -263,16 +265,16 @@ /mob/living/silicon/pai/proc/switchCamera(var/obj/machinery/camera/C) usr:cameraFollow = null if(!C) - src.unset_machine() - src.reset_perspective(null) + unset_machine() + reset_perspective(null) return 0 - if(stat == 2 || !C.status || !(src.network in C.network)) return 0 + if(stat == 2 || !C.status || !(network in C.network)) return 0 // ok, we're alive, camera is good and in our network... - src.set_machine(src) + set_machine(src) src:current = C - src.reset_perspective(C) + reset_perspective(C) return 1 /mob/living/silicon/pai/verb/reset_record_view() @@ -291,8 +293,8 @@ /mob/living/silicon/pai/cancel_camera() set category = "pAI Commands" set name = "Cancel Camera View" - src.reset_perspective(null) - src.unset_machine() + reset_perspective(null) + unset_machine() src:cameraFollow = null //Addition by Mord_Sith to define AI's network change ability @@ -300,8 +302,8 @@ /mob/living/silicon/pai/proc/pai_network_change() set category = "pAI Commands" set name = "Change Camera Network" - src.reset_perspective(null) - src.unset_machine() + reset_perspective(null) + unset_machine() src:cameraFollow = null var/cameralist[0] @@ -316,8 +318,8 @@ if(C.network != "CREED" && C.network != "thunder" && C.network != "RD" && C.network != "toxins" && C.network != "Prison") COMPILE ERROR! This will have to be updated as camera.network is no longer a string, but a list instead cameralist[C.network] = C.network - src.network = input(usr, "Which network would you like to view?") as null|anything in cameralist - to_chat(src, "\blue Switched to [src.network] camera network.") + network = input(usr, "Which network would you like to view?") as null|anything in cameralist + to_chat(src, "\blue Switched to [network] camera network.") //End of code by Mord_Sith */ @@ -327,7 +329,7 @@ /mob/verb/makePAI(var/turf/t in view()) var/obj/item/device/paicard/card = new(t) var/mob/living/silicon/pai/pai = new(card) - pai.key = src.key + pai.key = key card.setPersonality(pai) */ @@ -394,7 +396,7 @@ var/choice var/finalized = "No" - while(finalized == "No" && src.client) + while(finalized == "No" && client) choice = input(usr,"What would you like to use for your mobile chassis icon? This decision can only be made once.") as null|anything in possible_chassis if(!choice) return @@ -425,9 +427,9 @@ set category = "IC" // Pass lying down or getting up to our pet human, if we're in a rig. - if(stat == CONSCIOUS && istype(src.loc,/obj/item/device/paicard)) + if(stat == CONSCIOUS && istype(loc,/obj/item/device/paicard)) resting = 0 - var/obj/item/weapon/rig/rig = src.get_rig() + var/obj/item/weapon/rig/rig = get_rig() if(istype(rig)) rig.force_rest(src) else @@ -449,15 +451,15 @@ updatehealth() N.use(1) user.visible_message("[user.name] applied some [W] at [src]'s damaged areas.",\ - "You apply some [W] at [src.name]'s damaged areas.") + "You apply some [W] at [name]'s damaged areas.") else - to_chat(user, "All [src.name]'s systems are nominal.") + to_chat(user, "All [name]'s systems are nominal.") return else if(W.force) visible_message("[user.name] attacks [src] with [W]!") - src.adjustBruteLoss(W.force) - src.updatehealth() + adjustBruteLoss(W.force) + updatehealth() else visible_message("[user.name] bonks [src] harmlessly with [W].") spawn(1) @@ -529,9 +531,9 @@ var/msg = "" - switch(src.stat) + switch(stat) if(CONSCIOUS) - if(!src.client) msg += "\nIt appears to be in stand-by mode." //afk + if(!client) msg += "\nIt appears to be in stand-by mode." //afk if(UNCONSCIOUS) msg += "\nIt doesn't seem to be responding." if(DEAD) msg += "\nIt looks completely unsalvageable." diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/__defines.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/__defines.dm index fafd30a4ae4..8453a71cff4 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/__defines.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/__defines.dm @@ -4,8 +4,18 @@ #define MOVING_TO_TARGET 3 #define SPINNING_COCOON 4 +#define TS_DESC_RED "Red - Assault" +#define TS_DESC_GRAY "Gray - Ambush" +#define TS_DESC_GREEN "Green - Nurse" +#define TS_DESC_WHITE "White - Infect" +#define TS_DESC_BLACK "Black - Poison" +#define TS_DESC_PURPLE "Purple - Guard" +#define TS_DESC_PRINCE "Prince - WAR" +#define TS_DESC_MOTHER "Mother - HORROR" +#define TS_DESC_QUEEN "Queen - LEADER" + #define TS_TIER_1 1 #define TS_TIER_2 2 #define TS_TIER_3 3 #define TS_TIER_4 4 -#define TS_TIER_5 5 \ No newline at end of file +#define TS_TIER_5 5 diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm index 2111f350b0b..ca216da052d 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm @@ -1,4 +1,4 @@ - +// ---------- ACTIONS FOR ALL SPIDERS /datum/action/innate/terrorspider/web name = "Web" @@ -19,17 +19,83 @@ user.FindWrapTarget() user.DoWrap() +// ---------- GREEN ACTIONS + +/datum/action/innate/terrorspider/greeneggs + name = "Lay Green Eggs" + icon_icon = 'icons/effects/effects.dmi' + button_icon_state = "eggs" + +/datum/action/innate/terrorspider/greeneggs/Activate() + var/mob/living/simple_animal/hostile/poison/terror_spider/green/user = owner + user.DoLayGreenEggs() + +// ---------- PRINCE ACTIONS + +/datum/action/innate/terrorspider/princesmash + name = "Smash Welded Vent" + icon_icon = 'icons/atmos/vent_pump.dmi' + button_icon_state = "map_vent" + +/datum/action/innate/terrorspider/princesmash/Activate() + var/mob/living/simple_animal/hostile/poison/terror_spider/prince/user = owner + user.DoPrinceSmash() + +// ---------- QUEEN ACTIONS + +/datum/action/innate/terrorspider/queen/queennest + name = "Nest" + icon_icon = 'icons/mob/terrorspider.dmi' + button_icon_state = "terror_queen" + +/datum/action/innate/terrorspider/queen/queennest/Activate() + var/mob/living/simple_animal/hostile/poison/terror_spider/queen/user = owner + user.NestMode() + +/datum/action/innate/terrorspider/queen/queensense + name = "Hive Sense" + icon_icon = 'icons/mob/actions.dmi' + button_icon_state = "mindswap" + +/datum/action/innate/terrorspider/queen/queensense/Activate() + var/mob/living/simple_animal/hostile/poison/terror_spider/queen/user = owner + user.DoHiveSense() + +/datum/action/innate/terrorspider/queen/queeneggs + name = "Lay Queen Eggs" + icon_icon = 'icons/effects/effects.dmi' + button_icon_state = "eggs" + +/datum/action/innate/terrorspider/queen/queeneggs/Activate() + var/mob/living/simple_animal/hostile/poison/terror_spider/queen/user = owner + user.LayQueenEggs() + +/datum/action/innate/terrorspider/queen/queenfakelings + name = "Fake Spiderlings" + icon_icon = 'icons/effects/effects.dmi' + button_icon_state = "spiderling" + +/datum/action/innate/terrorspider/queen/queenfakelings/Activate() + var/mob/living/simple_animal/hostile/poison/terror_spider/queen/user = owner + user.QueenFakeLings() // ---------- WEB /mob/living/simple_animal/hostile/poison/terror_spider/proc/Web() + var/turf/mylocation = loc visible_message("[src] begins to secrete a sticky substance.") if(do_after(src, 40, target = loc)) - var/obj/effect/spider/terrorweb/T = locate() in get_turf(src) - if(T) - to_chat(src, "There is already a web here.") + if(loc != mylocation) + return + else if(istype(loc, /turf/space)) + to_chat(src, "Webs cannot be spun in space.") else - new /obj/effect/spider/terrorweb(loc) + var/obj/effect/spider/terrorweb/T = locate() in get_turf(src) + if(T) + to_chat(src, "There is already a web here.") + else + var/obj/effect/spider/terrorweb/W = new /obj/effect/spider/terrorweb(loc) + W.creator_ckey = ckey /obj/effect/spider/terrorweb name = "terror web" @@ -39,23 +105,27 @@ density = 0 // prevents it blocking all movement health = 20 // two welders, or one laser shot (15 for the normal spider webs) icon_state = "stickyweb1" - + var/creator_ckey = null /obj/effect/spider/terrorweb/New() ..() if(prob(50)) icon_state = "stickyweb2" - /obj/effect/spider/terrorweb/CanPass(atom/movable/mover, turf/target) if(istype(mover, /mob/living/simple_animal/hostile/poison/terror_spider)) return 1 + if(istype(mover, /obj/item/projectile/terrorqueenspit)) + return 1 if(isliving(mover)) if(prob(80)) to_chat(mover, "You get stuck in [src] for a moment.") var/mob/living/M = mover M.Stun(4) // 8 seconds. M.Weaken(4) // 8 seconds. + if(iscarbon(mover)) + spawn(70) + qdel(src) return 1 else return 0 @@ -63,22 +133,25 @@ return prob(20) return ..() - - +/obj/effect/spider/terrorweb/bullet_act(obj/item/projectile/Proj) + if(Proj.damage_type != BRUTE && Proj.damage_type != BURN) + visible_message("[src] is undamaged by [Proj]!") + // Webs don't care about disablers, tasers, etc. Or toxin damage. They're organic, but not alive. + return + ..() // ---------- WRAP - /mob/living/simple_animal/hostile/poison/terror_spider/proc/FindWrapTarget() if(!cocoon_target) var/list/choices = list() for(var/mob/living/L in oview(1,src)) - if(Adjacent(L)) + if(Adjacent(L) && !L.anchored) if(L.stat == DEAD) choices += L for(var/obj/O in oview(1,src)) if(Adjacent(O) && !O.anchored) - if(!istype(O, /obj/effect/spider/terrorweb) && !istype(O, /obj/effect/spider/cocoon)) + if(!istype(O, /obj/effect/spider/terrorweb) && !istype(O, /obj/effect/spider/cocoon) && !istype(O, /obj/effect/spider/spiderling/terror_spiderling)) choices += O if(choices.len) cocoon_target = input(src,"What do you wish to cocoon?") in null|choices @@ -87,6 +160,9 @@ /mob/living/simple_animal/hostile/poison/terror_spider/proc/DoWrap() if(cocoon_target && busy != SPINNING_COCOON) + if(cocoon_target.anchored) + cocoon_target = null + return busy = SPINNING_COCOON visible_message("[src] begins to secrete a sticky substance around [cocoon_target].") stop_automated_movement = 1 @@ -125,3 +201,17 @@ busy = 0 stop_automated_movement = 0 +/mob/living/simple_animal/hostile/poison/terror_spider/prince/proc/DoPrinceSmash() + for(var/obj/machinery/atmospherics/unary/vent_pump/P in view(1,src)) + if(P.welded) + P.welded = 0 + P.update_icon() + visible_message("[src] smashes the welded cover off [P]!") + return + for(var/obj/machinery/atmospherics/unary/vent_scrubber/C in view(1,src)) + if(C.welded) + C.welded = 0 + C.update_icon() + visible_message("[src] smashes the welded cover off [C]!") + return + to_chat(src, "There is no unwelded vent close enough to do this.") \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/black.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/black.dm index 68d25a29492..04ac9d30bf2 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/black.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/black.dm @@ -10,7 +10,7 @@ /mob/living/simple_animal/hostile/poison/terror_spider/black name = "Black Terror spider" - desc = "An ominous-looking spider, black as the darkest night, and with merciless eyes and a blood-red hourglass pattern on its back." + desc = "An ominous-looking spider, black as the darkest night. It has merciless eyes, and a blood-red hourglass pattern on its back." spider_role_summary = "Hit-and-run attacker with extremely venomous bite." icon_state = "terror_widow" @@ -24,14 +24,15 @@ stat_attack = 1 // ensures they will target people in crit, too! spider_tier = TS_TIER_2 + /mob/living/simple_animal/hostile/poison/terror_spider/black/spider_specialattack(mob/living/carbon/human/L, poisonable) if(!poisonable) return ..() - if(L.reagents.has_reagent("terror_black_toxin", 50)) + if(L.reagents.has_reagent("terror_black_toxin", 100)) return ..() var/inject_target = pick("chest", "head") if(L.stunned || L.can_inject(null, 0, inject_target, 0)) - L.reagents.add_reagent("terror_black_toxin", 15) // inject our special poison + L.reagents.add_reagent("terror_black_toxin", 30) // inject our special poison visible_message("[src] buries its long fangs deep into the [inject_target] of [target]!") else visible_message("[src] bites [target], but cannot inject venom into their [inject_target]!") diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm index 8ad926a8729..8049a742994 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm @@ -1,3 +1,4 @@ + // Terror Spider, Black, Deadly Venom /datum/reagent/terror_black_toxin @@ -8,26 +9,38 @@ metabolization_rate = 0.1 /datum/reagent/terror_black_toxin/on_mob_life(mob/living/M) - if(volume < 15) - // bitten once, die slowly. Easy to survive a single bite - just go to medbay. - // total damage: 2/tick, human health 150 until crit, = 75 ticks, = 150 seconds = 2.5 minutes to get to medbay. - M.adjustToxLoss(2) // same damage/tick as tabun cycle 0 to 60 - else if(volume < 30) - // bitten twice, die more quickly, muscle cramps make movement difficult. Call medics immediately. - // total damage: 4, human health 150 until crit, = 37.5 ticks, = 75s = 1m15s until death - M.adjustToxLoss(4) - M.Confused(3) + if(volume < 30) + // bitten once, die very slowly. Easy to survive a single bite - just go to medbay. + // total damage: 1/tick, human health 150 until crit, = 150 ticks, = 300 seconds = 5 minutes to get to medbay. + M.adjustToxLoss(1) + else if(volume < 60) + // bitten twice, die slowly. Get to medbay. + // total damage: 2/tick, human health 150 until crit, = 75 ticks, = 150 seconds = 2.5 minutes to get some medical treatment. + M.adjustToxLoss(2) M.EyeBlurry(3) - else if(volume < 45) - // bitten thrice, die very quickly, severe muscle cramps make movement very difficult. Even calling for help probably won't save you. - // total damage: 8, human health 150 until crit, = 18.75 ticks, = 37s until death - M.adjustToxLoss(8) // a bit worse than coiine + else if(volume < 90) + // bitten thrice, die quickly, severe muscle cramps make movement very difficult. Even calling for help probably won't save you. + // total damage: 4, human health 150 until crit, = 37.5 ticks, = 75s = 1m15s until death + M.adjustToxLoss(4) // a bit worse than coiine M.Confused(6) M.EyeBlurry(6) else // bitten 4 or more times, whole body goes into shock/death - // total damage: 12, human health 150 until crit, = 12.5 ticks, = 25s until death - M.adjustToxLoss(12) + // total damage: 8, human health 150 until crit, = 18.75 ticks, = 37s until death + M.adjustToxLoss(8) M.EyeBlurry(6) M.Paralyse(5) ..() + +// Terror Spider, Queen Toxin + +/datum/reagent/terror_queen_toxin + name = "Terror Queen venom" + id = "terror_queen_toxin" + description = "A royally potent venom." + color = "#CF3600" + metabolization_rate = 2 + +/datum/reagent/terror_queen_toxin/on_mob_life(mob/living/M) + // make them hallucinate a lot, like a changeling sting + M.AdjustHallucinate(50, bound_upper = 400) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm index 06703cc2106..d5e70b27b7e 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm @@ -13,15 +13,15 @@ return var/error_on_humanize = "" var/humanize_prompt = "Take direct control of [src]?" - humanize_prompt += "Role: [spider_role_summary]" + humanize_prompt += " Role: [spider_role_summary]" if(user.ckey in ts_ckey_blacklist) error_on_humanize = "You are not able to control any terror spider this round." - else if(!ai_playercontrol_allowingeneral) - error_on_humanize = "Terror spiders cannot currently be player-controlled." else if(spider_awaymission) error_on_humanize = "Terror spiders that are part of an away mission cannot be controlled by ghosts." else if(!ai_playercontrol_allowtype) error_on_humanize = "This specific type of terror spider is not player-controllable." + else if(degenerate) + error_on_humanize = "Dying spiders are not player-controllable." else if(stat == DEAD) error_on_humanize = "Dead spiders are not player-controllable." if(jobban_isbanned(user, "Syndicate") || jobban_isbanned(user, "alien")) @@ -39,5 +39,4 @@ return key = user.key for(var/mob/dead/observer/G in player_list) - G.show_message("A ghost has taken control of [src]. ([ghost_follow_link(src, ghost=G)]).") - + G.show_message("A ghost has taken control of [src]. ([ghost_follow_link(src, ghost=G)]).") \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/gray.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/gray.dm index 42c16cc7666..ddfe48bae09 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/gray.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/gray.dm @@ -18,10 +18,8 @@ health = 120 melee_damage_lower = 10 melee_damage_upper = 20 - ventcrawler = 1 move_to_delay = 5 // normal speed stat_attack = 1 // ensures they will target people in crit, too! - environment_smash = 1 /mob/living/simple_animal/hostile/poison/terror_spider/gray/spider_specialattack(mob/living/carbon/human/L, poisonable) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/green.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/green.dm new file mode 100644 index 00000000000..56265386686 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/green.dm @@ -0,0 +1,60 @@ + +// -------------------------------------------------------------------------------- +// ----------------- TERROR SPIDERS: T1 GREEN TERROR ------------------------------ +// -------------------------------------------------------------------------------- +// -------------: ROLE: reproduction +// -------------: SPECIAL: can also create webs, web normal objects, etc +// -------------: TO FIGHT IT: kill it however you like - just don't die to it! +// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386 + +/mob/living/simple_animal/hostile/poison/terror_spider/green + name = "Green Terror spider" + desc = "An ominous-looking green spider. It has a small egg-sac attached to it, and dried blood stains on its carapace." + spider_role_summary = "Average melee spider that webs its victims and lays more spider eggs" + + icon_state = "terror_green" + icon_living = "terror_green" + icon_dead = "terror_green_dead" + maxHealth = 120 + health = 120 + melee_damage_lower = 10 + melee_damage_upper = 20 + var/feedings_to_lay = 2 + + var/datum/action/innate/terrorspider/greeneggs/greeneggs_action + + +/mob/living/simple_animal/hostile/poison/terror_spider/green/New() + ..() + greeneggs_action = new() + greeneggs_action.Grant(src) + +/mob/living/simple_animal/hostile/poison/terror_spider/green/proc/DoLayGreenEggs() + var/obj/effect/spider/eggcluster/E = locate() in get_turf(src) + if(E) + to_chat(src, "There is already a cluster of eggs here!") + else if(fed < feedings_to_lay) + to_chat(src, "You must wrap more prey before you can do this!") + else + visible_message("[src] begins to lay a cluster of eggs.") + if(prob(33)) + DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/red, 1, 1) + else if(prob(50)) + DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/gray, 1, 1) + else + DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/green, 1, 1) + fed -= feedings_to_lay + +/mob/living/simple_animal/hostile/poison/terror_spider/green/spider_specialattack(mob/living/carbon/human/L, poisonable) + if(!poisonable) + ..() + return + var/inject_target = pick("chest","head") + if(L.stunned || L.can_inject(null,0,inject_target,0)) + if(L.eye_blurry < 60) + L.AdjustEyeBlurry(10) + // instead of having a venom that only lasts seconds, we just add the eyeblur directly. + visible_message("[src] buries its fangs deep into the [inject_target] of [target]!") + else + visible_message("[src] bites [target], but cannot inject venom into their [inject_target]!") + L.attack_animal(src) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/hive.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/hive.dm new file mode 100644 index 00000000000..2c58a133792 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/hive.dm @@ -0,0 +1,40 @@ + +// All terror spider code that relates to queen ruling over a hive + +/mob/living/simple_animal/hostile/poison/terror_spider/proc/DoHiveSense() + var/hsline = "" + to_chat(src, "Your Brood: ") + for(var/mob/living/simple_animal/hostile/poison/terror_spider/T in ts_spiderlist) + if(T.spider_awaymission != spider_awaymission) + continue + hsline = "* [T] in [get_area(T)], " + if(T.stat == DEAD) + hsline += "DEAD" + else + hsline += "health [T.health] / [T.maxHealth], " + if(T.ckey) + hsline += " *Player Controlled* " + else + hsline += " AI " + to_chat(src,hsline) + +/mob/living/simple_animal/hostile/poison/terror_spider/proc/CountSpiders() + var/numspiders = 0 + for(var/mob/living/simple_animal/hostile/poison/terror_spider/T in ts_spiderlist) + if(T.stat != DEAD && !T.spider_placed && spider_awaymission == T.spider_awaymission) + numspiders += 1 + return numspiders + +/mob/living/simple_animal/hostile/poison/terror_spider/proc/CountSpidersType(specific_type) + var/numspiders = 0 + for(var/mob/living/simple_animal/hostile/poison/terror_spider/T in ts_spiderlist) + if(T.stat != DEAD && !T.spider_placed && spider_awaymission == T.spider_awaymission) + if(T.type == specific_type) + numspiders += 1 + for(var/obj/effect/spider/eggcluster/terror_eggcluster/E in ts_egg_list) + if(E.spiderling_type == specific_type && E.z == z) + numspiders += E.spiderling_number + for(var/obj/effect/spider/spiderling/terror_spiderling/L in ts_spiderling_list) + if(!L.stillborn && L.grow_as == specific_type && L.z == z) + numspiders += 1 + return numspiders \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/mother.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/mother.dm new file mode 100644 index 00000000000..f41ebb54b43 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/mother.dm @@ -0,0 +1,46 @@ + +// -------------------------------------------------------------------------------- +// ----------------- TERROR SPIDERS: T3 MOTHER OF TERROR -------------------------- +// -------------------------------------------------------------------------------- +// -------------: ROLE: living schmuck bait +// -------------: SPECIAL: spawns an ungodly number of spiderlings when killed +// -------------: TO FIGHT IT: don't! Just leave it alone! It is harmless by itself... but god help you if you aggro it. +// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386 + +/mob/living/simple_animal/hostile/poison/terror_spider/mother + name = "Mother of Terror spider" + desc = "An enormous spider. Hundreds of tiny spiderlings are crawling all over it. Their beady little eyes all stare at you. The horror!" + spider_role_summary = "Schmuck bait. Extremely weak in combat, but spawns many spiderlings when it dies." + + icon_state = "terror_gray2" + icon_living = "terror_gray2" + icon_dead = "terror_gray2_dead" + maxHealth = 50 + health = 50 + melee_damage_lower = 10 + melee_damage_upper = 20 + move_to_delay = 5 + + spider_tier = TS_TIER_3 + spider_opens_doors = 2 + + var/canspawn = 1 + + +/mob/living/simple_animal/hostile/poison/terror_spider/mother/death(gibbed) + if(canspawn) + canspawn = 0 + for(var/i in 0 to 30) + var/obj/effect/spider/spiderling/terror_spiderling/S = new /obj/effect/spider/spiderling/terror_spiderling(get_turf(src)) + S.grow_as = pick(/mob/living/simple_animal/hostile/poison/terror_spider/red, /mob/living/simple_animal/hostile/poison/terror_spider/gray) + if(prob(66)) + S.stillborn = 1 + else if(prob(10)) + S.grow_as = pick(/mob/living/simple_animal/hostile/poison/terror_spider/black, /mob/living/simple_animal/hostile/poison/terror_spider/green) + visible_message("[src] breaks apart, the many spiders on its back scurrying everywhere!") + degenerate = 1 + ..() + +/mob/living/simple_animal/hostile/poison/terror_spider/mother/Destroy() + canspawn = 0 + return ..() \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm index 669449a6ae3..5a3a746e1a9 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm @@ -11,20 +11,34 @@ /mob/living/simple_animal/hostile/poison/terror_spider/prince name = "Prince of Terror spider" desc = "An enormous, terrifying spider. It looks like it is judging everything it sees. Its hide seems armored, and it bears the scars of many battles." - spider_role_summary = "Boss-level terror spider. Lightning bruiser. Capable of taking on a squad by itself." + spider_role_summary = "Miniboss terror spider. Lightning bruiser." + icon_state = "terror_allblack" icon_living = "terror_allblack" icon_dead = "terror_allblack_dead" - maxHealth = 400 // 20 laser shots. - health = 400 - melee_damage_lower = 15 - melee_damage_upper = 25 - move_to_delay = 5 - ventcrawler = 1 + + maxHealth = 600 // 30 laser shots + health = 600 + regen_points_per_hp = 6 // double the normal - IE halved regen speed + + melee_damage_lower = 20 + melee_damage_upper = 30 + move_to_delay = 4 // faster than normal + + ventcrawler = 0 + environment_smash = 3 + loot = list(/obj/item/clothing/accessory/medal) spider_tier = TS_TIER_3 spider_opens_doors = 2 + var/datum/action/innate/terrorspider/princesmash/princesmash_action + + +/mob/living/simple_animal/hostile/poison/terror_spider/prince/New() + ..() + princesmash_action = new() + princesmash_action.Grant(src) /mob/living/simple_animal/hostile/poison/terror_spider/prince/spider_specialattack(mob/living/carbon/human/L) if(prob(15)) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/purple.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/purple.dm new file mode 100644 index 00000000000..7b801d76651 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/purple.dm @@ -0,0 +1,85 @@ + +// -------------------------------------------------------------------------------- +// ----------------- TERROR SPIDERS: T2 PURPLE TERROR ----------------------------- +// -------------------------------------------------------------------------------- +// -------------: ROLE: guarding queen nests +// -------------: SPECIAL: chance to stun on hit +// -------------: TO FIGHT IT: shoot it from range, bring friends! +// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386 + +/mob/living/simple_animal/hostile/poison/terror_spider/purple + name = "Purple Terror spider" + desc = "An ominous-looking purple spider. It looks about warily, as if waiting for something." + spider_role_summary = "Guards the nest of the Queen of Terror." + + icon_state = "terror_purple" + icon_living = "terror_purple" + icon_dead = "terror_purple_dead" + maxHealth = 200 + health = 200 + melee_damage_lower = 15 + melee_damage_upper = 25 + move_to_delay = 6 + + spider_tier = TS_TIER_2 + spider_opens_doors = 2 + + ventcrawler = 0 + environment_smash = 3 + + var/dcheck_counter = 0 + var/queen_visible = 1 + var/cycles_noqueen = 0 + +/mob/living/simple_animal/hostile/poison/terror_spider/purple/spider_specialattack(mob/living/carbon/human/L, poisonable) + if(cycles_noqueen < 6 && prob(10)) + visible_message("[src] rams into [L], knocking them to the floor!") + L.Weaken(5) + L.Stun(5) + else + ..() + +/mob/living/simple_animal/hostile/poison/terror_spider/purple/Life() + . = ..() + if(.) // if mob is NOT dead + if(!degenerate && spider_myqueen) + if(dcheck_counter >= 10) + dcheck_counter = 0 + purple_distance_check() + else + dcheck_counter++ + +/mob/living/simple_animal/hostile/poison/terror_spider/purple/proc/purple_distance_check() + if(spider_myqueen) + var/mob/living/simple_animal/hostile/poison/terror_spider/queen/Q = spider_myqueen + if(Q) + if(Q.stat == DEAD) + spider_myqueen = null + degenerate = 1 + to_chat(src,"Your Queen has died! Her power no longer sustains you!") + return + queen_visible = 0 + for(var/mob/living/M in view(src, vision_range)) + if(M == Q) + queen_visible = 1 + break + if(queen_visible) + cycles_noqueen = 0 + if(spider_debug) + to_chat(src,"Queen visible.") + else + cycles_noqueen++ + if(spider_debug) + to_chat(src,"Queen NOT visible. Cycles: [cycles_noqueen].") + if(cycles_noqueen == 3) + // one minute without queen sighted + to_chat(src,"You wonder where your Queen is.") + else if(cycles_noqueen == 6) + // two minutes without queen sighted + to_chat(src,"Without your Queen in sight, you feel yourself getting weaker...") + else if(cycles_noqueen >= 9) + // three minutes without queen sighted, kill them. + degenerate = 1 + to_chat(src,"Your link to your Queen has been broken! Your life force starts to drain away!") + melee_damage_lower = 5 + melee_damage_upper = 10 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm new file mode 100644 index 00000000000..6ee528218ce --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm @@ -0,0 +1,214 @@ + +// -------------------------------------------------------------------------------- +// ----------------- TERROR SPIDERS: T4 QUEEN OF TERROR --------------------------- +// -------------------------------------------------------------------------------- +// -------------: ROLE: gamma-level threat to the whole station, like a blob +// -------------: SPECIAL: spins webs, breaks lights, breaks cameras, webs objects, lays eggs, commands other spiders... +// -------------: TO FIGHT IT: bring an army, and take no prisoners. Mechs and/or decloner guns are a very good idea. +// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386 + +/mob/living/simple_animal/hostile/poison/terror_spider/queen + name = "Queen of Terror spider" + desc = "An enormous, terrifying spider. Its egg sac is almost as big as its body, and teeming with spider eggs!" + spider_role_summary = "Commander of the spider forces. Lays eggs, directs the brood." + + icon_state = "terror_queen" + icon_living = "terror_queen" + icon_dead = "terror_queen_dead" + maxHealth = 200 + health = 200 + melee_damage_lower = 10 + melee_damage_upper = 20 + move_to_delay = 15 // yeah, this is very slow, but + ventcrawler = 1 + var/spider_spawnfrequency = 1200 // 120 seconds + var/spider_spawnfrequency_stable = 1200 // 120 seconds. Spawnfrequency is set to this on ai spiders once nest setup is complete. + var/spider_lastspawn = 0 + var/nestfrequency = 150 // 15 seconds + var/lastnestsetup = 0 + var/neststep = 0 + var/hasnested = 0 + var/spider_max_per_nest = 20 // above this, queen stops spawning more, and declares war. + + var/canlay = 0 // main counter for egg-laying ability! # = num uses, incremented at intervals + var/spider_can_fakelings = 3 // spawns defective spiderlings that don't grow up, used to freak out crew, atmosphere + + force_threshold = 18 // outright immune to anything of force under 18, this means welders can't hurt it, only guns can + + ranged = 1 + retreat_distance = 5 + minimum_distance = 5 + projectilesound = 'sound/weapons/pierce.ogg' + projectiletype = /obj/item/projectile/terrorqueenspit + + spider_tier = TS_TIER_4 + spider_opens_doors = 2 + loot = list(/obj/item/clothing/accessory/medal) + + var/datum/action/innate/terrorspider/queen/queennest/queennest_action + var/datum/action/innate/terrorspider/queen/queensense/queensense_action + var/datum/action/innate/terrorspider/queen/queeneggs/queeneggs_action + var/datum/action/innate/terrorspider/queen/queenfakelings/queenfakelings_action + + +/mob/living/simple_animal/hostile/poison/terror_spider/queen/New() + ..() + queennest_action = new() + queennest_action.Grant(src) + spider_myqueen = src + if(spider_awaymission) + spider_growinstantly = 1 + spider_spawnfrequency = 150 + +/mob/living/simple_animal/hostile/poison/terror_spider/queen/Life() + . = ..() + if(.) // if mob is NOT dead + if(ckey && canlay < 12 && hasnested) // max 12 eggs worth stored at any one time, realistically that's tons. + if(world.time > (spider_lastspawn + spider_spawnfrequency)) + canlay++ + spider_lastspawn = world.time + if(canlay == 1) + to_chat(src, "You are able to lay eggs again.") + else if(canlay == 12) + to_chat(src, "You have [canlay] eggs available to lay. You won't grow any more eggs until you lay some of your existing ones.") + else + to_chat(src, "You have [canlay] eggs available to lay.") + +/mob/living/simple_animal/hostile/poison/terror_spider/queen/death(gibbed) + if(!hasdied) + // When a queen dies, so do her player-controlled purple-type guardians. Intended as a motivator for purples to ensure they guard her. + for(var/mob/living/simple_animal/hostile/poison/terror_spider/purple/P in ts_spiderlist) + if(ckey) + P.visible_message("\The [src] writhes in pain!") + to_chat(P,"\The [src] has died. Without her hivemind link, purple terrors like yourself cannot survive more than a few minutes!") + P.degenerate = 1 + ..() + +/mob/living/simple_animal/hostile/poison/terror_spider/queen/proc/NestMode() + queeneggs_action = new() + queeneggs_action.Grant(src) + queenfakelings_action = new() + queenfakelings_action.Grant(src) + queensense_action = new() + queensense_action.Grant(src) + queennest_action.Remove(src) + hasnested = 1 + ventcrawler = 0 + environment_smash = 3 + DoQueenScreech(8, 100, 8, 100) + MassFlicker() + to_chat(src, "You have matured to your egglaying stage. You can now smash through walls, and lay eggs, but can no longer ventcrawl.") + +/mob/living/simple_animal/hostile/poison/terror_spider/queen/proc/MassFlicker() + var/list/target_lights = list() + for(var/mob/living/carbon/human/H in player_list) + if(H.z != z) + continue + if(H.stat == DEAD) + continue + for(var/obj/machinery/light/L in orange(7, H)) + if(L.on && prob(25)) + target_lights += L + for(var/obj/machinery/light/I in target_lights) + I.flicker() + +/mob/living/simple_animal/hostile/poison/terror_spider/queen/proc/LayQueenEggs() + if(!hasnested) + to_chat(src, "You must nest before doing this.") + return + if(canlay < 1) + var/remainingtime = round(((spider_lastspawn + spider_spawnfrequency) - world.time) / 10, 1) + if(remainingtime > 0) + to_chat(src, "Too soon to attempt that again. Wait another [num2text(remainingtime)] seconds.") + else + to_chat(src, "Too soon to attempt that again. Wait just a few more seconds...") + return + var/list/eggtypes = list(TS_DESC_RED, TS_DESC_GRAY, TS_DESC_GREEN, TS_DESC_BLACK, TS_DESC_PURPLE) + if(canlay >= 12) + eggtypes |= TS_DESC_MOTHER + eggtypes |= TS_DESC_PRINCE + var num_purples = CountSpidersType(/mob/living/simple_animal/hostile/poison/terror_spider/purple) + if(num_purples >= 2) + eggtypes -= TS_DESC_PURPLE + var num_blacks = CountSpidersType(/mob/living/simple_animal/hostile/poison/terror_spider/black) + if(num_blacks >= 2) + eggtypes -= TS_DESC_BLACK + var/eggtype = input("What kind of eggs?") as null|anything in eggtypes + if(!(eggtype in eggtypes)) + to_chat(src, "Unrecognized egg type.") + return 0 + if(eggtype == TS_DESC_MOTHER || eggtype == TS_DESC_PRINCE) + if(canlay < 12) + to_chat(src, "Insufficient strength. It takes as much effort to lay one of those as it does to lay 12 normal eggs.") + else + if(eggtype == TS_DESC_MOTHER) + canlay -= 12 + DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/mother, 1, 0) + else if(eggtype == TS_DESC_PRINCE) + canlay -= 12 + DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/prince, 1, 0) + return + var/numlings = 1 + if(eggtype != TS_DESC_PURPLE) + if(canlay >= 5) + numlings = input("How many in the batch?") as null|anything in list(1, 2, 3, 4, 5) + else if(canlay >= 3) + numlings = input("How many in the batch?") as null|anything in list(1, 2, 3) + else if(canlay == 2) + numlings = input("How many in the batch?") as null|anything in list(1, 2) + if(eggtype == null || numlings == null) + to_chat(src, "Cancelled.") + return + //spider_lastspawn = world.time // don't think we actually need this, if queen is laying manually canlay controls her rate. + canlay -= numlings + if(eggtype == TS_DESC_RED) + DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/red, numlings, 1) + else if(eggtype == TS_DESC_GRAY) + DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/gray, numlings, 1) + else if(eggtype == TS_DESC_GREEN) + DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/green, numlings, 1) + else if(eggtype == TS_DESC_BLACK) + DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/black, numlings, 1) + else if(eggtype == TS_DESC_PURPLE) + DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/purple, numlings, 0) + else + to_chat(src, "Unrecognized egg type.") + +/mob/living/simple_animal/hostile/poison/terror_spider/queen/proc/DoQueenScreech(light_range, light_chance, camera_range, camera_chance) + visible_message("\The [src] emits a bone-chilling shriek!") + for(var/obj/machinery/light/L in orange(light_range, src)) + if(L.on && prob(light_chance)) + L.broken() + for(var/obj/machinery/camera/C in orange(camera_range, src)) + if(C.status && prob(camera_chance)) + C.toggle_cam(src, 0) + +/mob/living/simple_animal/hostile/poison/terror_spider/queen/proc/QueenFakeLings() + if(spider_can_fakelings) + spider_can_fakelings-- + var/numlings = 15 + for(var/i in 1 to numlings) + var/obj/effect/spider/spiderling/terror_spiderling/S = new /obj/effect/spider/spiderling/terror_spiderling(get_turf(src)) + S.grow_as = /mob/living/simple_animal/hostile/poison/terror_spider/red + S.stillborn = 1 + S.name = "Evil-Looking Spiderling" + S.desc = "It moves very quickly, hisses loudly for its size... and has disproportionately large fangs. Hopefully it does not grow up..." + if(!spider_can_fakelings) + queenfakelings_action.Remove(src) + else + to_chat(src, "You have run out of uses of this ability.") + +/obj/item/projectile/terrorqueenspit + name = "poisonous spit" + damage = 0 + icon_state = "toxin" + damage_type = TOX + +/obj/item/projectile/terrorqueenspit/on_hit(mob/living/carbon/target) + if(ismob(target)) + var/mob/living/L = target + if(L.reagents) + if(L.can_inject(null, 0, "chest", 0)) + L.reagents.add_reagent("terror_queen_toxin", 15) + if(!istype(L, /mob/living/simple_animal/hostile/poison/terror_spider)) + L.adjustToxLoss(30) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm index 33480f9509c..cd48027775d 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm @@ -57,4 +57,4 @@ visible_message("[src] retracts its fangs a little.") melee_damage_lower = melee_damage_lower_rage0 melee_damage_upper = melee_damage_upper_rage0 - ..() + ..() \ No newline at end of file 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 new file mode 100644 index 00000000000..ccb7a5c1148 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/reproduction.dm @@ -0,0 +1,172 @@ + +// -------------------------------------------------------------------------------- +// ----------------- TERROR SPIDERS: SPIDERLINGS (USED BY GREEN, WHITE, QUEEN AND MOTHER TYPES) +// -------------------------------------------------------------------------------- + +/obj/effect/spider/spiderling/terror_spiderling + name = "spiderling" + desc = "A fast-moving tiny spider, prone to making aggressive hissing sounds. Hope it doesn't grow up." + icon_state = "spiderling" + anchored = 0 + layer = 2.75 + health = 3 + var/stillborn = 0 + faction = list("terrorspiders") + var/spider_myqueen = null + var/use_vents = 1 + +/obj/effect/spider/spiderling/terror_spiderling/New() + ..() + ts_spiderling_list += src + +/obj/effect/spider/spiderling/terror_spiderling/Destroy() + ts_spiderling_list -= src + return ..() + +/obj/effect/spider/spiderling/terror_spiderling/Bump(atom/A) + if(istype(A, /obj/structure/table)) + forceMove(A.loc) + else if(istype(A, /obj/machinery/recharge_station)) + qdel(src) + else + ..() + +/obj/effect/spider/spiderling/terror_spiderling/process() + if(travelling_in_vent) + if(isturf(loc)) + travelling_in_vent = 0 + entry_vent = null + else if(entry_vent) + if(get_dist(src, entry_vent) <= 1) + var/list/vents = list() + for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in entry_vent.parent.other_atmosmch) + vents.Add(temp_vent) + if(!vents.len) + entry_vent = null + return + var/obj/machinery/atmospherics/unary/vent_pump/exit_vent = pick(vents) + if(prob(50)) + visible_message("[src] scrambles into the ventillation ducts!", "You hear something squeezing through the ventilation ducts.") + var/original_location = loc + spawn(rand(20,60)) + forceMove(exit_vent) + var/travel_time = round(get_dist(loc, exit_vent.loc) / 2) + spawn(travel_time) + if(!exit_vent || exit_vent.welded) + forceMove(original_location) + entry_vent = null + return + if(prob(50)) + audible_message("You hear something squeezing through the ventilation ducts.") + spawn(travel_time) + if(!exit_vent || exit_vent.welded) + forceMove(original_location) + entry_vent = null + return + forceMove(exit_vent.loc) + entry_vent = null + var/area/new_area = get_area(loc) + if(new_area) + new_area.Entered(src) + else if(prob(33)) + var/list/nearby = oview(10, src) + if(nearby.len) + var/target_atom = pick(nearby) + walk_to(src, target_atom) + else if(prob(10) && use_vents) + for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(7,src)) + if(!v.welded) + entry_vent = v + walk_to(src, entry_vent, 1) + break + if(isturf(loc)) + amount_grown += rand(0,2) + if(amount_grown >= 100) + if(stillborn) + die() + else + if(!grow_as) + grow_as = pick(/mob/living/simple_animal/hostile/poison/terror_spider/red, /mob/living/simple_animal/hostile/poison/terror_spider/gray, /mob/living/simple_animal/hostile/poison/terror_spider/green) + var/mob/living/simple_animal/hostile/poison/terror_spider/S = new grow_as(loc) + S.faction = faction + S.spider_myqueen = spider_myqueen + S.master_commander = master_commander + qdel(src) + +// -------------------------------------------------------------------------------- +// ----------------- TERROR SPIDERS: EGGS (USED BY NURSE AND QUEEN TYPES) --------- +// -------------------------------------------------------------------------------- + +/mob/living/simple_animal/hostile/poison/terror_spider/proc/DoLayTerrorEggs(lay_type, lay_number, lay_crawl) + stop_automated_movement = 1 + var/obj/effect/spider/eggcluster/terror_eggcluster/C = new /obj/effect/spider/eggcluster/terror_eggcluster(get_turf(src)) + C.spiderling_type = lay_type + C.spiderling_number = lay_number + C.spiderling_ventcrawl = lay_crawl + C.faction = faction + C.spider_myqueen = spider_myqueen + C.master_commander = master_commander + if(spider_growinstantly) + C.amount_grown = 250 + C.spider_growinstantly = 1 + spawn(10) + stop_automated_movement = 0 + +/obj/effect/spider/eggcluster/terror_eggcluster + name = "terror egg cluster" + desc = "A cluster of tiny spider eggs. They pulse with a strong inner life, and appear to have sharp thorns on the sides." + icon_state = "eggs" + var/spider_growinstantly = 0 + faction = list("terrorspiders") + var/spider_myqueen = null + var/spiderling_type = null + var/spiderling_number = 1 + var/spiderling_ventcrawl = 1 + +/obj/effect/spider/eggcluster/terror_eggcluster/New() + ..() + ts_egg_list += src + spawn(50) + if(spiderling_type == /mob/living/simple_animal/hostile/poison/terror_spider/red) + name = "red terror eggs" + else if(spiderling_type == /mob/living/simple_animal/hostile/poison/terror_spider/gray) + name = "gray terror eggs" + else if(spiderling_type == /mob/living/simple_animal/hostile/poison/terror_spider/green) + name = "green terror eggs" + else if(spiderling_type == /mob/living/simple_animal/hostile/poison/terror_spider/black) + name = "black terror eggs" + else if(spiderling_type == /mob/living/simple_animal/hostile/poison/terror_spider/purple) + name = "purple terror eggs" + else if(spiderling_type == /mob/living/simple_animal/hostile/poison/terror_spider/white) + name = "white terror eggs" + else if(spiderling_type == /mob/living/simple_animal/hostile/poison/terror_spider/mother) + name = "mother of terror eggs" + else if(spiderling_type == /mob/living/simple_animal/hostile/poison/terror_spider/prince) + name = "prince of terror eggs" + else if(spiderling_type == /mob/living/simple_animal/hostile/poison/terror_spider/queen) + name = "queen of terror eggs" + +/obj/effect/spider/eggcluster/terror_eggcluster/Destroy() + ts_egg_list -= src + return ..() + +/obj/effect/spider/eggcluster/terror_eggcluster/process() + amount_grown += rand(0,2) + if(amount_grown >= 100) + var/num = spiderling_number + for(var/i=0, i spider_tier) visible_message("[src] bows in respect for the terrifying presence of [target].") @@ -163,22 +165,21 @@ var/global/list/ts_spiderlist = list() spider_specialattack(G,can_poison) else G.attack_animal(src) + else if(istype(target, /obj/structure/alien/resin)) + var/obj/structure/alien/resin/E = target + do_attack_animation(E) + E.health -= rand(melee_damage_lower, melee_damage_upper) + E.healthcheck() else target.attack_animal(src) -/mob/living/simple_animal/hostile/poison/terror_spider/proc/spider_specialattack(mob/living/carbon/human/L, var/poisonable) +/mob/living/simple_animal/hostile/poison/terror_spider/proc/spider_specialattack(mob/living/carbon/human/L, poisonable) L.attack_animal(src) - - - - - // -------------------------------------------------------------------------------- // --------------------- TERROR SPIDERS: PROC OVERRIDES --------------------------- // -------------------------------------------------------------------------------- - /mob/living/simple_animal/hostile/poison/terror_spider/examine(mob/user) ..() var/list/msgs = list() @@ -195,18 +196,20 @@ var/global/list/ts_spiderlist = list() msgs += "It has many injuries." else if(health > (maxHealth*0.25)) msgs += "It is barely clinging on to life!" + if(degenerate) + msgs += "It appears to be dying." else if(health < maxHealth && regen_points > regen_points_per_kill) msgs += "It appears to be regenerating quickly." if(killcount >= 1) msgs += "It has blood dribbling from its mouth." to_chat(usr,msgs.Join("
    ")) - /mob/living/simple_animal/hostile/poison/terror_spider/New() ..() ts_spiderlist += src add_language("Spider Hivemind") - add_language("Galactic Common") + if(spider_tier >= TS_TIER_2) + add_language("Galactic Common") default_language = all_languages["Spider Hivemind"] web_action = new() @@ -215,6 +218,7 @@ var/global/list/ts_spiderlist = list() wrap_action.Grant(src) name += " ([rand(1, 1000)])" + real_name = name msg_terrorspiders("[src] has grown in [get_area(src)].") if(is_away_level(z)) spider_awaymission = 1 @@ -233,7 +237,7 @@ var/global/list/ts_spiderlist = list() if(ckey) var/image/alert_overlay = image('icons/mob/terrorspider.dmi', icon_state) notify_ghosts("[src] has appeared in [get_area(src)]. (already player-controlled)", source = src, alert_overlay = alert_overlay) - else if(ai_playercontrol_allowingeneral && ai_playercontrol_allowtype) + else if(ai_playercontrol_allowtype) var/image/alert_overlay = image('icons/mob/terrorspider.dmi', icon_state) notify_ghosts("[src] has appeared in [get_area(src)].", enter_link = "(Click to control)", source = src, alert_overlay = alert_overlay, action = NOTIFY_ATTACK) @@ -243,13 +247,15 @@ var/global/list/ts_spiderlist = list() return ..() /mob/living/simple_animal/hostile/poison/terror_spider/Life() - ..() - if(stat == DEAD) + . = ..() + if(!.) // if mob is dead if(prob(2)) // 2% chance every cycle to decompose visible_message("\The dead body of the [src] decomposes!") gib() else + if(degenerate > 0) + adjustToxLoss(rand(1,10)) if(regen_points < regen_points_max) regen_points += regen_points_per_tick if((bruteloss > 0) || (fireloss > 0)) @@ -263,9 +269,6 @@ var/global/list/ts_spiderlist = list() if(prob(5)) CheckFaction() - - - /mob/living/simple_animal/hostile/poison/terror_spider/proc/handle_dying() if(!hasdied) hasdied = 1 @@ -282,7 +285,6 @@ var/global/list/ts_spiderlist = list() handle_dying() ..() - /mob/living/simple_animal/hostile/poison/terror_spider/proc/spider_special_action() return diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/white.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/white.dm new file mode 100644 index 00000000000..191eed19c47 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/white.dm @@ -0,0 +1,42 @@ + +// -------------------------------------------------------------------------------- +// ----------------- TERROR SPIDERS: T2 WHITE TERROR ------------------------------ +// -------------------------------------------------------------------------------- +// -------------: ROLE: stealthy reproduction +// -------------: AI: injects a venom that makes you grow spiders in your body, then retreats +// -------------: SPECIAL: stuns you on first attack - vulnerable to groups while it does this +// -------------: TO FIGHT IT: blast it before it can get away +// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386 + +/mob/living/simple_animal/hostile/poison/terror_spider/white + name = "White Terror spider" + desc = "An ominous-looking white spider, its ghostly eyes and vicious-looking fangs are the stuff of nightmares." + spider_role_summary = "Rare, bite-and-run spider that infects hosts with spiderlings" + + icon_state = "terror_white" + icon_living = "terror_white" + icon_dead = "terror_white_dead" + maxHealth = 100 + health = 100 + melee_damage_lower = 5 + melee_damage_upper = 15 + move_to_delay = 4 + spider_tier = TS_TIER_2 + loot = list(/obj/item/clothing/accessory/medal) + + +/mob/living/simple_animal/hostile/poison/terror_spider/white/spider_specialattack(mob/living/carbon/human/L, poisonable) + if(!poisonable) + ..() + return + var/inject_target = pick("chest","head") + L.attack_animal(src) + if(L.stunned || L.paralysis || L.can_inject(null,0,inject_target,0)) + if(!IsInfected(L)) + visible_message("[src] buries its long fangs deep into the [inject_target] of [L]!") + new /obj/item/organ/internal/body_egg/terror_eggs(L) + +/mob/living/simple_animal/hostile/poison/terror_spider/proc/IsInfected(mob/living/carbon/C) // Terror AI requires this + if(C.get_int_organ(/obj/item/organ/internal/body_egg)) + return 1 + return 0 \ No newline at end of file diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 962987dcc3f..2988363ffb9 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -196,3 +196,5 @@ var/list/permanent_huds = list() var/list/actions = list() + + var/list/progressbars = null //for stacking do_after bars diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 0a9e0e77912..2e83e9b9a95 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -442,9 +442,9 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM) if(istype(subject, /mob/dead/observer)) DM = subject if(check_rights(R_ADMIN|R_MOD,0,M)) // What admins see - lname = "[keyname][(DM && DM.anonsay) ? "*" : (DM ? "" : "^")] ([name])" + lname = "[keyname][(DM && DM.client && DM.client.prefs.ghost_anonsay) ? "*" : (DM ? "" : "^")] ([name])" else - if(DM && DM.anonsay) // If the person is actually observer they have the option to be anonymous + if(DM && DM.client && DM.client.prefs.ghost_anonsay) // If the person is actually observer they have the option to be anonymous lname = "Ghost of [name]" else if(DM) // Non-anons lname = "[keyname] ([name])" @@ -617,3 +617,6 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM) return FALSE // Cast to 1/0 return !!(client.prefs.toggles & toggleflag) + + +#define isterrorspider(A) (istype((A), /mob/living/simple_animal/hostile/poison/terror_spider)) \ No newline at end of file diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index efaf84798d1..15473caf5f2 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -241,11 +241,12 @@ var/mob/living/carbon/human/H = new H.species = current_species H.s_tone = s_tone - H.species.updatespeciescolor(H) - - icobase = H.species.icobase + H.species.updatespeciescolor(H, 0) //The mob's species wasn't set, so it's almost certainly different than the character's species at the moment. Thus, we need to be owner-insensitive. + var/obj/item/organ/external/chest/C = H.get_organ("chest") + icobase = C.icobase ? C.icobase : C.species.icobase if(H.species.bodyflags & HAS_TAIL) - coloured_tail = H.species.tail + coloured_tail = H.tail ? H.tail : H.species.tail + qdel(H) else icobase = current_species.icobase diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index fd10ebbbaf0..51b78d0b973 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -142,12 +142,12 @@ var/list/alldepartments = list() if(href_list["dept"]) if(is_authenticated) var/lastdestination = destination - var/list/combineddepartments = alldepartments + var/list/combineddepartments = alldepartments.Copy() if(long_range_enabled) - combineddepartments += admin_departments + combineddepartments += admin_departments.Copy() if(emagged) - combineddepartments += hidden_admin_departments + combineddepartments += hidden_admin_departments.Copy() destination = input(usr, "To which department?", "Choose a department", "") as null|anything in combineddepartments if(!destination) @@ -233,7 +233,7 @@ var/list/alldepartments = list() flick("faxreceive", src) - playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1) + playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) // give the sprite some time to flick sleep(20) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 7e5f847419f..a5f04461551 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -199,62 +199,8 @@ update_icon() -/obj/item/weapon/paper/proc/parsepencode(var/t, var/obj/item/weapon/pen/P, mob/user as mob, var/iscrayon = 0) -// t = sanitize(copytext(t),1,MAX_MESSAGE_LEN) - - t = replacetext(t, "\[center\]", "
    ") - t = replacetext(t, "\[/center\]", "
    ") - t = replacetext(t, "\[br\]", "
    ") - t = replacetext(t, "\[b\]", "") - t = replacetext(t, "\[/b\]", "") - t = replacetext(t, "\[i\]", "") - t = replacetext(t, "\[/i\]", "") - t = replacetext(t, "\[u\]", "") - t = replacetext(t, "\[/u\]", "") - t = replacetext(t, "\[large\]", "") - t = replacetext(t, "\[/large\]", "") - t = replacetext(t, "\[sign\]", "[user ? user.real_name : "Anonymous"]") - t = replacetext(t, "\[field\]", "") - - t = replacetext(t, "\[h1\]", "

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

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

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

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

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

    ") - - if(!iscrayon) - t = replacetext(t, "\[*\]", "
  • ") - t = replacetext(t, "\[hr\]", "
    ") - t = replacetext(t, "\[small\]", "") - t = replacetext(t, "\[/small\]", "") - t = replacetext(t, "\[list\]", "
      ") - t = replacetext(t, "\[/list\]", "
    ") - t = replacetext(t, "\[table\]", "") - t = replacetext(t, "\[/table\]", "
    ") - t = replacetext(t, "\[grid\]", "") - t = replacetext(t, "\[/grid\]", "
    ") - t = replacetext(t, "\[row\]", "") - t = replacetext(t, "\[cell\]", "") - t = replacetext(t, "\[logo\]", "") - - t = "[t]" - else // If it is a crayon, and he still tries to use these, make them empty! - t = replacetext(t, "\[*\]", "") - t = replacetext(t, "\[hr\]", "") - t = replacetext(t, "\[small\]", "") - t = replacetext(t, "\[/small\]", "") - t = replacetext(t, "\[list\]", "") - t = replacetext(t, "\[/list\]", "") - t = replacetext(t, "\[table\]", "") - t = replacetext(t, "\[/table\]", "") - t = replacetext(t, "\[row\]", "") - t = replacetext(t, "\[cell\]", "") - t = replacetext(t, "\[logo\]", "") - - t = "[t]" - - t = copytext(t, 1, MAX_PAPER_MESSAGE_LEN) +/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, deffont, signfont, crayonfont) //Count the fields var/laststart = 1 @@ -303,12 +249,10 @@ //var/t = strip_html_simple(input("Enter what you want to write:", "Write", null, null) as message, MAX_MESSAGE_LEN) var/t = input("Enter what you want to write:", "Write", null, null) as message var/obj/item/i = usr.get_active_hand() // Check to see if he still got that darn pen, also check if he's using a crayon or pen. - var/iscrayon = 0 add_hiddenprint(usr) // No more forging nasty documents as someone else, you jerks if(!istype(i, /obj/item/weapon/pen)) if(!istype(i, /obj/item/toy/crayon)) return - iscrayon = 1 // if paper is not in usr, then it must be near them, or in a clipboard or folder, which must be in or near usr @@ -326,8 +270,7 @@ return */ t = html_encode(t) - t = replacetext(t, "\n", "
    ") - t = parsepencode(t, i, usr, iscrayon) // Encode everything from pencode to html + t = parsepencode(t, i, usr) // Encode everything from pencode to html if(id!="end") addtofield(text2num(id), t) // He wants to edit a field, let him. diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 2a1b94d0f44..f2f25d58a2d 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -57,7 +57,7 @@ if(stat & (BROKEN|NOPOWER)) return - playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1) + playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) for(var/i = 0, i < copies, i++) if(toner <= 0) break @@ -117,7 +117,7 @@ if(!selection) return - playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1) + playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) var/obj/item/weapon/photo/p = new /obj/item/weapon/photo (src.loc) p.construct(selection) if(p.desc == "") diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index d55e240bdf6..89c3c8b61e1 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -319,7 +319,7 @@ field_generator power level display if(O.last_warning && temp) if((world.time - O.last_warning) > 50) //to stop message-spam temp = 0 - message_admins("A singulo exists and a containment field has failed.",1) + message_admins("A singulo exists and a containment field has failed. Location: [get_area(src)] (JMP)",1) investigate_log("has failed whilst a singulo exists.","singulo") O.last_warning = world.time diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm index d98f53ef74c..d0b4488d557 100644 --- a/code/modules/projectiles/ammunition/energy.dm +++ b/code/modules/projectiles/ammunition/energy.dm @@ -122,7 +122,7 @@ projectile_type = /obj/item/projectile/beam/disabler select_name = "disable" e_cost = 500 - fire_sound = "sound/weapons/taser2.ogg" + fire_sound = 'sound/weapons/taser2.ogg' /obj/item/ammo_casing/energy/plasma projectile_type = /obj/item/projectile/plasma @@ -139,7 +139,7 @@ /obj/item/ammo_casing/energy/wormhole projectile_type = /obj/item/projectile/beam/wormhole e_cost = 0 - fire_sound = "sound/weapons/pulse3.ogg" + fire_sound = 'sound/weapons/pulse3.ogg' var/obj/item/weapon/gun/energy/wormhole_projector/gun = null select_name = "blue" @@ -193,7 +193,7 @@ /obj/item/ammo_casing/energy/toxplasma projectile_type = /obj/item/projectile/energy/toxplasma - fire_sound = "sound/weapons/taser2.ogg" + fire_sound = 'sound/weapons/taser2.ogg' select_name = "plasma dart" /obj/item/ammo_casing/energy/clown diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 7b8872f7819..b859fc400fc 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -153,15 +153,15 @@ var/obj/item/weapon/gun/energy/kinetic_accelerator/KA = loc KA.modify_projectile(BB) - var/turf/proj_turf = get_turf(BB) - if(!isturf(proj_turf)) - return - var/datum/gas_mixture/environment = proj_turf.return_air() - var/pressure = environment.return_pressure() - if(pressure > 50) - BB.name = "weakened [BB.name]" - var/obj/item/projectile/kinetic/K = BB - K.damage *= K.pressure_decrease + var/turf/proj_turf = get_turf(BB) + if(!isturf(proj_turf)) + return + var/datum/gas_mixture/environment = proj_turf.return_air() + var/pressure = environment.return_pressure() + if(pressure > 50) + BB.name = "weakened [BB.name]" + var/obj/item/projectile/kinetic/K = BB + K.damage *= K.pressure_decrease //Projectiles @@ -176,7 +176,7 @@ var/pressure_decrease = 0.25 var/turf_aoe = FALSE - var/mob_aoe = 0 + var/mob_aoe = FALSE var/list/hit_overlays = list() /obj/item/projectile/kinetic/on_range() diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm index 6479854f854..9909cb18d9d 100644 --- a/code/modules/projectiles/guns/magic/staff.dm +++ b/code/modules/projectiles/guns/magic/staff.dm @@ -8,7 +8,7 @@ ammo_type = /obj/item/ammo_casing/magic/change icon_state = "staffofchange" item_state = "staffofchange" - fire_sound = "sound/magic/Staff_Change.ogg" + fire_sound = 'sound/magic/Staff_Change.ogg' /obj/item/weapon/gun/magic/staff/animate name = "staff of animation" @@ -16,7 +16,7 @@ ammo_type = /obj/item/ammo_casing/magic/animate icon_state = "staffofanimation" item_state = "staffofanimation" - fire_sound = "sound/magic/Staff_animation.ogg" + fire_sound = 'sound/magic/Staff_animation.ogg' /obj/item/weapon/gun/magic/staff/healing name = "staff of healing" @@ -24,7 +24,7 @@ ammo_type = /obj/item/ammo_casing/magic/heal icon_state = "staffofhealing" item_state = "staffofhealing" - fire_sound = "sound/magic/Staff_Healing.ogg" + fire_sound = 'sound/magic/Staff_Healing.ogg' /obj/item/weapon/gun/magic/staff/healing/handle_suicide() //Stops people trying to commit suicide to heal themselves return @@ -38,7 +38,7 @@ max_charges = 10 recharge_rate = 2 no_den_usage = 1 - fire_sound = "sound/magic/Staff_Chaos.ogg" + fire_sound = 'sound/magic/Staff_Chaos.ogg' /obj/item/weapon/gun/magic/staff/door name = "staff of door creation" @@ -49,7 +49,7 @@ max_charges = 10 recharge_rate = 2 no_den_usage = 1 - fire_sound = "sound/magic/Staff_Door.ogg" + fire_sound = 'sound/magic/Staff_Door.ogg' /obj/item/weapon/gun/magic/staff/honk name = "staff of the honkmother" @@ -59,7 +59,7 @@ item_state = "honker" max_charges = 4 recharge_rate = 8 - fire_sound = "sound/items/airhorn.ogg" + fire_sound = 'sound/items/airhorn.ogg' /obj/item/weapon/gun/magic/staff/focus name = "mental focus" @@ -72,7 +72,7 @@ /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." - fire_sound = "sound/magic/Fireball.ogg" + fire_sound = 'sound/magic/Fireball.ogg' ammo_type = /obj/item/ammo_casing/magic/spellblade icon_state = "spellblade" item_state = "spellblade" diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index 572412dee8b..20461c08acf 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -59,7 +59,7 @@ /obj/item/weapon/gun/magic/wand/death name = "wand of death" desc = "This deadly wand overwhelms the victim's body with pure energy, slaying them without fail." - fire_sound = "sound/magic/WandoDeath.ogg" + fire_sound = 'sound/magic/WandoDeath.ogg' ammo_type = /obj/item/ammo_casing/magic/death icon_state = "deathwand" max_charges = 3 //3, 2, 2, 1 @@ -80,7 +80,7 @@ name = "wand of resurrection" desc = "This wand uses healing magics to heal and revive. They are rarely utilized within the Wizard Federation for some reason." ammo_type = /obj/item/ammo_casing/magic/heal - fire_sound = "sound/magic/Staff_Healing.ogg" + fire_sound = 'sound/magic/Staff_Healing.ogg' icon_state = "revivewand" max_charges = 3 //3, 2, 2, 1 @@ -98,7 +98,7 @@ name = "wand of polymorph" desc = "This wand is attuned to chaos and will radically alter the victim's form." ammo_type = /obj/item/ammo_casing/magic/change - fire_sound = "sound/magic/Staff_Change.ogg" + fire_sound = 'sound/magic/Staff_Change.ogg' icon_state = "polywand" max_charges = 10 //10, 5, 5, 4 @@ -118,7 +118,7 @@ icon_state = "telewand" max_charges = 10 //10, 5, 5, 4 no_den_usage = 1 - fire_sound = "sound/magic/Wand_Teleport.ogg" + fire_sound = 'sound/magic/Wand_Teleport.ogg' /obj/item/weapon/gun/magic/wand/teleport/zap_self(mob/living/user) do_teleport(user, user, 10) @@ -136,7 +136,7 @@ name = "wand of door creation" desc = "This particular wand can create doors in any wall for the unscrupulous wizard who shuns teleportation magics." ammo_type = /obj/item/ammo_casing/magic/door - fire_sound = "sound/magic/Staff_Door.ogg" + fire_sound = 'sound/magic/Staff_Door.ogg' icon_state = "doorwand" max_charges = 20 //20, 10, 10, 7 @@ -152,7 +152,7 @@ /obj/item/weapon/gun/magic/wand/fireball name = "wand of fireball" desc = "This wand shoots scorching balls of fire that explode into destructive flames." - fire_sound = "sound/magic/Fireball.ogg" + fire_sound = 'sound/magic/Fireball.ogg' ammo_type = /obj/item/ammo_casing/magic/fireball icon_state = "firewand" max_charges = 8 //8, 4, 4, 3 diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 569bdb3f4e1..86ec72e238b 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -96,7 +96,7 @@ if(!(printing)) printing = 1 visible_message("[src] rattles and prints out a sheet of paper.") - playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1) + playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(loc) P.info = "
    Chemical Analysis

    " P.info += "Time of analysis: [worldtime2text(world.time)]

    " diff --git a/code/modules/reagents/chemistry/reagents/misc.dm b/code/modules/reagents/chemistry/reagents/misc.dm index f755f61219f..e8505d64653 100644 --- a/code/modules/reagents/chemistry/reagents/misc.dm +++ b/code/modules/reagents/chemistry/reagents/misc.dm @@ -417,15 +417,15 @@ var/newsize = current_size switch(volume) if(0 to 19) - newsize = 1.25 + newsize = 1.1 if(20 to 49) - newsize = 1.5 + newsize = 1.2 if(50 to 99) - newsize = 2 + newsize = 1.25 if(100 to 199) - newsize = 2.5 + newsize = 1.3 if(200 to INFINITY) - newsize = 3.5 + newsize = 1.5 H.resize = newsize/current_size current_size = newsize diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm index a92982a8aaf..9fc96c714a8 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm @@ -178,6 +178,7 @@ ..() /datum/reagent/phlogiston/reaction_mob(mob/living/M, method=TOUCH, volume) + M.adjust_fire_stacks(1) M.IgniteMob() ..() @@ -299,4 +300,4 @@ if(method == TOUCH) M.adjust_fire_stacks(volume / 5) return - ..() \ No newline at end of file + ..() diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 6f42eaf91b2..fe54819e035 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -402,4 +402,4 @@ datum/chemical_reaction/flash_powder id = "thermite" result = "thermite" required_reagents = list("aluminum" = 1, "iron" = 1, "oxygen" = 1) - result_amount = 3 \ No newline at end of file + result_amount = 3 diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index f44e96ae78b..0ad25eb32ed 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -152,8 +152,8 @@ build_path = /obj/item/ammo_box/magazine/wt550m9/wtic /datum/design/mag_oldsmg/tx_mag - name = "WT-550 Auto Gun Urnaium Magazine (4.6x30mm TX)" - desc = "A 20 round urnaium tipped magazine for the out of date security WT-550 Auto Rifle" + name = "WT-550 Auto Gun Uranium Magazine (4.6x30mm TX)" + desc = "A 20 round uranium tipped magazine for the out of date security WT-550 Auto Rifle" id = "mag_oldsmg_tx" materials = list(MAT_METAL = 6000, MAT_SILVER = 600, MAT_URANIUM = 2000) build_path = /obj/item/ammo_box/magazine/wt550m9/wttx diff --git a/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm b/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm index 673f5996ade..83c3551bde4 100644 --- a/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm +++ b/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm @@ -73,7 +73,7 @@ results = get_scan_info(scanned_object) src.visible_message("[name] states, \"Scanning complete.\"") - playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1) + playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) var/obj/item/weapon/paper/P = new(src.loc) P.name = "[src] report #[++report_num]" P.info = "[src] analysis report #[report_num]
    " diff --git a/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm b/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm index bd2c704f21f..4b0cb78116a 100644 --- a/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm +++ b/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm @@ -257,7 +257,7 @@ if(scanned_item) //create report - playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1) + playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) var/obj/item/weapon/paper/P = new(src) P.name = "[src] report #[++report_num]: [scanned_item.name]" P.stamped = list(/obj/item/weapon/stamp) diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index 416eac1ba2a..9e0e26a0252 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -67,6 +67,26 @@ return return ..() +/obj/machinery/computer/camera_advanced/xenobio/attackby(obj/item/O, mob/user, params) + if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/monkeycube)) + monkeys++ + to_chat(user, "You feed [O] to [src]. It now has [monkeys] monkey cubes stored.") + user.drop_item() + qdel(O) + return + else if(istype(O, /obj/item/weapon/storage/bag)) + var/obj/item/weapon/storage/P = O + var/loaded = 0 + for(var/obj/G in P.contents) + if(istype(G, /obj/item/weapon/reagent_containers/food/snacks/monkeycube)) + loaded = 1 + monkeys++ + qdel(G) + if(loaded) + to_chat(user, "You fill [src] with the monkey cubes stored in [O]. [src] now has [monkeys] monkey cubes stored.") + return + ..() + /datum/action/innate/camera_off/xenobio/Activate() if(!target || !ishuman(target)) return @@ -82,9 +102,8 @@ origin.monkey_recycle_action.Remove(C) //All of this stuff below could probably be a proc for all advanced cameras, only the action removal needs to be camera specific remote_eye.eye_user = null + C.reset_perspective(null) if(C.client) - C.client.perspective = MOB_PERSPECTIVE - C.client.eye = src C.client.images -= remote_eye.user_image for(var/datum/camerachunk/chunk in remote_eye.visibleCameraChunks) C.client.images -= chunk.obscured @@ -109,6 +128,8 @@ S.forceMove(remote_eye.loc) S.visible_message("[S] warps in!") X.stored_slimes -= S + else + to_chat(owner, "Target is not near a camera. Cannot proceed.") /datum/action/innate/slime_pick_up name = "Pick up Slime" @@ -132,7 +153,8 @@ S.visible_message("[S] vanishes in a flash of light!") S.forceMove(X) X.stored_slimes += S - + else + to_chat(owner, "Target is not near a camera. Cannot proceed.") /datum/action/innate/feed_slime name = "Feed Slimes" @@ -151,7 +173,8 @@ food.LAssailant = C X.monkeys -- to_chat(owner, "[X] now has [X.monkeys] monkeys left.") - + else + to_chat(owner, "Target is not near a camera. Cannot proceed.") /datum/action/innate/monkey_recycle name = "Recycle Monkeys" @@ -168,5 +191,7 @@ for(var/mob/living/carbon/human/M in remote_eye.loc) if(issmall(M) && M.stat) M.visible_message("[M] vanishes as they are reclaimed for recycling!") - X.monkeys += 0.2 + X.monkeys = round(X.monkeys + 0.2,0.1) qdel(M) + else + to_chat(owner, "Target is not near a camera. Cannot proceed.") \ No newline at end of file diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index 8944cf84131..5e57fb4eff9 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -295,7 +295,7 @@ return var/obj/item/weapon/paper/reqform = new /obj/item/weapon/paper(_loc) - playsound(_loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1) + playsound(_loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1) reqform.name = "Requisition Form - [crates] '[object.name]' for [orderedby]" reqform.info += "

    [station_name] Supply Requisition Form


    " reqform.info += "INDEX: #[shuttle_master.ordernum]
    " @@ -446,7 +446,7 @@ var/packs_list[0] for(var/set_name in shuttle_master.supply_packs) var/datum/supply_packs/pack = shuttle_master.supply_packs[set_name] - if(!pack.contraband && !pack.hidden && pack.group == cat) + if(!pack.contraband && !pack.hidden && !pack.special && pack.group == cat) // 0/1 after the pack name (set_name) is a boolean for ordering multiple crates packs_list.Add(list(list("name" = pack.name, "amount" = pack.amount, "cost" = pack.cost, "command1" = list("doorder" = "[set_name]0"), "command2" = list("doorder" = "[set_name]1"), "command3" = list("contents" = set_name)))) @@ -595,7 +595,7 @@ var/packs_list[0] for(var/set_name in shuttle_master.supply_packs) var/datum/supply_packs/pack = shuttle_master.supply_packs[set_name] - if((pack.hidden && src.hacked) || (pack.contraband && src.can_order_contraband) || (!pack.contraband && !pack.hidden)) + if((pack.hidden && hacked) || (pack.contraband && can_order_contraband) || (pack.special && pack.special_enabled) || (!pack.contraband && !pack.hidden && !pack.special)) if(pack.group == cat) // 0/1 after the pack name (set_name) is a boolean for ordering multiple crates packs_list.Add(list(list("name" = pack.name, "amount" = pack.amount, "cost" = pack.cost, "command1" = list("doorder" = "[set_name]0"), "command2" = list("doorder" = "[set_name]1"), "command3" = list("contents" = set_name)))) diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm index 1c03c3f7039..12bf7ff8750 100644 --- a/code/modules/shuttle/syndicate.dm +++ b/code/modules/shuttle/syndicate.dm @@ -8,6 +8,7 @@ shuttleId = "syndicate" possible_destinations = "syndicate_away;syndicate_z5;syndicate_z3;syndicate_ne;syndicate_nw;syndicate_n;syndicate_se;syndicate_sw;syndicate_s" var/challenge = FALSE + var/moved = FALSE /obj/machinery/computer/shuttle/syndicate/recall name = "syndicate shuttle recall terminal" @@ -18,6 +19,7 @@ if(challenge && world.time < SYNDICATE_CHALLENGE_TIMER) to_chat(usr, "You've issued a combat challenge to the station! You've got to give them at least [round(((SYNDICATE_CHALLENGE_TIMER - world.time) / 10) / 60)] more minutes to allow them to prepare.") return 0 + moved = TRUE ..() /obj/machinery/computer/shuttle/syndicate/drop_pod diff --git a/code/modules/spacepods/equipment.dm b/code/modules/spacepods/equipment.dm index 427a6db798a..752c90f5db4 100644 --- a/code/modules/spacepods/equipment.dm +++ b/code/modules/spacepods/equipment.dm @@ -91,7 +91,7 @@ icon_state = "weapon_taser" projectile_type = "/obj/item/projectile/beam/disabler" shot_cost = 400 - fire_sound = "sound/weapons/Taser.ogg" + fire_sound = 'sound/weapons/Taser.ogg' /obj/item/device/spacepod_equipment/weaponry/burst_taser name = "burst taser system" @@ -100,7 +100,7 @@ projectile_type = "/obj/item/projectile/beam/disabler" shot_cost = 1200 shots_per = 3 - fire_sound = "sound/weapons/Taser.ogg" + fire_sound = 'sound/weapons/Taser.ogg' fire_delay = 30 /obj/item/device/spacepod_equipment/weaponry/laser diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm new file mode 100644 index 00000000000..89a58d7cc9e --- /dev/null +++ b/code/modules/station_goals/bsa.dm @@ -0,0 +1,408 @@ +// Crew has to build a bluespace cannon +// Cargo orders part for high price +// Requires high amount of power +// Requires high level stock parts +/datum/station_goal/bluespace_cannon + name = "Bluespace Artillery" + +/datum/station_goal/bluespace_cannon/get_report() + return {"Bluespace Artillery position construction
    + Our military presence is inadequate in your sector. We need you to construct BSA-[rand(1,99)] Artillery position aboard your station. +

    + Its base parts should be available for shipping by your cargo shuttle. +
    + -Nanotrasen Naval Command"} + +/datum/station_goal/bluespace_cannon/on_report() + //Unlock BSA parts + var/datum/supply_packs/misc/bsa/P = shuttle_master.supply_packs["[/datum/supply_packs/misc/bsa]"] + P.special_enabled = TRUE + +/datum/station_goal/bluespace_cannon/check_completion() + if(..()) + return TRUE + for(var/obj/machinery/bsa/full/B) + if(B && !B.stat && is_station_contact(B.z)) + return TRUE + return FALSE + +/obj/machinery/bsa + icon = 'icons/obj/machines/particle_accelerator3.dmi' + density = 1 + anchored = 1 + +/obj/machinery/bsa/back + name = "Bluespace Artillery Generator" + desc = "Generates cannon pulse. Needs to be linked with a fusor. " + icon_state = "power_box" + +/obj/machinery/bsa/back/attackby(obj/item/weapon/W, mob/user, params) + if(istype(W, /obj/item/device/multitool)) + var/obj/item/device/multitool/M = W + M.buffer = src + to_chat(user, "You store linkage information in [W]'s buffer.") + else if(istype(W, /obj/item/weapon/wrench)) + default_unfasten_wrench(user, W, 10) + return TRUE + else + return ..() + +/obj/machinery/bsa/front + name = "Bluespace Artillery Bore" + desc = "Do not stand in front of cannon during operation. Needs to be linked with a fusor." + icon_state = "emitter_center" + +/obj/machinery/bsa/front/attackby(obj/item/weapon/W, mob/user, params) + if(istype(W, /obj/item/device/multitool)) + var/obj/item/device/multitool/M = W + M.buffer = src + to_chat(user, "You store linkage information in [W]'s buffer.") + else if(istype(W, /obj/item/weapon/wrench)) + default_unfasten_wrench(user, W, 10) + return TRUE + else + return ..() + +/obj/machinery/bsa/middle + name = "Bluespace Artillery Fusor" + desc = "Contents classifed by Nanotrasen Naval Command. Needs to be linked with the other BSA parts using multitool." + icon_state = "fuel_chamber" + var/obj/machinery/bsa/back/back + var/obj/machinery/bsa/front/front + +/obj/machinery/bsa/middle/attackby(obj/item/weapon/W, mob/user, params) + if(istype(W, /obj/item/device/multitool)) + var/obj/item/device/multitool/M = W + if(M.buffer) + if(istype(M.buffer,/obj/machinery/bsa/back)) + back = M.buffer + M.buffer = null + to_chat(user, "You link [src] with [back].") + else if(istype(M.buffer,/obj/machinery/bsa/front)) + front = M.buffer + M.buffer = null + to_chat(user, "You link [src] with [front].") + else if(istype(W, /obj/item/weapon/wrench)) + default_unfasten_wrench(user, W, 10) + return TRUE + else + return ..() + +/obj/machinery/bsa/middle/proc/check_completion() + if(!front || !back) + return "No linked parts detected!" + if(!front.anchored || !back.anchored || !anchored) + return "Linked parts unwrenched!" + if(front.y != y || back.y != y || !(front.x > x && back.x < x || front.x < x && back.x > x) || front.z != z || back.z != z) + return "Parts misaligned!" + if(!has_space()) + return "Not enough free space!" + +/obj/machinery/bsa/middle/proc/has_space() + var/cannon_dir = get_cannon_direction() + var/x_min + var/x_max + switch(cannon_dir) + if(EAST) + x_min = x - 4 //replace with defines later + x_max = x + 6 + if(WEST) + x_min = x + 4 + x_max = x - 6 + + for(var/turf/T in block(locate(x_min,y-1,z),locate(x_max,y+1,z))) + if(T.density || isspaceturf(T)) + return FALSE + return TRUE + +/obj/machinery/bsa/middle/proc/get_cannon_direction() + if(front.x > x && back.x < x) + return EAST + else if(front.x < x && back.x > x) + return WEST + +/obj/machinery/bsa/full + name = "Bluespace Artillery" + desc = "Long range bluespace artillery." + icon = 'icons/obj/lavaland/cannon.dmi' + icon_state = "cannon_west" + + var/obj/machinery/computer/bsa_control/controller + var/cannon_direction = WEST + var/static/image/top_layer = null + var/ex_power = 3 + var/power_used_per_shot = 2000000 //enough to kil standard apc - todo : make this use wires instead and scale explosion power with it + var/last_fire_time = 0 // The time at which the gun was last fired + var/reload_cooldown = 600 // The gun's cooldown + + pixel_y = -32 + pixel_x = -192 + bound_width = 352 + bound_x = -192 + +/obj/machinery/bsa/full/Destroy() + if(controller && controller.cannon == src) + controller.cannon = null + controller = null + return ..() + +/obj/machinery/bsa/full/east + icon_state = "cannon_east" + cannon_direction = EAST + +/obj/machinery/bsa/full/admin + power_used_per_shot = 0 + reload_cooldown = 100 + +/obj/machinery/bsa/full/admin/east + icon_state = "cannon_east" + cannon_direction = EAST + +/obj/machinery/bsa/full/proc/get_front_turf() + switch(dir) + if(WEST) + return locate(x - 6,y,z) + if(EAST) + return locate(x + 4,y,z) + return get_turf(src) + +/obj/machinery/bsa/full/proc/get_back_turf() + switch(dir) + if(WEST) + return locate(x + 4,y,z) + if(EAST) + return locate(x - 6,y,z) + return get_turf(src) + +/obj/machinery/bsa/full/proc/get_target_turf() + switch(dir) + if(WEST) + return locate(1,y,z) + if(EAST) + return locate(world.maxx,y,z) + return get_turf(src) + +/obj/machinery/bsa/full/New(loc, direction) + ..() + + if(direction) + cannon_direction = direction + + switch(cannon_direction) + if(WEST) + dir = WEST + pixel_x = -192 + top_layer = image("icons/obj/lavaland/orbital_cannon.dmi", "top_west") + top_layer.layer = 4.1 + icon_state = "cannon_west" + if(EAST) + dir = EAST + top_layer = image("icons/obj/lavaland/orbital_cannon.dmi", "top_east") + top_layer.layer = 4.1 + icon_state = "cannon_east" + overlays += top_layer + reload() + +/obj/machinery/bsa/full/proc/fire(mob/user, turf/bullseye) + var/turf/point = get_front_turf() + for(var/turf/T in getline(get_step(point,dir),get_target_turf())) + T.ex_act(1) + for(var/atom/A in T) + A.ex_act(1) + + point.Beam(get_target_turf(), icon_state = "bsa_beam", time = 50, maxdistance = world.maxx, beam_type = /obj/effect/ebeam/deadly) //ZZZAP + playsound(src, 'sound/machines/bsa_fire.ogg', 100, 1) + + message_admins("[key_name_admin(user)] has launched an artillery strike.") + explosion(bullseye,ex_power,ex_power*2,ex_power*4) + + reload() + +/obj/machinery/bsa/full/proc/reload() + use_power(power_used_per_shot) + last_fire_time = world.time / 10 + +/obj/item/weapon/circuitboard/machine/bsa/back + name = "Bluespace Artillery Generator (Machine Board)" + build_path = /obj/machinery/bsa/back + origin_tech = "engineering=2;combat=2;bluespace=2" //No freebies! + req_components = list( + /obj/item/weapon/stock_parts/capacitor/quadratic = 5, + /obj/item/stack/cable_coil = 2) + +/obj/item/weapon/circuitboard/machine/bsa/middle + name = "Bluespace Artillery Fusor (Machine Board)" + build_path = /obj/machinery/bsa/middle + origin_tech = "engineering=2;combat=2;bluespace=2" + req_components = list( + /obj/item/weapon/ore/bluespace_crystal = 20, + /obj/item/stack/cable_coil = 2) + +/obj/item/weapon/circuitboard/machine/bsa/front + name = "Bluespace Artillery Bore (Machine Board)" + build_path = /obj/machinery/bsa/front + origin_tech = "engineering=2;combat=2;bluespace=2" + req_components = list( + /obj/item/weapon/stock_parts/manipulator/femto = 5, + /obj/item/stack/cable_coil = 2) + +/obj/item/weapon/circuitboard/computer/bsa_control + name = "Bluespace Artillery Controls (Computer Board)" + build_path = /obj/machinery/computer/bsa_control + origin_tech = "engineering=2;combat=2;bluespace=2" + +/obj/machinery/computer/bsa_control + name = "Bluespace Artillery Control" + var/obj/machinery/bsa/full/cannon + var/notice + var/target + use_power = 0 + circuit = /obj/item/weapon/circuitboard/computer/bsa_control + icon = 'icons/obj/machines/particle_accelerator3.dmi' + icon_state = "control_boxp" + var/icon_state_broken = "control_box" + var/icon_state_nopower = "control_boxw" + var/icon_state_reloading = "control_boxp1" + var/icon_state_active = "control_boxp0" + layer = 3.1 // Just above the cannon sprite + + var/area_aim = FALSE //should also show areas for targeting + var/target_all_areas = FALSE //allows all areas (including admin areas) to be targeted + +/obj/machinery/computer/bsa_control/admin + area_aim = TRUE + target_all_areas = TRUE + +/obj/machinery/computer/bsa_control/admin/initialize() + ..() + if(!cannon) + cannon = deploy() + +/obj/machinery/computer/bsa_control/Destroy() + if(cannon && cannon.controller == src) + cannon.controller = null + cannon = null + return ..() + +/obj/machinery/computer/bsa_control/process() + ..() + update_icon() + +/obj/machinery/computer/bsa_control/update_icon() + if(stat & BROKEN) + icon_state = icon_state_broken + else if(stat & NOPOWER) + icon_state = icon_state_nopower + else if(cannon && (cannon.last_fire_time + cannon.reload_cooldown) > (world.time / 10)) + icon_state = icon_state_reloading + else if(cannon) + icon_state = icon_state_active + else + icon_state = initial(icon_state) + +/obj/machinery/computer/bsa_control/attack_hand(mob/user) + if(..()) + return 1 + ui_interact(user) + +/obj/machinery/computer/bsa_control/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "bsa.tmpl", name, 400, 305) + ui.open() + ui.set_auto_update(1) + +/obj/machinery/computer/bsa_control/ui_data(mob/user, ui_key = "main", datum/topic_state/state = physical_state) + var/list/data = list() + data["connected"] = cannon + data["notice"] = notice + if(target) + data["target"] = get_target_name() + + if(cannon) + var/reload_cooldown = cannon.reload_cooldown + var/last_fire_time = cannon.last_fire_time + var/time_to_wait = max(0, round(reload_cooldown - ((world.time / 10) - last_fire_time))) + var/minutes = max(0, round(time_to_wait / 60)) + var/seconds = max(0, time_to_wait - (60 * minutes)) + + data["reloadtime_mins"] = minutes + data["reloadtime_secs"] = (seconds < 10) ? "0[seconds]" : seconds + data["ready"] = minutes == 0 && seconds == 0 + else + data["ready"] = FALSE + + return data + +/obj/machinery/computer/bsa_control/Topic(href, href_list) + if(..()) + return 1 + + if(href_list["build"]) + cannon = deploy() + . = TRUE + else if(href_list["fire"]) + fire(usr) + . = TRUE + else if(href_list["recalibrate"]) + calibrate(usr) + . = TRUE + update_icon() + +/obj/machinery/computer/bsa_control/proc/calibrate(mob/user) + var/list/gps_locators = list() + for(var/obj/item/device/gps/G in GPS_list) //nulls on the list somehow + gps_locators[G.gpstag] = G + + var/list/options = gps_locators + if(area_aim) + options += target_all_areas ? ghostteleportlocs : teleportlocs + var/V = input(user,"Select target", "Select target",null) in options|null + target = options[V] + +/obj/machinery/computer/bsa_control/proc/get_target_name() + if(istype(target,/area)) + var/area/A = target + return A.name + else if(istype(target,/obj/item/device/gps)) + var/obj/item/device/gps/G = target + return G.gpstag + +/obj/machinery/computer/bsa_control/proc/get_impact_turf() + if(istype(target,/area)) + return pick(get_area_turfs(target)) + else if(istype(target,/obj/item/device/gps)) + return get_turf(target) + +/obj/machinery/computer/bsa_control/proc/fire(mob/user) + if(!cannon || !target) + return + if(cannon.stat) + notice = "Cannon unpowered!" + return + notice = null + cannon.fire(user, get_impact_turf()) + +/obj/machinery/computer/bsa_control/proc/deploy() + var/obj/machinery/bsa/full/prebuilt = locate() in range(7, src) //In case of adminspawn + if(prebuilt) + prebuilt.controller = src + return prebuilt + + var/obj/machinery/bsa/middle/centerpiece = locate() in range(7, src) + if(!centerpiece) + notice = "No BSA parts detected nearby." + return null + notice = centerpiece.check_completion() + if(notice) + return null + //Totally nanite construction system not an immersion breaking spawning + var/datum/effect/system/harmless_smoke_spread/s = new /datum/effect/system/harmless_smoke_spread() + s.set_up(4, 0, get_turf(centerpiece)) + s.start() + var/obj/machinery/bsa/full/cannon = new(get_turf(centerpiece),centerpiece.get_cannon_direction()) + cannon.controller = src + qdel(centerpiece.front) + qdel(centerpiece.back) + qdel(centerpiece) + return cannon diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm new file mode 100644 index 00000000000..26d00e6360d --- /dev/null +++ b/code/modules/station_goals/dna_vault.dm @@ -0,0 +1,301 @@ +//Crew has to create dna vault +// Cargo can order DNA samplers + DNA vault boards +// DNA vault requires x animals ,y plants, z human dna +// DNA vaults require high tier stock parts and cold +// After completion each crewmember can receive single upgrade chosen out of 2 for the mob. +#define VAULT_SPACEIMMUNE "Space Immunity" +#define VAULT_XRAY "X-Ray Vision" +#define VAULT_TELEKINESIS "Telekinesis" +#define VAULT_PSYCHIC "Psychic Powers" +#define VAULT_SPEED "Speediness" + +/datum/station_goal/dna_vault + name = "DNA Vault" + var/animal_count + var/human_count + var/plant_count + +/datum/station_goal/dna_vault/New() + ..() + animal_count = rand(15,20) //might be too few given ~15 roundstart stationside ones + human_count = rand(round(0.75 * ticker.mode.num_players_started()), ticker.mode.num_players_started()) // 75%+ roundstart population. + var/non_standard_plants = non_standard_plants_count() + plant_count = rand(round(0.5 * non_standard_plants),round(0.7 * non_standard_plants)) + +/datum/station_goal/dna_vault/proc/non_standard_plants_count() + . = 0 + for(var/T in subtypesof(/obj/item/seeds)) //put a cache if it's used anywhere else + var/obj/item/seeds/S = T + if(initial(S.rarity) > 0) + .++ + +/datum/station_goal/dna_vault/get_report() + return {"DNA Vault construction
    + Our long term prediction systems say there's 99% chance of system-wide cataclysm in near future. As such, we need you to construct a DNA Vault aboard your station. +

    + The DNA Vault needs to contain samples of: +
      +
    • [animal_count] unique animal data.
    • +
    • [plant_count] unique non-standard plant data.
    • +
    • [human_count] unique sapient humanoid DNA data.
    • +
    + The base vault parts should be available for shipping by your cargo shuttle."} + +/datum/station_goal/dna_vault/on_report() + var/datum/supply_packs/P = shuttle_master.supply_packs["[/datum/supply_packs/misc/dna_vault]"] + P.special_enabled = TRUE + + P = shuttle_master.supply_packs["[/datum/supply_packs/misc/dna_probes]"] + P.special_enabled = TRUE + +/datum/station_goal/dna_vault/check_completion() + if(..()) + return TRUE + for(var/obj/machinery/dna_vault/V in machines) + if(V.animals.len >= animal_count && V.plants.len >= plant_count && V.dna.len >= human_count && is_station_contact(V.z)) + return TRUE + return FALSE + +/obj/item/device/dna_probe + name = "DNA Sampler" + desc = "Can be used to take chemical and genetic samples of pretty much anything." + icon = 'icons/obj/hypo.dmi' + item_state = "hypo" + icon_state = "hypo" + flags = NOBLUDGEON + var/list/animals = list() + var/list/plants = list() + var/list/dna = list() + +/obj/item/device/dna_probe/proc/clear_data() + animals = list() + plants = list() + dna = list() + +var/list/non_simple_animals = typecacheof(list(/mob/living/carbon/human/monkey,/mob/living/carbon/alien)) + +/obj/item/device/dna_probe/afterattack(atom/target, mob/user, proximity) + ..() + if(!proximity || !target) + return + //tray plants + if(istype(target,/obj/machinery/hydroponics)) + var/obj/machinery/hydroponics/H = target + if(!H.myseed) + return + if(!H.harvest)// So it's bit harder. + to_chat(user, "Plants needs to be ready to harvest to perform full data scan.") //Because space dna is actually magic + return + if(plants[H.myseed.type]) + to_chat(user, "Plant data already present in local storage.") + return + plants[H.myseed.type] = 1 + to_chat(user, "Plant data added to local storage.") + + //animals + if(isanimal(target) || is_type_in_typecache(target, non_simple_animals)) + if(isanimal(target)) + var/mob/living/simple_animal/A = target + if(!A.healable)//simple approximation of being animal not a robot or similar + to_chat(user, "No compatible DNA detected") + return + if(animals[target.type]) + to_chat(user, "Animal data already present in local storage.") + return + animals[target.type] = 1 + to_chat(user, "Animal data added to local storage.") + + //humans + if(ishuman(target)) + var/mob/living/carbon/human/H = target + if(dna[H.dna.uni_identity]) + to_chat(user, "Humanoid data already present in local storage.") + return + dna[H.dna.uni_identity] = 1 + to_chat(user, "Humanoid data added to local storage.") + + +/obj/item/weapon/circuitboard/machine/dna_vault + name = "DNA Vault (Machine Board)" + build_path = /obj/machinery/dna_vault + origin_tech = "engineering=2;combat=2;bluespace=2" //No freebies! + req_components = list( + /obj/item/weapon/stock_parts/capacitor/quadratic = 5, + /obj/item/stack/cable_coil = 2) + +/obj/structure/filler + name = "big machinery part" + density = 1 + anchored = 1 + invisibility = 101 + var/obj/machinery/parent + +/obj/structure/filler/ex_act() + return + +/obj/machinery/dna_vault + name = "DNA Vault" + desc = "Break glass in case of apocalypse." + icon = 'icons/obj/machines/dna_vault.dmi' + icon_state = "vault" + density = 1 + anchored = 1 + idle_power_usage = 5000 + pixel_x = -32 + pixel_y = -64 + luminosity = 1 + + //High defaults so it's not completed automatically if there's no station goal + var/animals_max = 100 + var/plants_max = 100 + var/dna_max = 100 + var/list/animals = list() + var/list/plants = list() + var/list/dna = list() + + var/completed = FALSE + var/list/power_lottery = list() + + var/list/obj/structure/fillers = list() + +/obj/machinery/dna_vault/New() + //TODO: Replace this,bsa and gravgen with some big machinery datum + var/list/occupied = list() + for(var/direct in list(EAST,WEST,SOUTHEAST,SOUTHWEST)) + occupied += get_step(src,direct) + occupied += locate(x+1,y-2,z) + occupied += locate(x-1,y-2,z) + + for(var/T in occupied) + var/obj/structure/filler/F = new(T) + F.parent = src + fillers += F + + if(ticker.mode) + for(var/datum/station_goal/dna_vault/G in ticker.mode.station_goals) + animals_max = G.animal_count + plants_max = G.plant_count + dna_max = G.human_count + break + +/obj/machinery/dna_vault/Destroy() + for(var/V in fillers) + var/obj/structure/filler/filler = V + filler.parent = null + qdel(filler) + . = ..() + +/obj/machinery/dna_vault/attack_ghost(mob/user) + if(stat & (BROKEN|MAINT)) + return + return ui_interact(user) + +/obj/machinery/dna_vault/attack_hand(mob/user) + if(..()) + return 1 + ui_interact(user) + +/obj/machinery/dna_vault/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + roll_powers(user) + ui = new(user, src, ui_key, "dna_vault.tmpl", name, 550, 400) + ui.open() + +/obj/machinery/dna_vault/proc/roll_powers(mob/user) + if(user in power_lottery) + return + var/list/L = list() + var/list/possible_powers = list(VAULT_SPACEIMMUNE,VAULT_XRAY,VAULT_TELEKINESIS,VAULT_PSYCHIC,VAULT_SPEED) + L += pick_n_take(possible_powers) + L += pick_n_take(possible_powers) + power_lottery[user] = L + +/obj/machinery/dna_vault/ui_data(mob/user, ui_key = "main", datum/topic_state/state = physical_state) //TODO Make it % bars maybe + var/list/data = list() + data["plants"] = plants.len + data["plants_max"] = plants_max + data["animals"] = animals.len + data["animals_max"] = animals_max + data["dna"] = dna.len + data["dna_max"] = dna_max + data["completed"] = completed + data["used"] = TRUE + data["choiceA"] = "" + data["choiceB"] = "" + if(user && completed) + var/list/L = power_lottery[user] + if(L && L.len) + data["used"] = FALSE + data["choiceA"] = L[1] + data["choiceB"] = L[2] + return data + +/obj/machinery/dna_vault/Topic(href, href_list) + if(..()) + return 1 + + if(href_list["gene"]) + upgrade(usr,href_list["choice"]) + . = TRUE + +/obj/machinery/dna_vault/proc/check_goal() + if(plants.len >= plants_max && animals.len >= animals_max && dna.len >= dna_max) + completed = TRUE + +/obj/machinery/dna_vault/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/device/dna_probe)) + var/obj/item/device/dna_probe/P = I + var/uploaded = 0 + for(var/plant in P.plants) + if(!plants[plant]) + uploaded++ + plants[plant] = 1 + for(var/animal in P.animals) + if(!animals[animal]) + uploaded++ + animals[animal] = 1 + for(var/ui in P.dna) + if(!dna[ui]) + uploaded++ + dna[ui] = 1 + check_goal() + to_chat(user, "[uploaded] new datapoints uploaded.") + else + return ..() + +/obj/machinery/dna_vault/proc/upgrade(mob/living/carbon/human/H, upgrade_type) + if(!(upgrade_type in power_lottery[H])) + return + if(!completed) + return + if(!H.ignore_gene_stability) + to_chat(H, "[src] stabilizes your genes, granting you the ability to have multiple powers.") + H.ignore_gene_stability = 1 + switch(upgrade_type) + if(VAULT_SPACEIMMUNE) + to_chat(H, "You suddenly don't feel the need to breathe anymore. You also don't feel any cold anymore.") + grant_power(H, NOBREATHBLOCK, NO_BREATH) + grant_power(H, FIREBLOCK, RESIST_COLD) + if(VAULT_XRAY) + to_chat(H, "You can suddenly see through walls.") + grant_power(H, XRAYBLOCK, XRAY) + if(VAULT_TELEKINESIS) + to_chat(H, "You gain the ability to control objects from a distance.") + grant_power(H, TELEBLOCK, TK) + if(VAULT_PSYCHIC) + to_chat(H, "Your mind expands, giving you psychic powers.") + grant_power(H, REMOTETALKBLOCK, REMOTE_TALK) + grant_power(H, REMOTEVIEWBLOCK, REMOTE_VIEW) + grant_power(H, EMPATHBLOCK, EMPATH) + grant_power(H, PSYRESISTBLOCK, PSY_RESIST) + if(VAULT_SPEED) + to_chat(H, "You feel very fast and agile.") + grant_power(H, JUMPBLOCK, JUMPY) + grant_power(H, INCREASERUNBLOCK, RUN) + power_lottery[H] = list() + +/obj/machinery/dna_vault/proc/grant_power(mob/living/carbon/human/H, block, power) + H.dna.SetSEState(block, 1, 1) + H.mutations |= power + genemutcheck(H, block, null, MUTCHK_FORCED) \ No newline at end of file diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm new file mode 100644 index 00000000000..2090b34baa5 --- /dev/null +++ b/code/modules/station_goals/shield.dm @@ -0,0 +1,193 @@ +//Station Shield +// A chain of satellites encircles the station +// Satellites be actived to generate a shield that will block unorganic matter from passing it. +/datum/station_goal/station_shield + name = "Station Shield" + var/coverage_goal = 500 + +/datum/station_goal/station_shield/get_report() + return {"Station Shield construction
    + The station is located in a zone full of space debris. We have a prototype shielding system you will deploy to reduce collision related accidents. +

    + You can order the satellites and control systems through cargo shuttle."} + +/datum/station_goal/station_shield/on_report() + //Unlock + var/datum/supply_packs/P = shuttle_master.supply_packs["[/datum/supply_packs/misc/shield_sat]"] + P.special_enabled = TRUE + + P = shuttle_master.supply_packs["[/datum/supply_packs/misc/shield_sat_control]"] + P.special_enabled = TRUE + +/datum/station_goal/station_shield/check_completion() + if(..()) + return TRUE + if(get_coverage() >= coverage_goal) + return TRUE + return FALSE + +/datum/station_goal/proc/get_coverage() + var/list/coverage = list() + for(var/obj/machinery/satellite/meteor_shield/A in machines) + if(!A.active || !is_station_level(A.z)) + continue + coverage |= view(A.kill_range, A) + return coverage.len + +/obj/item/weapon/circuitboard/computer/sat_control + name = "Satellite Network Control (Computer Board)" + build_path = /obj/machinery/computer/sat_control + origin_tech = "engineering=3" + +/obj/machinery/computer/sat_control + name = "Satellite control" + desc = "Used to control the satellite network." + circuit = /obj/item/weapon/circuitboard/computer/sat_control + icon_screen = "accelerator" + icon_keyboard = "accelerator_key" + var/notice + +/obj/machinery/computer/sat_control/attack_hand(mob/user) + if(..()) + return 1 + ui_interact(user) + +/obj/machinery/computer/sat_control/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "sat_control.tmpl", name, 475, 400) + ui.open() + +/obj/machinery/computer/sat_control/Topic(href, href_list) + if(..()) + return 1 + + if(href_list["toggle"]) + toggle(text2num(href_list["id"])) + . = TRUE + +/obj/machinery/computer/sat_control/proc/toggle(id) + for(var/obj/machinery/satellite/S in machines) + if(S.id == id && atoms_share_level(src, S)) + S.toggle() + +/obj/machinery/computer/sat_control/ui_data(mob/user, ui_key = "main", datum/topic_state/state = physical_state) + var/list/data = list() + + data["satellites"] = list() + for(var/obj/machinery/satellite/S in machines) + data["satellites"] += list(list( + "id" = S.id, + "active" = S.active, + "mode" = S.mode + )) + data["notice"] = notice + + var/datum/station_goal/station_shield/G = locate() in ticker.mode.station_goals + if(G) + data["meteor_shield"] = 1 + data["meteor_shield_coverage"] = G.get_coverage() + data["meteor_shield_coverage_max"] = G.coverage_goal + data["meteor_shield_coverage_percentage"] = (G.get_coverage() / G.coverage_goal) * 100 + return data + +/obj/machinery/satellite + name = "Defunct Satellite" + desc = "" + icon = 'icons/obj/machines/satellite.dmi' + icon_state = "sat_inactive" + var/mode = "NTPROBEV0.8" + var/active = FALSE + density = 1 + use_power = FALSE + var/static/gid = 0 + var/id = 0 + +/obj/machinery/satellite/New() + ..() + id = gid++ + +/obj/machinery/satellite/attack_hand(mob/user) + if(..()) + return 1 + interact(user) + +/obj/machinery/satellite/interact(mob/user) + toggle(user) + +/obj/machinery/satellite/proc/toggle(mob/user) + if(!active && !isinspace()) + if(user) + to_chat(user, "You can only active the [src] in space.") + return TRUE + if(user) + to_chat(user, "You [active ? "deactivate": "activate"] the [src]") + active = !active + if(active) + animate(src, pixel_y = 2, time = 10, loop = -1) + anchored = 1 + else + animate(src, pixel_y = 0, time = 10) + anchored = 0 + update_icon() + +/obj/machinery/satellite/update_icon() + icon_state = active ? "sat_active" : "sat_inactive" + +/obj/machinery/satellite/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/device/multitool)) + to_chat(user, "// NTSAT-[id] // Mode : [active ? "PRIMARY" : "STANDBY"] //[emagged ? "DEBUG_MODE //" : ""]") + else + return ..() + +/obj/machinery/satellite/meteor_shield + name = "Meteor Shield Satellite" + desc = "Meteor Point Defense Satellite" + mode = "M-SHIELD" + speed_process = TRUE + var/kill_range = 14 + +/obj/machinery/satellite/meteor_shield/proc/space_los(meteor) + for(var/turf/T in getline(src,meteor)) + if(!isspaceturf(T)) + return FALSE + return TRUE + +/obj/machinery/satellite/meteor_shield/process() + if(!active) + return + for(var/obj/effect/meteor/M in meteor_list) + if(M.z != z) + continue + if(get_dist(M, src) > kill_range) + continue + if(!emagged && space_los(M)) + Beam(get_turf(M), icon_state = "sat_beam", time = 5, maxdistance = kill_range) + qdel(M) + +/obj/machinery/satellite/meteor_shield/toggle(user) + if(..(user)) + return TRUE + if(emagged) + if(active) + change_meteor_chance(2) + else + change_meteor_chance(0.5) + +/obj/machinery/satellite/meteor_shield/proc/change_meteor_chance(mod) + for(var/datum/event_container/container in event_manager.event_containers) + for(var/datum/event_meta/M in container.available_events) + if(M.event_type == /datum/event/meteor_wave) + M.weight *= mod + +/obj/machinery/satellite/meteor_shield/Destroy() + . = ..() + if(active && emagged) + change_meteor_chance(0.5) + +/obj/machinery/satellite/meteor_shield/emag_act(mob/user) + if(!emagged) + to_chat(user, "You override the shield's circuits, causing it to attract meteors instead of destroying them.") + emagged = 1 + if(active) + change_meteor_chance(2) diff --git a/code/modules/station_goals/station_goal.dm b/code/modules/station_goals/station_goal.dm new file mode 100644 index 00000000000..5a97f0ee2f3 --- /dev/null +++ b/code/modules/station_goals/station_goal.dm @@ -0,0 +1,49 @@ +//TODO +// Admin button to override with your own +// Sabotage objective for tators +// Multiple goals with less impact but more department focused + +/datum/station_goal + var/name = "Generic Goal" + var/weight = 1 //In case of multiple goals later. + var/required_crew = 10 + var/list/gamemode_blacklist = list() + var/completed = FALSE + var/report_message = "Complete this goal." + +/datum/station_goal/proc/send_report() + priority_announcement.Announce("Priority Nanotrasen directive received. Project \"[name]\" details inbound.", "Incoming Priority Message", 'sound/AI/commandreport.ogg') + print_command_report(get_report(), "Nanotrasen Directive [pick(phonetic_alphabet)] \Roman[rand(1,50)]") + on_report() + +/datum/station_goal/proc/on_report() + //Additional unlocks/changes go here + return + +/datum/station_goal/proc/get_report() + return report_message + +/datum/station_goal/proc/check_completion() + return completed + +/datum/station_goal/proc/print_result() + if(check_completion()) + to_chat(world, "Station Goal : [name] : Completed!") + else + to_chat(world, "Station Goal : [name] : Failed!") + +/datum/station_goal/Destroy() + ticker.mode.station_goals -= src + . = ..() + +/datum/station_goal/Topic(href, href_list) + ..() + + if(!check_rights(R_EVENT)) + return + + if(href_list["announce"]) + on_report() + send_report() + else if(href_list["remove"]) + qdel(src) \ 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 ce4b55efb11..110584d5d2a 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -18,6 +18,9 @@ var/model var/force_icon + var/icobase = 'icons/mob/human_races/r_human.dmi' // Normal icon set. + var/deform = 'icons/mob/human_races/r_def_human.dmi' // Mutated icon set. + var/damage_state = "00" var/brute_dam = 0 var/burn_dam = 0 @@ -127,9 +130,12 @@ /obj/item/organ/external/New(var/mob/living/carbon/holder) ..() - if(istype(holder, /mob/living/carbon/human)) - replaced(holder) - sync_colour_to_human(holder) + var/mob/living/carbon/human/H = holder + icobase = species.icobase + deform = species.deform + if(istype(H)) + replaced(H) + sync_colour_to_human(H) spawn(1) get_icon() diff --git a/code/modules/surgery/organs/organ_icon.dm b/code/modules/surgery/organs/organ_icon.dm index 03690ef3279..e174ed55a3f 100644 --- a/code/modules/surgery/organs/organ_icon.dm +++ b/code/modules/surgery/organs/organ_icon.dm @@ -14,6 +14,16 @@ var/global/list/limb_icon_cache = list() overlays += organ.mob_icon child_icons += organ.mob_icon +/obj/item/organ/external/proc/change_organ_icobase(var/new_icobase, var/new_deform, var/owner_sensitive) //Change the icobase/deform of this organ. If owner_sensitive is set, that means the proc won't mess with frankenstein limbs. + if(owner_sensitive) //This and the below statements mean that the icobase/deform will only get updated if the limb is the same species as and is owned by the mob it's attached to. + if(species && owner.species && species.name != owner.species.name) + return + if(dna.unique_enzymes != owner.dna.unique_enzymes) // This isn't MY arm + return + + icobase = new_icobase ? new_icobase : icobase + deform = new_deform ? new_deform : deform + /obj/item/organ/external/proc/sync_colour_to_human(var/mob/living/carbon/human/H) if(status & ORGAN_ROBOT && !(species && species.name == "Machine")) //machine people get skin color return @@ -29,6 +39,9 @@ var/global/list/limb_icon_cache = list() if(H.species.bodyflags & HAS_SKIN_COLOR) s_tone = null s_col = list(H.r_skin, H.g_skin, H.b_skin) + if(H.species.bodyflags & HAS_ICON_SKIN_TONE) + var/obj/item/organ/external/chest/C = H.get_organ("chest") + change_organ_icobase(C.icobase, C.deform) /obj/item/organ/external/proc/sync_colour_to_dna() if(status & ORGAN_ROBOT) @@ -171,10 +184,10 @@ var/global/list/limb_icon_cache = list() icon_file = 'icons/mob/human_races/robotic.dmi' else if(status & ORGAN_MUTATED) - icon_file = species.deform + icon_file = deform else // Congratulations, you are normal - icon_file = species.icobase + icon_file = icobase return list(icon_file, new_icon_state) /obj/item/organ/external/chest/get_icon_state(skeletal) diff --git a/code/modules/surgery/organs/parasites.dm b/code/modules/surgery/organs/parasites.dm index 61e72743464..3d1917fe258 100644 --- a/code/modules/surgery/organs/parasites.dm +++ b/code/modules/surgery/organs/parasites.dm @@ -1,3 +1,6 @@ + +// Traitor-only space spider eggs + /obj/item/organ/internal/body_egg/spider_eggs name = "spider eggs" icon = 'icons/effects/effects.dmi' @@ -34,3 +37,82 @@ M.reagents.del_reagent("spidereggs") //purge all remaining spider eggs reagent if caught, in time. qdel(src) //We don't want people re-implanting these for near instant gibbings. return null + + + +// Terror Spiders - white spider infection + +/obj/item/organ/internal/body_egg/terror_eggs + name = "terror eggs" + icon = 'icons/effects/effects.dmi' + icon_state = "eggs" + var/current_cycle = 0 + var/awaymission_infection = 0 + var/alternate_ending = 0 + +/obj/item/organ/internal/body_egg/terror_eggs/on_life() + current_cycle += 1 + if(owner.health < -25) + to_chat(owner,"You feel a strange, blissful senstation.") + owner.adjustBruteLoss(-5) + owner.adjustFireLoss(-5) + owner.adjustToxLoss(-5) + // the spider eggs secrete stimulants to keep their host alive until they hatch + switch(current_cycle) + if(1) // immediately + to_chat(owner,"Your spider bite wound hurts horribly! ") + if(istype(get_area(owner), /area/awaycontent) || istype(get_area(owner), /area/awaymission)) + awaymission_infection = 1 + if(15) // 30 seconds... enough time for the nerve agent to kick in, the pain to be blocked, and healing to begin + to_chat(owner,"The pain has faded, and stopped bleeding, though the skin around it has turned black.") + owner.adjustBruteLoss(-10) + if(60) // 2 minutes... the point where the venom uses and accellerates the healing process, to feed the eggs + to_chat(owner,"Your bite wound has completely sealed up, though the skin is still black. You feel significantly better.") + owner.adjustBruteLoss(-20) + if(120) // 4 minutes... where the eggs are developing, and the wound is turning into a hatching site, but invisibly + to_chat(owner,"The black flesh around your old spider bite wound has started to peel off.") + if(150) // 5 minutes... where the victim realizes something is wrong - this is not a normal wound + to_chat(owner,"The black flesh around your spider bite wound has cracked, and started to split open!") + if(165) // 5m 30s + to_chat(owner,"The black flesh splits open completely, revealing a cluster of small black oval shapes inside you, shapes that seem to be moving!") + if(180) // 6m + if(awaymission_infection && is_away_level(owner.z)) + // we started in the awaymission, we ended on the station. + // To prevent someone bringing an infection back, we're going to trigger an alternate, equally-bad result here. + // Actually, let's make it slightly worse... just to discourage people from bringing back infections. + alternate_ending = 1 + to_chat(owner,"The shapes extend tendrils out of your wound... no... those are legs! SPIDER LEGS! You have spiderlings growing inside you! You scratch at the wound, but it just aggrivates them - they swarm out of the wound, biting you all over!") + owner.visible_message("[owner] flails around on the floor as spiderlings erupt from their skin and swarm all over them! ") + owner.Stun(20) + owner.Weaken(20) + // yes, this is a long stun - that's intentional. Gotta give the spiderlings time to escape. + var/obj/effect/spider/spiderling/terror_spiderling/S1 = new(get_turf(owner)) + S1.grow_as = /mob/living/simple_animal/hostile/poison/terror_spider/red + S1.name = "red spiderling" + if(prob(50)) + S1.stillborn = 1 + var/obj/effect/spider/spiderling/terror_spiderling/S2 = new(get_turf(owner)) + S2.grow_as = /mob/living/simple_animal/hostile/poison/terror_spider/gray + S2.name = "gray spiderling" + if(prob(50)) + S2.stillborn = 1 + var/obj/effect/spider/spiderling/terror_spiderling/S3 = new(get_turf(owner)) + S3.grow_as = /mob/living/simple_animal/hostile/poison/terror_spider/green + S3.name = "green spiderling" + if(prob(50)) + S3.stillborn = 1 + if(alternate_ending) + S1.stillborn = 1 + S2.stillborn = 1 + S3.stillborn = 1 + owner.gib() + else + owner.adjustToxLoss(rand(100,180)) // normal case, range: 100-180, average 140, almost crit (150). + if(190) // 6m 30s + to_chat(owner,"The spiderlings are gone. Your wound, though, looks worse than ever. Remnants of tiny spider eggs, and dead spiders, inside your flesh. Disgusting.") + qdel(src) + +/obj/item/organ/internal/body_egg/terror_eggs/remove(var/mob/living/carbon/M, var/special = 0) + ..() + qdel(src) // prevent people re-implanting them into others + return null diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 63fe8fc81bc..05486c9046d 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -433,7 +433,7 @@ var/static/regex/multispin_words = regex("like a record baby") //HONK else if((findtext(message, honk_words))) spawn(25) - playsound(get_turf(owner), "sound/items/bikehorn.ogg", 300, 1) + playsound(get_turf(owner), 'sound/items/bikehorn.ogg', 300, 1) if(owner.mind && owner.mind.assigned_role == "Clown") for(var/mob/living/carbon/C in listeners) C.slip(0,7 * power_multiplier) diff --git a/goon/browserassets/css/browserOutput.css b/goon/browserassets/css/browserOutput.css index 970e94bb3b4..77984467afb 100644 --- a/goon/browserassets/css/browserOutput.css +++ b/goon/browserassets/css/browserOutput.css @@ -258,7 +258,7 @@ em {font-style: normal; font-weight: bold;} .srvradio {color: #6eaa2c;} .admin_channel {color: #9A04D1; font-weight: bold;} .mentor_channel {color: #775BFF; font-weight: bold;} -.mentor_channel_admin {color: #9A04D1; font-weight: bold;} +.mentor_channel_admin {color: #A35CFF; font-weight: bold;} .djradio {color: #663300;} .binaryradio {color: #0B0050; font-family: 'Courier New', Courier, monospace;} .mommiradio {color: navy;} @@ -300,6 +300,7 @@ h1.alert, h2.alert {color: #000000;} .confirm {color: #00af3b;} .rose {color: #ff5050;} .sans {font-family: 'Comic Sans MS', cursive, sans-serif;} +.wingdings {font-family: Wingdings, Webdings;} .ancient {color: #008B8B; font-stye: italic;} .newscaster {color: #800000;} .mod {color: #735638; font-weight: bold;} @@ -376,4 +377,4 @@ h1.alert, h2.alert {color: #000000;} .hierophant_warning {color: #660099; font-weight: bold; font-style: italic;} /* EMOJI STUFF */ -.emoji {max-height: 16px; max-width: 16px} \ No newline at end of file +.emoji {max-height: 16px; max-width: 16px} diff --git a/goon/browserassets/html/adminOutput.html b/goon/browserassets/html/adminOutput.html new file mode 100644 index 00000000000..baf8bc00b3b --- /dev/null +++ b/goon/browserassets/html/adminOutput.html @@ -0,0 +1,104 @@ + \ No newline at end of file diff --git a/goon/browserassets/js/browserOutput.js b/goon/browserassets/js/browserOutput.js index 538452dc472..88b9a5425af 100644 --- a/goon/browserassets/js/browserOutput.js +++ b/goon/browserassets/js/browserOutput.js @@ -396,7 +396,7 @@ function ehjaxCallback(data) { dataJ = $.parseJSON(data); } catch (e) { //But...incorrect :sadtrombone: - window.onerror('JSON: '+e+'. '+data, 'browserOutput.html', 327); + window.onerror('JSON: '+e+'. '+data+'; data.length = '+data.length, 'browserOutput.html', 327); return; } data = dataJ; diff --git a/goon/code/datums/browserOutput.dm b/goon/code/datums/browserOutput.dm index aefb719afa4..27307cbccdb 100644 --- a/goon/code/datums/browserOutput.dm +++ b/goon/code/datums/browserOutput.dm @@ -99,6 +99,8 @@ var/list/chatResources = list( loaded = TRUE winset(owner, "browseroutput", "is-disabled=false") + if(owner.holder) + loadAdmin() for(var/message in messageQueue) to_chat(owner, message) @@ -119,6 +121,9 @@ var/list/chatResources = list( data = json_encode(data) C << output("[data]", "[window]:ehjaxCallback") +/datum/chatOutput/proc/loadAdmin() + var/data = json_encode(list("loadAdminCode" = replacetext(replacetext(file2text("goon/browserassets/html/adminOutput.html"), "\n", ""), "\t", ""))) + ehjax_send(data = url_encode(data)) /datum/chatOutput/proc/sendClientData() var/list/deets = list("clientData" = list()) diff --git a/html/changelog.html b/html/changelog.html index 93108539e6c..12830048819 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,175 @@ -->
    +

    18 February 2017

    +

    Alffd updated:

    +
      +
    • Fixes missing entries in species/station for Vox cough and sneeze.
    • +
    +

    Crazylemon64 updated:

    +
      +
    • Centcomm has begun enforcing stricter security protocols after a recent influx of fax responses from Clown impersonators
    • +
    • Mind transfer abilities work again
    • +
    • Centcomm is no longer obnoxiously pedantic, regarding BSA deployment
    • +
    + +

    17 February 2017

    +

    Crazylemon64 updated:

    +
      +
    • Space vines now have a mutation that lets them grow in a more intelligent manner
    • +
    +

    Ported by Markolie, developed by AnturK updated:

    +
      +
    • Station Goals have been ported from /tg/. These optional goals are big projects given to the station by Central Command, requiring interdepartmental cooperation and a huge number of resources to complete.
    • +
    • Three station goals have been added: bluespace artillery construction, meteor shield satellite network and DNA vault.
    • +
    • Fixes the "Messages" tab of the communications computer.
    • +
    + +

    16 February 2017

    +

    Crazylemon64 updated:

    +
      +
    • Slime people and Dionae now make sounds when coughing
    • +
    +

    KasparoVy updated:

    +
      +
    • Welding goggles and welding gas masks now properly affect your vision.
    • +
    +

    davipatury updated:

    +
      +
    • changed urnaium to uranium in wt-550 auto gun uranium magazine design
    • +
    +

    uraniummeltdown updated:

    +
      +
    • The wizard has a new spell, Rod Form, which allows him to transform into an immovable rod.
    • +
    • Ethereal beings no longer cause bananium floor tiles to squeak.
    • +
    + +

    15 February 2017

    +

    Alexshreds updated:

    +
      +
    • Coughing and sneezing now plays sounds.
    • +
    +

    Ausops updated:

    +
      +
    • Internals and plasma tanks have been resprited.
    • +
    +

    Crazylemon64 updated:

    +
      +
    • Phlogiston now ignites consistently upon application
    • +
    +

    FlimFlamm updated:

    +
      +
    • New decals for boxes. Just apply a pen to change them (while they're open)!
    • +
    +

    KasparoVy updated:

    +
      +
    • You can now choose to speak anonymously in deadchat from round-start game preferences.
    • +
    • Your decision to speak anonymously in deadchat now persists between ghostings.
    • +
    • Vox tails won't change colour when other Vox spawn in anymore.
    • +
    +

    Markolie updated:

    +
      +
    • Mine bots once again only do ten damage in pressurized areas
    • +
    +

    Twinmold93 updated:

    +
      +
    • Blob Conscious Split now properly scales the requirement of blob tiles to win.
    • +
    +

    uraniummeltdown updated:

    +
      +
    • Borers now have action buttons
    • +
    • Borer names are now dependent on generation
    • +
    + +

    14 February 2017

    +

    Developed by Cyberboss, ported by Markolie updated:

    +
      +
    • Progress bars will now stack vertically.
    • +
    • Progress bars will no longer be affected by lighting.
    • +
    +

    DrunkDwarf updated:

    +
      +
    • Adds a section to the Airlock menu of the RCD to allow specifying the name of the new Airlock
    • +
    +

    Fethas updated:

    +
      +
    • You can no longer put anything THAT IS ALREADY A CULTIST IN A SOULSTONE....AT ALL.
    • +
    • Readds missing beserker robe sprite.
    • +
    • Cap growth serum at 1.5
    • +
    +

    Fox McCloud updated:

    +
      +
    • Xenobiology console should be more responsive when using/exiting using it
    • +
    • Xenobiology console can now be loaded with a bag
    • +
    • Using monkey cubes on the Xenobiology console no longer makes you attempt to utilize the console
    • +
    +

    Markolie updated:

    +
      +
    • The kinetic accelerator sprite modkits now apply properly when the kinetic accelerator is empty.
    • +
    • Welding tools now once again have a proper in-hand when turned on.
    • +
    + +

    13 February 2017

    +

    Crazylemon64 updated:

    +
      +
    • Achieving higher growth rates on kudzu will result in a faster-growing vine when planted
    • +
    +

    Fethas updated:

    +
      +
    • Metastation: The escape shuttle doors should no longer be security access only.
    • +
    • Metastation: Hooks up disposals door control.
    • +
    • Cyberiad: Untriggers Neca and makes the floor tiles in the emergecny wing sec area plating.
    • +
    • Cyberiad: Moves the cargo mail room table onto the otherside of the window so you can actually OPEN IT.
    • +
    +

    Fluff12 updated:

    +
      +
    • Greys can now choose to speak in wingdings or not. The Voice option is right below Species in character creation if Grey is selected - make sure you have it set to what you want!
    • +
    +

    Fox McCloud updated:

    +
      +
    • improves the tatortot sprite
    • +
    +

    Kyep updated:

    +
      +
    • Playtime requirements for IAAs have been set at 5 hours (similar to Sec Officer). Playtime requirements for Captains and AI have been increased from 10 hours to 20 hours.
    • +
    • Mech-mounted teleporters are no longer massively overpowered. They now consume a huge amount of energy to use, to the point that crew mechs with them can only use them a few times. They can no longer be spammed. Dark Gygax mechs used by nuclear operatives get a better version of the teleporter, which has around 40 uses, and is more precise.
    • +
    • Fixed several bugs related to Terror Spider webs.
    • +
    • Terror Spiders have been rebalanced. Spiders are no longer spaceproof, princes are now proper minibosses, and more.
    • +
    • Several new classes of Terror Spiders (green, white, purple, queen, mother) have been added - including types which can breed. This creates new strategy around nest defense.
    • +
    +

    Markolie updated:

    +
      +
    • Fixed a number of genetics powers not working.
    • +
    • Posibrains can no longer whisper when silenced.
    • +
    • Syndicate turrets will no longer target the Syndicate pAI found on their outpost.
    • +
    • Fixed the "Swedish" disability occasionally hiding parts of speech.
    • +
    • Mouthless players can no longer eat crayons (such as IPC's).
    • +
    • Instruments can now be interacted with while buckled.
    • +
    • Emagging a single fax machine will no longer give all fax machines access to the Syndicate destination.
    • +
    • Evidence bags will now always show the item inside of them.
    • +
    • Spacepods leaving a trail of humans instead of ion trail effects.
    • +
    +

    uraniummeltdown updated:

    +
      +
    • Nuclear Operatives can customize the Declaration of War.
    • +
    • The RSF has a unique sprite.
    • +
    + +

    12 February 2017

    +

    Fox McCloud updated:

    +
      +
    • Fixes erroneous access on inner morgue door which was granting people with morgue access, access to the entirety of medical bay
    • +
    +

    Kyep updated:

    +
      +
    • added two more mining hardsuits to the mining outpost.
    • +
    +

    uraniummeltdown updated:

    +
      +
    • Whetstones have been resprited
    • +
    • Drying racks have new sprites.
    • +
    +

    11 February 2017

    Markolie updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index b27e7bece5a..2088bedab95 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -3633,3 +3633,134 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscadd: 'Refactors the kinetic accelerator to use modkits instead of subtypes: these unique mods (such as more range or shorter cooldown) can be purchased from the mining vendor or built by R&D or robotics (developed by KorPhaeron).' +2017-02-12: + Fox McCloud: + - bugfix: Fixes erroneous access on inner morgue door which was granting people + with morgue access, access to the entirety of medical bay + Kyep: + - tweak: added two more mining hardsuits to the mining outpost. + uraniummeltdown: + - rscadd: Whetstones have been resprited + - rscadd: Drying racks have new sprites. +2017-02-13: + Crazylemon64: + - bugfix: Achieving higher growth rates on kudzu will result in a faster-growing + vine when planted + Fethas: + - tweak: 'Metastation: The escape shuttle doors should no longer be security access + only.' + - tweak: 'Metastation: Hooks up disposals door control.' + - tweak: 'Cyberiad: Untriggers Neca and makes the floor tiles in the emergecny wing + sec area plating.' + - tweak: 'Cyberiad: Moves the cargo mail room table onto the otherside of the window + so you can actually OPEN IT.' + Fluff12: + - rscadd: Greys can now choose to speak in wingdings or not. The Voice option is + right below Species in character creation if Grey is selected - make sure you + have it set to what you want! + Fox McCloud: + - tweak: improves the tatortot sprite + Kyep: + - tweak: Playtime requirements for IAAs have been set at 5 hours (similar to Sec + Officer). Playtime requirements for Captains and AI have been increased from + 10 hours to 20 hours. + - tweak: Mech-mounted teleporters are no longer massively overpowered. They now + consume a huge amount of energy to use, to the point that crew mechs with them + can only use them a few times. They can no longer be spammed. Dark Gygax mechs + used by nuclear operatives get a better version of the teleporter, which has + around 40 uses, and is more precise. + - bugfix: Fixed several bugs related to Terror Spider webs. + - tweak: Terror Spiders have been rebalanced. Spiders are no longer spaceproof, + princes are now proper minibosses, and more. + - rscadd: Several new classes of Terror Spiders (green, white, purple, queen, mother) + have been added - including types which can breed. This creates new strategy + around nest defense. + Markolie: + - bugfix: Fixed a number of genetics powers not working. + - bugfix: Posibrains can no longer whisper when silenced. + - bugfix: Syndicate turrets will no longer target the Syndicate pAI found on their + outpost. + - bugfix: Fixed the "Swedish" disability occasionally hiding parts of speech. + - bugfix: Mouthless players can no longer eat crayons (such as IPC's). + - bugfix: Instruments can now be interacted with while buckled. + - bugfix: Emagging a single fax machine will no longer give all fax machines access + to the Syndicate destination. + - bugfix: Evidence bags will now always show the item inside of them. + - bugfix: Spacepods leaving a trail of humans instead of ion trail effects. + uraniummeltdown: + - rscadd: Nuclear Operatives can customize the Declaration of War. + - rscadd: The RSF has a unique sprite. +2017-02-14: + Developed by Cyberboss, ported by Markolie: + - tweak: Progress bars will now stack vertically. + - bugfix: Progress bars will no longer be affected by lighting. + DrunkDwarf: + - rscadd: Adds a section to the Airlock menu of the RCD to allow specifying the + name of the new Airlock + Fethas: + - bugfix: You can no longer put anything THAT IS ALREADY A CULTIST IN A SOULSTONE....AT + ALL. + - bugfix: Readds missing beserker robe sprite. + - tweak: Cap growth serum at 1.5 + Fox McCloud: + - tweak: Xenobiology console should be more responsive when using/exiting using + it + - tweak: Xenobiology console can now be loaded with a bag + - bugfix: Using monkey cubes on the Xenobiology console no longer makes you attempt + to utilize the console + Markolie: + - bugfix: The kinetic accelerator sprite modkits now apply properly when the kinetic + accelerator is empty. + - bugfix: Welding tools now once again have a proper in-hand when turned on. +2017-02-15: + Alexshreds: + - rscadd: Coughing and sneezing now plays sounds. + Ausops: + - rscadd: Internals and plasma tanks have been resprited. + Crazylemon64: + - experiment: Phlogiston now ignites consistently upon application + FlimFlamm: + - rscadd: New decals for boxes. Just apply a pen to change them (while they're open)! + KasparoVy: + - rscadd: You can now choose to speak anonymously in deadchat from round-start game + preferences. + - tweak: Your decision to speak anonymously in deadchat now persists between ghostings. + - bugfix: Vox tails won't change colour when other Vox spawn in anymore. + Markolie: + - bugfix: Mine bots once again only do ten damage in pressurized areas + Twinmold93: + - bugfix: Blob Conscious Split now properly scales the requirement of blob tiles + to win. + uraniummeltdown: + - rscadd: Borers now have action buttons + - tweak: Borer names are now dependent on generation +2017-02-16: + Crazylemon64: + - tweak: Slime people and Dionae now make sounds when coughing + KasparoVy: + - bugfix: Welding goggles and welding gas masks now properly affect your vision. + davipatury: + - spellcheck: changed urnaium to uranium in wt-550 auto gun uranium magazine design + uraniummeltdown: + - rscadd: The wizard has a new spell, Rod Form, which allows him to transform into + an immovable rod. + - bugfix: Ethereal beings no longer cause bananium floor tiles to squeak. +2017-02-17: + Crazylemon64: + - experiment: Space vines now have a mutation that lets them grow in a more intelligent + manner + Ported by Markolie, developed by AnturK: + - rscadd: Station Goals have been ported from /tg/. These optional goals are big + projects given to the station by Central Command, requiring interdepartmental + cooperation and a huge number of resources to complete. + - rscadd: 'Three station goals have been added: bluespace artillery construction, + meteor shield satellite network and DNA vault.' + - bugfix: Fixes the "Messages" tab of the communications computer. +2017-02-18: + Alffd: + - bugfix: Fixes missing entries in species/station for Vox cough and sneeze. + Crazylemon64: + - bugfix: Centcomm has begun enforcing stricter security protocols after a recent + influx of fax responses from Clown impersonators + - bugfix: Mind transfer abilities work again + - bugfix: Centcomm is no longer obnoxiously pedantic, regarding BSA deployment diff --git a/html/changelogs/AutoChangeLog-pr-6410.yml b/html/changelogs/AutoChangeLog-pr-6410.yml new file mode 100644 index 00000000000..398f2a23866 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6410.yml @@ -0,0 +1,4 @@ +author: "Kyep" +delete-after: True +changes: + - rscadd: "Added a 'take' option to ahelps/mhelps, so admins/mentors can quickly let the asker know their question is being looked at." diff --git a/icons/effects/beam.dmi b/icons/effects/beam.dmi index 67da41362f8..ec06922a07d 100644 Binary files a/icons/effects/beam.dmi and b/icons/effects/beam.dmi differ diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi index 9bf1a315131..3d0c7233c98 100644 Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index a05e783b307..7764cd6d0c5 100644 Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi index 68a273305a8..b6089236f2a 100644 Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index cecb8427e84..0c9090c5b81 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 fe42152fb5f..0f889055ad0 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index d56a42ca099..d915f6941a7 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/obj/cardboard_boxes.dmi b/icons/obj/cardboard_boxes.dmi new file mode 100644 index 00000000000..3ef52c11bfb Binary files /dev/null and b/icons/obj/cardboard_boxes.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index b98c786872a..be68443c2bf 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index f08feb413f3..25edd2c325a 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi index 39b73d8052b..9b38b205075 100644 Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ diff --git a/icons/obj/hydroponics/equipment.dmi b/icons/obj/hydroponics/equipment.dmi index a81ead53edc..189d1682194 100644 Binary files a/icons/obj/hydroponics/equipment.dmi and b/icons/obj/hydroponics/equipment.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 1e8b80b314e..186e7d05232 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi index fde65f1c949..d844e5f721a 100644 Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ diff --git a/icons/obj/lavaland/cannon.dmi b/icons/obj/lavaland/cannon.dmi new file mode 100644 index 00000000000..82efad1bc5e Binary files /dev/null and b/icons/obj/lavaland/cannon.dmi differ diff --git a/icons/obj/machines/artillery.dmi b/icons/obj/machines/artillery.dmi deleted file mode 100644 index 887af9fdc07..00000000000 Binary files a/icons/obj/machines/artillery.dmi and /dev/null differ diff --git a/icons/obj/machines/dna_vault.dmi b/icons/obj/machines/dna_vault.dmi new file mode 100644 index 00000000000..35503336d42 Binary files /dev/null and b/icons/obj/machines/dna_vault.dmi differ diff --git a/icons/obj/machines/particle_accelerator3.dmi b/icons/obj/machines/particle_accelerator3.dmi new file mode 100644 index 00000000000..c601b8d1b6a Binary files /dev/null and b/icons/obj/machines/particle_accelerator3.dmi differ diff --git a/icons/obj/machines/satellite.dmi b/icons/obj/machines/satellite.dmi new file mode 100644 index 00000000000..efe3dade763 Binary files /dev/null and b/icons/obj/machines/satellite.dmi differ diff --git a/icons/obj/tank.dmi b/icons/obj/tank.dmi index 1154fe08e33..ef5f6ad194e 100644 Binary files a/icons/obj/tank.dmi and b/icons/obj/tank.dmi differ diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi new file mode 100644 index 00000000000..332afbbdb71 Binary files /dev/null and b/icons/obj/tools.dmi differ diff --git a/nano/templates/bluespace_artillery.tmpl b/nano/templates/bluespace_artillery.tmpl deleted file mode 100644 index 344a6d1fd48..00000000000 --- a/nano/templates/bluespace_artillery.tmpl +++ /dev/null @@ -1,26 +0,0 @@ - -

      Bluespace Artillery Control

      -
      -
      Target Lock
      -
      {{:data.target}}
      -
      -
      -
      Fire Cooldown
      -
      - {{if data.reloadtime_mins > 0 || data.reloadtime_mins == 0 && data.reloadtime_secs > 0}} - {{:data.reloadtime_mins}}:{{:data.reloadtime_secs}} - {{else}} - Ready - {{/if}} -
      -
      -
      - {{:helper.link('Select Target', 'exclamation-triangle', { 'area' : 1 })}} - {{:helper.link('Fire', 'exclamation-triangle', { 'fire' : 1 }, data.reloadtime_mins > 0 || data.reloadtime_mins == 0 && data.reloadtime_secs > 0 ? 'disabled' : '')}} -
      -
      -Deployment of weapon authorized by Nanotrasen Naval Command. Remember, friendly fire is grounds for termination of your contract and life. - diff --git a/nano/templates/bsa.tmpl b/nano/templates/bsa.tmpl new file mode 100644 index 00000000000..a0e8a60deb5 --- /dev/null +++ b/nano/templates/bsa.tmpl @@ -0,0 +1,51 @@ + +{{if data.notice}} +
      {{:data.notice}}
      +{{/if}} +

      Bluespace Artillery Control

      +
      +
      + Target: +
      +
      + {{:helper.link(data.target ? data.target : "None", 'crosshairs', {'recalibrate' : 1})}} +
      +
      +
      +
      + Reload Cooldown: +
      +
      + {{if data.ready}} + Ready + {{else data.reloadtime_mins || data.reloadtime_secs}} + {{:data.reloadtime_mins}}:{{:data.reloadtime_secs}} + {{else}} + No cannon connected! + {{/if}} +
      +
      +
      +
      + Controls: +
      +
      + {{:helper.link('FIRE!', 'warning', {'fire' : 1}, data.ready && data.target ? null : 'disabled')}} +
      +
      +{{if !data.connected}} +
      +
      + Maintenance: +
      +
      + {{:helper.link('Complete Deployment', 'wrench', {'build' : 1})}} +
      +
      +{{else}} +
      +Deployment of weapon authorized by Nanotrasen Naval Command. Remember, friendly fire is grounds for termination of your contract and life. +{{/if}} \ No newline at end of file diff --git a/nano/templates/comm_console.tmpl b/nano/templates/comm_console.tmpl index c4e1799afcf..062c8d844f3 100644 --- a/nano/templates/comm_console.tmpl +++ b/nano/templates/comm_console.tmpl @@ -111,17 +111,17 @@ Used In File(s): /code/game/machinery/computers/communications.dm

      Messages

      {{if data.current_message}} {{:helper.link('Messages','home',{'operation':'messagelist'})}} -

      {{>title}}

      +

      {{:data.current_message_title}}

      - {{>body}} + {{:data.current_message}}
      {{else}} {{:helper.link('Back','home',{'operation':'main'})}} {{for data.messages}}
      - {{:helper.link('Open','envelope-o',{'operation':'messagelist','msgid':data.id})}} - {{:helper.link('Delete','close',{'operation':'delmessage','msgid':data.id},'red')}} - {{>data.title}} + {{:value.title}}
      + {{:helper.link('Open','envelope-o',{'operation':'messagelist','msgid':value.id})}} + {{:helper.link('Delete','close',{'operation':'delmessage','msgid':value.id})}}
      {{/for}} {{/if}} diff --git a/nano/templates/dna_vault.tmpl b/nano/templates/dna_vault.tmpl new file mode 100644 index 00000000000..a5d631414d1 --- /dev/null +++ b/nano/templates/dna_vault.tmpl @@ -0,0 +1,49 @@ + +

      DNA Vault Database

      +
      +
      + Human DNA: +
      +
      + {{:helper.displayBar(data.dna, 0, data.dna_max, data.dna >= data.dna_max ? 'good' : 'average')}} +
      + {{:data.dna}}/{{:data.dna_max}} Samples +
      +
      +
      +
      +
      + Plant Data: +
      +
      + {{:helper.displayBar(data.plants, 0, data.plants_max, data.plants >= data.plants_max ? 'good' : 'average')}} +
      + {{:data.plants}}/{{:data.plants_max}} Samples +
      +
      +
      +
      +
      + Animal Data: +
      +
      + {{:helper.displayBar(data.animals, 0, data.animals_max, data.animals >= data.animals_max ? 'good' : 'average')}} +
      + {{:data.animals}}/{{:data.animals_max}} Samples +
      +
      +
      +{{if data.completed && !data.used}} +
      +
      + Applicable gene therapy treatments: +
      +
      + {{:helper.link(data.choiceA, null, {'gene' : 1, 'choice' : data.choiceA})}} + {{:helper.link(data.choiceB, null, {'gene' : 1, 'choice' : data.choiceB})}} +
      +
      +{{/if}} \ No newline at end of file diff --git a/nano/templates/faxmachine.tmpl b/nano/templates/faxmachine.tmpl index 76e68027a5c..e52c40eb927 100644 --- a/nano/templates/faxmachine.tmpl +++ b/nano/templates/faxmachine.tmpl @@ -59,9 +59,9 @@ Used In File(s): \code\modules\paperwork\faxmachine.dm
    {{if data.authenticated}} - {{:helper.link(data.cooldown && data.respectcooldown ? "Realigning" : "Send", data.cooldown && data.respectcooldown ? 'clock-o' : "mail-closed", {'send' : 1}, data.cooldown && data.respectcooldown ? 'disabled' : "")}} + {{:helper.link(data.cooldown && data.respectcooldown ? "Realigning" : "Send", data.cooldown && data.respectcooldown ? 'clock-o' : "envelope-o", {'send' : 1}, data.cooldown && data.respectcooldown ? 'disabled' : "")}} {{else}} - {{:helper.link(data.cooldown && data.respectcooldown ? "Realigning" : "Send", data.cooldown && data.respectcooldown ? 'clock-o' : "mail-closed", null, !data.authenticated ? 'disabled' : "")}} + {{:helper.link(data.cooldown && data.respectcooldown ? "Realigning" : "Send", data.cooldown && data.respectcooldown ? 'clock-o' : "envelope-o", null, !data.authenticated ? 'disabled' : "")}} {{/if}}
    \ No newline at end of file diff --git a/nano/templates/rcd.tmpl b/nano/templates/rcd.tmpl index 073171a4ba7..e72b6253a17 100644 --- a/nano/templates/rcd.tmpl +++ b/nano/templates/rcd.tmpl @@ -12,6 +12,21 @@ {{else data.menu == 2}}
    {{:helper.link('Back', 'reply', {'menu': 1})}}
    +
    +
    +
    +
    + {{if !data.locked}}{{:helper.link("Rename", '', {'choice' : 'airlock_name'})}}{{else}}LOCKED{{/if}} +
    +
    + Airlock Name: +
    +
    + {{:data.door_name}} +
    +
    +
    +

    Type

    {{for data.allowed_door_types}} diff --git a/nano/templates/sat_control.tmpl b/nano/templates/sat_control.tmpl new file mode 100644 index 00000000000..a3b5ad40cb1 --- /dev/null +++ b/nano/templates/sat_control.tmpl @@ -0,0 +1,32 @@ + +{{if data.notice}} +
    {{:data.notice}}
    +{{/if}} +

    Satellite Network Control

    +{{for data.satellites}} +
    +
    + #{{:value.id}} - {{:value.mode}} +
    +
    + + {{:helper.link(value.active ? 'Deactivate' : 'Activate', null, {'toggle' : 1, 'id' : value.id})}} +
    +
    +{{/for}} +{{if data.meteor_shield}} +
    +
    + Station Shield Coverage: +
    +
    + {{:helper.displayBar(data.meteor_shield_coverage, 0, data.meteor_shield_coverage_max, data.meteor_shield_coverage_percentage >= 100 ? 'good' : 'average')}} +
    + {{:data.meteor_shield_coverage_percentage}}% +
    +
    +
    +{{/if}} \ No newline at end of file diff --git a/paradise.dme b/paradise.dme index 4f8a12f79f9..566614547bc 100644 --- a/paradise.dme +++ b/paradise.dme @@ -306,6 +306,7 @@ #include "code\datums\spells\mind_transfer.dm" #include "code\datums\spells\projectile.dm" #include "code\datums\spells\rathens.dm" +#include "code\datums\spells\rod_form.dm" #include "code\datums\spells\shapeshift.dm" #include "code\datums\spells\summonitem.dm" #include "code\datums\spells\touch_attacks.dm" @@ -434,7 +435,9 @@ #include "code\game\gamemodes\miniantags\abduction\machinery\experiment.dm" #include "code\game\gamemodes\miniantags\abduction\machinery\pad.dm" #include "code\game\gamemodes\miniantags\borer\borer.dm" +#include "code\game\gamemodes\miniantags\borer\borer_chemicals.dm" #include "code\game\gamemodes\miniantags\borer\borer_event.dm" +#include "code\game\gamemodes\miniantags\borer\borer_html.dm" #include "code\game\gamemodes\miniantags\bot_swarm\swarmer.dm" #include "code\game\gamemodes\miniantags\bot_swarm\swarmer_event.dm" #include "code\game\gamemodes\miniantags\guardian\guardian.dm" @@ -1088,7 +1091,6 @@ #include "code\modules\atmos_automation\implementation\scrubbers.dm" #include "code\modules\atmos_automation\implementation\sensors.dm" #include "code\modules\atmos_automation\implementation\vent_pump.dm" -#include "code\modules\awaymissions\bluespaceartillery.dm" #include "code\modules\awaymissions\corpse.dm" #include "code\modules\awaymissions\exile.dm" #include "code\modules\awaymissions\gateway.dm" @@ -1299,6 +1301,7 @@ #include "code\modules\events\slaughterevent.dm" #include "code\modules\events\spacevine.dm" #include "code\modules\events\spider_infestation.dm" +#include "code\modules\events\spider_terror.dm" #include "code\modules\events\spontaneous_appendicitis.dm" #include "code\modules\events\tear.dm" #include "code\modules\events\traders.dm" @@ -1447,6 +1450,7 @@ #include "code\modules\mining\mine_areas.dm" #include "code\modules\mining\mine_items.dm" #include "code\modules\mining\mine_turfs.dm" +#include "code\modules\mining\minebot.dm" #include "code\modules\mining\mint.dm" #include "code\modules\mining\money_bag.dm" #include "code\modules\mining\ore.dm" @@ -1734,9 +1738,16 @@ #include "code\modules\mob\living\simple_animal\hostile\terror_spiders\chem.dm" #include "code\modules\mob\living\simple_animal\hostile\terror_spiders\ghost.dm" #include "code\modules\mob\living\simple_animal\hostile\terror_spiders\gray.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\green.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\hive.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\mother.dm" #include "code\modules\mob\living\simple_animal\hostile\terror_spiders\prince.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\purple.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\queen.dm" #include "code\modules\mob\living\simple_animal\hostile\terror_spiders\red.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\reproduction.dm" #include "code\modules\mob\living\simple_animal\hostile\terror_spiders\terror_spiders.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\white.dm" #include "code\modules\mob\new_player\login.dm" #include "code\modules\mob\new_player\logout.dm" #include "code\modules\mob\new_player\new_player.dm" @@ -2069,6 +2080,10 @@ #include "code\modules\spacepods\parts.dm" #include "code\modules\spacepods\pod_fabricator.dm" #include "code\modules\spacepods\spacepod.dm" +#include "code\modules\station_goals\bsa.dm" +#include "code\modules\station_goals\dna_vault.dm" +#include "code\modules\station_goals\shield.dm" +#include "code\modules\station_goals\station_goal.dm" #include "code\modules\store\items.dm" #include "code\modules\store\store.dm" #include "code\modules\surgery\bones.dm" diff --git a/sound/effects/mob_effects/f_cougha.ogg b/sound/effects/mob_effects/f_cougha.ogg new file mode 100644 index 00000000000..f53e0f5bd2c Binary files /dev/null and b/sound/effects/mob_effects/f_cougha.ogg differ diff --git a/sound/effects/mob_effects/f_coughb.ogg b/sound/effects/mob_effects/f_coughb.ogg new file mode 100644 index 00000000000..2626f8d6621 Binary files /dev/null and b/sound/effects/mob_effects/f_coughb.ogg differ diff --git a/sound/effects/mob_effects/f_machine_cougha.ogg b/sound/effects/mob_effects/f_machine_cougha.ogg new file mode 100644 index 00000000000..e0a8441e3d4 Binary files /dev/null and b/sound/effects/mob_effects/f_machine_cougha.ogg differ diff --git a/sound/effects/mob_effects/f_machine_coughb.ogg b/sound/effects/mob_effects/f_machine_coughb.ogg new file mode 100644 index 00000000000..b70b6d16c14 Binary files /dev/null and b/sound/effects/mob_effects/f_machine_coughb.ogg differ diff --git a/sound/effects/mob_effects/f_machine_sneeze.ogg b/sound/effects/mob_effects/f_machine_sneeze.ogg new file mode 100644 index 00000000000..9649c862449 Binary files /dev/null and b/sound/effects/mob_effects/f_machine_sneeze.ogg differ diff --git a/sound/effects/mob_effects/f_sneeze.ogg b/sound/effects/mob_effects/f_sneeze.ogg new file mode 100644 index 00000000000..e6c4a49ade8 Binary files /dev/null and b/sound/effects/mob_effects/f_sneeze.ogg differ diff --git a/sound/effects/mob_effects/m_cougha.ogg b/sound/effects/mob_effects/m_cougha.ogg new file mode 100644 index 00000000000..146beefdf87 Binary files /dev/null and b/sound/effects/mob_effects/m_cougha.ogg differ diff --git a/sound/effects/mob_effects/m_coughb.ogg b/sound/effects/mob_effects/m_coughb.ogg new file mode 100644 index 00000000000..745fb50e19c Binary files /dev/null and b/sound/effects/mob_effects/m_coughb.ogg differ diff --git a/sound/effects/mob_effects/m_coughc.ogg b/sound/effects/mob_effects/m_coughc.ogg new file mode 100644 index 00000000000..abfe70d2769 Binary files /dev/null and b/sound/effects/mob_effects/m_coughc.ogg differ diff --git a/sound/effects/mob_effects/m_machine_cougha.ogg b/sound/effects/mob_effects/m_machine_cougha.ogg new file mode 100644 index 00000000000..3e803f64b1e Binary files /dev/null and b/sound/effects/mob_effects/m_machine_cougha.ogg differ diff --git a/sound/effects/mob_effects/m_machine_coughb.ogg b/sound/effects/mob_effects/m_machine_coughb.ogg new file mode 100644 index 00000000000..d1287070922 Binary files /dev/null and b/sound/effects/mob_effects/m_machine_coughb.ogg differ diff --git a/sound/effects/mob_effects/m_machine_coughc.ogg b/sound/effects/mob_effects/m_machine_coughc.ogg new file mode 100644 index 00000000000..67e13314934 Binary files /dev/null and b/sound/effects/mob_effects/m_machine_coughc.ogg differ diff --git a/sound/effects/mob_effects/machine_sneeze.ogg b/sound/effects/mob_effects/machine_sneeze.ogg new file mode 100644 index 00000000000..f0ba0ab8170 Binary files /dev/null and b/sound/effects/mob_effects/machine_sneeze.ogg differ diff --git a/sound/effects/mob_effects/sneeze.ogg b/sound/effects/mob_effects/sneeze.ogg new file mode 100644 index 00000000000..e7587bab20f Binary files /dev/null and b/sound/effects/mob_effects/sneeze.ogg differ diff --git a/sound/machines/bsa_fire.ogg b/sound/machines/bsa_fire.ogg new file mode 100644 index 00000000000..19244ff69d6 Binary files /dev/null and b/sound/machines/bsa_fire.ogg differ diff --git a/sound/machines/terminal_alert.ogg b/sound/machines/terminal_alert.ogg new file mode 100644 index 00000000000..0f5006ee42c Binary files /dev/null and b/sound/machines/terminal_alert.ogg differ diff --git a/sound/machines/terminal_button01.ogg b/sound/machines/terminal_button01.ogg new file mode 100644 index 00000000000..362d81f3c57 Binary files /dev/null and b/sound/machines/terminal_button01.ogg differ diff --git a/sound/machines/terminal_button02.ogg b/sound/machines/terminal_button02.ogg new file mode 100644 index 00000000000..6df9b289b55 Binary files /dev/null and b/sound/machines/terminal_button02.ogg differ diff --git a/sound/machines/terminal_button03.ogg b/sound/machines/terminal_button03.ogg new file mode 100644 index 00000000000..3bd1e2c4259 Binary files /dev/null and b/sound/machines/terminal_button03.ogg differ diff --git a/sound/machines/terminal_button04.ogg b/sound/machines/terminal_button04.ogg new file mode 100644 index 00000000000..f9020380d0a Binary files /dev/null and b/sound/machines/terminal_button04.ogg differ diff --git a/sound/machines/terminal_button05.ogg b/sound/machines/terminal_button05.ogg new file mode 100644 index 00000000000..0bbfefe5273 Binary files /dev/null and b/sound/machines/terminal_button05.ogg differ diff --git a/sound/machines/terminal_button06.ogg b/sound/machines/terminal_button06.ogg new file mode 100644 index 00000000000..ecb521f272c Binary files /dev/null and b/sound/machines/terminal_button06.ogg differ diff --git a/sound/machines/terminal_button07.ogg b/sound/machines/terminal_button07.ogg new file mode 100644 index 00000000000..a6ed66bbf26 Binary files /dev/null and b/sound/machines/terminal_button07.ogg differ diff --git a/sound/machines/terminal_button08.ogg b/sound/machines/terminal_button08.ogg new file mode 100644 index 00000000000..2d35c62cc4c Binary files /dev/null and b/sound/machines/terminal_button08.ogg differ diff --git a/sound/machines/terminal_insert_disc.ogg b/sound/machines/terminal_insert_disc.ogg new file mode 100644 index 00000000000..07313dabaca Binary files /dev/null and b/sound/machines/terminal_insert_disc.ogg differ diff --git a/sound/machines/terminal_off.ogg b/sound/machines/terminal_off.ogg new file mode 100644 index 00000000000..4882aa924af Binary files /dev/null and b/sound/machines/terminal_off.ogg differ diff --git a/sound/machines/terminal_on.ogg b/sound/machines/terminal_on.ogg new file mode 100644 index 00000000000..95164b5b774 Binary files /dev/null and b/sound/machines/terminal_on.ogg differ diff --git a/sound/machines/terminal_prompt.ogg b/sound/machines/terminal_prompt.ogg new file mode 100644 index 00000000000..1ff4930a263 Binary files /dev/null and b/sound/machines/terminal_prompt.ogg differ diff --git a/sound/machines/terminal_prompt_confirm.ogg b/sound/machines/terminal_prompt_confirm.ogg new file mode 100644 index 00000000000..b838a764e8c Binary files /dev/null and b/sound/machines/terminal_prompt_confirm.ogg differ diff --git a/sound/machines/terminal_prompt_deny.ogg b/sound/machines/terminal_prompt_deny.ogg new file mode 100644 index 00000000000..c408c21625f Binary files /dev/null and b/sound/machines/terminal_prompt_deny.ogg differ diff --git a/sound/voice/shriekcough.ogg b/sound/voice/shriekcough.ogg new file mode 100644 index 00000000000..15dc2e3873c Binary files /dev/null and b/sound/voice/shriekcough.ogg differ diff --git a/sound/voice/shrieksneeze.ogg b/sound/voice/shrieksneeze.ogg new file mode 100644 index 00000000000..9b1a5d1cca7 Binary files /dev/null and b/sound/voice/shrieksneeze.ogg differ