diff --git a/.travis.yml b/.travis.yml
index 052a53f7ccc..b6cce2273b1 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -3,8 +3,8 @@ language: c
env:
global:
- - BYOND_MAJOR="506"
- - BYOND_MINOR="1247"
+ - BYOND_MAJOR="507"
+ - BYOND_MINOR="1286"
matrix:
- DM_MAPFILE="tgstation2"
- DM_MAPFILE="metastation"
diff --git a/_maps/map_files/MiniStation/MiniStation.dmm b/_maps/map_files/MiniStation/MiniStation.dmm
index 68de70ba928..eb894ff0559 100644
--- a/_maps/map_files/MiniStation/MiniStation.dmm
+++ b/_maps/map_files/MiniStation/MiniStation.dmm
@@ -3,7 +3,7 @@
"ac" = (/obj/effect/landmark{name = "carpspawn"},/turf/space,/area/space)
"ad" = (/turf/simulated/mineral/random/low_chance,/area/space)
"ae" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_ne"; name = "northeast of station"; turf_type = /turf/simulated/floor/plating/snow; width = 18},/turf/space,/area/space)
-"af" = (/turf/simulated/mineral/random/high_chance,/area/space)
+"af" = (/turf/simulated/mineral/random/low_chance,/area/mine/unexplored)
"ag" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_nw"; name = "northwest of station"; turf_type = /turf/simulated/floor/plating/snow; width = 18},/turf/space,/area/space)
"ah" = (/turf/simulated/wall,/area/bridge)
"ai" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/door/poddoor/preopen{id = "bridge blast"; layer = 2.9; name = "bridge blast door"},/turf/simulated/floor/plating/airless,/area/bridge)
@@ -62,9 +62,9 @@
"bj" = (/obj/item/stack/rods{amount = 50},/turf/simulated/floor/plating/airless,/area/quartermaster/storage)
"bk" = (/obj/item/weapon/storage/bag/ore,/turf/simulated/floor/plating/airless,/area/quartermaster/storage)
"bl" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/bridge)
-"bm" = (/obj/machinery/door/airlock/glass_command{name = "Bridge"; req_access_txt = "19"},/turf/simulated/floor/plasteel,/area/bridge)
+"bm" = (/turf/simulated/mineral/random/high_chance,/area/mine/unexplored)
"bn" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1},/turf/simulated/floor/plasteel,/area/bridge)
-"bo" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/airlock/glass_command{name = "Bridge"; req_access_txt = "19"},/turf/simulated/floor/plasteel,/area/bridge)
+"bo" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "Bridge"; req_access_txt = "19"},/turf/simulated/floor/plasteel,/area/bridge)
"bp" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/bridge)
"bq" = (/turf/simulated/wall,/area/quartermaster/storage)
"br" = (/obj/machinery/light/small{dir = 8},/obj/machinery/mineral/unloading_machine{icon_state = "unloader-corner"; input_dir = 4; output_dir = 2},/turf/simulated/floor/plating/airless,/area/quartermaster/storage)
@@ -78,9 +78,9 @@
"bz" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/floor/plating,/area/hallway/primary/central)
"bA" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/bridge)
"bB" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall,/area/bridge)
-"bC" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/bridge)
-"bD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/bridge)
-"bE" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/bridge)
+"bC" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "Bridge"; req_access_txt = "19"},/turf/simulated/floor/plasteel,/area/bridge)
+"bD" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/bridge)
+"bE" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/bridge)
"bF" = (/obj/machinery/power/apc{auto_name = 1; dir = 1; name = "_North APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/bridge)
"bG" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/closet,/turf/simulated/floor/plating,/area/hallway/primary/central)
"bH" = (/obj/structure/plasticflaps/mining,/obj/machinery/conveyor{dir = 2; id = "mining_internal"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
@@ -91,9 +91,9 @@
"bM" = (/obj/machinery/door/airlock/external{req_access_txt = "13"},/turf/simulated/floor/plating,/area/hallway/primary/central)
"bN" = (/turf/simulated/floor/plating,/area/hallway/primary/central)
"bO" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/hallway/primary/central)
-"bP" = (/obj/machinery/door/firedoor/border_only,/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
+"bP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/bridge)
"bQ" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/quartermaster/storage)
-"bR" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
+"bR" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
"bS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/hallway/primary/central)
"bT" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/hallway/primary/central)
"bU" = (/turf/simulated/wall,/area/medical/research{name = "Research Division"})
@@ -108,18 +108,18 @@
"cd" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/quartermaster/storage)
"ce" = (/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/wall,/area/quartermaster/storage)
"cf" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/hallway/primary/central)
-"cg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
-"ch" = (/obj/machinery/door/airlock/glass_command{name = "Bridge"; req_access_txt = "19"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/bridge)
+"cg" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
+"ch" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
"ci" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/hallway/primary/central)
"cj" = (/turf/simulated/wall/r_wall,/area/security/brig)
"ck" = (/turf/simulated/wall,/area/security/brig)
"cl" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/disposaloutlet,/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
"cm" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
-"cn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/door/poddoor/preopen{id = "xenobio2"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
+"cn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/poddoor/preopen{id = "xenobio2"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
"co" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/window/reinforced,/obj/machinery/camera/autoname,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/medical/research{name = "Research Division"})
"cp" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"cq" = (/obj/structure/window/reinforced,/obj/structure/table/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/door_control{id = "xenobio8"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/medical/research{name = "Research Division"})
-"cr" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id = "xenobio8"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
+"cq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor/preopen{id = "xenobio8"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
+"cr" = (/obj/structure/window/reinforced,/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio8"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/medical/research{name = "Research Division"})
"cs" = (/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
"ct" = (/obj/structure/plasticflaps,/obj/machinery/conveyor{dir = 1; id = "mining_internal"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"cu" = (/obj/machinery/mineral/processing_unit_console{layer = 3; machinedir = 1; pixel_y = 0},/turf/simulated/wall,/area/quartermaster/storage)
@@ -135,10 +135,10 @@
"cE" = (/obj/machinery/photocopier,/turf/simulated/floor/plasteel,/area/security/brig)
"cF" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
"cG" = (/mob/living/simple_animal/slime,/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
-"cH" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access_txt = "55"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/poddoor/preopen{id = "xenobio2"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
+"cH" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id = "xenobio2"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
"cI" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/medical/research{name = "Research Division"})
"cJ" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/medical/research{name = "Research Division"})
-"cK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id = "xenobio8"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
+"cK" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id = "xenobio8"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
"cL" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
"cM" = (/obj/machinery/conveyor{dir = 1; id = "mining_internal"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/quartermaster/storage)
"cN" = (/obj/machinery/conveyor_switch/oneway{id = "mining_internal"; name = "mining conveyor"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/quartermaster/storage)
@@ -164,14 +164,14 @@
"dh" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/closet{name = "Contraband Locker"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/security/brig)
"di" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/security/brig)
"dj" = (/obj/structure/rack,/obj/item/clothing/suit/armor/riot,/obj/item/clothing/suit/armor/riot,/obj/item/clothing/suit/armor/riot,/obj/item/clothing/head/helmet/riot,/obj/item/clothing/head/helmet/riot,/obj/item/clothing/head/helmet/riot,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/item/weapon/shield/riot,/obj/item/weapon/shield/riot,/obj/item/weapon/shield/riot,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
-"dk" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/door/poddoor/preopen{id = "xenobio2"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
-"dl" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio2"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/medical/research{name = "Research Division"})
+"dk" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio2"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/medical/research{name = "Research Division"})
+"dl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/poddoor/preopen{id = "xenobio8"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
"dm" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/medical/research{name = "Research Division"})
-"dn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable,/obj/machinery/door/poddoor/preopen{id = "xenobio8"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
+"dn" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/brig)
"do" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/disposaloutlet{dir = 1},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
"dp" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
"dq" = (/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
-"dr" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "hazard door east"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"dr" = (/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,/obj/machinery/door/airlock/glass_security{name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/brig)
"ds" = (/obj/machinery/door/airlock/maintenance{name = "Cargo Bay Maintenance"; req_access_txt = "31"},/turf/simulated/floor/plating,/area/quartermaster/storage)
"dt" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/hallway/primary/central)
"du" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plating,/area/quartermaster/storage)
@@ -206,10 +206,10 @@
"dX" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"dY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"dZ" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/hallway/primary/central)
-"ea" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/obj/machinery/door/airlock/glass_security{name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/brig)
-"eb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/brig)
-"ec" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig)
-"ed" = (/obj/machinery/door/airlock/glass_security{name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/brig)
+"ea" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/brig)
+"eb" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig)
+"ec" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/poddoor/preopen{id = "xenobio1"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
+"ed" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/brig)
"ee" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/brig)
"ef" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel,/area/security/brig)
"eg" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor/plasteel,/area/security/brig)
@@ -218,7 +218,7 @@
"ej" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_x = -27; pixel_y = 3},/turf/simulated/floor/plasteel,/area/security/brig)
"ek" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/security/brig)
"el" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/bridge)
-"em" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/door/poddoor/preopen{id = "xenobio1"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
+"em" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig)
"en" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/medical/research{name = "Research Division"})
"eo" = (/obj/machinery/monkey_recycler,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"ep" = (/obj/machinery/processor{desc = "A machine used to process slimes and retrieve their extract."; name = "Slime Processor"},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
@@ -247,13 +247,13 @@
"eM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"eN" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"eO" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/security/brig)
-"eP" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/brig)
-"eQ" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig)
+"eP" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id = "xenobio1"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
+"eQ" = (/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,/obj/machinery/door/airlock/glass_security{name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/brig)
"eR" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/security/brig)
"eS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/security/brig)
"eT" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/security/brig)
"eU" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/door_timer{dir = 4; id = "Cell 1"; name = "Cell 1"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig)
-"eV" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access_txt = "55"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/poddoor/preopen{id = "xenobio1"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
+"eV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig)
"eW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
"eX" = (/turf/simulated/wall,/area/space)
"eY" = (/turf/simulated/wall/shuttle{icon_state = "wall3"},/area/space)
@@ -269,16 +269,16 @@
"fi" = (/obj/structure/closet/secure_closet/brig{id = "Cell 2"; name = "Cell 2 Locker"},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/security/brig)
"fj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"fk" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/hallway/primary/central)
-"fl" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = -32},/obj/machinery/door/airlock/glass_security{name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/brig)
-"fm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig)
+"fl" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio1"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/medical/research{name = "Research Division"})
+"fm" = (/obj/machinery/door/firedoor,/obj/machinery/door/window/brigdoor{dir = 4; id = "Cell 1"; name = "Cell 1"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig)
"fn" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/brig)
"fo" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/security/brig)
"fp" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig)
"fq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"fr" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/light/small{dir = 1},/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/plasteel,/area/security/brig)
"fs" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/closet/secure_closet/brig{id = "Cell 2"; name = "Cell 2 Locker"},/turf/simulated/floor/plasteel,/area/security/brig)
-"ft" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/door/poddoor/preopen{id = "xenobio1"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
-"fu" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio1"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/medical/research{name = "Research Division"})
+"ft" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Cargo Bay"; req_access_txt = "31"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"fu" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Xenobiology Lab"; req_access_txt = "7"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"fv" = (/obj/effect/landmark/start{name = "Scientist"},/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"fw" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
"fx" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_x = -25; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "browncorner"; dir = 1},/area/quartermaster/storage)
@@ -299,13 +299,13 @@
"fM" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/security/brig)
"fN" = (/obj/machinery/photocopier,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "cautioncorner"; dir = 4},/area/quartermaster/storage)
"fO" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/brig)
-"fP" = (/obj/machinery/door/window/brigdoor{dir = 4; id = "Cell 2"; name = "Cell 2"; req_access_txt = "2"},/obj/machinery/door/firedoor/border_only{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig)
+"fP" = (/obj/machinery/r_n_d/server/core,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/research{name = "Research Division"})
"fQ" = (/obj/machinery/flasher{id = "Cell 2"; pixel_x = 28},/turf/simulated/floor/plasteel,/area/security/brig)
"fR" = (/obj/structure/table,/obj/item/weapon/extinguisher{pixel_x = 4; pixel_y = 3},/obj/item/weapon/extinguisher,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"fS" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"fT" = (/obj/structure/table,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/obj/machinery/light,/obj/item/stack/sheet/mineral/plasma{layer = 2.9},/obj/item/stack/sheet/mineral/plasma{layer = 2.9},/obj/item/stack/sheet/mineral/plasma{layer = 2.9},/obj/item/stack/sheet/mineral/plasma{layer = 2.9},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"fU" = (/obj/structure/table,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/syringes,/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"fV" = (/obj/machinery/door/airlock/glass_mining{name = "Cargo Bay"; req_access_txt = "31"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"fV" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Cargo Office"; req_access_txt = "31"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"fW" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/security/brig)
"fX" = (/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"fY" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
@@ -330,16 +330,16 @@
"gr" = (/obj/machinery/newscaster{pixel_y = 32},/obj/structure/closet/l3closet/scientist,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"gs" = (/obj/structure/closet/secure_closet/scientist,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"gt" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/medical/research{name = "Research Division"})
-"gu" = (/obj/machinery/door/airlock/research{name = "Xenobiology Lab"; req_access_txt = "7"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"gu" = (/obj/machinery/door_control{dir = 2; id = "rnd"; name = "Shutters Control Button"; pixel_x = -24; pixel_y = -6},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_x = -27; pixel_y = 3},/turf/simulated/floor/plasteel{icon_state = "whitepurple"; dir = 8},/area/medical/research{name = "Research Division"})
"gv" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/medical/research{name = "Research Division"})
"gw" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/medical/research{name = "Research Division"})
"gx" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; external_pressure_bound = 120; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = 32},/turf/simulated/floor/bluegrid,/area/medical/research{name = "Research Division"})
-"gy" = (/obj/machinery/r_n_d/server/core,/obj/machinery/light/small{dir = 1},/obj/machinery/alarm/server{dir = 2; pixel_x = 0; pixel_y = 22},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/research{name = "Research Division"})
+"gy" = (/obj/structure/closet/crate,/obj/machinery/camera/autoname{dir = 8},/obj/item/weapon/ore/glass,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
"gz" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; external_pressure_bound = 140; on = 1; pressure_checks = 0},/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = 32},/turf/simulated/floor/bluegrid,/area/medical/research{name = "Research Division"})
"gA" = (/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,/area/quartermaster/storage)
"gB" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/quartermaster/storage)
"gC" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"gD" = (/obj/machinery/door/airlock/glass_mining{name = "Cargo Office"; req_access_txt = "31"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"gD" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/closet/crate,/obj/item/weapon/ore/slag,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
"gE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/structure/closet/secure_closet/security,/turf/simulated/floor/plasteel,/area/security/brig)
"gF" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/security/brig)
"gG" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/structure/stool/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel,/area/security/brig)
@@ -352,8 +352,8 @@
"gN" = (/obj/machinery/mineral/ore_redemption{input_dir = 4},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/hallway/primary/central)
"gO" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"},/area/hallway/primary/central)
"gP" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "purplecorner"},/area/hallway/primary/central)
-"gQ" = (/obj/machinery/door_control{dir = 2; id = "rnd"; name = "Shutters Control Button"; pixel_x = -24; pixel_y = -6},/obj/machinery/door/firedoor/border_only{dir = 8; name = "hazard door west"},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_x = -27; pixel_y = 3},/turf/simulated/floor/plasteel{icon_state = "whitepurple"; dir = 8},/area/medical/research{name = "Research Division"})
-"gR" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"gQ" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Scientist"},/turf/simulated/floor/plasteel{icon_state = "whitepurple"; dir = 8},/area/medical/research{name = "Research Division"})
+"gR" = (/obj/structure/table/reinforced,/obj/machinery/door/window/southright{dir = 4; name = "Research and Development Desk"; req_access_txt = "7"},/obj/item/weapon/folder/yellow,/obj/machinery/door/poddoor/shutters/preopen{id = "rnd"; name = "research lab shutters"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"gS" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/table,/obj/item/weapon/disk/tech_disk{pixel_x = 0; pixel_y = 0},/obj/item/weapon/disk/tech_disk{pixel_x = 0; pixel_y = 0},/obj/item/weapon/disk/design_disk,/obj/item/weapon/disk/design_disk,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/camera/autoname,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"gT" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"gU" = (/obj/structure/table,/obj/item/weapon/stock_parts/micro_laser,/obj/item/weapon/stock_parts/micro_laser,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/manipulator,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
@@ -365,7 +365,7 @@
"ha" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "yellow"},/area/quartermaster/storage)
"hb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
"hc" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/closet/crate,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
-"hd" = (/obj/structure/closet/crate,/obj/machinery/camera/autoname{dir = 8},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
+"hd" = (/obj/machinery/atmospherics/pipe/simple{dir = 2},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_research{name = "Server Room"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/research{name = "Research Division"})
"he" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"hf" = (/obj/structure/table,/obj/item/weapon/restraints/handcuffs,/obj/item/device/assembly/timer,/obj/item/device/flash,/turf/simulated/floor/plasteel,/area/security/brig)
"hg" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/obj/structure/stool/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel,/area/security/brig)
@@ -378,16 +378,16 @@
"hn" = (/obj/structure/table/wood,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/folder/red,/obj/item/weapon/hand_labeler,/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor/fancy/carpet,/area/security/brig)
"ho" = (/obj/structure/table,/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"hp" = (/turf/simulated/floor/plasteel{icon_state = "purple"; dir = 4},/area/hallway/primary/central)
-"hq" = (/obj/structure/table/reinforced,/obj/machinery/door/window/southright{dir = 4; name = "Research and Development Desk"; req_access_txt = "7"},/obj/machinery/door/poddoor/shutters{density = 0; icon_state = "shutter0"; id = "rnd"; name = "Research Lab Shutters"; opacity = 0},/obj/item/weapon/folder/yellow,/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
-"hr" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Scientist"},/obj/machinery/door/firedoor/border_only{dir = 8; name = "hazard door west"},/turf/simulated/floor/plasteel{icon_state = "whitepurple"; dir = 8},/area/medical/research{name = "Research Division"})
+"hq" = (/obj/machinery/door/firedoor,/obj/machinery/door/window/brigdoor{dir = 4; id = "Cell 2"; name = "Cell 2"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig)
+"hr" = (/obj/structure/table,/obj/item/weapon/hand_labeler,/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/obj/item/weapon/pen,/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = -30; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "whitepurple"; dir = 8},/area/medical/research{name = "Research Division"})
"hs" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"ht" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"hu" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"hv" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"hw" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"hx" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple{dir = 4},/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
-"hy" = (/obj/machinery/door/airlock/glass_research{name = "Server Room"; req_access_txt = "47"},/obj/machinery/atmospherics/pipe/simple{dir = 2},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/research{name = "Research Division"})
-"hz" = (/turf/simulated/floor/plating,/area/space)
+"hy" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/closet/crate,/obj/item/weapon/ore/glass,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
+"hz" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Detective"; req_access_txt = "4"},/turf/simulated/floor/plasteel,/area/security/brig)
"hA" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/quartermaster/storage)
"hB" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"hC" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel,/area/hallway/primary/central)
@@ -396,14 +396,14 @@
"hF" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/security/brig)
"hG" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/simulated/floor/plasteel,/area/security/brig)
"hH" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/brig)
-"hI" = (/obj/machinery/door/window/brigdoor{dir = 4; id = "Cell 1"; name = "Cell 1"; req_access_txt = "2"},/obj/machinery/door/firedoor/border_only{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig)
+"hI" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Research and Development Lab"; req_access_txt = "7"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"hJ" = (/obj/machinery/flasher{id = "Cell 3"; pixel_x = 28},/turf/simulated/floor/plasteel,/area/security/brig)
"hK" = (/obj/structure/closet/secure_closet/detective,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/brig)
"hL" = (/turf/simulated/floor/fancy/carpet,/area/security/brig)
"hM" = (/obj/structure/table/wood,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/turf/simulated/floor/fancy/carpet,/area/security/brig)
"hN" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"hO" = (/turf/simulated/floor/plasteel{icon_state = "purplecorner"; dir = 4},/area/hallway/primary/central)
-"hP" = (/obj/structure/table,/obj/item/weapon/hand_labeler,/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/obj/item/weapon/pen,/obj/machinery/door/firedoor/border_only{dir = 8; name = "hazard door west"},/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = -30; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "whitepurple"; dir = 8},/area/medical/research{name = "Research Division"})
+"hP" = (/obj/machinery/camera{c_tag = "Toxin Test Site"; dir = 8; network = list("RD","Toxins"); use_power = 0},/turf/simulated/floor/plating/airless,/area/space)
"hQ" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
"hR" = (/obj/machinery/r_n_d/destructive_analyzer,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/medical/research{name = "Research Division"})
"hS" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/medical/research{name = "Research Division"})
@@ -412,8 +412,8 @@
"hV" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"hW" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"hX" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Scientist"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"hY" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/atmospherics/pipe/simple{dir = 2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"hZ" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
+"hY" = (/obj/structure/closet/crate,/obj/item/weapon/ore/iron,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
+"hZ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/sink{pixel_y = 24},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
"ia" = (/obj/machinery/computer/rdservercontrol,/obj/machinery/door/window/southright{dir = 8; name = "Server Controller Computer"; req_access_txt = "7"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"ib" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/security/brig)
"ic" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/closet/crate,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
@@ -436,7 +436,7 @@
"it" = (/obj/machinery/light,/turf/simulated/floor/plasteel,/area/medical/research{name = "Research Division"})
"iu" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/r_n_d/circuit_imprinter,/obj/item/weapon/reagent_containers/glass/beaker/sulphuric,/turf/simulated/floor/plasteel,/area/medical/research{name = "Research Division"})
"iv" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
-"iw" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor/border_only{dir = 2; name = "hazard door south"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"iw" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/poddoor/preopen{id = "Biohazard"; name = "biohazard blast door"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"})
"ix" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker/large{pixel_x = -3; pixel_y = 3},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"iy" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/table,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/matter_bin,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"iz" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/clothing/glasses/welding,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
@@ -457,21 +457,21 @@
"iO" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"iP" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/wall,/area/hallway/primary/central)
"iQ" = (/obj/machinery/portable_atmospherics/pump,/obj/machinery/atmospherics/unary/portables_connector/visible,/turf/simulated/floor/plating,/area/hallway/primary/central)
-"iR" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/machinery/door/airlock/glass_security{name = "Detective"; req_access_txt = "4"},/turf/simulated/floor/plasteel,/area/security/brig)
+"iR" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"iS" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1},/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva)
"iT" = (/obj/machinery/camera/autoname{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"iU" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
-"iV" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/research{name = "Research and Development Lab"; req_access_txt = "7"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"iV" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"iW" = (/obj/machinery/atmospherics/pipe/simple{dir = 2},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"iX" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{current_temperature = 80; dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"iY" = (/obj/machinery/mass_driver{dir = 4; id = "toxinsdriver"},/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
"iZ" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/medical/research{name = "Research Division"})
"ja" = (/obj/machinery/door/poddoor{id = "toxinsdriver"; name = "Toxins Launcher Bay Door"},/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
-"jb" = (/obj/machinery/camera{c_tag = "Toxin Test Site"; dir = 8; network = list("RD","Toxins"); use_power = 0},/turf/simulated/floor/plating,/area/space)
+"jb" = (/obj/machinery/door/poddoor/preopen{id = "Biohazard"; name = "biohazard blast door"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"})
"jc" = (/turf/simulated/wall/shuttle{icon_state = "swall_s6"; dir = 2},/area/shuttle/arrival)
"jd" = (/obj/machinery/door/airlock/shuttle{name = "Arrivals Shuttle Airlock"},/obj/docking_port/mobile{dir = 2; dwidth = 5; height = 7; id = "arrival"; name = "arrival shuttle"; travelDir = -90; width = 15},/obj/docking_port/stationary{dir = 2; dwidth = 5; height = 7; id = "arrival_home"; name = "port bay 1"; width = 15},/turf/simulated/floor/plasteel/shuttle,/area/shuttle/arrival)
"je" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
-"jf" = (/obj/structure/closet/crate,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
+"jf" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"jg" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/wall,/area/hallway/primary/central)
"jh" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/closet/jcloset,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/janitor)
"ji" = (/turf/simulated/floor/fancy/carpet{icon_state = "carpetnoconnect"},/area/hallway/primary/central)
@@ -489,11 +489,11 @@
"ju" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/central)
"jv" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "purple"; dir = 4},/area/hallway/primary/central)
"jw" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/medical/research{name = "Research Division"})
-"jx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/sink{pixel_y = 24},/obj/machinery/door/firedoor/border_only{dir = 8; name = "hazard door west"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
+"jx" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
"jy" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/shower{pixel_y = 18},/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 1},/area/medical/research{name = "Research Division"})
"jz" = (/obj/structure/sink{pixel_y = 24},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 5},/area/medical/research{name = "Research Division"})
"jA" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/turf/simulated/wall,/area/medical/research{name = "Research Division"})
-"jB" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/firedoor/border_only{dir = 8; name = "hazard door west"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"})
+"jB" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/poddoor/preopen{id = "Biohazard"; name = "biohazard blast door"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"})
"jC" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
"jD" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 2},/area/medical/research{name = "Research Division"})
"jE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 10; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
@@ -508,14 +508,14 @@
"jN" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/wall,/area/quartermaster/storage)
"jO" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/hallway/primary/central)
"jP" = (/obj/machinery/door/window/eastleft,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/hallway/primary/central)
-"jQ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1},/obj/machinery/door/firedoor/border_only{dir = 8; name = "hazard door west"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"jQ" = (/obj/machinery/door/firedoor/heavy,/obj/machinery/door/airlock/research{name = "Toxins Lab"; req_access_txt = "7"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"jR" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"jS" = (/obj/structure/grille,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/ai_monitored/storage/eva)
-"jT" = (/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"jT" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"},/area/janitor)
"jU" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"jV" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/table/reinforced,/obj/item/device/transfer_valve{pixel_x = -5},/obj/item/device/transfer_valve{pixel_x = 0},/obj/item/device/transfer_valve{pixel_x = 5},/obj/item/device/transfer_valve{pixel_x = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"jW" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"jX" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/firedoor/border_only{dir = 8; name = "hazard door west"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"})
+"jW" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"jX" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
"jY" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
"jZ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"ka" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
@@ -542,11 +542,11 @@
"kv" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"kw" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "purple"; dir = 4},/area/hallway/primary/central)
"kx" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/medical/research{name = "Research Division"})
-"ky" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/obj/machinery/door/firedoor/border_only{dir = 8; name = "hazard door west"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
+"ky" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/medical/medbay)
"kz" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/closet/firecloset,/obj/machinery/light/small,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
"kA" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 1},/obj/structure/closet/firecloset,/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
"kB" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/medical/research{name = "Research Division"})
-"kC" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/firedoor/border_only{dir = 8; name = "hazard door west"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"})
+"kC" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/medical/medbay)
"kD" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
"kE" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 1},/area/medical/research{name = "Research Division"})
"kF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
@@ -574,7 +574,7 @@
"lb" = (/obj/machinery/bookbinder,/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/hallway/primary/central)
"lc" = (/obj/machinery/libraryscanner,/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/hallway/primary/central)
"ld" = (/obj/structure/table/wood,/obj/machinery/computer/libraryconsole{pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 6},/area/hallway/primary/central)
-"le" = (/obj/machinery/door/airlock/research{name = "Toxins Lab"; req_access_txt = "7"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"le" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"lf" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"lg" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"lh" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'BOMB RANGE"; name = "BOMB RANGE"},/turf/simulated/wall,/area/medical/research{name = "Research Division"})
@@ -771,7 +771,7 @@
"oQ" = (/obj/structure/closet/crate/bin,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"oR" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/ai_monitored/storage/eva)
"oS" = (/obj/machinery/door/airlock/maintenance{name = "Medbay Maintenance"; req_access_txt = "45"},/turf/simulated/floor/plating,/area/medical/medbay)
-"oT" = (/obj/machinery/door/firedoor/border_only{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/medical/medbay)
+"oT" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Custodial Closet"; req_access_txt = "26"},/turf/simulated/floor/plasteel,/area/janitor)
"oU" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/obj/machinery/newscaster{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"oV" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"oW" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
@@ -793,7 +793,7 @@
"pm" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"pn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel,/area/janitor)
"po" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/janitor)
-"pp" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"},/area/janitor)
+"pp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "E.V.A."; req_access_txt = "18"},/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva)
"pq" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/airlock/maintenance{name = "Custodial Maintenance"; req_access_txt = "26"},/turf/simulated/floor/plating,/area/janitor)
"pr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plating,/area/hallway/primary/central)
"ps" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
@@ -825,51 +825,51 @@
"pS" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 8},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/exit)
"pT" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/janitorialcart,/obj/item/weapon/mop,/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/janitor)
"pU" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/requests_console{department = "Janitorial"; departmentType = 1; pixel_y = -29},/turf/simulated/floor/plasteel,/area/janitor)
-"pV" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plasteel,/area/janitor)
+"pV" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyer"; name = "Medbay"; req_access_txt = "5"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"pW" = (/obj/structure/closet/crate/bin,/turf/simulated/floor/plasteel,/area/janitor)
"pX" = (/obj/machinery/camera/autoname{dir = 8},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"pY" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/wall/r_wall,/area/ai_monitored/storage/eva)
-"pZ" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva)
-"qa" = (/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva)
-"qb" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"pZ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyer"; name = "Medbay"; req_access_txt = "5"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
+"qa" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/sign/nosmoking_2{pixel_x = 28},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"},/area/medical/medbay)
+"qb" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre"; req_access_txt = "45"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"qc" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/wall/r_wall,/area/ai_monitored/storage/eva)
"qd" = (/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/hallway/primary/central)
"qe" = (/obj/machinery/shower{icon_state = "shower"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/hallway/primary/central)
"qf" = (/obj/structure/stool/bed/roller,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"qg" = (/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyer"; name = "Medbay Exit Button"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -26},/obj/structure/stool/bed/roller,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"qh" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreen"},/area/medical/medbay)
-"qi" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreen"},/area/medical/medbay)
-"qj" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
+"qh" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medbay"; req_access_txt = "5"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
+"qi" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Diner"},/turf/simulated/floor/plasteel,/area/crew_quarters/bar)
+"qj" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Diner"},/turf/simulated/floor/plasteel,/area/crew_quarters/bar)
"qk" = (/obj/machinery/requests_console{announcementConsole = 0; department = "Medbay"; departmentType = 1; name = "Medbay RC"; pixel_x = 0; pixel_y = -30; pixel_z = 0},/obj/structure/closet/crate/bin,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"ql" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"qm" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"qn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/sign/nosmoking_2{pixel_x = 28},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreencorner"},/area/medical/medbay)
+"qn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (WEST)"; icon_state = "whitebluecorner"; dir = 8},/area/medical/medbay)
"qo" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/medical/medbay)
-"qp" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreencorner"},/area/medical/medbay)
+"qp" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 1; icon_state = "comfychair"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/exit)
"qq" = (/obj/machinery/computer/operating,/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 1},/area/medical/medbay)
"qr" = (/obj/machinery/camera/autoname{dir = 8},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"},/area/medical/medbay)
"qs" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "escape"; dir = 10},/area/hallway/secondary/exit)
"qt" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
-"qu" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 1; icon_state = "comfychair_beige"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/exit)
+"qu" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"},/area/medical/medbay)
"qv" = (/obj/structure/closet/crate/bin,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/exit)
-"qw" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock{name = "Custodial Closet"; req_access_txt = "26"},/turf/simulated/floor/plasteel,/area/janitor)
+"qw" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteyellow"},/area/medical/medbay)
"qx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/hallway/primary/central)
"qy" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
-"qz" = (/obj/machinery/door/airlock/glass_command{name = "E.V.A."; req_access_txt = "18"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva)
+"qz" = (/obj/structure/table/reinforced,/obj/machinery/door/window/eastright{dir = 2; name = "Chemistry Desk"; req_access_txt = "33"},/obj/item/clothing/glasses/science,/obj/machinery/door/firedoor/heavy,/turf/simulated/floor/plating,/area/medical/medbay)
"qA" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"qB" = (/obj/machinery/door/airlock{name = "Public Toilets"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/hallway/primary/central)
"qC" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/hallway/primary/central)
"qD" = (/obj/structure/stool/bed/chair,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"qE" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"qF" = (/obj/structure/sign/bluecross,/turf/simulated/wall,/area/medical/medbay)
-"qG" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyer"; name = "Medbay"; req_access_txt = "5"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"qH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyer"; name = "Medbay"; req_access_txt = "5"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
+"qG" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"},/area/medical/medbay)
+"qH" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Cryo"; req_access_txt = "45"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"qI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/medbay)
"qJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/medbay)
"qK" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/camera/autoname{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"qL" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "hazard door east"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreen"},/area/medical/medbay)
-"qM" = (/obj/machinery/door/airlock/medical{name = "Operating Theatre"; req_access_txt = "45"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"qN" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreen"},/area/medical/medbay)
+"qL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
+"qM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "Head of Personnel Office"; req_access = null; req_access_txt = "57"},/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
+"qN" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/medbay)
"qO" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"qP" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1},/obj/structure/table,/obj/item/stack/packageWrap,/obj/item/weapon/hand_labeler,/obj/item/device/radio/headset/headset_med,/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_y = 25},/obj/machinery/camera/autoname,/turf/simulated/floor/plasteel{tag = "icon-whiteyellowcorner"; icon_state = "whiteyellowcorner"; dir = 2},/area/medical/medbay)
"qQ" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
@@ -889,15 +889,15 @@
"re" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 1},/area/hallway/primary/central)
"rf" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"rg" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/medical/medbay)
-"rh" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/medbay)
-"ri" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/medbay)
+"rh" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/medical/medbay)
+"ri" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/medical/medbay)
"rj" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/drinks/britcup{desc = "Kingston's personal cup."},/obj/machinery/camera/autoname,/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"rk" = (/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyer"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = -26; req_access_txt = "5"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreen"},/area/medical/medbay)
+"rk" = (/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyer"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = -26; req_access_txt = "5"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/medbay)
"rl" = (/obj/machinery/computer/med_data,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"rm" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/turf/simulated/floor/plating,/area/medical/medbay)
-"rn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor/border_only{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"ro" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreencorner"},/area/medical/medbay)
-"rp" = (/obj/structure/closet/secure_closet/medical2,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreencorner"},/area/medical/medbay)
+"rn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plasteel{tag = "icon-whiteyellow (WEST)"; icon_state = "whiteyellow"; dir = 8},/area/medical/medbay)
+"ro" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (EAST)"; icon_state = "whitebluecorner"; dir = 4},/area/medical/medbay)
+"rp" = (/obj/structure/closet/secure_closet/medical2,/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (NORTH)"; icon_state = "whitebluecorner"; dir = 1},/area/medical/medbay)
"rq" = (/obj/structure/table,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"rr" = (/obj/machinery/vending/wallmed{pixel_y = -28},/obj/structure/table,/obj/item/weapon/storage/box/syringes,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"rs" = (/obj/machinery/computer/pandemic,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
@@ -918,8 +918,8 @@
"rH" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/medbay)
"rI" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/medical/medbay)
"rJ" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/white,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"rK" = (/obj/structure/stool/bed/chair/office/light{dir = 8},/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreen"},/area/medical/medbay)
-"rL" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medbay"; req_access_txt = "5"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
+"rK" = (/obj/structure/stool/bed/chair/office/light{dir = 8},/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/medbay)
+"rL" = (/obj/structure/table/reinforced,/obj/machinery/door/window/eastright{dir = 8; name = "Chemistry Desk"; req_access_txt = "33"},/obj/machinery/door/firedoor/heavy,/turf/simulated/floor/plating,/area/medical/medbay)
"rM" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"rN" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "L2"; dir = 4},/area/hallway/secondary/exit)
"rO" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "L4"; dir = 4},/area/hallway/secondary/exit)
@@ -935,9 +935,9 @@
"rY" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/medical/medbay)
"rZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"sa" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/structure/sign/nosmoking_2{pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"sb" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreen"},/area/medical/medbay)
+"sb" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/medbay)
"sc" = (/obj/machinery/vending/medical{pixel_x = -2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"sd" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
+"sd" = (/obj/machinery/chem_heater,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"se" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/crew_quarters/bar)
"sf" = (/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 7; pixel_y = 1},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 0; pixel_y = 0},/obj/item/weapon/wrench{pixel_x = 5; pixel_y = -5},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"sg" = (/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 1},/area/medical/medbay)
@@ -957,13 +957,13 @@
"su" = (/turf/simulated/wall,/area/crew_quarters/bar)
"sv" = (/obj/structure/sign/maltesefalcon/left,/turf/simulated/wall,/area/crew_quarters/bar)
"sw" = (/obj/structure/sign/maltesefalcon/right,/turf/simulated/wall,/area/crew_quarters/bar)
-"sx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/glass{name = "Diner"},/turf/simulated/floor/plasteel,/area/crew_quarters/bar)
+"sx" = (/turf/simulated/floor/plasteel{tag = "icon-whiteyellow (WEST)"; icon_state = "whiteyellow"; dir = 8},/area/medical/medbay)
"sy" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/hallway/secondary/entry)
-"sz" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/airlock/glass{name = "Diner"},/turf/simulated/floor/plasteel,/area/crew_quarters/bar)
+"sz" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"},/area/medical/medbay)
"sA" = (/obj/machinery/light/small,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/bar)
"sB" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"sC" = (/obj/structure/sign/chemistry,/turf/simulated/wall,/area/medical/medbay)
-"sD" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteyellow"},/area/medical/medbay)
+"sD" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Genetics"; req_access_txt = "45"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"sE" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"sF" = (/obj/machinery/telecomms/receiver/preset_left/ministation,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer)
"sG" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"},/area/medical/medbay)
@@ -990,22 +990,22 @@
"tb" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"tc" = (/obj/structure/stool/bed/chair,/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"td" = (/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"te" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"tf" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"tg" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
+"te" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteyellow (WEST)"; icon_state = "whiteyellow"; dir = 8},/area/medical/medbay)
+"tf" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/firedoor/heavy,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Chemistry Lab"; req_access_txt = "5; 33"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
+"tg" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteyellowcorner"},/area/medical/medbay)
"th" = (/obj/structure/closet/crate/bin,/obj/structure/noticeboard{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"ti" = (/obj/machinery/vending/boozeomat,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/crew_quarters/bar)
"tj" = (/obj/structure/table,/obj/item/weapon/book/manual/barman_recipes,/obj/item/stack/packageWrap,/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/crew_quarters/bar)
"tk" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/engine/engineering)
"tl" = (/obj/structure/table,/obj/machinery/door/window/southleft{layer = 3.1},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"tm" = (/obj/structure/table,/obj/machinery/door/window/southright{layer = 3.1},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
-"tn" = (/obj/structure/table/reinforced,/obj/machinery/door/window/eastright{dir = 2; name = "Chemistry Desk"; req_access_txt = "33"},/obj/item/clothing/glasses/science,/turf/simulated/floor/plating,/area/medical/medbay)
+"tn" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"to" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/structure/table,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/syringes,/obj/item/weapon/storage/pill_bottle/epinephrine{pixel_x = 5; pixel_y = -2},/obj/item/weapon/storage/pill_bottle/epinephrine{pixel_x = 5; pixel_y = -2},/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"tp" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/obj/machinery/door_control{desc = "A remote control switch for the genetics doors."; id = "GeneticsDoor"; name = "Genetics Exit Button"; normaldoorcontrol = 1; pixel_x = 8; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/medbay)
"tq" = (/obj/machinery/smartfridge/chemistry,/turf/simulated/wall,/area/medical/medbay)
"tr" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{tag = "icon-whiteyellowcorner (WEST)"; icon_state = "whiteyellowcorner"; dir = 8},/area/medical/medbay)
-"ts" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/obj/machinery/door/firedoor/border_only{dir = 4; name = "hazard door east"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"},/area/medical/medbay)
-"tt" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Cryo"; req_access_txt = "45"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
+"ts" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medbay Storage"; req_access_txt = "45"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
+"tt" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Bar Storage"; req_access_txt = "25"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"tu" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/light,/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
"tv" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"tw" = (/obj/machinery/vending/wallmed{pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
@@ -1014,8 +1014,8 @@
"tz" = (/obj/structure/grille,/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating/airless,/area/engine/engineering)
"tA" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit)
"tB" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
-"tC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/airlock/command{name = "Head of Personnel Office"; req_access = null; req_access_txt = "57"},/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
-"tD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor/border_only{dir = 8},/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
+"tC" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Bar Storage"; req_access_txt = "25"},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/bar)
+"tD" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/brute{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/brute{pixel_x = -2; pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"tE" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
"tF" = (/obj/machinery/computer/card,/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
"tG" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Head of Personnel"},/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
@@ -1042,8 +1042,8 @@
"ub" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/effect/landmark/start{name = "Chemist"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"uc" = (/obj/machinery/chem_master,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"ud" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/effect/landmark/start{name = "Chemist"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellow"},/area/medical/medbay)
-"ue" = (/obj/structure/table/reinforced,/obj/machinery/door/window/eastright{dir = 8; name = "Chemistry Desk"; req_access_txt = "33"},/turf/simulated/floor/plating,/area/medical/medbay)
-"uf" = (/obj/machinery/door/firedoor/border_only{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plasteel{tag = "icon-whiteyellow (WEST)"; icon_state = "whiteyellow"; dir = 8},/area/medical/medbay)
+"ue" = (/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/bar)
+"uf" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Frozen Storage"; req_access_txt = "25"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/bar)
"ug" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/obj/machinery/camera/autoname{dir = 8},/obj/structure/sign/nosmoking_2{pixel_x = 28},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"},/area/medical/medbay)
"uh" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/tcommsat/computer)
"ui" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/tcommsat/computer)
@@ -1070,9 +1070,9 @@
"uD" = (/obj/machinery/hydroponics/soil,/turf/simulated/floor/plasteel{icon_state = "green"; dir = 1},/area/hallway/primary/central)
"uE" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"uF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellow"},/area/medical/medbay)
-"uG" = (/obj/machinery/door/firedoor/border_only{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-whiteyellow (WEST)"; icon_state = "whiteyellow"; dir = 8},/area/medical/medbay)
-"uH" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 4; name = "hazard door east"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"},/area/medical/medbay)
-"uI" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Genetics"; req_access_txt = "45"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
+"uG" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"uH" = (/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"uI" = (/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 12; id = "ferry_home"; name = "station"; turf_type = /turf/space; width = 5},/turf/simulated/floor/plating/airless,/area/space)
"uJ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"uK" = (/obj/machinery/vending/wallmed{pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"uL" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
@@ -1083,7 +1083,7 @@
"uQ" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/engine/gravity_generator)
"uR" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/engine/gravity_generator)
"uS" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/closet/secure_closet/hop,/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
-"uT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
+"uT" = (/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_y = 25},/obj/structure/closet/radiation,/turf/simulated/floor/plasteel,/area/engine/engineering)
"uU" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"uV" = (/obj/structure/kitchenspike,/obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/bar)
"uW" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
@@ -1096,8 +1096,8 @@
"vd" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"ve" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"vf" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellow"},/area/medical/medbay)
-"vg" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Chemistry Lab"; req_access_txt = "5; 33"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"vh" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-whiteyellow (WEST)"; icon_state = "whiteyellow"; dir = 8},/area/medical/medbay)
+"vg" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "yellow"; dir = 1},/area/engine/engineering)
+"vh" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{name = "Engineering"; req_access_txt = "10"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"vi" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"vj" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (EAST)"; icon_state = "whitebluecorner"; dir = 4},/area/medical/medbay)
"vk" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (NORTH)"; icon_state = "whitebluecorner"; dir = 1},/area/medical/medbay)
@@ -1126,9 +1126,9 @@
"vH" = (/obj/structure/table,/obj/item/weapon/screwdriver{pixel_x = -2; pixel_y = 6},/obj/item/stack/sheet/mineral/plasma{layer = 2.9},/obj/item/stack/sheet/mineral/plasma{layer = 2.9},/obj/item/device/radio/headset/headset_med,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"vI" = (/obj/structure/closet/secure_closet/chemical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"vJ" = (/obj/structure/closet/wardrobe/chemistry_white,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellowcorner"},/area/medical/medbay)
-"vK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteyellowcorner"},/area/medical/medbay)
-"vL" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"vM" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
+"vK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_y = 25},/obj/structure/closet/secure_closet/engineering_personal,/turf/simulated/floor/plasteel,/area/engine/engineering)
+"vL" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/machinery/light/small{dir = 8},/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/plasteel{dir = 9; icon_state = "yellow"},/area/engine/engineering)
+"vM" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/turf/simulated/floor/plasteel{icon_state = "yellow"; dir = 5},/area/engine/engineering)
"vN" = (/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"vO" = (/obj/machinery/dna_scannernew,/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 1},/area/medical/medbay)
"vP" = (/obj/machinery/light,/obj/machinery/computer/cloning,/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 1},/area/medical/medbay)
@@ -1160,7 +1160,7 @@
"wp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/medbay)
"wq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/medical/medbay)
"wr" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/medical/medbay)
-"ws" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medbay Storage"; req_access_txt = "45"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
+"ws" = (/obj/structure/closet/secure_closet/engineering_personal,/turf/simulated/floor/plasteel,/area/engine/engineering)
"wt" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/medical/medbay)
"wu" = (/turf/simulated/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/arrival)
"wv" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel/shuttle,/area/shuttle/arrival)
@@ -1175,10 +1175,10 @@
"wE" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plating,/area/hallway/primary/central)
"wF" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/hallway/primary/central)
"wG" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/crew_quarters/bar)
-"wH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock{name = "Bar Storage"; req_access_txt = "25"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"wH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor/plasteel,/area/engine/engineering)
"wI" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/crew_quarters/bar)
"wJ" = (/obj/machinery/computer/security/telescreen/entertainment,/turf/simulated/wall,/area/crew_quarters/bar)
-"wK" = (/obj/machinery/door/airlock{name = "Bar Storage"; req_access_txt = "25"},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/bar)
+"wK" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/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/engineering)
"wL" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/hallway/primary/central)
"wM" = (/obj/machinery/seed_extractor,/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/hallway/primary/central)
"wN" = (/obj/machinery/biogenerator,/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/hallway/primary/central)
@@ -1187,7 +1187,7 @@
"wQ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 1},/area/medical/medbay)
"wR" = (/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 1},/area/medical/medbay)
"wS" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 1},/area/medical/medbay)
-"wT" = (/obj/structure/table,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/mask/muzzle,/obj/item/weapon/gun/syringe,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
+"wT" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/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/engineering)
"wU" = (/turf/simulated/floor/plasteel/shuttle,/turf/simulated/wall/shuttle{icon_state = "swall_f10"; dir = 2},/area/shuttle/arrival)
"wV" = (/turf/simulated/wall/shuttle{icon_state = "swall13"; dir = 2},/area/shuttle/arrival)
"wW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/hallway/primary/central)
@@ -1196,18 +1196,18 @@
"wZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/obj/machinery/meter{use_power = 0},/turf/simulated/floor/plating{icon_state = "warnplatecorner"; dir = 1},/area/hallway/primary/central)
"xa" = (/obj/structure/closet/crate{desc = "It's a storage unit for kitchen clothes and equipment."; name = "Kitchen Crate"},/obj/item/clothing/head/chefhat,/obj/item/clothing/under/rank/chef,/obj/item/weapon/storage/box/mousetraps{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/box/mousetraps,/obj/item/clothing/under/waiter,/obj/item/clothing/under/waiter,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/bar)
"xb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/camera/autoname,/mob/living/simple_animal/mouse/brown/Tom,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/bar)
-"xc" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/bar)
-"xd" = (/obj/machinery/door/airlock{name = "Frozen Storage"; req_access_txt = "25"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/bar)
+"xc" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/engine/engineering)
+"xd" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/engine/engineering)
"xe" = (/obj/structure/sink/kitchen{pixel_y = 28},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"xf" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"xf" = (/obj/machinery/pipedispenser/disposal,/turf/simulated/floor/plasteel,/area/engine/engineering)
"xg" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/vending/dinnerware,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"xh" = (/obj/machinery/reagentgrinder,/obj/structure/table/wood,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"xi" = (/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/obj/structure/table/wood,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"xj" = (/obj/structure/closet/crate/bin,/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"xk" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"xk" = (/obj/machinery/suit_storage_unit/engine,/turf/simulated/floor/plasteel,/area/engine/engineering)
"xl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/medical/medbay)
"xm" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/fire{pixel_x = -2; pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"xn" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor/plasteel{icon_state = "yellow"; dir = 5},/area/engine/engineering)
+"xn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/engine/engineering)
"xo" = (/obj/machinery/atmospherics/pipe/simple/cyan/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engine/engineering)
"xp" = (/obj/structure/closet/secure_closet/medical3,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"xq" = (/turf/simulated/wall/shuttle{icon_state = "swall_s5"; dir = 2},/area/shuttle/arrival)
@@ -1244,7 +1244,7 @@
"xV" = (/obj/machinery/camera/autoname{dir = 1},/obj/structure/table/wood,/obj/item/weapon/book/manual/chef_recipes{pixel_y = 5},/obj/item/weapon/reagent_containers/food/condiment/enzyme,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"xW" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"xX" = (/obj/machinery/atmospherics/pipe/simple/yellow/visible{tag = "icon-intact (NORTH)"; icon_state = "intact"; dir = 1},/turf/simulated/floor/plating,/area/engine/engineering)
-"xY" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"xY" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "yellow"},/area/engine/engineering)
"xZ" = (/obj/structure/table,/obj/item/weapon/storage/belt/medical{pixel_x = 0; pixel_y = 2},/obj/item/weapon/storage/belt/medical{pixel_x = 0; pixel_y = 2},/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"ya" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = 7; pixel_y = -3},/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = -4; pixel_y = -3},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 3; pixel_y = -2},/obj/item/weapon/reagent_containers/glass/bottle/morphine,/obj/item/weapon/reagent_containers/glass/bottle/toxin{pixel_x = 4; pixel_y = 2},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 5; pixel_y = -2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"yb" = (/obj/structure/table,/obj/machinery/light,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/tie/stethoscope,/obj/item/weapon/reagent_containers/hypospray,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
@@ -1285,7 +1285,7 @@
"yK" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plasteel,/area/engine/engineering)
"yL" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel,/area/engine/engineering)
"yM" = (/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"yN" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/turf/simulated/floor/plasteel{icon_state = "yellow"; dir = 1},/area/engine/engineering)
+"yN" = (/obj/machinery/pipedispenser/disposal/transit_tube,/turf/simulated/floor/plasteel,/area/engine/engineering)
"yO" = (/obj/structure/table,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light{dir = 1},/obj/machinery/cell_charger,/turf/simulated/floor/plasteel,/area/engine/engineering)
"yP" = (/obj/structure/table,/obj/machinery/alarm{pixel_y = 23},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/clothing/gloves/color/yellow,/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/turf/simulated/floor/plasteel,/area/engine/engineering)
"yQ" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/camera/autoname,/obj/machinery/power/smes/engineering,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
@@ -1348,9 +1348,9 @@
"zV" = (/obj/machinery/vending/tool,/turf/simulated/floor/plasteel,/area/engine/engineering)
"zW" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/wall/r_wall,/area/engine/engineering)
"zX" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/engine/engineering)
-"zY" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/airlock/engineering{name = "Engineering"; req_access_txt = "10"},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"zY" = (/obj/machinery/door/firedoor/heavy,/turf/simulated/floor/plasteel,/area/engine/engineering)
"zZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/engine/engineering)
-"Aa" = (/obj/machinery/pipedispenser/disposal,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"Aa" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor/heavy,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Ab" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Ac" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering)
"Ad" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
@@ -1359,22 +1359,18 @@
"Ag" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Ah" = (/obj/machinery/vending/engivend,/turf/simulated/floor/plasteel,/area/engine/engineering)
"Ai" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/engine/engineering)
-"Aj" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/machinery/light/small{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/plasteel{dir = 9; icon_state = "yellow"},/area/engine/engineering)
-"Ak" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor/plasteel{icon_state = "yellow"; dir = 1},/area/engine/engineering)
+"Aj" = (/obj/structure/grille,/obj/structure/lattice,/turf/space,/area/engine/engineering)
+"Ak" = (/obj/machinery/atmospherics/unary/tank/air{dir = 8; icon_state = "grey"},/turf/simulated/floor/plating,/area/tcommsat/computer)
"Al" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/yellow/visible{tag = "icon-intact (NORTH)"; icon_state = "intact"; dir = 1},/turf/simulated/floor/plating,/area/engine/engineering)
"Am" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/engine/engineering)
"An" = (/obj/machinery/pipedispenser,/turf/simulated/floor/plasteel,/area/engine/engineering)
"Ao" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel,/area/engine/engineering)
"Ap" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/gloves/color/black,/obj/item/weapon/extinguisher{pixel_x = 8},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"Aq" = (/obj/structure/closet/secure_closet/engineering_personal,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/engine/engineering)
+"Aq" = (/obj/machinery/suit_storage_unit/atmos,/turf/simulated/floor/plasteel,/area/engine/engineering)
"Ar" = (/obj/machinery/power/port_gen/pacman,/turf/simulated/floor/plasteel,/area/engine/engineering)
"As" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/floor/plasteel,/area/engine/engineering)
"At" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/engine/engineering)
-"Au" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"Av" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Aw" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"Ax" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"Ay" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 8},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Az" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/engine/engineering)
"AA" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/engine/engineering)
"AB" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor/plasteel,/area/engine/engineering)
@@ -1389,10 +1385,8 @@
"AK" = (/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"AL" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/engine/engineering)
"AM" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"AN" = (/obj/structure/closet/radiation,/turf/simulated/floor/plasteel,/area/engine/engineering)
"AO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "yellow"; dir = 1},/area/engine/engineering)
"AP" = (/obj/machinery/requests_console{announcementConsole = 0; department = "Engineering"; departmentType = 4; name = "Engineering RC"; pixel_y = 30},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"AQ" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/space/hardsuit,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit,/turf/simulated/floor/plasteel,/area/engine/engineering)
"AR" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
"AS" = (/obj/machinery/atmospherics/unary/portables_connector/visible,/turf/simulated/floor/plating,/area/engine/engineering)
"AT" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/portables_connector/visible,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engine/engineering)
@@ -1404,8 +1398,6 @@
"AZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Ba" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/camera/autoname,/turf/simulated/floor/plasteel,/area/engine/engineering)
"Bb" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/cyan/visible{tag = "icon-intact (NORTH)"; icon_state = "intact"; dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engine/engineering)
-"Bc" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"Bd" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/engine/engineering)
"Be" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/engine/engineering)
"Bf" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/yellow/visible{tag = "icon-intact (NORTH)"; icon_state = "intact"; dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engine/engineering)
"Bg" = (/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_y = 25},/obj/machinery/atmospherics/unary/portables_connector/visible,/turf/simulated/floor/plating,/area/engine/engineering)
@@ -1413,8 +1405,6 @@
"Bi" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Bj" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/portables_connector/visible,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engine/engineering)
"Bk" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/engine/engineering)
-"Bl" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "yellow"},/area/engine/engineering)
-"Bm" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Bn" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/cyan/visible{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engine/engineering)
"Bo" = (/obj/structure/closet/crate{name = "solar pack crate"},/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/weapon/circuitboard/solar_control,/obj/item/weapon/tracker_electronics,/obj/item/weapon/paper/solar,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engine/engineering)
"Bp" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/engine/engineering)
@@ -1459,8 +1449,6 @@
"Cc" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/camera/autoname,/turf/simulated/floor/plasteel,/area/engine/engineering)
"Cd" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{tag = "icon-manifold (NORTH)"; icon_state = "manifold"; dir = 1},/turf/simulated/floor/plating,/area/engine/engineering)
"Ce" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"Cf" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"Cg" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Ch" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Ci" = (/obj/structure/transit_tube{icon_state = "N-SE"},/turf/space,/area/space)
"Cj" = (/obj/structure/transit_tube{icon_state = "D-SW"},/turf/space,/area/space)
@@ -1476,7 +1464,6 @@
"Ct" = (/obj/structure/table,/obj/item/stack/cable_coil,/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/turf/simulated/floor/plasteel,/area/engine/engineering)
"Cu" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/item/clothing/ears/earmuffs{pixel_x = -3; pixel_y = -2},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Cv" = (/obj/structure/table,/obj/item/stack/rods{amount = 50},/obj/item/device/analyzer,/turf/simulated/floor/plasteel,/area/engine/engineering)
-"Cw" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Cx" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Cy" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Cz" = (/obj/structure/table,/turf/simulated/floor/plasteel,/area/engine/engineering)
@@ -1537,12 +1524,10 @@
"DU" = (/obj/machinery/ignition_switch{id = "burnchamber"; pixel_x = 25},/turf/simulated/floor/plating,/area/engine/engineering)
"DW" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/turf/simulated/floor/engine/vacuum,/area/engine/engineering)
"DX" = (/obj/structure/transit_tube{icon_state = "N-S"},/obj/structure/lattice,/turf/space,/area/space)
-"DY" = (/obj/structure/grille,/turf/space,/area/engine/engineering)
"DZ" = (/obj/structure/lattice,/obj/structure/transit_tube{tag = "icon-N-S-Pass"; icon_state = "N-S-Pass"},/turf/space,/area/space)
"Ea" = (/turf/simulated/wall,/area/tcommsat/computer)
"Eb" = (/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/wall,/area/tcommsat/computer)
"Ec" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/tcommsat/computer)
-"Ed" = (/obj/machinery/atmospherics/unary/tank/air{icon_state = "intact"; dir = 8},/turf/simulated/floor/plating,/area/tcommsat/computer)
"Ee" = (/obj/structure/transit_tube{icon_state = "N-SE"},/obj/structure/lattice,/turf/space,/area/space)
"Ef" = (/obj/structure/transit_tube{icon_state = "D-SW"},/obj/structure/lattice,/turf/space,/area/space)
"Eg" = (/obj/machinery/door/airlock/external{name = "Telecomms Emergency Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/tcommsat/computer)
@@ -1663,7 +1648,6 @@
"GK" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/turf/simulated/wall/r_wall,/area/engine/gravity_generator)
"GL" = (/obj/machinery/door/airlock/highsecurity{name = "Gravity Generator Room"; req_access_txt = "19;23"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/gravity_generator)
"GN" = (/obj/structure/closet/radiation,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/tcommsat/computer)
-"GO" = (/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 12; id = "ferry_home"; name = "station"; turf_type = /turf/space; width = 5},/turf/simulated/floor/plating,/area/space)
"GP" = (/obj/machinery/telecomms/processor/preset_one,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer)
"GQ" = (/obj/machinery/telecomms/broadcaster/preset_left/ministation,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer)
"GR" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_s"; name = "south of station"; turf_type = /turf/simulated/floor/plating/snow; width = 18},/turf/space,/area/space)
@@ -1720,146 +1704,146 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadafadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadafadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaadadafadadadadadadadaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaadadadadadadadadaaaaadadadadaaaaaaaaaaadadadadadadadaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaadadadadafadadadaaaaaaadadadadadaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaadafadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaadadadadadadaaaaadadafadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadafadadaaaaaaaaaaaaaaadadadadaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaadadaaaaaaaaaaadaaaaaaadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaadadaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaadadadaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaadaaaaaaadadadafadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaadadafadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadaaaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadafadadaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadafadadadaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadafadadaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaadadafadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadaaaaaaaaacaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaadadadadadadadaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadafadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaadadadadadafadaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadaaaaaaaaaaaaaaaaaaaaaaadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadafadadadadaaaaaaadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadaaaaaaadadafadadadadadadaaaaaaadaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaadadadadadadadadadaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadaaaaaaadadafadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaadadadafadadaaaaaaaaadadaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaadadadadaaaaaaaaadadaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaadadafadadadadaaaaaaaaaaaaaaadadadaaaaaaaaaaadadaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadafadadadaaaaaaaaaaadadadadadadaaaaaaaaaaaaadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaadadafadadaaaaaaaaaaaaaaaaadaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadafadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadafadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaadadadadaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadafadaaaaadadadadadaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaadadafadaaaaaaadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadafadadaaaaaaadadadadaaaaaaadadadadadadadaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaadadadadaaaaaaadadadafadadaaaaaaaaadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaadadaaaaaaaaaaaaadadadadadaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaadadadadaaaaaaaaadadafadadaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadafadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaadadaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafbmafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbmafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafafafaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaafafbmafafafafafafafaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaafafafafafafafafaaaaafafafafaaaaaaaaaaafafafafafafafaaaaaaaaaaaaaaafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaaaaaafafafafbmafafafaaaaaaafafafafafaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaafbmafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaaaaaaaaaafafafafafafaaaaafafbmafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafbmafafaaaaaaaaaaaaaaafafafafaaaaaaaaaaafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaafafaaaaaaaaaaafaaaaaaafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaafafaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaafafafaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaafaaaaaaafafafbmafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaaaaaaaaaaaaaaaaaaaafafbmafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaaaaaaaaaaaafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafbmafafaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafbmafafafaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafbmafafaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaafafbmafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafaaaaaaaaacaaaaafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafafafafafafafaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafbmafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaaaaaafafafafafbmafaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafaaaaaaaaaaaaaaaaaaaaaaafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafbmafafafafaaaaaaafafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafafaaaaaaafafbmafafafafafafaaaaaaafaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaafafafafafafafafafaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafaaaaaaafafbmafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaafafafbmafafaaaaaaaaafafaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaaaaaaaaaaaafafafafaaaaaaaaafafaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaafafbmafafafafaaaaaaaaaaaaaaafafafaaaaaaaaaaafafaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafbmafafafaaaaaaaaaaafafafafafafaaaaaaaaaaaaafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaaaaaaaaaafafbmafafaaaaaaaaaaaaaaaaafaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbmafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbmafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaafafafafaaaaafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafbmafaaaaafafafafafaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaafafbmafaaaaaaafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafbmafafaaaaaaafafafafaaaaaaafafafafafafafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaafafafafaaaaaaafafafbmafafaaaaaaaaafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaafafaaaaaaaaaaaaafafafafafaaaaaaaaafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaafafafafaaaaaaaaafafbmafafaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbmafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaafafaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadaaaaaaaaaaaaaaaaaaadadadafadaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadafadadadadaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaahajaiaiaialakakakaLahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaahahanaoapaqarasatauavahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaahawaxayazaAaBaCaDayaEaFahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaahaGaHayayaIaJaKayaybnaMahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafaaaaaaaaaaaaaaaaaaafafafbmafaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafafaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafbmafafafafaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaafafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaahajaiaiaialakakakaLahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaahahanaoapaqarasatauavahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaahawaxayazaAaBaCaDayaEaFahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaahaGaHayayaIaJaKayaybnaMahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaahaNaOayayaPaQaRayayaSaTahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaahaUaOayayayaVaWaXaXaYaZahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamamaaamaaaaamamaaaaaaaaahahbaaybbbcbdbebfaybgahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaambhbibjbjbkbkamamamamaaaaaaamahblahahbmbIboahahbpahamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqbrbsbsbtbubvbvbwbvbvaaaabxbybxbzbAbBbCbDbEahbFbGbxbybxamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqbHbqbQbqbQbqbJbqbKbqaabLbMbNbMbObNahbPcgbRahbSbTbMbNbMbLamaaaaaaaaaaaaaaaaaaaaaaaabUbUbUbUbUbUbVbWbUbUbUbUbUbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqbXbYbZcabYcbccbqcdceamambxbxbxbOcfahbmelchahcibTbxbxcjckckckckaaaaaaaaaaaaaaaaaaaabUclcmcmcncocpcpcqcrcscscsbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqctbQcubQcvbQcwbqbKbqbxbxbxcxbNbObNbxcyczcAbxbSbTbNcBcjcCcDcEckckckckckaaaaaaaaaaambUcFcGcscHcIcpcpcJcKcscscLbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaambqcMcNcOcOcPcOcQcRcSbqbNbNbNcTcUcVcUcWcXcYcZcWdadbcUdccjdddedfdgdhdidjckamamamamamambUcscscsdkdlcpcpdmdncmcmdobUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamambqdpcScScScScSdqcSdrdsbNdtdudvdwdxdydwdzdAdBdCdDdEcjcjcjdFdedGdHdedIdJckaaaaaaaaaaambUbUbUbUdKbUdLdMbUbUbUbUbUbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamamamamambqdNcSdOcScSdPcSdOdQbqbqbqdRdSdTdUdVdWdXdYdZeaebecedeeefdeegeheiejekeHckaaaaaaaaaaaabUclcmcmemencpcpeoepeqeresetaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeuamamamamamamambqevewexeyezezezeAeBeCeDeEeFeGbQeIeJeKeLeMeNeOePeQeReSeSeSeTeUckckckckckaaaaaaaaaaambUcFcGcseVcIcpcpcpcpcpcpcpeWamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXamaaaaaaaaaaambJeZfafbfccScScSfdfebqffcSfbfgbQeIeJeKeLfjfkflebfmedfndedefofpfhfrfickamamamamamamambUcscscsftfucpcpcpcpfvcpcpfwamamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaabqfxcSfyfzfAfAfAfAfBfCfDfAfEfFfGfHfIfJeLfqfLcjfKfMckdededefofOhIdefQckamaaaaaaaaaaambUbUbUbUbUbUcpcpfSfRfTfUbUbUbUbUbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaabqcScSfbfccScScScSdrfVcScSfafNbQfXfXfXfYfZgacjgbgcgdgegfggghgifWgegjcjckckckckntntntgogpgqgrgsbUgtgugvbUbUgwbUgxgygzbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaagAgBcSfbfccScSgCcSdrfVcScScSdrgDfXfXfXeLfjgacjgEgFgFgGgHgIdegkckckckcjgKgLgMckgNgOgPgogQcpcpcpcpcpgRgSgTgUgVbUgWgXgYbUamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaagZhacShbhchdbqbqbqbqbqbqbqbqbqbqbxbxbxeLfjhecjcjhfdehghhhigFhjfhfrfscjhlhmhnckhofXhphqhrcpcpcphshthuhvhththwbUhxhyhxbUbUamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaabQhAcSfbfccSbqbNbNbNbNbNbNbNbNbNbNbxhBeLfjgahCcjhDhEhFdehGgehHfPdehJcjhKhLhMckhNfXhOgohPhQhRhShThUhVhWcpcphXbUgRhYhZiabUamamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaabQcScShbhcicbqbNbxbxbxbxbxbxbxbxidbxieeLfjgaifcjigihglijgmilimfWgegjcjgniogJckiqfXfXgoirhQisitiuiviwixiyiziAbUcpiBiCbUbUbUbUbUamamamamamamamamamamamamamamamamameYeYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaabQgBcSfbfccSbqiEdwiFiGbxiHiIiJiKiLbxbxiMiNiOiPcjcjcjcjcjcjcjcjcjcjcjcjhkiRibckiTfXiUgobUbUbUbUbUgviVbUbUbUbUbUcpiWcpiXbUiYiZjabLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahzjbiDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaxJgZhaewjehcjfbqbOjgiijijjjkjljljljmjneJfYdAjpjpjqjqjqjqjqjqjqjqjrjqjqjqjsjtjujqdzjqjvjwjxjyjzjAjBjCjDjEjFjEjGjHcpjIjJjKjLjMjLbUamamamamamamamamamamamamamamamamameYeYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaagAbJdRdSjNbqbqbOjObxbxbxjkjljljljljmjPikfjingafXfXfXfXfXfXfXfXfXfXfXfXfXfXgafXikiphpjTjQcpjRjWjXjYcpcpjZhththtkacpcpcpkbkckdkeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXeXkfkfkgkgkfkfkfkfkikjkkkkkkklkmkniGbxjkjlkojljlkpkqfXfjfXkrksksktkuksksksksksksksktkskskvkskskvkwkxkykzkAkBkCkDkEkFkFkFjUkHkIcpcpcpkJkckKkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamkfkMkNkNkOkPkQkfkRkSkTkTkUkVkWiijikXkYkZlalblcldeJfXfjfXbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxgogogogogogobUbUgvgwbUbUlebUbUbUbUbUlflgesbUlhlibUbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakgkgkglklllmlmlnlolplqlrbNcfbxbxbxbxbxbxbxbxbxbxbxbxbxlsfjfXbxcTcUcUcUcUcUcUcUcUcUcUltlulvgolwlwlwlxlycplzlAlBjVlDgRlElFlGlHgtgwbUbUbUamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaahaUaOayayayaVaWaXaXaYaZahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamamaaamaaaaamamaaaaaaaaahahbaaybbbcbdbebfaybgahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaambhbibjbjbkbkamamamamaaaaaaamahblahahbobIbCahahbpahamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqbrbsbsbtbubvbvbwbvbvaaaabxbybxbzbAbBbDbPbEahbFbGbxbybxamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqbHbqbQbqbQbqbJbqbKbqaabLbMbNbMbObNahbRchcgahbSbTbMbNbMbLamaaaaaaaaaaaaaaaaaaaaaaaabUbUbUbUbUbUbVbWbUbUbUbUbUbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqbXbYbZcabYcbccbqcdceamambxbxbxbOcfahboelbCahcibTbxbxcjckckckckaaaaaaaaaaaaaaaaaaaabUclcmcmcncocpcpcrcqcscscsbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqctbQcubQcvbQcwbqbKbqbxbxbxcxbNbObNbxcyczcAbxbSbTbNcBcjcCcDcEckckckckckaaaaaaaaaaambUcFcGcscHcIcpcpcJcKcscscLbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaambqcMcNcOcOcPcOcQcRcSbqbNbNbNcTcUcVcUcWcXcYcZcWdadbcUdccjdddedfdgdhdidjckamamamamamambUcscscscndkcpcpdmdlcmcmdobUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamambqdpcScScScScSdqcScSdsbNdtdudvdwdxdydwdzdAdBdCdDdEcjcjcjdFdedGdHdedIdJckaaaaaaaaaaambUbUbUbUdKbUdLdMbUbUbUbUbUbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamamamamambqdNcSdOcScSdPcSdOdQbqbqbqdRdSdTdUdVdWdXdYdZdrdnebeaeeefdeegeheiejekeHckaaaaaaaaaaaabUclcmcmecencpcpeoepeqeresetaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeuamamamamamamambqevewexeyezezezeAeBeCeDeEeFeGbQeIeJeKeLeMeNeOedemeReSeSeSeTeUckckckckckaaaaaaaaaaambUcFcGcsePcIcpcpcpcpcpcpcpeWamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXamaaaaaaaaaaambJeZfafbfccScScSfdfebqffcSfbfgbQeIeJeKeLfjfkeQdneVeafndedefofpfhfrfickamamamamamamambUcscscsecflcpcpcpcpfvcpcpfwamamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaabqfxcSfyfzfAfAfAfAfBfCfDfAfEfFfGfHfIfJeLfqfLcjfKfMckdededefofOfmdefQckamaaaaaaaaaaambUbUbUbUbUbUcpcpfSfRfTfUbUbUbUbUbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaabqcScSfbfccScScScScSftcScSfafNbQfXfXfXfYfZgacjgbgcgdgegfggghgifWgegjcjckckckckntntntgogpgqgrgsbUgtfugvbUbUgwbUgxfPgzbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaagAgBcSfbfccScSgCcScSftcScScScSfVfXfXfXeLfjgacjgEgFgFgGgHgIdegkckckckcjgKgLgMckgNgOgPgogucpcpcpcpcpcpgSgTgUgVbUgWgXgYbUamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaagZhacShbgDgybqbqbqbqbqbqbqbqbqbqbxbxbxeLfjhecjcjhfdehghhhigFhjfhfrfscjhlhmhnckhofXhpgRgQcpcpcphshthuhvhththwbUhxhdhxbUbUamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaabQhAcSfbfccSbqbNbNbNbNbNbNbNbNbNbNbxhBeLfjgahCcjhDhEhFdehGgehHhqdehJcjhKhLhMckhNfXhOgohrhQhRhShThUhVhWcpcphXbUcpiBhQiabUamamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaabQcScShbhyicbqbNbxbxbxbxbxbxbxbxidbxieeLfjgaifcjigihglijgmilimfWgegjcjgniogJckiqfXfXgoirhQisitiuivkIixiyiziAbUcpiBiCbUbUbUbUbUamamamamamamamamamamamamamamamamameYeYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaabQgBcSfbfccSbqiEdwiFiGbxiHiIiJiKiLbxbxiMiNiOiPcjcjcjcjcjcjcjcjcjcjcjcjhkhzibckiTfXiUgobUbUbUbUbUgvhIbUbUbUbUbUcpiWcpiXbUiYiZjabLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLhPiDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaxJgZhaewjehchYbqbOjgiijijjjkjljljljmjneJfYdAjpjpjqjqjqjqjqjqjqjqjrjqjqjqjsjtjujqdzjqjvjwhZjyjzjAiwjCjDjEjFjEjGjHcpjIjJjKjLjMjLbUamamamamamamamamamamamamamamamamameYeYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaagAbJdRdSjNbqbqbOjObxbxbxjkjljljljljmjPikfjingafXfXfXfXfXfXfXfXfXfXfXfXfXfXgafXikiphpiViRcpjRjfjbjYcpcpjZhththtkacpcpcpkbkckdkeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXeXkfkfkgkgkfkfkfkfkikjkkkkkkklkmkniGbxjkjlkojljlkpkqfXfjfXkrksksktkuksksksksksksksktkskskvkskskvkwkxjxkzkAkBjBkDkEkFkFkFjUkHkIcpcpcpkJkckKkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamkfkMkNkNkOkPkQkfkRkSkTkTkUkVkWiijikXkYkZlalblcldeJfXfjfXbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxgogogogogogobUbUgvgwbUbUjQbUbUbUbUbUlflgesbUlhlibUbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakgkgkglklllmlmlnlolplqlrbNcfbxbxbxbxbxbxbxbxbxbxbxbxbxlsfjfXbxcTcUcUcUcUcUcUcUcUcUcUltlulvgolwlwlwlxlycplzlAlBjVlDcplElFlGlHgtgwbUbUbUamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxKlIlJlIlklKlKlKlLlMlNdxlOkklPbxiQiQbxlRlSlTlUlVlWbNcTlXlYlZlYlXmambmbmbmbmbmbmbmbmbbNbSbNmcgomdmememflycpcpmghXcpcpcpcpkGmilCmjmhmlmkmoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakgkgkglklKlKlKmpmqkfmrlJlJmskkklmtmumvmwntmxntmybNmzbxfXfXfXbxbSmbmAmBmCmDmEmCmFmbmGmHcUmIgomemememflycpcpmgcpcpmJmKmLcpcphQmMmNmOmPmoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamkfmQlKlKmRmSmTmUmVmWlJbNbNbNbNbNbNbNmvmwmXbNcTmYbxfXfXfXbxbSmbmZnanbnbnbiSndmbnenfbNnggogogogogogonhninjnkmmncmnncnlnpnmmjnnmlnomoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamkgnulKlKnvmpnwkfnxnynznAnAnAnAnAnBnCnDdtbNnEbSnFbxfXfXfXbxbSmbnGnHnInbnJnKnLmbnMnNcUnOnPnQnRnSnTgogogonUkxkxkxkxkxkxkxkxkxnVgogogoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamkfmQlKlKnvmpnWkfnXnYnZnAjhobocodoejojobxogbNohoibxfXfXfXbxbSmbojoknbnbnbolommbonbNbNoonPopnqorororosotouovowoxoyozoAnPoBoCoDoEoFoGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakgkgkglklKlKnvmpmqkfkfkfkfnAoHoIoJoKoebxbxbxbNbNbSoLbxfXfXoMbxbSmbmboNjSoPkhoRmbmbbxbNbNlRoSoTnroVoVoVoWoXoYoVoVoVoZpapbnPpcpdpepfpgphaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalIlJlIlklKlKnvmpmqpipjpkplnAlQpnpopppqbNcTprprprmYbNbxfXfXpsbxnNptpuoNpvpwnsoRpypzbxbNbNpAnPpBpfpCpfpfpDpEpFpGpGpGpDpHoroupIpJpKpfpfnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakgkgkglkoapMpNpOpPpQpRpkpSnApTpUpVpWoebNbSbNdtlvlucxbxfXfXpXbxbNbNcxpYpZqaqbqcqdqebxbNbxbxnPnPnPnPqfqgqhqinPqjqjqkqlqmqnqoqpoZqqpfqrnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamkfqsqtlKnvmpmqququpkqvnAnAoeqwnAoebxqxbxbxbxbxbxbxfXfXfXbxbxbxbxmbofqzoOmbqBbxbxidbxoQqDqEhCnPqFnPqGqHnPqIqJnPqKpaqLqMqNqOoqpfpfoGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamkfkfkflKnvmpqQpMpMpMpMqRpMqSpOpMqTksqUfXqVfXqWqXlYlYlYlYlYlYqYlYlYqZrarbrcrdrejqjqjrjqrfjqjqjqjqrgrhrirjrkrlrmrnpHronPrprqrrrsrtphaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamameXrurvrwrxryrzrArBlmlmlmrDlmlmrErFcXcXcXrGfXfXpmfXipfXfXfXfXfXeLfXgafXfXfXfXfXfXfXfXfXfXfXfXrIpDpfrJrKpfrLrnparMnPnPnPnPnPnPnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamkfkfkflKrNrOrPrQrRrSrTrClKlKlKlKlKeLgafXfXrVfjfXfXeLfXgafXfXfXfXfXeLfXrWksksksksktksksrXkskskskurYrZpfsasbscrmsdqmoUnPsfsgshsisjnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakgsksllKlKmpmqlKlKlKlKnvsmsnsnsnsospsqsrsrsrqxbxbxiMssstsusvswsususxpxszsususususufXpLsBfXfXbxbxsCsDsDnPnPnPnPsEpHsGsHsIsJsKsLpfoGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakflKlKlKlKqyqAsOlKlKlKnvsrsrljljsRsSsTsUsVsWsXsYdwsZfXgasutatbtctdtetftgthsutitjsusseJtltmeJbxamnPrmtnnPtoqPtqtrpatsttrHpftvtwpfphaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakgtykglklKlKtAkgtykgkftBtCtDtEtFtGtHtItJtKtLtMtNtNtOkssBpxtdtQtRtStTtdtUtVtWsetYsufXfXfXfXtZbxaanPuaubucpaudueufoXugnPnPnPnPnPnPnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakglJkgujukulumkglJkgkfkfsrunuounupuqurusutsruubxuvfXfXfXpxtdtTuxtdtTtdtUtVuyuzuAsufXuBuCuDfXntaanPuEpfpfpauFrmuGpauHuItpuKuLpfuMoGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasyuOsykgkgkgkgsyuOsyamamsruSuTuntuununtXuWsruubxuXfXfXfXpxtdtTuYtdtTtdtUtVuZuzvasulsvbvbvbvcbxaanPvdpfpfvevfvgvhvivjsHvkpfvlpfpfphaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajcvmjdvmvmsPsPvmvmvqvpvramsrsrvtsrsrvuvvsrsqsruubxbxfXfXfXpxtdvxtRtStTtdvyvzvAvBvCvDfXuBuCuDvEntaanPvFvGvHvIvJqovKvLvMnPvNvOvPvQvRnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajcvpvmvsvSvSvUvTvWvVvXvUvSvYvZambxbNbSwbwcsrsrsrbGwduubNbxfXfXfXsuwewfwgwhwiwjwktVwlwmvCwnfXvbvbvbwobxamnPqIwpwpwqnPnPwrwswtnPnPnPnPnPnPnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavYwawvwuvSwwvSwwvSwwvSwwvSwxvZambxbNbSbNbxwAwBwCwDwEwFlPbxfXfXfXsusuwGsususuwHwIsuwJsuwKsufXwLwMwNwObxaaaaaaaaamamnPwPwQwRwSwTnPamamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasQvSvSvqvSwwvSwwwzwwvSwwvSwxvZambxbNbSbNbxbNwWwXwYwZnDbObxfXfXiUsuxaxbxcxdxexfxgxhxixjxksuidbxbxbxbxbxaaaaaaaaaaamxlxmuJpfuUxpxlamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakgkgkglklKlKnvmpmqkfkfkfkfnAoHoIoJoKoebxbxbxbNbNbSoLbxfXfXoMbxbSmbmboNjSoPkhoRmbmbbxbNbNlRoSrInroVoVoVoWoXoYoVoVoVoZpapbnPpcpdpepfpgphaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalIlJlIlklKlKnvmpmqpipjpkplnAlQpnpojTpqbNcTprprprmYbNbxfXfXpsbxnNptpuoNpvpwnsoRpypzbxbNbNpAnPpBpfpCpfpfpDpEpFpGpGpGpDpHoroupIpJpKpfpfnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakgkgkglkoapMpNpOpPpQpRpkpSnApTpUpopWoebNbSbNdtlvlucxbxfXfXpXbxbNbNcxpYjWpwjXqcqdqebxbNbxbxnPnPnPnPqfqgkykCnPleleqkqlqmqaqoqnoZqqpfqrnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamkfqsqtlKnvmpmqqpqppkqvnAnAoeoTnAoebxqxbxbxbxbxbxbxfXfXfXbxbxbxbxmbofppoOmbqBbxbxidbxoQqDqEhCnPqFnPpVpZnPqIqJnPqKpaquqbqNqOoqpfpfoGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamkfkfkflKnvmpqQpMpMpMpMqRpMqSpOpMqTksqUfXqVfXqWqXlYlYlYlYlYlYqYlYlYqZrarbrcrdrejqjqjrjqrfjqjqjqjqrgrhrirjrkrlrmpDpHronPrprqrrrsrtphaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamameXrurvrwrxryrzrArBlmlmlmrDlmlmrErFcXcXcXrGfXfXpmfXipfXfXfXfXfXeLfXgafXfXfXfXfXfXfXfXfXfXfXfXrIpDpfrJrKpfqhpDparMnPnPnPnPnPnPnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamkfkfkflKrNrOrPrQrRrSrTrClKlKlKlKlKeLgafXfXrVfjfXfXeLfXgafXfXfXfXfXeLfXrWksksksksktksksrXkskskskurYrZpfsasbscrmqlqmoUnPsfsgshsisjnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakgsksllKlKmpmqlKlKlKlKnvsmsnsnsnsospsqsrsrsrqxbxbxiMssstsusvswsusuqipxqjsususususufXpLsBfXfXbxbxsCqwqwnPnPnPnPsEpHsGsHsIsJsKsLpfoGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakflKlKlKlKqyqAsOlKlKlKnvsrsrljljsRsSsTsUsVsWsXsYdwsZfXgasutatbtctdtTtdtUthsutitjsusseJtltmeJbxamnPrmqznPtoqPtqtrpaqGqHrHpftvtwpfphaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakgtykglklKlKtAkgtykgkftBqMqLtEtFtGtHtItJtKtLtMtNtNtOkssBpxtdtQtRtStTtdtUtVtWsetYsufXfXfXfXtZbxaanPuaubucpaudrLrnoXugnPnPnPnPnPnPnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakglJkgujukulumkglJkgkfkfsrunuounupuqurusutsruubxuvfXfXfXpxtdtTuxtdtTtdtUtVuyuzuAsufXuBuCuDfXntaanPuEpfsdpauFrmsxpaszsDtpuKuLpfuMoGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasyuOsykgkgkgkgsyuOsyamamsruSuountuununtXuWsruubxuXfXfXfXpxtdtTuYtdtTtdtUtVuZuzvasulsvbvbvbvcbxaanPvdpfpfvevftftevivjsHvkpfvlpfpfphaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajcvmjdvmvmsPsPvmvmvqvpvramsrsrvtsrsrvuvvsrsqsruubxbxfXfXfXpxtdvxtRtStTtdvyvzvAvBvCvDfXuBuCuDvEntaanPvFvGvHvIvJqotgoVtnnPvNvOvPvQvRnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajcvpvmvsvSvSvUvTvWvVvXvUvSvYvZambxbNbSwbwcsrsrsrbGwduubNbxfXfXfXsuwewfwgwhwiwjwktVwlwmvCwnfXvbvbvbwobxamnPqIwpwpwqnPnPwrtswtnPnPnPnPnPnPnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavYwawvwuvSwwvSwwvSwwvSwwvSwxvZambxbNbSbNbxwAwBwCwDwEwFlPbxfXfXfXsusuwGsususuttwIsuwJsutCsufXwLwMwNwObxaaaaaaaaamamnPwPwQwRwStDnPamamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasQvSvSvqvSwwvSwwwzwwvSwwvSwxvZambxbNbSbNbxbNwWwXwYwZnDbObxfXfXiUsuxaxbueufxeuGxgxhxixjuHsuidbxbxbxbxbxaaaaaaaaaaamxlxmuJpfuUxpxlamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavYwUwvwuvSwwvSwwvSwwvSwwvSwxvZambxbNbSbNbxbNxrxsqCxsbTxubxfXfXfXsuxvxwxxxyxzxAxBxCxDxExFsubNbxamamaaaaaaaaaaaaaaaanPxGpfpfpfxHnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxqwVvmvsvSvSvSvSvSvSvSvSvSvYvZambxcxnNprprprxLbxxMbxbTbObxxNfXxOsuuVsAxRwIxSsMxUxVxWsNxYsubNbxbxbxamaaaaaaaaaaaaaanPnPxZyaybnPnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxqwVvmvsvSvSvSvSvSvSvSvSvSvYvZambxcxnNprprprxLbxxMbxbTbObxxNfXxOsuuVsAxRwIxSsMxUxVxWsNuHsubNbxbxbxamaaaaaaaaaaaaaanPnPxZyaybnPnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxqvmvmvmvmvmvmvmvmvmwVxIambxyddtmGbNbNxrbxvobxyfygtNksksksyhyiyjykylsusususususuymsubNbMbNbMbLamamamamamamamamnPqIwpwqnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabxbybxbxbxbxbxbNxrbxbxbxbNmsynyojqypyqyrysytpryuyvbNmubNbNbNbNbNbxbybxamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaambxbNbMcTprprywpryxprprprprpryylYlYlYyzmYyAyAyAyAyAyAyAyAyAyAyAbxbxamamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamGObMbNyByCyAyAyAyAyAyAyAyAyAyAyDyEfXyFyGyAyAyHyHyIyIyJyJyKyLyMyBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaameXeXyByNyOyPyRyQySyTyUyVyWyAyXikfXinyYyAyZyHyHyIyIyJyJyKzazbyByBamamzczczdzdzcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamuIbMbNyByCyAyAyAyAyAyAyAyAyAyAyDyEfXyFyGyAyAyHyHyIyIyJyJyKyLuTyBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaameXeXyBvgyOyPyRyQySyTyUyVyWyAyXikfXinyYyAyZyHyHyIyIyJyJyKzazbyByBamamzczczdzdzcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamtkzazfzazgzgzgzazavwziyAzjfXfXfXzkyAyZyHyHyIyIyJyJzlzazmzntkaaaazczozozozcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatkzazqzrzsztztzrzazuzvzwzxzyzzzAzByAzCzDzDzEzEzFzFzGzHzIzJtxzLzLtzwyzOzPzcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatkzazqzazRzSzSzTzTzUzazVzWzXzYzXzZAaAbAcAcAcAcAcAcAdAezmzntkaaaazczozozozcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayBzaAfAbAbAgzazazazszaAhAiAjAkxnAmAnzavwzazrzazrzazqzfzmyByBamamzczczczczcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayBAoApAqArAsAbAbAbAtAbAuAvAezaAwAxAyAzAAABACAzADAEAFAGAoyBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatkzazqzazRzSzSzTzTzUzazVzWzXvhzXzZvKAbAcAcAcAcAcAcAdAezmzntkaaaazczozozozcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayBzaAfAbAbAgzazazazszaAhAivLAVvMAmwszavwzazrzazrzazqzfzmyByBamamzczczczczcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayBAoAoApArAsAbAbwHAtAbAbwKAezaAwwTAzAzAAABACAzADAEAFAGAoyBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayByByByByBzqzayByBAHyByByBAIzaAJyByByBAKyByBzaALyByByByByBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaayBzqAMyBANAOAPAQyBtktktkyBAUzaAVAWyBAXALyBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaayBzqAMyBAWAOAPAUyBtktktkyBAUzaAVAWyBAXALyBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamamamyBzqAYyBzazRAZAZAZAZBazayMzazazazayBAIALyBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaayBtkyBBcBdtkzazazaBextxoBhxPxQBkzazazatkBlBmyBtkyBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaatkBozazqBptkzazfzaBqxTBsBtBuxXBwzavwzatkBxALByBztkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaatkBozazqBptkzazqzaBAyeycBDzezhBGzaALzatkBxALzaBHtkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaayBtkyBxcxdtkxfzazaBextxoBhxPxQBkzazaxktkxYxnyBtkyBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaatkBozazqBptkAnzfzaBqxTBsBtBuxXBwzavwAqtkBxALByBztkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaatkBozazqBptkyNzqzaBAyeycBDzezhBGzaALxktkBxALzaBHtkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaatkBozaAsAbBIBIBJBKBLzKzpBOzMzNBRzaBSBTBTAzBUBVBWtkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaayBtkyBzqzaBXyByByByBzQzQAKAlAlyByByByBCczaALyBtPyBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamamamyBCezfzazayLzaCfzKzpAVzMzNCgzazazazavwChyBCiCjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaayBAfCkAbAbAgzaCfzKzpBOzMzNCgzaClAzAzCmCnyBCoCpCqCqCqCrCqCqCqCqCsCjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamaaaaaayBCtCuCvyBAiyByBzQzQCwAlAlyByBAmyBCxCyCzyBamamamamamamamamamamCoCAamaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamamamyBCezfzazayLzazYzKzpAVzMzNzYzazazazavwChyBCiCjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaayBAfCkAbAbAgzazYzKzpBOzMzNzYzaClAzAzCmCnyBCoCpCqCqCqCrCqCqCqCqCsCjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamaaaaaayBCtCuCvyBAiyByBzQzQAaAlAlyByBAmyBCxCyCzyBamamamamamamamamamamCoCAamaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayByByByByByByByByByBARATASyeBbAVBfzhBgBjBiCJyByByByByByByByByBaaaaaaaaaaamCKamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayBCLCMCNCNCNCNCMCOyBzaCPCQCRCSzaCTCRCQCUCVyBCWCXCYCZCYCYCXDayBaaaaaaaaaaaaDbamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaayBDcCLCOCLCOCLCODdDsBnBvBrBBzpzazMBEBCBMBFDnDoDpDaDpDaDpDaDqDraaaaaaaaaaaaDbamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayBDcDcDcDcDcDcDcCLDsBNBPBPBPBQDwBYBZBZBZCaDnCYDoDqDqDqDqDqDqDraaaaaaaaaaaaDbamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayBDcDcDcDcDcDcDcDcyBCbCdCdCdCBCDCCCdCEDGCFCHCGCIDqDqDqDqDqDqDraaaaaaaaaaaaDbamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayBDdDLDdDLDdDLDdDLyBDeDfDeDeDgDPDhDiDSDTDUyBDjCIDWDoDWDoDWDoyBaaaaaaaaaaamDXamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayBDYDYDYDYDYDYDYDYyByByByByByByByByByByByBCJyByByByByByByByByBamamamamamamDZamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayBAjAjAjAjAjAjAjAjyByByByByByByByByByByByBCJyByByByByByByByByBamamamamamamDZamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamDXamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDbamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDbamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamamamamamamamamamamamEaEaEaEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDbamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamambLEaEbEaEaEaEaEaEaEaEaEaEcEdEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDbamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamambLEaEbEaEaEaEaEaEaEaEaEaEcAkEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEeEfamamamamamamamamamamamamamamamamamamamambLbLEgEhEgEhEhEhEhEhEiEjEkElEmuhEoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEpEqCqErCqCqCqCqCqCqErCqCqCqCqErEsEtEfamEaEaEaEaEaEaEaEuEvEwEwEwExEyEzEAEdEaamamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEpEqCqErCqCqCqCqCqCqErCqCqCqCqErEsEtEfamEaEaEaEaEaEaEaEuEvEwEwEwExEyEzEAAkEaamamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamCoEBEfuiEhEhEDEhEhEhEhEEEFEGEGEHEIEhEJEJEJEJEJEJEJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamCoCAuiEhEhEvEwEwEwEwELEMDkEOEPEIEhEJEQERESETEQEJamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamEauwEaEhEhEEsFrUGPEWEaEYEZFaFbFcFdEJFeFfEQFfFgEJamamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
index 82564de3856..2a6675536bd 100644
--- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm
+++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
@@ -104,7 +104,7 @@
"abZ" = (/obj/machinery/newscaster/security_unit{pixel_x = -30; pixel_y = 0},/obj/machinery/camera{c_tag = "Head of Security's Office"; dir = 4; network = list("SS13")},/obj/machinery/recharger{pixel_y = 4},/obj/structure/table/wood,/turf/simulated/floor/fancy/carpet,/area/security/hos)
"aca" = (/obj/structure/stool/bed/chair/comfy/black,/turf/simulated/floor/fancy/carpet,/area/security/hos)
"acb" = (/turf/simulated/floor/fancy/carpet,/area/security/hos)
-"acc" = (/obj/machinery/keycard_auth{pixel_x = 24; pixel_y = 10},/obj/machinery/hologram/holopad,/turf/simulated/floor/fancy/carpet,/area/security/hos)
+"acc" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/fancy/carpet,/area/security/hos)
"acd" = (/obj/structure/sign/securearea{pixel_y = -32},/obj/structure/lattice/catwalk,/turf/space,/area/space)
"ace" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/lattice/catwalk,/turf/space,/area/solar/auxstarboard)
"acf" = (/obj/structure/lattice,/obj/item/stack/cable_coil/random,/turf/space,/area/space)
@@ -351,8 +351,8 @@
"agM" = (/obj/structure/disposalpipe/sortjunction{dir = 4; icon_state = "pipe-j2s"; sortType = 7},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main)
"agN" = (/obj/structure/disposalpipe/sortjunction{dir = 4; icon_state = "pipe-j2s"; sortType = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/security/main)
"agO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/security/main)
-"agP" = (/turf/simulated/wall,/area/shuttle/pod_3)
-"agQ" = (/turf/space,/turf/simulated/wall/shuttle{dir = 2; icon_state = "swall_f10"; layer = 2},/area/space)
+"agP" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/simulated/floor/plating,/area/shuttle/pod_3)
+"agQ" = (/turf/space,/turf/simulated/wall/shuttle{icon_state = "swall_f9"; dir = 2},/area/shuttle/pod_3)
"agR" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Security Delivery"; req_access_txt = "1"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/security/main)
"agS" = (/obj/machinery/recharger,/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/main)
"agT" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
@@ -381,7 +381,7 @@
"ahq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plasteel,/area/security/main)
"ahr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/security/main)
"ahs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/security/main)
-"aht" = (/obj/machinery/door/airlock/external{name = "Escape Pod Three"; req_access_txt = "63"},/turf/simulated/floor/plating,/area/shuttle/pod_3)
+"aht" = (/turf/space,/turf/simulated/wall/shuttle{dir = 2; icon_state = "swall_f10"; layer = 2},/area/shuttle/pod_3)
"ahu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/security/main)
"ahv" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/security/main)
"ahw" = (/obj/machinery/power/apc{dir = 4; name = "Security Office APC"; pixel_x = 24; pixel_y = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main)
@@ -403,8 +403,8 @@
"ahM" = (/obj/structure/grille,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/security/warden)
"ahN" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/main)
"ahO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (NORTH)"; dir = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/main)
-"ahP" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/simulated/floor/plating,/area/space)
-"ahQ" = (/turf/space,/turf/simulated/wall/shuttle{icon_state = "swall_f9"; dir = 2},/area/space)
+"ahP" = (/obj/machinery/keycard_auth{pixel_x = 24; pixel_y = 10},/obj/machinery/computer/card/minor/hos,/turf/simulated/floor/fancy/carpet,/area/security/hos)
+"ahQ" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/hor)
"ahR" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/main)
"ahS" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/main)
"ahT" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-y"; dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/security/main)
@@ -3903,7 +3903,7 @@
"bxc" = (/obj/structure/stool/bed/chair/office/light{dir = 8},/obj/effect/landmark/start{name = "Research Director"},/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/hor)
"bxd" = (/obj/machinery/computer/robotics,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/hor)
"bxe" = (/obj/structure/rack,/obj/item/device/aicard,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/crew_quarters/hor)
-"bxf" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/hor)
+"bxf" = (/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/obj/machinery/light,/obj/machinery/computer/card/minor/rd,/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/hor)
"bxg" = (/obj/structure/lamarr,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"},/area/crew_quarters/hor)
"bxh" = (/turf/simulated/wall/r_wall,/area/crew_quarters/hor)
"bxi" = (/turf/simulated/wall,/area/toxins/explab)
@@ -4096,7 +4096,7 @@
"bAN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"bAO" = (/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"bAP" = (/obj/machinery/power/apc{dir = 8; name = "RD Office APC"; pixel_x = -25},/obj/structure/cable,/obj/machinery/light_switch{pixel_y = -23},/obj/structure/flora/kirbyplants/dead,/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/hor)
-"bAQ" = (/obj/machinery/hologram/holopad,/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/hor)
+"bAQ" = (/obj/machinery/computer/card/minor/cmo,/turf/simulated/floor/plasteel{icon_state = "barber"},/area/medical/cmo)
"bAR" = (/obj/structure/table,/obj/item/weapon/cartridge/signal/toxins,/obj/item/weapon/cartridge/signal/toxins{pixel_x = -4; pixel_y = 2},/obj/item/weapon/cartridge/signal/toxins{pixel_x = 4; pixel_y = 6},/obj/machinery/camera{c_tag = "Research Director's Office"; dir = 1; network = list("SS13","RD")},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/hor)
"bAS" = (/obj/structure/closet/secure_closet/RD,/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/hor)
"bAT" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/hor)
@@ -5653,7 +5653,7 @@
"ceK" = (/turf/simulated/wall/r_wall,/area/engine/engineering)
"ceL" = (/obj/machinery/computer/atmos_alert,/obj/machinery/requests_console{announcementConsole = 1; department = "Chief Engineer's Desk"; departmentType = 3; name = "Chief Engineer RC"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ceM" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
-"ceN" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/lighter/zippo,/obj/item/clothing/glasses/meson{pixel_y = 4},/obj/item/weapon/stamp/ce,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"ceN" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/lighter/zippo,/obj/item/clothing/glasses/meson{pixel_y = 4},/obj/item/weapon/stamp/ce,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ceO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ceP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ceQ" = (/obj/structure/grille,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/engine/chiefs_office)
@@ -5772,7 +5772,7 @@
"cgZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"cha" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sign/nosmoking_2{pixel_y = 32},/obj/machinery/camera{c_tag = "Engineering Power Storage"},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
"chb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"chc" = (/obj/structure/filingcabinet/chestdrawer,/obj/machinery/camera{c_tag = "Chief Engineer's Office"; dir = 4; network = list("SS13")},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/mob/living/simple_animal/parrot/Poly,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"chc" = (/obj/machinery/camera{c_tag = "Chief Engineer's Office"; dir = 4; network = list("SS13")},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/computer/card/minor/ce,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"chd" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"che" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/weapon/storage/fancy/cigarettes,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"chf" = (/turf/simulated/floor/engine,/area/toxins/explab)
@@ -6428,7 +6428,7 @@
"ctF" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (EAST)"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior)
"ctG" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{tag = "icon-darkbluecorners (WEST)"; icon_state = "darkbluecorners"; dir = 8},/area/turret_protected/aisat_interior)
"ctH" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/engine/engineering)
-"ctI" = (/obj/structure/table/reinforced,/obj/item/stack/medical/bruise_pack{pixel_x = -3; pixel_y = 2},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"ctI" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/structure/filingcabinet/chestdrawer,/mob/living/simple_animal/parrot/Poly,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ctJ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel{tag = "icon-darkbluecorners"; icon_state = "darkbluecorners"; temperature = 273.15},/area/turret_protected/aisat_interior)
"ctK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (WEST)"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior)
"ctL" = (/obj/machinery/door/airlock/shuttle{name = "Mining Shuttle Airlock"; req_access_txt = "48"},/obj/docking_port/mobile{dir = 8; dwidth = 3; height = 5; id = "mining"; name = "mining shuttle"; travelDir = 90; width = 7},/obj/docking_port/stationary{dir = 8; dwidth = 3; height = 5; id = "mining_home"; name = "mining shuttle bay"; width = 7},/turf/simulated/floor/plating,/area/shuttle/labor)
@@ -6578,13 +6578,13 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaaZaasaasaasaaKabaabbaasaasabcabdaaiaaiaaiaafaaaaaaaaaaaaaaaaafaaaaaVaaaaaaaaaaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeabeabeabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaOaaWaaNaaXabiaasabjaasaasaasaasaasaasaauaasabkablaaiaafaafaafaafaafaafaafaafabmabmabmabnabmabmaboaboabpabpabpaboaboaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgaaYabraaPabsabuaasaasabvabwabxaasabyabzabAaasabBabCaaiaafaaaaafaafaafaafaaaaafabnabDabEaeIabFabGaboabHabIabJabKabLaboaaaaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafabMaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaabfabfabeabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgabNabPabOabsabSabTabSabSabSabUabSabSabSabVabSabSabWaaiactactactactactactactactabmabXabEaeIabYabDaboabZacaacbacbaccaboaaaaafacdaagaagaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfaafaafaaaaceaaaacfaafabfabfabfabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaabfabfabeabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgabNabPabOabsabSabTabSabSabSabUabSabSabSabVabSabSabWaaiactactactactactactactactabmabXabEaeIabYabDaboabZacaacbaccahPaboaaaaafacdaagaagaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfaafaafaaaaceaaaacfaafabfabfabfabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgabQacgabRabsackaasaclabSacmacnacoabSacpacqacrabSacsaaiacMacNacOacOacPacQacRacSactacuabEaeIaecabDabpacwacxacyacbaczaboaaaaafacAacBacAaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaafaaaaafaaaaaaaceaaaaaaaafaaaaafaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafacCaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaciacDacjacEacHaasacIabSacJacnacIabSacKacqacIabSacLaaiacMadkadladladladladmadnactacTabEaeIaecabDabpacUacVacWacbacXaboaafaafacAacYacAaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafacZacZacZacZacZaaaadaaaaacZacZacZacZacZaafabfaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadbadbadbadbaafaafaaaadcaaaaafaafabfabfabfabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafhaaHaaHaaHacFaddacGabsadfadgadhabSadfadiadhabSadfadjadhabSabSaaiafnaRFaNFadVaNFadWbhdbiGactadoabEaeIaecabDaboadpadqadradsadtaboabnabmadvacBacAacAachaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaadwadxadxadxadxadyadzadAadBadBadBadBadCaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaafaaaaafaaaaaaadcaaaaaaaafaaaaafaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHabhadeadDadGadFadIadHadKadJadMadLadOadNadUadLaepadPadQadRaaiadSadTaNFboSaNFadXadYadZaeaabEabEaebaeTabmaboaedaboaeeaboaefaboaegaehacAaeiagParqanTanTagQaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaemaemaemaemaemaaaadzaaaaemaemaemaemaemaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaenaenaenaenaenaaaaeoaaaaenaenaenaenaenaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHadEaeqaeraeuaetaewaevafiaexavkaifaexaexaexaifaOyaOvaeyaezaaiaeAaeBaeCaeDaeEaeFaeGaeHactahoagSaeJahpabmaeLaeMaeNaeOaePaeQaeNaeRaeSaeVaeUahtamoamIamJahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaaaaafaaaaaaaaaadzaaaaaaaaaaafaaaaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaafaafbafbafbafbafcafdafeaffaffaffaffafgaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaesaOzaRfbfTbfPabSbiEafjafkaflafmbNoafoafpafpafpabSafqafraaiafsaftafuafvafwafxafyafzactacvabnafBafCabmafDafEafFafGafHafIafJafKafLacAafMagPaptanTanTahQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafacZacZacZacZacZaaaadzaaaacZacZacZacZacZaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaafaaaaafaaaaaaadcaaaaaaaafaaaaafaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHabhadeadDadGadFadIadHadKadJadMadLadOadNadUadLaepadPadQadRaaiadSadTaNFboSaNFadXadYadZaeaabEabEaebaeTabmaboaedaboaeeaboaefaboaegaehacAaeiacAarqanTanTahtaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaemaemaemaemaemaaaadzaaaaemaemaemaemaemaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaenaenaenaenaenaaaaeoaaaaenaenaenaenaenaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHadEaeqaeraeuaetaewaevafiaexavkaifaexaexaexaifaOyaOvaeyaezaaiaeAaeBaeCaeDaeEaeFaeGaeHactahoagSaeJahpabmaeLaeMaeNaeOaePaeQaeNaeRaeSaeVaeUaeVamoamIamJagPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaaaaafaaaaaaaaaadzaaaaaaaaaaafaaaaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaafaafbafbafbafbafcafdafeaffaffaffaffafgaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaesaOzaRfbfTbfPabSbiEafjafkaflafmbNoafoafpafpafpabSafqafraaiafsaftafuafvafwafxafyafzactacvabnafBafCabmafDafEafFafGafHafIafJafKafLacAafMacAaptanTanTagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafacZacZacZacZacZaaaadzaaaacZacZacZacZacZaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafafPafPafPafPafPaaaafdaaaafPafPafPafPafPaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaHaaHbaMbOybkdaaHaaiadhafQadfafRafRafRafRafRafRafRafSafTafUafVafWafXafYafZagaagbagcafUagdahSageagfaggaghagiafFagjafHagkaglagmabmadvacAacAacAachaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaadwadxadxadxadxadyadzadAadBadBadBadBadCaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaaaaafaaaaaaaaaafdaaaaaaaaaaafaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaHaaHaaHaaHaaHaaiagnagoagpafRagqagragsagtaguafRagvagwagxagyagzagAagBagaagCagbagDagEagFafFagGagHagIagJagKaeKafAagNagOagLagMagRanUagUacAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaemaemaemaemaemaaaadzaaaaemaemaemaemaemaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaenaenaenaenaenaaaafdaaaaenaenaenaenaenaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaiagVagWagXafRagYagZahaahbahcafRagvahdaheahfahgahhahiahjahjahkahlahmahnaqqaPUaPTahqahrahsahTahVahuahvahWahwabmacAahxacAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaaaaafaaaaaaaaaadzaaaaaaaaaaafaaaaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -6647,15 +6647,15 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnwbkNbkNbsfbjxbjxbjxbiibjxbjxcuWbjxbjxbqAbsgaYpbshbsibjEbsjbskbslbeabaHbaHaZhbmzbsnbqHaHYbpibpjblibsobspbsqbsrbssbliaaaaaaaafbfCbstbsubstbgZaafaaaaaabqVbsvbswbsxbsybszbszbsAbsBbsCaHYaHYbmVbsDbfXbsEbsFbsGbsHbsGbsIbsJbsKbsLbsKbsKbsKbsMbsNbfXbhkbsObsPbsPbsQbsRbosbosbsSbsTbsUbpRboybncbeHbeIbsVbsVbsVbsVbsVbeKbnkbnkbnkbnkbsWbsXbsYbnkbsZbtabtbbtcbtcbtcbtcbtdbtebtfbrYbuAbuzbuCbuBbuBbuDbwabrVbsbbgxbsdbsebseabtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtobqxbqybqxbmlbtpbjxbjxbtqbjxbtpcuWbjxbjxbqAbtraYpbtsbttbnGbtubtvbecbpbbjEbtwbtxbmzbsnbqHaWUbpibtyblibtzbtAbtBbtCbmGbliaaaaaaaafbtDbtEbnUbtFbtGaafaaaaaabqVbtHbtIbtJbtKbtLbtMbtNbpubtOaHYaHYbmSbmSbtPbtQbpGbtRbtSbtTbtUbtVbtWbtXbtWbtXbtWbtXbtWbtXbtYbtZbsPbuabubbucbudbuebufbugbuhbuibujbncbukbulbumbnmbunbhJbhJbuobhJbhJbupbuqburbusbutbtcbuubuvbuwbuxbuxbuxbuybuybuybuybuybwcbwbbwebwdbwebwfbwebrVbsbbgxbwgbqvbwhbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabuFbuGbuFbuHbuIbuHbuHbuHbuHbuHcuXbuKbjxbqAbuLaYpbuMbaHbuNbuObuPbuQbuRbuRbuRbuQbuQbuSbqHaJkbuTbpjblibuUbuVbuWbuXbuYbliaaaaaaaafbuZbvabqRbvbbvcaafaaaaaabqVbvdbvebvfbvgbtLbtMbtNbpubvhaHYaHYbvibvjbvkbvlbvmbvnbtXbvobvpbvqbvrbvsbDibvubvvbvubFzbtXbhkbjZbsPbvxbvybvzbvAbvBbvCbvDbvEbvEbvFbvGbvHbvIbvJbvKbvLbvMbvNbvMbvMbvObvMbvMbvPbvQbvRbvRbvSbvTbqibuxbvUbvVbvWbvXbvYbambuybxjbxibzCbyAbzDbxibAVbrVbsbbgxcjgbsebsebjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnwbkNbkNbkNaYpbkNbkNbkNbwibwicuYbwibwjbwkbwkbwibwibwlbwlbwmbwnbuQbwobwpbwqbwrbuQbsnbqHaHZaIcaIcbliblibwsbliblibwtbliaHUaHUaHUbwubwvbsubwwbwxaHUaHUaHUbpubpubpubpubpubpubpubpubpubvhaHYbwybtXbtXbtXbwzbtXbtXbtXbwAbvpbwBbwCbwDbwEbwFbwGbwHbwIbwDbhkbjZbsPbwJbwKbwLbwMbwNbwObrAbrAbrAbwPbwQbwRbwSbwTbwTbwTbwTbwUbwTbwTbwTbwVbwVbwWbwXbwYbwYbwZbxabqibuxbxbbxcbxdbxebxfbxgbxhbrVbrVbFBbFBbFBbrVcfYbrVbsbbgxbwgbqvcvhbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnwbkNbkNbkNaYpbkNbkNbkNbwibwicuYbwibwjbwkbwkbwibwibwlbwlbwmbwnbuQbwobwpbwqbwrbuQbsnbqHaHZaIcaIcbliblibwsbliblibwtbliaHUaHUaHUbwubwvbsubwwbwxaHUaHUaHUbpubpubpubpubpubpubpubpubpubvhaHYbwybtXbtXbtXbwzbtXbtXbtXbwAbvpbwBbwCbwDbwEbwFbwGbwHbwIbwDbhkbjZbsPbwJbwKbwLbwMbwNbwObrAbrAbrAbwPbwQbwRbwSbwTbwTbwTbwTbwUbwTbwTbwTbwVbwVbwWbwXbwYbwYbwZbxabqibuxbxbbxcbxdbxeahQbxgbxhbrVbrVbFBbFBbFBbrVcfYbrVbsbbgxbwgbqvcvhbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwicuZbxlbxmbxnbxobxpbwkbxqbxrbxsbxtbxubxvbxwbxxbxybuQbsnbqHaHYaHYaHYbxzaKQbxAaKAbxBbxCbxDaVLaVLaVLbxEbxFbxGbxHbxIaHYaHYaHYaHYaKQaHYaKAaHYaHYaHYbxzaHYbvhaHYbxJbtXbxKbxLbxMbxNbxObtXbxPbxQbxRbxSbwDbwEbwEbxTbxUbxVbwDbhkbxWbsPbrAbxXbxYbxZbwQbyabybbycbydbncbncbeHbyebwTbyfbygbyhbyibyjbykbwTbylbymbynbyobypbwYbyqbyrbysbytbyubyvbywbyxbyybyzbxhchfchfchfchfchfchfchfbrVbsbbgxbsdbsebseabtaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwkbyBbyCbyDbyEbyFbyGbyHbyIbyJbyKbyLbyMbyNbyObxxbyPbuQbsnbyQaHYaHYaHYaHYaHYaHYaKAaHYbqHaHYaHYaHYaHYaHYbyRbySbyTaHYaHYaHYaHYaHYaHYaHYaKAbyUaHYaHYaHYaHYbvhbyVbyWbtSbyXbyYbyZbyYbzabtXbzbbvpbvqbzcbtXbzdbzebzfbzgbzhbtXbhkbjZbsPbsPbsPbsPbsPbncbncbncbncbncbncbzibgibzjbwTbzkbzlbzmbznbzobzpbwTbzqbzrbzsbztbzubwYbyqbzvbzwbzxbzybzzbzzbzzbzAbzBbxhchfchfctEctDchfchfchfbrVbsbbgxbsdbsebsebjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibzEbzFbzGbzHbzIcvbcvacvccvcbAZbzLbuRbzMbzNbzObzPbuQbzQbzRbzSbzSbzSbzTbzSbzSbzUbzSbzVaHYbzWbzXbzYbzYcuBbAabAbbAcbAdbAeaVLaVLbAfaVLbAgbAhaVLbAibAjbAkbAlaHYaHYbtXbAmbAnbAobtWbApbtXbtWbAqbArbtXbtXbtXbtXbtXbtXbtXbtXbhkbjZbfXbAsbAtbAubAvbAwbAxbAybAzbAAbAwbzibgibABbwTbACbADbAEbAFbAGbAHbwTbAIbAJbAKbALbAMbwYbyqbANbAObuybAPbAQbARbASbATbAUbxhchfchfchfbscchfchfchfbrVbsbbqtbAWbqvbqwbjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibzEbzFbzGbzHbzIcvbcvacvccvcbAZbzLbuRbzMbzNbzObzPbuQbzQbzRbzSbzSbzSbzTbzSbzSbzUbzSbzVaHYbzWbzXbzYbzYcuBbAabAbbAcbAdbAeaVLaVLbAfaVLbAgbAhaVLbAibAjbAkbAlaHYaHYbtXbAmbAnbAobtWbApbtXbtWbAqbArbtXbtXbtXbtXbtXbtXbtXbtXbhkbjZbfXbAsbAtbAubAvbAwbAxbAybAzbAAbAwbzibgibABbwTbACbADbAEbAFbAGbAHbwTbAIbAJbAKbALbAMbwYbyqbANbAObuybAPbxfbARbASbATbAUbxhchfchfchfbscchfchfchfbrVbsbbqtbAWbqvbqwbjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibwibwkbwkbwkbwkbwibwibAXbAYbAZbBabuQbuQbuQbuQbuQbuQbBbbBcaIcaIcaIcaIcbBdbBdbBdbBdbBdbBdbBdbBdbBdbBdbBebBfbBgbBhbBhbBhbBhbBhbBibBhbBhbBjbBhbyebBkbyeaIdaJlbBlbtXbBmbBnbBobBpbBqbtXbBrbxQbBsbBtbBubBvbBwbBxbBybBzbBAbBBbBCbBDbBDbBEbBFbBGbBHbBIbBJbBKbBLbAwbzibgibBMbBMbBMbBMbBMbBMbBMbBMbBMbBNbBNbBNbBNbBNbBNbBObBPbBQbuybuybuybuybuybuybuybxhbrVbrVbrVbrVbrVbrVbrVbrVbsbbgxbBRbBSbjobjoaafaafaafaagaagaagaagaagaagaagaagaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBTaaaaaaaaaaafaaaaaabwlbBUbBVbBWbBXbBYbBZbCabCbbCcbCdbCebCfaaaaaaaafaaabBdbCgbChbCibCjbCkbClbCmbCnbCobCpbCqbCrbBhbCsbCtcuDbCubCwbCvbCvbCxbCybCzbCAbyebyebyebyebtXbCBbCCbCDbCCbCEbtXbCFbvpbCGbCHbCIbCJbCIbCIbCKbCLbCMbCNbCObCObCObCPbCQbvlbCRbCSbCTbCUbCVbAwbzibgibBMbCWbCWbCWbCXbCWbCWbCWbBMbCYbCYbCZbCYbCYbBNbDabDbbqibDcbDdbDebDfbDgbDhbJqbDjbDkbDlbDmbDnbDobsmbtnbtnbvwbDsbDdbDdbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaelctjaekctjaejaaaaafaaabwlbwlbDtbxrbDubDvbDwbDxbDybDybDzbDAbDBbDCaafbDDbDEbDFbDGbDHbDIbDJbDIbDKbDIbDIbDIbBdbDLbDMbDNbBhbDObDPbDQbDRbDSbCvbDTbBjbBhbDUbDVbDWbDXbDYbDZbEabEbbCCbEcbCCbxQbEdbEebEfbEgbtXbEhbEibCCbCCbEjbEkbmSbmSbmSbmSbmSbElbEmbpGbEnbEobEpbBKbEqbAwbzibgibBMbCWbCWbCWbCWbCWbCWbCWbBMbErbEsbEtbEubEvbBNbEwbExbEybEzbEAbEBbECbEDbEDbEDbEDbEEbEFbEGbDnbjobvZbEIbEJbEJbEKbELbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbENbEObENaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNcuCctMcuCafNbERbERbERbwlbESbxrbETbEUbEVbEWbwlbBcbEXbBcbBcbEYbEZaaabFabFbbFcbFdbDIbDIbFebDIbFfbFgbFhbDIbBdbDLbFibFjbBhbFkbFlbFmbFnbFobCvbFpbBjbzibFqbFrbFsbFrbFtbFubtXbFvbCIbFwbCIbFxbtSbFybCJbFAbtXbFCbCCbCCbCCbCCbGNbmSbPIbFEbFFbFGbBEbFHbvlbFIbBKbBKbFJbFKbFLbFMbFNbBMbCWbCWbCWbCWbCWbCWbCWbBMbFObFPbFQbFRbFSbFTbFUbFVbtbbFWbFXbEDbFYbEDbEDbEDbEDbEDbEDbEDbDnbFZbDpbGbbGcbGdbGebGfbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbEObENbGgbENbEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaekajxctyajxaekbERbGhbGibwlbGjbxrbGkbxrbxrbEWbwlbGlbGmbGnbBcbEYbEZaafbFabGobGpbGqbGrbGsbGrbGrbGtbGubGrbGrbGvbGwbGxbGybBhbGzbBhbBhbBhbBhbGAbGBbGCbGDbGEbGFbGGbGHbGIbGIbtXbGJbGKcltbGMbGQbtXbGObGPbGSbtXbGRbDqbEHbDrbFDbGWbmSbGXbGYbpFbGZbHabHbbHcbCRbHdbBKbBKbHebAwbzibgibBMbBMbHfbCWbCWbHgbHfbBMbBMbHhbHibHjbHkbHlbBNbHmbHnbtbbHobHpbHqbHqbHrbHsbHtbHqbHubHvbHwbHxbHybGabHAbHBbHCbHDbHEbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbHFbEObHGbHHbHIbEObHFaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaekajxctyajxaekbERbGhbGibwlbGjbxrbGkbxrbxrbEWbwlbGlbGmbGnbBcbEYbEZaafbFabGobGpbGqbGrbGsbGrbGrbGtbGubGrbGrbGvbGwbGxbGybBhbGzbBhbBhbBhbBhbGAbGBbGCbGDbGEbGFbGGbGHbGIbGIbtXbGJbGKcltbGMbGQbtXbGObGPbGSbtXbGRbDqbEHbDrbFDbGWbmSbGXbGYbpFbGZbHabHbbHcbCRbHdbAQbBKbHebAwbzibgibBMbBMbHfbCWbCWbHgbHfbBMbBMbHhbHibHjbHkbHlbBNbHmbHnbtbbHobHpbHqbHqbHrbHsbHtbHqbHubHvbHwbHxbHybGabHAbHBbHCbHDbHEbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbHFbEObHGbHHbHIbEObHFaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNajxajxajxctLbHKbxrbxrbHLbGjbxrbxrbxrbxrbEWbwlbHMbGnbHNbBcbEYbEZaaabFabHObHPbHQbDIbDIbHRbDIbHSbHTbHUbHVbBdbHWbHXbHYbHZbIabIbbIbbIbbIbbIbbIcbIbbIdbIebIfbIgbIhbIibIjbtSbtSbtSbtSbtSbtSbtSbtSbtSbtSbMNbMNbMNbMNbMNbMNbOnbOCbmSbmSbmSbmSbIlbImbhjbAwbAwbAwbAwbAwbAwbzibgibBMbInbIobIpbIqbIrbIsbInbItbHhbHibHjbIubIvbIwbIxbIybuwbIzbDdbIAbIAbIBbICbIDbIEbEDbEDbIFbDnbIGbGLbIIbDdbIJbIKbIKbDdaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbEObEObILbIMbIMbIMbINbEObEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaekctyctyctyaekbERbIObIPbIQbIRbxrbxrbISbITbIUbwlbBcbBcbBcbBcbEYbDCaafbIVbDEbIWbDGbIXbDIbIYbDIbDIbDIbDIbDIbBdbDLbIZbJabJbbJcbJcbJcbJcbJcbJcbJdbJebJfbJgbJhbJibJjbJkbJlbJmbJnbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJobJpbmSbGXcqlbBDbJrbBEbJsbJtbJubJvbJvbJwbJxbJgbJybJzbBMbJAbJBbJCbJDbJEbJFbJGbItbItbItbItbItbItbJHbJIbJJbJKbJLbDdbDnbDnbDnbDnbDnbDnbJMbEDbEDbDnbjobvZbgxbDdbJNbJObJPbJQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJRbJSbJRbIMbJTbIMctxctlbENaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNajZctzctAafNbERbERbERbwlbwlbERbERbERbwlbwlbwlaaaaaaaaabJYbJZbEZaaaaaaaafaaabBdbKabKbbKcbDIbKdbKebKfbKgbKhbKibKjbKkbKlbKmbKnbKobKpbKqbKmbKmbKmbKmbKmbKrbKsbKmbKmbKtbKmbKubKmbKmbKmbKmbKmbyebyebyebyebyebyebyebyebKvbKwbmSbKxbKybKzbKAbKBbKCbKDbKEbKFbKFbKGbKFbKFbKHbKIbBMbKJbKKbKLbKKbKMbKKbKNbKObKPbKQbKRbKSbKTbKUbyqbHnbqibKVaafbKWbKXbKYbKZbLabKZbLbbLcbLdbDnbLebsbbLfbDdbDdbDdbDdbDdaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbEObEObLgbIMbIMbIMbLhbEObEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index bbb172cfe83..6a90495198c 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -108,6 +108,7 @@
#define STAGE_THREE 5
#define STAGE_FOUR 7
#define STAGE_FIVE 9
+#define STAGE_SIX 11 //From supermatter shard
//zlevel defines, can be overridden for different maps in the appropriate _maps file.
#define ZLEVEL_SPACEMAX 7
diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm
index bc0dd8fc2b4..31b91c7cd1e 100644
--- a/code/__DEFINES/preferences.dm
+++ b/code/__DEFINES/preferences.dm
@@ -9,8 +9,9 @@
#define MIDROUND_ANTAG 64
#define SOUND_INSTRUMENTS 128
#define SOUND_SHIP_AMBIENCE 256
+#define SOUND_PRAYERS 512
-#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|MEMBER_PUBLIC|INTENT_STYLE|MIDROUND_ANTAG|SOUND_INSTRUMENTS|SOUND_SHIP_AMBIENCE)
+#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|MEMBER_PUBLIC|INTENT_STYLE|MIDROUND_ANTAG|SOUND_INSTRUMENTS|SOUND_SHIP_AMBIENCE|SOUND_PRAYERS)
//Chat toggles
#define CHAT_OOC 1
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index f171be733e9..a80a9bb9ebd 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -13,6 +13,16 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/undershirt, undershirt_list, undershirt_m, undershirt_f)
//socks
init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, socks_list, socks_m, socks_f)
+ //lizard bodyparts (blizzard intensifies)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, body_markings_list)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/tails, tails_list)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/tails_animated, animated_tails_list)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/snouts, snouts_list)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/horns, horns_list)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/frills, frills_list)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, spines_list)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/spines_animated, animated_spines_list)
+
//Species
for(var/spath in typesof(/datum/species))
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 20c38174275..01f8d00be82 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -36,6 +36,22 @@
if(FEMALE) return pick(socks_f)
else return pick(socks_list)
+/proc/random_features()
+ if(!tails_list.len)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/tails, tails_list)
+ if(!snouts_list.len)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/snouts, snouts_list)
+ if(!horns_list.len)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/horns, horns_list)
+ if(!frills_list.len)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/frills, frills_list)
+ if(!spines_list.len)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, spines_list)
+ if(!body_markings_list.len)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, body_markings_list)
+
+ return(list("mcolor" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "tail" = pick(tails_list), "snout" = pick(snouts_list), "horns" = pick(horns_list), "frills" = pick(frills_list), "spines" = pick(spines_list), "body_markings" = pick(body_markings_list)))
+
/proc/random_hair_style(gender)
switch(gender)
if(MALE) return pick(hair_styles_male_list)
diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm
index 9945a13fcad..33b781ad4f8 100644
--- a/code/__HELPERS/text.dm
+++ b/code/__HELPERS/text.dm
@@ -76,12 +76,12 @@
// Used to get a properly sanitized input, of max_length
/proc/stripped_input(var/mob/user, var/message = "", var/title = "", var/default = "", var/max_length=MAX_MESSAGE_LEN)
var/name = input(user, message, title, default) as text|null
- return strip_html_properly(name, max_length)
+ return html_encode(trim(name, max_length)) //trim is "inside" because html_encode can expand single symbols into multiple symbols (such as turning < into <)
// Used to get a properly sanitized multiline input, of max_length
/proc/stripped_multiline_input(var/mob/user, var/message = "", var/title = "", var/default = "", var/max_length=MAX_MESSAGE_LEN)
var/name = input(user, message, title, default) as message|null
- return strip_html_properly(name, max_length)
+ return html_encode(trim(name, max_length))
//Filters out undesirable characters from names
/proc/reject_bad_name(var/t_in, var/allow_numbers=0, var/max_length=MAX_NAME_LEN)
@@ -147,56 +147,7 @@
return t_out
-//this proc strips html properly, this means that it removes everything between < and >, and between "http" and "://"
-//also limit the size of the input, if specified to
-/proc/strip_html_properly(var/input,var/max_length=MAX_MESSAGE_LEN)
- if(!input)
- return
-
- if(max_length)
- input = copytext(input,1,max_length)
-
- var/sanitized_output
- var/next_html_tag = findtext(input, "<")
- var/next_http = findtext(input, "http", 1, next_html_tag)
-
- //the opening and closing of the expression to skip, e.g '<' and '>'
- var/opening = non_zero_min(next_html_tag, next_http)
- var/closing
-
- sanitized_output = copytext(input, 1, opening)
-
- while(next_html_tag || next_http)
-
- //we treat < ... >
- if(opening == next_html_tag)
- closing = findtext(input, ">", opening + 1)
- if(closing)
- next_html_tag = findtext(input, "<", closing)
- next_http = findtext(input, "http", closing, next_html_tag)
- else //no matching ">"
- next_html_tag = 0
-
- //we treat "http(s)://"
- else
- closing = findtext(input, "://", opening + 1)
- if(closing)
- closing += 2 //skip these extra //
- next_http = findtext(input, "http", closing)
- next_html_tag = findtext(input, "<", closing, next_http)
- else //no matching "://"
- next_http = 0
-
- //check if we've something to skip
- if(closing)
- opening = non_zero_min(next_html_tag, next_http)
- sanitized_output += copytext(input, closing + 1, opening)
-
- sanitized_output += copytext(input, opening) //don't forget the remaining text
-
- return sanitized_output
-
-//strip_html_properly helper proc that returns the smallest non null of two numbers
+//html_encode helper proc that returns the smallest non null of two numbers
//or 0 if they're both null (needed because of findtext returning 0 when a value is not present)
/proc/non_zero_min(var/a, var/b)
if(!a)
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index adb3b60c80b..fb75fed9b60 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -987,25 +987,8 @@ Turf and target are seperate in case you want to teleport some distance from a t
/proc/get_turf(atom/A)
if (!istype(A))
return
- if (isturf(A))
- return A
-
- var/list/atom/checked_turf_candidates = list() //prevent recursion from badmins being dumbasses
- var/atom/turf_candidate = A.loc
-
- while (!isturf(turf_candidate))
- if (!turf_candidate || turf_candidate in checked_turf_candidates)
- return
- checked_turf_candidates += turf_candidate
-
- //SO I BET YOU MIGHT BE WONDERING WHY I'M CHECKING THIS AGAIN.
- //I'LL FUCKING TELL YOU WAY, ITS BECAUSE FOR SOME GOD DAMN REASON, WHEN THIS IS CALLED
- //IN AN OBJECT'S NEW() PROC, THE FIRST CHECK WILL FUCKING PASS, BUT FUCKING RUNTIME HERE
- //BITCHING ABOUT HOW IT CAN'T READ NULL.LOC, SO FUCK IT, WE CHECK THIS TWICE.
- if (!turf_candidate)
- return
- turf_candidate = turf_candidate.loc
- return turf_candidate
+ for(A, A && !isturf(A), A=A.loc); //semicolon is for the empty statement
+ return A
//Gets the turf this atom's *ICON* appears to inhabit
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index 6271cceb754..c3bc1e7c1f8 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -18,6 +18,15 @@ var/global/list/undershirt_f = list() //stores only undershirt name
var/global/list/socks_list = list() //stores /datum/sprite_accessory/socks indexed by name
var/global/list/socks_m = list() //stores only socks name
var/global/list/socks_f = list() //stores only socks name
+ //Lizard Bits (all datum lists indexed by name)
+var/global/list/body_markings_list = list()
+var/global/list/tails_list = list()
+var/global/list/animated_tails_list = list()
+var/global/list/snouts_list = list()
+var/global/list/horns_list = list()
+var/global/list/frills_list = list()
+var/global/list/spines_list = list()
+var/global/list/animated_spines_list = list()
//Backpacks
var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel")
//Female Uniforms
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index ca38a246dc0..e9b60141730 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -33,8 +33,12 @@
clear_alert(category)
return .()
else if(alert.icon_state == "[id][severity]")
-// src << "threw alert not in need of update [category] [id] [severity]"
- return 0
+ if(alert.timeout)
+ clear_alert(category)
+ return .()
+ else
+ // src << "threw alert not in need of update [category] [id] [severity]"
+ return 0
// src << "updating alert [category] [id] [severity]"
else
alert = PoolOrNew(/obj/screen/alert)
@@ -63,6 +67,12 @@
return 0
alert.name = initial(path_as_obj.name)
alert.desc = initial(path_as_obj.desc)
+ alert.timeout = initial(path_as_obj.timeout)
+ if(alert.timeout)
+ spawn(alert.timeout)
+ if(alert.timeout && alerts[category] == alert && world.time >= alert.timeout)
+ clear_alert(category)
+ alert.timeout = world.time + alert.timeout - world.tick_lag
alert.mouse_opacity = 1
return alert
@@ -86,6 +96,7 @@
icon_state = "default"
name = "Alert"
desc = "Something seems to have gone wrong with this alert, so report this bug please"
+ var/timeout = 0 //If set to a number, this alert will clear itself after that many deciseconds
//Gas alerts
@@ -145,6 +156,37 @@ The box in your backpack has an oxygen tank and gas mask in it."
name = "High Pressure"
desc = "The air around you is hazardously thick. A fire suit would protect you."
+/obj/screen/alert/blind
+ name = "Blind"
+ desc = "For whatever reason, you can't see. This may be caused by a genetic defect, eye trauma, being unconscious, \
+or something covering your eyes."
+
+/obj/screen/alert/high
+ name = "High"
+ desc = "Woah man, you're tripping balls! Careful you don't get addicted to this... if you aren't already."
+
+/obj/screen/alert/drunk //Not implemented
+ name = "Drunk"
+ desc = "All that alcohol you've been drinking is impairing your speech, motor skills, and mental cognition. Make sure to act like it."
+
+/obj/screen/alert/embeddedobject
+ name = "Embedded Object"
+ desc = "Something got lodged into your flesh and is causing major bleeding. It might fall out with time, but surgery is the safest way. \
+If you're feeling frisky, click yourself in help intent to pull the object out."
+
+/obj/screen/alert/asleep
+ name = "Asleep"
+ desc = "You've fallen asleep. Wait a bit and you should wake up. Unless you don't, considering how helpless you are."
+
+/obj/screen/alert/weightless
+ name = "Weightless"
+ desc = "Gravity has ceased affecting you, and you're floating around aimlessly. You'll need something large and heavy, like a \
+wall or lattice strucure, to push yourself off of if you want to move. A jetpack would enable free range of motion. A pair of \
+magboots would let you walk around normally on the floor. Barring those, you can throw things, use a fire extuingisher, \
+or shoot a gun to move around via Newton's 3rd Law of motion."
+
+//ALIENS
+
/obj/screen/alert/alien_tox
name = "Plasma"
desc = "There's flammable plasma in the air. If it lights up, you'll be toast."
@@ -154,6 +196,9 @@ The box in your backpack has an oxygen tank and gas mask in it."
name = "Burning"
desc = "It's too hot! Flee to space or at least away from the flames. Standing on weeds will heal you up."
+
+//SILICONS
+
/obj/screen/alert/nocell
name = "Missing Power Cell"
desc = "Unit has no power cell. No modules available until a power cell is reinstalled. Robotics may provide assistance."
@@ -167,6 +212,24 @@ Reharging stations are available in robotics, the dormitory's bathrooms. and the
name = "Low Charge"
desc = "Unit's power cell is running low. Reharging stations are available in robotics, the dormitory's bathrooms. and the AI satelite."
+//Need to cover all use cases - emag, illegal upgrade module, malf AI hack, traitor cyborg
+/obj/screen/alert/hacked
+ name = "Hacked"
+ desc = "Hazardous non-standard equipment detected. Please ensure any usage of this equipment is in line with unit's laws, if any."
+
+/obj/screen/alert/locked
+ name = "Locked Down"
+ desc = "Unit has remotely locked down. Usage of a Robotics Control Computer like the one in the Research Director's \
+office by your AI master or any qualified human may resolve this matter. Robotics my provide further assistance if necessary."
+
+/obj/screen/alert/newlaw
+ name = "Law Update"
+ desc = "Laws have potentially been uploaded to or removed from this unit. Please be aware of any changes \
+so as to remain in compliance with the most up-to-date laws."
+ timeout = 300
+
+//OBJECT-BASED
+
/obj/screen/alert/buckled
name = "Buckled"
desc = "You've been buckled to something and can't move. Click the alert to unbuckle unless you're handcuffed."
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index c250dc1d2d9..4a0b0f4abb4 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -160,6 +160,8 @@
var/aggressive_changelog = 0
+ var/reactionary_explosions = 0 //If we use reactionary explosions, explosions that react to walls and doors
+
/datum/configuration/New()
var/list/L = typesof(/datum/game_mode) - /datum/game_mode
for(var/T in L)
@@ -485,6 +487,22 @@
config.no_summon_magic = 1
if("no_summon_events")
config.no_summon_events = 1
+ if("reactionary_explosions")
+ config.reactionary_explosions = 1
+ if("bombcap")
+ var/BombCap = text2num(value)
+ if (!BombCap)
+ continue
+ if (BombCap < 4)
+ BombCap = 4
+ if (BombCap > 128)
+ BombCap = 128
+
+ MAX_EX_DEVESTATION_RANGE = round(BombCap/4)
+ MAX_EX_HEAVY_RANGE = round(BombCap/2)
+ MAX_EX_LIGHT_RANGE = BombCap
+ MAX_EX_FLASH_RANGE = BombCap
+ MAX_EX_FLAME_RANGE = BombCap
else
diary << "Unknown setting in configuration: '[name]'"
diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm
index 5cff548b620..838bcde4e26 100644
--- a/code/controllers/master_controller.dm
+++ b/code/controllers/master_controller.dm
@@ -9,6 +9,7 @@ var/global/datum/controller/game_controller/master_controller = new()
var/processing_interval = 1 //The minimum length of time between MC ticks (in deciseconds). The highest this can be without affecting schedules, is the GCD of all subsystem var/wait. Set to 0 to disable all processing.
var/iteration = 0
var/cost = 0
+ var/SSCostPerSecond = 0
var/last_thing_processed
var/list/subsystems = list()
@@ -60,7 +61,8 @@ calculate the longest number of ticks the MC can wait between each cycle without
for(var/datum/subsystem/S in subsystems)
S.Initialize(world.timeofday, zlevel)
sleep(-1)
-
+ for(var/datum/subsystem/S in subsystems)
+ S.AfterInitialize(zlevel)
world << "Initializations complete "
world.log << "Initializations complete"
@@ -89,10 +91,11 @@ calculate the longest number of ticks the MC can wait between each cycle without
++iteration
start_time = world.timeofday
-
+ var/SubSystemRan = 0
for(var/datum/subsystem/SS in subsystems)
if(SS.can_fire > 0)
if(SS.next_fire <= world.time)
+ SubSystemRan = 1
timer = world.timeofday
last_thing_processed = SS.type
SS.last_fire = world.time
@@ -100,7 +103,9 @@ calculate the longest number of ticks the MC can wait between each cycle without
SS.cost = MC_AVERAGE(SS.cost, world.timeofday - timer)
if (SS.dynamic_wait)
var/oldwait = SS.wait
- SS.wait = min(max(round(SS.cost*SS.dwait_delta, 0.1),SS.dwait_lower),SS.dwait_upper)
+ var/GlobalCostDelta = (SSCostPerSecond-(SS.cost/SS.wait))/(SS.wait/10)-1
+ var/NewWait = MC_AVERAGE(oldwait,(SS.cost-1.5+GlobalCostDelta)*SS.dwait_delta)
+ SS.wait = Clamp(round(NewWait,0.1),SS.dwait_lower,SS.dwait_upper)
if (oldwait != SS.wait)
calculateGCD()
SS.next_fire += SS.wait
@@ -109,11 +114,20 @@ calculate the longest number of ticks the MC can wait between each cycle without
sleep(-1)
cost = MC_AVERAGE(cost, world.timeofday - start_time)
-
+ if (SubSystemRan)
+ calculateSScost()
sleep(processing_interval)
else
sleep(50)
+/datum/controller/game_controller/proc/calculateSScost()
+ var/newcost = 0
+ for(var/datum/subsystem/SS in subsystems)
+ if (!SS.can_fire)
+ continue
+ newcost += SS.cost/(SS.wait/10)
+ SSCostPerSecond = MC_AVERAGE(SSCostPerSecond,newcost)
+
#undef MC_AVERAGE
/datum/controller/game_controller/proc/roundHasStarted()
diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm
index 5c74da6d84d..969e2fa6d97 100644
--- a/code/controllers/subsystem/air.dm
+++ b/code/controllers/subsystem/air.dm
@@ -3,7 +3,6 @@ var/datum/subsystem/air/SSair
/datum/subsystem/air
name = "Air"
priority = 20
- cost = 5
wait = 5
dynamic_wait = 1
dwait_lower = 5
@@ -56,10 +55,12 @@ var/datum/subsystem/air/SSair
/datum/subsystem/air/Initialize(timeofday, zlevel)
- setup_allturfs(zlevel)
setup_atmos_machinery(zlevel)
..()
+/datum/subsystem/air/AfterInitialize(zlevel)
+ setup_allturfs(zlevel)
+
#define MC_AVERAGE(average, current) (0.8*(average) + 0.2*(current))
/datum/subsystem/air/fire()
var/timer = world.timeofday
@@ -167,15 +168,14 @@ var/datum/subsystem/air/SSair
EG.dismantle()
/datum/subsystem/air/proc/setup_allturfs(z_level)
+ active_turfs.Cut()
var/z_start = 1
var/z_finish = world.maxz
if(1 <= z_level && z_level <= world.maxz)
z_level = round(z_level)
z_start = z_level
z_finish = z_level
-
var/list/turfs_to_init = block(locate(1, 1, z_start), locate(world.maxx, world.maxy, z_finish))
-
for(var/turf/simulated/T in turfs_to_init)
T.CalculateAdjacentTurfs()
if(!T.blocks_air)
@@ -195,6 +195,8 @@ var/datum/subsystem/air/SSair
if(!T.air.check_turf_total(enemy_tile))
T.excited = 1
active_turfs |= T
+ if(active_turfs.len)
+ warning("There are [active_turfs.len] active turfs at roundstart, this is a mapping error caused by a difference of the air between the adjacent turfs.")
/datum/subsystem/air/proc/setup_atmos_machinery(z_level)
for (var/obj/machinery/atmospherics/AM in atmos_machinery)
diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm
index a99ac70899f..352caeb6195 100644
--- a/code/controllers/subsystem/garbage.dm
+++ b/code/controllers/subsystem/garbage.dm
@@ -5,9 +5,11 @@ var/datum/subsystem/garbage_collector/SSgarbage
can_fire = 1
wait = 5
priority = -1
+ dynamic_wait = 1
+ dwait_delta = 5
var/collection_timeout = 300// deciseconds to wait to let running procs finish before we just say fuck it and force del() the object
- var/max_run_time = 2 // how long, in deciseconds, can we run before waiting for the next tick
+ var/max_run_time = 1 // how long, in deciseconds, can we run before waiting for the next tick
var/delslasttick = 0 // number of del()'s we've done this tick
var/gcedlasttick = 0 // number of things that gc'ed last tick
var/totaldels = 0
diff --git a/code/controllers/subsystem/lighting.dm b/code/controllers/subsystem/lighting.dm
index c2a0c3df334..cd74bb16b84 100644
--- a/code/controllers/subsystem/lighting.dm
+++ b/code/controllers/subsystem/lighting.dm
@@ -7,6 +7,7 @@ var/datum/subsystem/lighting/SSlighting
wait = 5
priority = 1
dynamic_wait = 1
+ dwait_delta = 1
var/list/changed_lights = list() //list of all datum/light_source that need updating
var/changed_lights_workload = 0 //stats on the largest number of lights (max changed_lights.len)
diff --git a/code/controllers/subsystem/shuttles.dm b/code/controllers/subsystem/shuttles.dm
index 7392c98ec88..f2598097565 100644
--- a/code/controllers/subsystem/shuttles.dm
+++ b/code/controllers/subsystem/shuttles.dm
@@ -109,7 +109,7 @@ var/datum/subsystem/shuttle/SSshuttle
user << "The emergency shuttle has been disabled by Centcom."
return
- call_reason = strip_html_properly(trim(call_reason))
+ call_reason = html_encode(trim(call_reason))
if(length(call_reason) < CALL_SHUTTLE_REASON_LENGTH)
user << "You must provide a reason."
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 4d80d74daae..fa6db81352b 100644
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -417,5 +417,5 @@ var/datum/subsystem/ticker/ticker
/datum/subsystem/ticker/proc/send_random_tip()
var/list/randomtips = file2list("config/tips.txt")
if(randomtips.len)
- world << "Tip of the round: [strip_html_properly(pick(randomtips))] "
+ world << "Tip of the round: [html_encode(pick(randomtips))] "
diff --git a/code/controllers/subsystems.dm b/code/controllers/subsystems.dm
index 5e10dcbcfd6..777bc2e5a1e 100644
--- a/code/controllers/subsystems.dm
+++ b/code/controllers/subsystems.dm
@@ -37,6 +37,9 @@
world << "[msg] "
world.log << msg
+/datum/subsystem/proc/AfterInitialize()
+ return
+
//hook for printing stats to the "MC" statuspanel for admins to see performance and related stats etc.
/datum/subsystem/proc/stat_entry(msg)
var/dwait = ""
diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm
index 4d54909b27d..f44fa115c39 100644
--- a/code/datums/ai_laws.dm
+++ b/code/datums/ai_laws.dm
@@ -5,6 +5,7 @@
var/list/inherent = list()
var/list/supplied = list()
var/list/ion = list()
+ var/mob/living/silicon/owner
/datum/ai_laws/default/asimov
name = "Three Laws of Robotics"
@@ -169,3 +170,20 @@
if (length(law) > 0)
who << "[number]. [law]"
number++
+
+/datum/ai_laws/proc/clear_zeroth_law(var/force) //only removes zeroth from antag ai if force is 1
+ if(force)
+ src.zeroth = null
+ src.zeroth_borg = null
+ return
+ else
+ if(src.owner.mind.special_role)
+ return
+ else
+ src.zeroth = null
+ src.zeroth_borg = null
+ return
+
+/datum/ai_laws/proc/associate(var/mob/living/silicon/M)
+ if(!owner)
+ owner = M
\ No newline at end of file
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index 78728738681..ae0df9ac76d 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -260,7 +260,7 @@ var/record_id_num = 1001
L.fields["enzymes"] = H.dna.struc_enzymes
L.fields["identity"] = H.dna.uni_identity
L.fields["species"] = H.dna.species.type
- L.fields["mcolor"] = H.dna.mutant_color
+ L.fields["features"] = H.dna.features
L.fields["image"] = image
locked += L
return
@@ -272,7 +272,7 @@ var/record_id_num = 1001
photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.skin_tone]_[g]_s")
else
photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.dna.species.id]_[g]_s")
- photo.Blend("#[H.dna.mutant_color]", ICON_MULTIPLY)
+ photo.Blend("#[H.dna.features["mcolor"]]", ICON_MULTIPLY)
var/icon/eyes_s
if(EYECOLOR in H.dna.species.specflags)
diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm
index 4a7c4765b00..f40b58dca57 100644
--- a/code/datums/helper_datums/getrev.dm
+++ b/code/datums/helper_datums/getrev.dm
@@ -38,7 +38,15 @@ var/global/datum/getrev/revdata = new()
src << "Protect Assistant Role From Traitor: [config.protect_assistant_from_antagonist]"
src << "Enforce Human Authority: [config.enforce_human_authority]"
src << "Allow Latejoin Antagonists: [config.allow_latejoin_antagonists]"
- src << "Protect Assistant From Antagonist: [config.protect_assistant_from_antagonist]"
src << "Enforce Continuous Rounds: [config.continuous.len] of [config.modes.len] roundtypes"
src << "Allow Midround Antagonists: [config.midround_antag.len] of [config.modes.len] roundtypes"
+ if(config.show_game_type_odds)
+ src <<"Game Mode Odds: "
+ var/sum = 0
+ for(var/i=1,i<=config.probabilities.len,i++)
+ sum += config.probabilities[config.probabilities[i]]
+ for(var/i=1,i<=config.probabilities.len,i++)
+ if(config.probabilities[config.probabilities[i]] > 0)
+ var/percentage = round(config.probabilities[config.probabilities[i]] / sum * 100, 0.1)
+ src << "[config.probabilities[i]] [percentage]%"
return
diff --git a/code/datums/martial.dm b/code/datums/martial.dm
index 81e611df4f4..865209ab97e 100644
--- a/code/datums/martial.dm
+++ b/code/datums/martial.dm
@@ -87,11 +87,11 @@
name = "Boxing"
/datum/martial_art/boxing/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
- A << " Can't disarm while boxing! "
+ A << "Can't disarm while boxing! "
return 1
/datum/martial_art/boxing/grab_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
- A << " Can't grab while boxing! "
+ A << "Can't grab while boxing! "
return 1
/datum/martial_art/boxing/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
diff --git a/code/datums/spells/lichdom.dm b/code/datums/spells/lichdom.dm
new file mode 100644
index 00000000000..a6ace565803
--- /dev/null
+++ b/code/datums/spells/lichdom.dm
@@ -0,0 +1,108 @@
+/obj/effect/proc_holder/spell/targeted/lichdom
+ name = "Bind Soul"
+ desc = "A dark necromantic pact that can forever bind your soul to an item of your choosing. So long as both your body and the item remain intact you can revive from death, though the time between reincarnations grows steadily with use."
+ school = "necromancy"
+ charge_max = 10
+ clothes_req = 0
+ centcom_cancast = 0
+ invocation = "NECREM IMORTIUM!"
+ invocation_type = "shout"
+ range = -1
+ level_max = 0 //cannot be improved
+ cooldown_min = 10
+ include_user = 1
+
+ var/obj/marked_item
+ var/mob/living/current_body
+
+ action_icon_state = "skeleton"
+
+/obj/effect/proc_holder/spell/targeted/lichdom/New()
+ if(ticker.mode.round_ends_with_antag_death)
+ ticker.mode.round_ends_with_antag_death = 0
+
+ ..()
+/obj/effect/proc_holder/spell/targeted/lichdom/cast(list/targets)
+ for(var/mob/user in targets)
+ var/list/hand_items = list()
+ if(iscarbon(user))
+ hand_items = list(user.get_active_hand(),user.get_inactive_hand())
+
+ if(marked_item && !stat_allowed) //sanity, shouldn't happen without badminry
+ marked_item = null
+ return
+
+ if(stat_allowed) //Death is not my end!
+ if(user.stat == CONSCIOUS && iscarbon(user))
+ user << "You aren't dead enough to revive! " //Usually a good problem to have
+ charge_counter = charge_max
+ return
+
+ if(!marked_item.loc) //Wait nevermind
+ user << "Your phylactery is gone! "
+ return
+
+ if(isobserver(user))
+ var/mob/dead/observer/O = user
+ O.reenter_corpse()
+
+ var/mob/living/carbon/human/lich = new /mob/living/carbon/human(get_turf(marked_item))
+
+ lich.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(lich), slot_shoes)
+ lich.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(lich), slot_w_uniform)
+ lich.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(lich), slot_wear_suit)
+ lich.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(lich), slot_head)
+
+ lich.real_name = user.mind.name
+ user.mind.transfer_to(lich)
+ hardset_dna(lich,null,null,lich.real_name,null,/datum/species/skeleton)
+ lich << "Your bones clatter and shutter as they're pulled back into this world! "
+ charge_max += 600
+ var/mob/old_body = current_body
+ current_body = lich
+ lich.Weaken(10)
+
+ if(old_body && old_body.loc)
+ if(iscarbon(old_body))
+ var/mob/living/carbon/C = old_body
+ for(var/obj/item/W in C)
+ C.unEquip(W)
+ var/wheres_wizdo = dir2text(get_dir(get_turf(old_body), get_turf(marked_item)))
+ if(wheres_wizdo)
+ old_body.visible_message("Suddenly [old_body.name]'s corpse falls to pieces! You see a strange energy rise from the remains, and speed off towards the [wheres_wizdo]! ")
+ old_body.dust()
+
+ if(!marked_item) //linking item to the spell
+ message = ""
+ for(var/obj/item in hand_items)
+ if(ABSTRACT in item.flags || NODROP in item.flags)
+ continue
+ marked_item = item
+ user << "You begin to focus your very being into the [item.name]... "
+ break
+
+ if(!marked_item)
+ user << "You must hold an item you wish to make your phylactery... "
+
+ spawn(50)
+ if(marked_item.loc != user) //I changed my mind I don't want to put my soul in a cheeseburger!
+ user << "Your soul snaps back to your body as you drop the [marked_item.name]! "
+ marked_item = null
+ return
+ name = "RISE!"
+ desc = "Rise from the dead! You will reform at the location of your phylactery and your old body will crumble away."
+ charge_max = 1800 //3 minute cooldown, if you rise in sight of someone and killed again, you're probably screwed.
+ charge_counter = 1800
+ stat_allowed = 1
+ marked_item.name = "Ensouled [marked_item.name]"
+ marked_item.desc = "A terrible aura surrounds this item, its very existence is offensive to life itself..."
+ marked_item.color = "#003300"
+ user << "With a hideous feeling of emptiness you watch in horrified fascination as skin sloughs off bone! Blood boils, nerves disintegrate, eyes boil in their sockets! As your organs crumble to dust in your fleshless chest you come to terms with your choice. You're a lich! "
+ hardset_dna(user, null, null, null, null, /datum/species/skeleton)
+ current_body = user.mind.current
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ H.unEquip(H.wear_suit)
+ H.unEquip(H.head)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(H), slot_head)
\ No newline at end of file
diff --git a/code/datums/spells/summonitem.dm b/code/datums/spells/summonitem.dm
index e74ce4a92c6..7b29e448844 100644
--- a/code/datums/spells/summonitem.dm
+++ b/code/datums/spells/summonitem.dm
@@ -7,7 +7,7 @@
invocation = "GAR YOK"
invocation_type = "whisper"
range = -1
- level_max = 1 //cannot be improved
+ level_max = 0 //cannot be improved
cooldown_min = 100
include_user = 1
diff --git a/code/datums/wires/camera.dm b/code/datums/wires/camera.dm
deleted file mode 100644
index 33f8c1421a5..00000000000
--- a/code/datums/wires/camera.dm
+++ /dev/null
@@ -1,76 +0,0 @@
-// Wires for cameras.
-
-/datum/wires/camera
- random = 0
- holder_type = /obj/machinery/camera
- wire_count = 6
-
-/datum/wires/camera/GetInteractWindow()
-
- . = ..()
- var/obj/machinery/camera/C = holder
- . += " \n[(C.view_range == initial(C.view_range) ? "The focus light is on." : "The focus light is off.")]"
- . += " \n[(C.can_use() ? "The power link light is on." : "The power link light is off.")]"
- . += " \n[(C.light_disabled ? "The camera light is off." : "The camera light is on.")]"
- . += " \n[(C.alarm_on ? "The alarm light is on." : "The alarm light is off.")]"
- return .
-
-/datum/wires/camera/CanUse(var/mob/living/L)
- var/obj/machinery/camera/C = holder
- if(!C.panel_open)
- return 0
- return 1
-
-var/const/CAMERA_WIRE_FOCUS = 1
-var/const/CAMERA_WIRE_POWER = 2
-var/const/CAMERA_WIRE_LIGHT = 4
-var/const/CAMERA_WIRE_ALARM = 8
-var/const/CAMERA_WIRE_NOTHING1 = 16
-var/const/CAMERA_WIRE_NOTHING2 = 32
-
-/datum/wires/camera/UpdateCut(var/index, var/mended)
- var/obj/machinery/camera/C = holder
-
- switch(index)
- if(CAMERA_WIRE_FOCUS)
- var/range = (mended ? initial(C.view_range) : C.short_range)
- C.setViewRange(range)
-
- if(CAMERA_WIRE_POWER)
- if(C.status && !mended || !C.status && mended)
- C.deactivate(usr, 1)
-
- if(CAMERA_WIRE_LIGHT)
- C.light_disabled = !mended
-
- if(CAMERA_WIRE_ALARM)
- if(!mended)
- C.triggerCameraAlarm()
- else
- C.cancelCameraAlarm()
- return
-
-/datum/wires/camera/UpdatePulsed(var/index)
- var/obj/machinery/camera/C = holder
- if(IsIndexCut(index))
- return
- switch(index)
- if(CAMERA_WIRE_FOCUS)
- var/new_range = (C.view_range == initial(C.view_range) ? C.short_range : initial(C.view_range))
- C.setViewRange(new_range)
-
- if(CAMERA_WIRE_POWER)
- C.deactivate(null) // Deactivate the camera
-
- if(CAMERA_WIRE_LIGHT)
- C.light_disabled = !C.light_disabled
-
- if(CAMERA_WIRE_ALARM)
- C.visible_message("\icon[C] *beep*", "\icon[C] *beep*")
- return
-
-/datum/wires/camera/proc/CanDeconstruct()
- if(IsIndexCut(CAMERA_WIRE_POWER) && IsIndexCut(CAMERA_WIRE_FOCUS) && IsIndexCut(CAMERA_WIRE_LIGHT) && IsIndexCut(CAMERA_WIRE_NOTHING1) && IsIndexCut(CAMERA_WIRE_NOTHING2))
- return 1
- else
- return 0
\ No newline at end of file
diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm
index ba6f252724a..e483513c40a 100644
--- a/code/datums/wires/wires.dm
+++ b/code/datums/wires/wires.dm
@@ -102,8 +102,7 @@ var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown",
/datum/wires/Topic(href, href_list)
..()
- if(in_range(holder, usr) && isliving(usr))
-
+ if(usr.Adjacent(holder) && isliving(usr))
var/mob/living/L = usr
if(CanUse(L) && href_list["action"])
var/obj/item/I = L.get_active_hand()
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 8afadbc4ce8..cb638aa6f31 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -21,6 +21,10 @@
// replaced by OPENCONTAINER flags and atom/proc/is_open_container()
///Chemistry.
var/allow_spin = 1
+
+ //Value used to increment ex_act() if reactionary_explosions is on
+ var/explosion_block = 0
+
/atom/proc/onCentcom()
var/turf/T = get_turf(src)
if(!T)
diff --git a/code/game/communications.dm b/code/game/communications.dm
index 75155dff914..9f7d515a300 100644
--- a/code/game/communications.dm
+++ b/code/game/communications.dm
@@ -299,4 +299,4 @@ var/list/pointers = list()
for(var/d in data)
var/val = data[d]
if(istext(val))
- data[d] = strip_html_properly(val)
+ data[d] = html_encode(val)
diff --git a/code/game/dna.dm b/code/game/dna.dm
index 128b7aa1fc6..60fa4a6ca9d 100644
--- a/code/game/dna.dm
+++ b/code/game/dna.dm
@@ -21,7 +21,7 @@
var/uni_identity
var/blood_type
var/datum/species/species = new /datum/species/human() //The type of mutant race the player is if applicable (i.e. potato-man)
- var/mutant_color = "FFF" // What color you are if you have certain speciess
+ var/list/features = list("FFF") //first value is mutant color
var/real_name //Stores the real name of the person who originally got this dna datum. Used primarely for changelings,
var/list/mutations = list() //All mutations are from now on here
var/mob/living/carbon/holder
@@ -36,7 +36,7 @@
destination.dna.uni_identity = uni_identity
destination.dna.blood_type = blood_type
hardset_dna(destination, null, null, null, null, species)
- destination.dna.mutant_color = mutant_color
+ destination.dna.features = features
destination.dna.real_name = real_name
destination.dna.mutations = mutations
@@ -46,7 +46,7 @@
new_dna.uni_identity = uni_identity
new_dna.blood_type = blood_type
new_dna.species = new species.type
- new_dna.mutant_color = mutant_color
+ new_dna.features = features
new_dna.real_name = real_name
new_dna.mutations = mutations
@@ -131,7 +131,7 @@
spans |= M.get_spans()
return spans
-/proc/hardset_dna(mob/living/carbon/owner, ui, se, real_name, blood_type, datum/species/mrace, mcolor)
+/proc/hardset_dna(mob/living/carbon/owner, ui, se, real_name, blood_type, datum/species/mrace, features)
if(!ismonkey(owner) && !ishuman(owner))
return
if(!owner.dna)
@@ -143,8 +143,8 @@
owner.reagents.del_reagent(exotic_blood.id)
owner.dna.species = new mrace()
- if(mcolor)
- owner.dna.mutant_color = mcolor
+ if(features)
+ owner.dna.features = features
if(real_name)
owner.real_name = real_name
@@ -193,6 +193,7 @@
character.dna.uni_identity = character.dna.generate_uni_identity(character)
character.dna.struc_enzymes = character.dna.generate_struc_enzymes(character)
character.dna.unique_enzymes = character.dna.generate_unique_enzymes(character)
+ character.dna.features = character.features
return character.dna
/proc/create_dna(mob/living/carbon/C, datum/species/S) //don't use this unless you're about to use hardset_dna or ready_dna
@@ -497,8 +498,8 @@
/obj/machinery/computer/scan_consolenew
name = "\improper DNA scanner access console"
desc = "Scan DNA."
- icon = 'icons/obj/computer.dmi'
- icon_state = "scanner"
+ icon_screen = "dna"
+ icon_keyboard = "med_key"
density = 1
circuit = /obj/item/weapon/circuitboard/scan_consolenew
var/radduration = 2
@@ -972,7 +973,7 @@
/datum/dna/proc/is_same_as(var/datum/dna/D)
if(uni_identity == D.uni_identity && struc_enzymes == D.struc_enzymes && real_name == D.real_name)
- if(species == D.species && mutant_color == D.mutant_color && blood_type == D.blood_type)
+ if(species == D.species && features == D.features && blood_type == D.blood_type)
return 1
return 0
diff --git a/code/game/gamemodes/abduction/abduction.dm b/code/game/gamemodes/abduction/abduction.dm
index 502d4300932..5a3d85f957a 100644
--- a/code/game/gamemodes/abduction/abduction.dm
+++ b/code/game/gamemodes/abduction/abduction.dm
@@ -263,7 +263,7 @@
for(var/team_number=1,team_number<=teams,team_number++)
var/obj/machinery/abductor/console/con = get_team_console(team_number)
var/datum/objective/objective = team_objectives[team_number]
- if (con.experiment.points > objective.target_amount)
+ if (con.experiment.points >= objective.target_amount)
SSshuttle.emergency.request(null, 0.5)
finished = 1
return ..()
@@ -279,7 +279,7 @@
var/datum/mind/smind = scientists[team_number]
var/mob/living/carbon/human/agent = amind.current
var/mob/living/carbon/human/scientist = smind.current
- if (console.experiment.points > objective.target_amount)
+ if (console.experiment.points >= objective.target_amount)
world << "[team_name] team fullfilled its mission! "
world << "Team Members : [agent.name]([agent.ckey]),[scientist.name]([scientist.ckey]) "
else
diff --git a/code/game/gamemodes/abduction/abduction_gear.dm b/code/game/gamemodes/abduction/abduction_gear.dm
index a13b347907c..dfb27d32870 100644
--- a/code/game/gamemodes/abduction/abduction_gear.dm
+++ b/code/game/gamemodes/abduction/abduction_gear.dm
@@ -22,15 +22,6 @@
var/stealth_armor = list(melee = 15, bullet = 15, laser = 15, energy = 15, bomb = 15, bio = 15, rad = 15)
var/combat_armor = list(melee = 50, bullet = 50, laser = 50, energy = 50, bomb = 50, bio = 50, rad = 50)
- var/obj/machinery/camera/portable/vest_cam = null
-
-
-/obj/item/clothing/suit/armor/abductor/vest/New()
- ..()
- vest_cam = new /obj/machinery/camera/portable(src)
- vest_cam.c_tag = "Agent Vest Cam"
- vest_cam.network = list("Abductor")
-
/obj/item/clothing/suit/armor/abductor/vest/proc/flip_mode()
switch(mode)
if(VEST_STEALTH)
diff --git a/code/game/gamemodes/abduction/gland.dm b/code/game/gamemodes/abduction/gland.dm
index ccb60820159..959f98b5b2a 100644
--- a/code/game/gamemodes/abduction/gland.dm
+++ b/code/game/gamemodes/abduction/gland.dm
@@ -92,7 +92,7 @@
for(var/mob/living/carbon/human/H in orange(4,T))
if(H == host)
continue
- H << " You hear a buzz in your head "
+ H << "You hear a buzz in your head "
H.confused += 20
/obj/item/gland/pop
@@ -213,7 +213,7 @@
/obj/effect/cocoon/abductor/proc/Copy(var/mob/living/carbon/human/H)
var/mob/living/carbon/human/interactive/greytide/clone = new(src)
- hardset_dna(clone,H.dna.uni_identity,H.dna.struc_enzymes,H.real_name, H.dna.blood_type, H.dna.species.type, H.dna.mutant_color)
+ hardset_dna(clone,H.dna.uni_identity,H.dna.struc_enzymes,H.real_name, H.dna.blood_type, H.dna.species.type, H.dna.features)
//There's no define for this / get all items ?
var/list/slots = list(slot_back,slot_w_uniform,slot_wear_suit,\
diff --git a/code/game/gamemodes/abduction/machinery/experiment.dm b/code/game/gamemodes/abduction/machinery/experiment.dm
index 3d79a64b56b..e9ac19599cd 100644
--- a/code/game/gamemodes/abduction/machinery/experiment.dm
+++ b/code/game/gamemodes/abduction/machinery/experiment.dm
@@ -43,7 +43,7 @@
photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.skin_tone]_[g]_s")
else
photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.dna.species.id]_[g]_s")
- photo.Blend("#[H.dna.mutant_color]", ICON_MULTIPLY)
+ photo.Blend("#[H.dna.features["mcolor"]]", ICON_MULTIPLY)
var/icon/eyes_s
if(EYECOLOR in H.dna.species.specflags)
@@ -86,7 +86,7 @@
dat += "Analyze "
dat += ""
else
- dat += " Experiment "
+ dat += "Experiment "
if(!occupant)
dat += "Machine Unoccupied "
diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm
index 549243bf86c..a621168182a 100644
--- a/code/game/gamemodes/antag_spawner.dm
+++ b/code/game/gamemodes/antag_spawner.dm
@@ -146,4 +146,52 @@
ticker.mode.syndicates += R.mind
ticker.mode.update_synd_icons_added(R.mind)
R.mind.special_role = "syndicate"
- R.faction = list("syndicate")
\ No newline at end of file
+ R.faction = list("syndicate")
+
+
+/obj/item/weapon/antag_spawner/slaughter_demon //Warning edgiest item in the game
+ name = "vial of blood"
+ desc = "A magically infused bottle of blood, distilled from countless murder victims. Used in unholy rituals to attract horrifying creatures."
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "vial"
+
+
+/obj/item/weapon/antag_spawner/slaughter_demon/attack_self(mob/user as mob)
+ var/list/demon_candidates = get_candidates(BE_ALIEN)
+ if(user.z != 1)
+ user << "You should probably wait until you reach the station. "
+ return
+ if(demon_candidates.len > 0)
+ used = 1
+ var/client/C = pick(demon_candidates)
+ spawn_antag(C, get_turf(src.loc), "Slaughter Demon")
+ user << "You shatter the bottle, no turning back now! "
+ user << "You sense a dark presence lurking just beyond the veil... "
+ playsound(user.loc, 'sound/effects/Glassbr1.ogg', 100, 1)
+ qdel(src)
+ else
+ user << "You can't seem to work up the nerve to shatter the bottle. Perhaps you should try again later. "
+
+
+/obj/item/weapon/antag_spawner/slaughter_demon/spawn_antag(var/client/C, var/turf/T, var/type = "")
+
+ var /obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(T)
+ var/mob/living/simple_animal/slaughter/S = new /mob/living/simple_animal/slaughter/(holder)
+ S.phased = TRUE
+ S.key = C.key
+ S.mind.assigned_role = "Slaughter Demon"
+ S.mind.special_role = "Slaughter Demon"
+ ticker.mode.traitors += S.mind
+ var/datum/objective/assassinate/new_objective = new /datum/objective/assassinate
+ new_objective.owner = S:mind
+ new_objective:target = usr:mind
+ new_objective.explanation_text = "Kill [usr.real_name], the one who summoned you."
+ S.mind.objectives += new_objective
+ var/datum/objective/new_objective2 = new /datum/objective
+ new_objective2.owner = S:mind
+ new_objective2.explanation_text = "Kill everyone else while you're at it."
+ S.mind.objectives += new_objective2
+ S << S.playstyle_string
+ S << "You are currently not currently in the same plane of existence as the station. Ctrl+Click a blood pool to manifest. "
+ S << "Objective #[1] : [new_objective.explanation_text]"
+ S << "Objective #[2] : [new_objective2.explanation_text]"
\ No newline at end of file
diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index 7dcd49f1821..3a6ef5e1d26 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -83,10 +83,9 @@
H.hair_style = null
H.update_hair()
human_overlays = H.overlays
- if(overmind && overmind.blob_reagent_datum)
- adjustcolors(overmind.blob_reagent_datum.color)
+ update_icons()
H.loc = src
- loc.visible_message(" The corpse of [H.name] suddenly rises! ")
+ loc.visible_message("The corpse of [H.name] suddenly rises! ")
/mob/living/simple_animal/hostile/blob/blobspore/death(gibbed)
..(1)
@@ -120,8 +119,18 @@
..()
+/mob/living/simple_animal/hostile/blob/blobspore/update_icons()
+ ..()
+
+ if(overmind && overmind.blob_reagent_datum)
+ adjustcolors(overmind.blob_reagent_datum.color)
+ else
+ adjustcolors(color) //to ensure zombie/other overlays update
+
+
/mob/living/simple_animal/hostile/blob/blobspore/adjustcolors(var/a_color)
color = a_color
+
if(is_zombie)
overlays.Cut()
overlays = human_overlays
@@ -130,7 +139,6 @@
color = initial(color)//looks better.
overlays += I
-
/////////////////
// BLOBBERNAUT //
/////////////////
diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm
index 840e16b90f5..40ccd99868f 100644
--- a/code/game/gamemodes/blob/overmind.dm
+++ b/code/game/gamemodes/blob/overmind.dm
@@ -65,12 +65,12 @@
/mob/camera/blob/proc/update_health()
if(blob_core)
- hud_used.blobhealthdisplay.maptext = " [round(blob_core.health)]
"
+ hud_used.blobhealthdisplay.maptext = "[round(blob_core.health)]
"
/mob/camera/blob/proc/add_points(var/points)
if(points != 0)
blob_points = Clamp(blob_points + points, 0, max_blob_points)
- hud_used.blobpwrdisplay.maptext = " [round(src.blob_points)]
"
+ hud_used.blobpwrdisplay.maptext = "[round(src.blob_points)]
"
/mob/camera/blob/say(var/message)
if (!message)
diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm
index 913b6dd295d..516a407cbef 100644
--- a/code/game/gamemodes/changeling/powers/absorb.dm
+++ b/code/game/gamemodes/changeling/powers/absorb.dm
@@ -92,7 +92,7 @@
new_dna.struc_enzymes = T.dna.struc_enzymes
new_dna.real_name = T.dna.real_name
new_dna.species = T.dna.species
- new_dna.mutant_color = T.dna.mutant_color
+ new_dna.features = T.dna.features
new_dna.blood_type = T.dna.blood_type
absorbedcount++
store_dna(new_dna, user)
diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm
index fc897feff6b..40884bda963 100644
--- a/code/game/gamemodes/changeling/powers/mutations.dm
+++ b/code/game/gamemodes/changeling/powers/mutations.dm
@@ -303,8 +303,7 @@
icon_state = "lingarmor"
flags = NODROP
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- slowdown = 2
- armor = list(melee = 65, bullet = 20, laser = 10, energy = 13, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 40, bullet = 20, laser = 30, energy = 13, bomb = 0, bio = 0, rad = 0)
flags_inv = HIDEJUMPSUIT
cold_protection = 0
heat_protection = 0
@@ -322,7 +321,7 @@
desc = "A tough, hard covering of black chitin with transparent chitin in front."
icon_state = "lingarmorhelmet"
flags = HEADCOVERSEYES | BLOCKHAIR | NODROP
- armor = list(melee = 70, bullet = 15, laser = 7,energy = 10, bomb = 5, bio = 2, rad = 0)
+ armor = list(melee = 40, bullet = 15, laser = 30,energy = 10, bomb = 5, bio = 2, rad = 0)
flags_inv = HIDEEARS
/obj/item/clothing/head/helmet/changeling/dropped()
diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm
index 936f3f47662..bbadbcd6cac 100644
--- a/code/game/gamemodes/changeling/powers/tiny_prick.dm
+++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm
@@ -91,7 +91,7 @@
var/datum/dna/NewDNA = selected_dna
if(ismonkey(target))
user << "We stealthily sting [target.name]. "
- hardset_dna(target, NewDNA.uni_identity, NewDNA.struc_enzymes, NewDNA.real_name, NewDNA.blood_type, NewDNA.species.type, NewDNA.mutant_color)
+ hardset_dna(target, NewDNA.uni_identity, NewDNA.struc_enzymes, NewDNA.real_name, NewDNA.blood_type, NewDNA.species.type, NewDNA.features)
updateappearance(target)
feedback_add_details("changeling_powers","TS")
return 1
diff --git a/code/game/gamemodes/changeling/powers/transform.dm b/code/game/gamemodes/changeling/powers/transform.dm
index 7b13ecf03da..2f57a81ebb7 100644
--- a/code/game/gamemodes/changeling/powers/transform.dm
+++ b/code/game/gamemodes/changeling/powers/transform.dm
@@ -17,8 +17,7 @@
user.dna = chosen_dna
user.real_name = chosen_dna.real_name
- hardset_dna(user, null, null, null, null, chosen_dna.species.type)
- user.dna.mutant_color = chosen_dna.mutant_color
+ hardset_dna(user, null, null, null, null, chosen_dna.species.type, chosen_dna.features)
updateappearance(user)
domutcheck(user)
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 4bfeecb2247..eddb0216d76 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -188,7 +188,7 @@
return 0
- if(living_antag_player && living_antag_player.mind && living_antag_player.stat != DEAD && !isnewplayer(living_antag_player) &&!isbrain(living_antag_player))
+ if(living_antag_player && living_antag_player.mind && isliving(living_antag_player) && living_antag_player.stat != DEAD && !isnewplayer(living_antag_player) &&!isbrain(living_antag_player))
return 0 //A resource saver: once we find someone who has to die for all antags to be dead, we can just keep checking them, cycling over everyone only when we lose our mark.
for(var/mob/Player in living_mob_list)
diff --git a/code/game/gamemodes/gang/dominator.dm b/code/game/gamemodes/gang/dominator.dm
new file mode 100644
index 00000000000..0bb8c7b21de
--- /dev/null
+++ b/code/game/gamemodes/gang/dominator.dm
@@ -0,0 +1,212 @@
+/obj/machinery/dominator
+ name = "dominator"
+ desc = "A visibly sinister device. Looks like you can break it if you hit it enough."
+ icon = 'icons/obj/machines/dominator.dmi'
+ icon_state = "dominator"
+ density = 1
+ anchored = 1.0
+ layer = 3.6
+ var/health = 200
+ var/gang
+ var/operating = 0
+ var/broken = 0
+
+/obj/machinery/dominator/New()
+ if(!istype(ticker.mode, /datum/game_mode/gang))
+ qdel(src)
+ return
+ SetLuminosity(2)
+
+/obj/machinery/dominator/examine(mob/user)
+ ..()
+ if(broken)
+ user << "It looks completely busted. "
+ return
+
+ var/datum/game_mode/gang/mode = ticker.mode
+ var/time = null
+ if(gang == "A")
+ if(isnum(mode.A_timer))
+ time = max(mode.A_timer, 0)
+ if(gang == "B")
+ if(isnum(mode.B_timer))
+ time = max(mode.B_timer, 0)
+ if(isnum(time))
+ if(time > 0)
+ user << "Hostile Takeover in progress. Estimated [time] seconds remain. "
+ else
+ user << "Hostile Takeover of [station_name()] successful. Have a great day. "
+ else
+ user << "System on standby. "
+ user << "System Integrity: [health/2]% "
+
+
+/obj/machinery/dominator/proc/healthcheck(var/damage)
+ var/iconname = "dominator"
+ if(gang)
+ iconname += "-[gang]"
+ SetLuminosity(3)
+
+ var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread
+
+ health -= damage
+
+ switch(health)
+ if(101 to INFINITY)
+ if(prob(damage*2))
+ sparks.set_up(5, 1, src)
+ sparks.start()
+ if(1 to 100)
+ sparks.set_up(5, 1, src)
+ sparks.start()
+ iconname += "-damaged"
+
+ if(!broken)
+ if(health <= 0)
+ set_broken()
+ else
+ icon_state = iconname
+
+ if(health <= -50)
+ new /obj/item/stack/sheet/plasteel(src.loc)
+ qdel(src)
+
+/obj/machinery/dominator/proc/set_broken()
+ var/datum/game_mode/gang/mode = ticker.mode
+ if(gang == "A")
+ mode.A_timer = "OFFLINE"
+ if(gang == "B")
+ mode.B_timer = "OFFLINE"
+ if(!isnum(mode.A_timer) && !isnum(mode.B_timer))
+ SSshuttle.emergencyNoEscape = 0
+ if(SSshuttle.emergency.mode == SHUTTLE_STRANDED)
+ SSshuttle.emergency.mode = SHUTTLE_DOCKED
+ SSshuttle.emergency.timer = world.time
+ priority_announce("Hostile enviroment resolved. You have 3 minutes to board the Emergency Shuttle.", null, 'sound/AI/shuttledock.ogg', "Priority")
+ else
+ priority_announce("All hostile activity within station systems have ceased.","Network Alert")
+ if(gang)
+ ticker.mode.message_gangtools(((gang=="A") ? ticker.mode.A_tools : ticker.mode.B_tools),"Hostile takeover cancelled: Dominator is no longer operational.",1,1)
+ SetLuminosity(0)
+ icon_state = "dominator-broken"
+ broken = 1
+
+/obj/machinery/dominator/Destroy()
+ if(!broken)
+ set_broken()
+ ..()
+
+/obj/machinery/dominator/emp_act(severity)
+ healthcheck(100)
+ ..()
+
+/obj/machinery/dominator/ex_act(severity, target)
+ if(target == src)
+ qdel(src)
+ return
+ switch(severity)
+ if(1.0)
+ qdel(src)
+ if(2.0)
+ healthcheck(120)
+ if(3.0)
+ healthcheck(30)
+ return
+
+/obj/machinery/dominator/bullet_act(var/obj/item/projectile/Proj)
+ if(Proj.damage)
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ playsound(src, 'sound/effects/bang.ogg', 50, 1)
+ visible_message("[src] was hit by [Proj]. ")
+ healthcheck(Proj.damage)
+ ..()
+
+/obj/machinery/dominator/blob_act()
+ healthcheck(110)
+
+/obj/machinery/dominator/attackby(I as obj, user as mob, params)
+
+ return
+
+/obj/machinery/dominator/attack_hand(mob/user)
+ if(operating||broken)
+ examine(user)
+ return
+
+ var/datum/game_mode/gang/mode = ticker.mode
+ var/gang_territory
+ var/timer
+
+ var/tempgang
+ if(user.mind in (ticker.mode.A_gang|ticker.mode.A_bosses))
+ tempgang = "A"
+ gang_territory = ticker.mode.A_territory.len
+ timer = mode.A_timer
+ else if(user.mind in (ticker.mode.B_gang|ticker.mode.B_bosses))
+ tempgang = "B"
+ gang_territory = ticker.mode.B_territory.len
+ timer = mode.B_timer
+
+ if(!tempgang)
+ examine(user)
+ return
+
+ if(isnum(timer)) //In theory, this shouldn't happen. But if it does, they get this meme
+ user << "Error: Hostile Takeover is already in progress. "
+ return
+
+ var/time = max(180,900 - ((round((gang_territory/start_state.num_territories)*200, 1) - 60) * 15))
+ if(alert(user,"With [round((gang_territory/start_state.num_territories)*100, 1)]% station control, a takeover will require [time] seconds.\nYour gang will be unable to gain influence while it is active.\nThe entire station will likely be alerted to it once it starts.\nAre you ready?","Confirm","Ready","Later") == "Ready")
+ if ((!in_range(src, user) || !istype(src.loc, /turf)))
+ return 0
+ var/area/srcloc = get_area(src.loc)
+ gang = tempgang
+ mode.domination(gang,1,srcloc.name)
+ src.name = "[gang_name(gang)] Gang [src.name]"
+ healthcheck(0)
+ operating = 1
+ ticker.mode.message_gangtools(((gang=="A") ? ticker.mode.A_tools : ticker.mode.B_tools),"Hostile takeover in progress: Estimated [time] seconds until victory.")
+
+/obj/machinery/dominator/attack_alien(mob/living/user)
+ user.do_attack_animation(src)
+ playsound(src, 'sound/effects/bang.ogg', 50, 1)
+ user.visible_message("[user] smashes against [src] with its claws. ",\
+ "You smash against [src] with your claws. ",\
+ "You hear metal scraping. ")
+ healthcheck(15)
+
+/obj/machinery/dominator/attack_animal(mob/living/user as mob)
+ if(!isanimal(user))
+ return
+ var/mob/living/simple_animal/M = user
+ M.do_attack_animation(src)
+ if(M.melee_damage_upper <= 0)
+ return
+ healthcheck(M.melee_damage_upper)
+
+/obj/machinery/dominator/mech_melee_attack(obj/mecha/M)
+ if(M.damtype == "brute")
+ playsound(src, 'sound/effects/bang.ogg', 50, 1)
+ visible_message("[M.name] has hit [src]. ")
+ healthcheck(M.force)
+ return
+
+/obj/machinery/dominator/attack_hulk(mob/user)
+ playsound(src, 'sound/effects/bang.ogg', 50, 1)
+ user.visible_message("[user] smashes [src]. ",\
+ "You punch [src]. ",\
+ "You hear metal being slammed. ")
+ healthcheck(5)
+
+/obj/machinery/dominator/attackby(obj/item/weapon/I as obj, mob/living/user as mob, params)
+ if(istype(I, /obj/item/weapon))
+ add_fingerprint(user)
+ user.changeNext_move(CLICK_CD_MELEE)
+ user.do_attack_animation(src)
+ if( (I.flags&NOBLUDGEON) || !I.force )
+ return
+ playsound(src, 'sound/weapons/smash.ogg', 50, 1)
+ visible_message("[user] has hit \the [src] with [I]. ")
+ if(I.damtype == BURN || I.damtype == BRUTE)
+ healthcheck(I.force)
+ return
diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm
index 6967dc894c7..2b448e0b833 100644
--- a/code/game/gamemodes/gang/gang.dm
+++ b/code/game/gamemodes/gang/gang.dm
@@ -15,6 +15,10 @@
var/list/A_territory_lost = list()
var/list/B_territory_new = list()
var/list/B_territory_lost = list()
+ var/gang_A_style
+ var/gang_A_headgear
+ var/gang_B_style
+ var/gang_B_headgear
/datum/game_mode/gang
name = "gang war"
@@ -26,14 +30,15 @@
recommended_enemies = 2
enemy_minimum_age = 14
var/finished = 0
- var/goal_scalar = 0.5 //Goal = Total territories x goal_scalar
-
+ // Victory timers
+ var/A_timer = "OFFLINE"
+ var/B_timer = "OFFLINE"
///////////////////////////
//Announces the game type//
///////////////////////////
/datum/game_mode/gang/announce()
world << "The current game mode is - Gang War! "
- world << "A violent turf war has erupted on the station! Gangsters - Take over the station by claiming more than [round(100*goal_scalar,1)]% of the station! Crew - The gangs will try to keep you on the station. Successfully evacuate the station to win! "
+ world << "A violent turf war has erupted on the station! Gangsters - Take over the station by activating and defending a Dominator! Crew - The gangs will try to keep you on the station. Successfully evacuate the station to win! "
///////////////////////////////////////////////////////////////////////////////
@@ -73,6 +78,15 @@
modePlayer += B_bosses
..()
+/datum/game_mode/gang/process(seconds)
+ if(!finished)
+ if(isnum(A_timer))
+ A_timer -= seconds
+ if(isnum(B_timer))
+ B_timer -= seconds
+
+ ticker.mode.check_win()
+
/datum/game_mode/gang/proc/assign_bosses()
var/datum/mind/boss = pick(antag_candidates)
A_bosses += boss
@@ -91,7 +105,7 @@
/datum/game_mode/proc/forge_gang_objectives(var/datum/mind/boss_mind)
var/datum/objective/rival_obj = new
rival_obj.owner = boss_mind
- rival_obj.explanation_text = "Claim more than 50% the station before the [(boss_mind in A_bosses) ? gang_name("B") : gang_name("A")] Gang does."
+ rival_obj.explanation_text = "Preform a hostile takeover of the station with a Dominator."
boss_mind.objectives += rival_obj
@@ -103,6 +117,17 @@
boss_mind.current << "Objective #[obj_count] : [objective.explanation_text]"
obj_count++
+/datum/game_mode/gang/proc/domination(var/gang,var/modifier=1,var/dominatorloc)
+ if(gang=="A")
+ A_timer = max(180,900 - ((round((ticker.mode.A_territory.len/start_state.num_territories)*200, 1) - 60) * 15)) * modifier
+ if(gang=="B")
+ B_timer = max(180,900 - ((round((ticker.mode.B_territory.len/start_state.num_territories)*200, 1) - 60) * 15)) * modifier
+ if(gang && dominatorloc)
+ priority_announce("Hostile runtimes detected in all station systems. A network breach by the [gang_name(gang)] Gang has been located in [dominatorloc].","Network Alert")
+ if(get_security_level() != "delta")
+ set_security_level("red")
+ SSshuttle.emergencyNoEscape = 1
+
///////////////////////////////////////////////////////////////////////////
//This equips the bosses with their gear, and makes the clown not clumsy//
///////////////////////////////////////////////////////////////////////////
@@ -132,37 +157,91 @@
var/where = mob.equip_in_one_of_slots(gangtool, slots)
if (!where)
mob << "Your Syndicate benefactors were unfortunately unable to get you a Gangtool."
+ . += 1
else
gangtool.register_device(mob)
- mob << "The Gangtool in your [where] will allow you to use your influence to purchase items and prevent the station from evacuating before you can take over. Use it to recall the emergency shuttle from anywhere on the station."
+ mob << "The Gangtool in your [where] will allow you to purchase items, send messages to your gangsters and recall the emergency shuttle from anywhere on the station."
mob << "You can also promote your gang members to lieutenant by giving them an unregistered gangtool. Lieutenants cannot be deconverted and are able to use recruitment pens and gangtools."
- . += 1
var/where2 = mob.equip_in_one_of_slots(T, slots)
if (!where2)
mob << "Your Syndicate benefactors were unfortunately unable to get you a recruitment pen to start."
- else
- mob << "The recruitment pen in your [where2] will help you get your gang started. Use it on unsuspecting crew members to recruit them."
. += 1
+ else
+ mob << "The recruitment pen in your [where2] will help you get your gang started. Stab unsuspecting crew members with it to recruit them."
var/where3 = mob.equip_in_one_of_slots(SC, slots)
if (!where3)
mob << "Your Syndicate benefactors were unfortunately unable to get you a territory spraycan to start."
- else
- mob << "The territory spraycan in your [where3] can be used to claim areas of the station for your gang. The more territory your gang controls, the more influence you get. Distribute these to your gangsters to grow your influence faster."
. += 1
+ else
+ mob << "The territory spraycan in your [where3] can be used to claim areas of the station for your gang. The more territory your gang controls, the more influence you get. All gangsters can use these, so distribute them to grow your influence faster."
mob.update_icons()
return .
+//Used by recallers when purchasing a gang outfit. First time a gang outfit is purchased the buyer decides a gang style which is stored so gang outfits are uniform
+/datum/game_mode/proc/gang_outfit(mob/user,var/obj/item/device/gangtool/gangtool,var/gang)
+ if(!user || !gangtool || !gang)
+ return 0
+ if(!gangtool.can_use(user))
+ return 0
+
+ var/gang_style_list = list("Gang Colors","Leather Jackets","Black Suits","White Suits")
+ var/style
+ if(gang == "A")
+ if(!gang_A_style)
+ gang_A_style = input("Pick an outfit style.", "Pick Style") as null|anything in gang_style_list
+ style = gang_A_style
+
+ if(gang == "B")
+ if(!gang_B_style)
+ gang_B_style = input("Pick an outfit style.", "Pick Style") as null|anything in gang_style_list
+ style = gang_B_style
+
+ if(!style)
+ return 0
+
+ if(gangtool.can_use(user) && (((gang == "A") ? gang_points.A : gang_points.B) >= 1))
+ switch(style)
+ if("Gang Colors")
+ if(gang == "A")
+ new /obj/item/clothing/under/color/blue(user.loc)
+ if(gang == "B")
+ new /obj/item/clothing/under/color/red(user.loc)
+ if("Leather Jackets")
+ new /obj/item/clothing/suit/jacket/leather(user.loc)
+ if("Black Suits")
+ new /obj/item/clothing/under/suit_jacket/charcoal(user.loc)
+ if("White Suits")
+ new /obj/item/clothing/under/suit_jacket/white(user.loc)
+
+ return 1
+
+ return 0
+
/////////////////////////////////////////////
//Checks if the either gang have won or not//
/////////////////////////////////////////////
/datum/game_mode/gang/check_win()
- if(A_territory.len > (start_state.num_territories * goal_scalar))
- finished = "A" //Gang A wins
- else if(B_territory.len > (start_state.num_territories * goal_scalar))
- finished = "B" //Gang B wins
+ var/winner = 0
+
+ if(isnum(A_timer))
+ if(A_timer < 0)
+ winner += 1
+ if(isnum(B_timer))
+ if(B_timer < 0)
+ winner += 2
+
+ if(winner)
+ if(winner == 3) //Edge Case: If both dominators activate at the same time
+ domination("A",0.5)
+ domination("B",0.5)
+ priority_announce("Multiple station takeover attempts have made simultaneously. Conflicting hostile runtimes appears to have delayed both attempts.","Network Alert")
+ else if(winner == 1)
+ finished = "A" //Gang A wins
+ else if(winner == 2)
+ finished = "B" //Gang B wins
///////////////////////////////
//Checks if the round is over//
@@ -282,7 +361,7 @@
if(!finished)
world << "The station was [station_was_nuked ? "destroyed!" : "evacuated before either gang could claim it!"] "
else
- world << "The [finished=="A" ? gang_name("A") : gang_name("B")] Gang has claimed over [round(100*goal_scalar,1)]% of the station and has assumed control! "
+ world << "The [finished=="A" ? gang_name("A") : gang_name("B")] Gang successfully preformed a hostile takeover of the station!! "
..()
return 1
@@ -338,8 +417,8 @@
//////////////////////////////////////////////////////////
/datum/gang_points
- var/A = 30
- var/B = 30
+ var/A = 25
+ var/B = 25
var/next_point_interval = 1800
var/next_point_time
@@ -371,25 +450,43 @@
B_lost_names += "[ticker.mode.B_territory_lost[area]], "
ticker.mode.B_territory -= area
+ var/datum/game_mode/gang/gangmode
+ if(istype(ticker.mode, /datum/game_mode/gang))
+ gangmode = ticker.mode
+
//Calculate and report influence growth
- ticker.mode.message_gangtools(ticker.mode.A_tools,"[gang_name("A")] Gang Status Report: ")
- var/A_new = min(999,A + 15 + ticker.mode.A_territory.len)
+ ticker.mode.message_gangtools(ticker.mode.A_tools,"*---------*[gang_name("A")] Gang Status Report: ")
var/A_message = ""
- if(A_new != A)
- A_message += "Your gang has gained [A_new - A] Influence for holding on to [ticker.mode.A_territory.len] territories."
- if(A_new == 999)
- A_message += " You cannot gain any more influence without spending some with this device."
- A = A_new
+ if(gangmode && isnum(gangmode.A_timer))
+ var/new_time = max(180,gangmode.A_timer - (ticker.mode.A_territory.len * 2))
+ if(new_time < gangmode.A_timer)
+ A_message += "Your takeover has been rushed by [gangmode.A_timer - new_time] seconds for holding on to [ticker.mode.A_territory.len] territories. "
+ gangmode.A_timer = new_time
+ A_message += "[gangmode.A_timer] seconds remain in hostile takeover."
+ else
+ var/A_new = min(999,A + 15 + ticker.mode.A_territory.len)
+ if(A_new != A)
+ A_message += "Your gang has gained [A_new - A] Influence for holding on to [ticker.mode.A_territory.len] territories."
+ if(A_new == 999)
+ A_message += " You cannot gain any more influence without spending some with this device."
+ A = A_new
ticker.mode.message_gangtools(ticker.mode.A_tools,A_message,0)
ticker.mode.message_gangtools(ticker.mode.B_tools,"[gang_name("B")] Gang Status Report: ")
- var/B_new = min(999,B + 15 + ticker.mode.B_territory.len)
var/B_message = ""
- if(B_new != B)
- B_message += "Your gang has gained [B_new - B] Influence for holding on to [ticker.mode.B_territory.len] territories."
- if(B_new == 999)
- B_message += " You cannot gain any more influence without spending some with this device."
- B = B_new
+ if(gangmode && isnum(gangmode.B_timer))
+ var/new_time = max(180,gangmode.B_timer - (ticker.mode.B_territory.len * 2))
+ if(new_time < gangmode.B_timer)
+ B_message += "Your takeover has been rushed by [gangmode.B_timer - new_time] seconds for holding on to [ticker.mode.B_territory.len] territories. "
+ gangmode.B_timer = new_time
+ B_message += "[gangmode.B_timer] seconds remain in hostile takeover."
+ else
+ var/B_new = min(999,B + 15 + ticker.mode.B_territory.len)
+ if(B_new != B)
+ B_message += "Your gang has gained [B_new - B] Influence for holding on to [ticker.mode.B_territory.len] territories."
+ if(B_new == 999)
+ B_message += " You cannot gain any more influence without spending some with this device."
+ B = B_new
ticker.mode.message_gangtools(ticker.mode.B_tools,B_message,0)
@@ -428,13 +525,12 @@
var/A_control = round((ticker.mode.A_territory.len/start_state.num_territories)*100, 1)
var/B_control = round((ticker.mode.B_territory.len/start_state.num_territories)*100, 1)
- ticker.mode.message_gangtools((ticker.mode.A_tools),"Your gang now has [A_control]% control of the station.",0)
- ticker.mode.message_gangtools((ticker.mode.A_tools),"The [gang_name("B")] Gang has [B_control]% control of the station.",0,1)
- ticker.mode.message_gangtools((ticker.mode.B_tools),"Your gang now has [B_control]% control of the station.",0)
- ticker.mode.message_gangtools((ticker.mode.B_tools),"The [gang_name("A")] Gang has [A_control]% control of the station.",0,1)
+ ticker.mode.message_gangtools((ticker.mode.A_tools),"Your gang now has [A_control]% control of the station. *---------*",0)
+ ticker.mode.message_gangtools((ticker.mode.B_tools),"Your gang now has [B_control]% control of the station. *---------*",0)
- //Victory check
- ticker.mode.check_win()
+ //Increase outfit stock
+ for(var/obj/item/device/gangtool/tool in (ticker.mode.A_tools | ticker.mode.B_tools))
+ tool.outfits = min(tool.outfits+3,10)
//Restart the counter
start()
diff --git a/code/game/objects/items/devices/recaller.dm b/code/game/gamemodes/gang/recaller.dm
similarity index 70%
rename from code/game/objects/items/devices/recaller.dm
rename to code/game/gamemodes/gang/recaller.dm
index de3f046635c..b081a80686e 100644
--- a/code/game/objects/items/devices/recaller.dm
+++ b/code/game/gamemodes/gang/recaller.dm
@@ -2,7 +2,7 @@
/obj/item/device/gangtool
name = "suspicious device"
desc = "A strange device of sorts. Hard to really make out what it actually does just by looking."
- icon_state = "recaller"
+ icon_state = "gangtool"
item_state = "walkietalkie"
throwforce = 0
w_class = 1.0
@@ -13,6 +13,7 @@
var/boss = 1 //If it has the power to promote gang members
var/recalling = 0
var/promotions = 0
+ var/outfits = 5
/obj/item/device/gangtool/New() //Initialize supply point income if it hasn't already been started
if(!ticker.mode.gang_points)
@@ -33,30 +34,35 @@
else
dat += "Register Device "
else
+ var/datum/game_mode/gang/gangmode
+ if(istype(ticker.mode, /datum/game_mode/gang))
+ gangmode = ticker.mode
+
var/gang_size = ((gang == "A")? (ticker.mode.A_gang.len + ticker.mode.A_bosses.len) : (ticker.mode.B_gang.len + ticker.mode.B_bosses.len))
var/gang_territory = ((gang == "A")? ticker.mode.A_territory.len : ticker.mode.B_territory.len)
var/points = ((gang == "A") ? ticker.mode.gang_points.A : ticker.mode.gang_points.B)
+ var/timer
+ if(gangmode)
+ timer = ((gang == "A") ? gangmode.A_timer : gangmode.B_timer)
+ if(isnum(timer))
+ dat += "Takeover In Progress:[timer] seconds remain "
dat += "Registration: [(gang == "A")? gang_name("A") : gang_name("B")] Gang [boss ? "Administrator" : "Lieutenant"] "
- dat += "Organization Size: [gang_size] "
- dat += "Station Control: [round((gang_territory/start_state.num_territories)*100, 1)]% "
- dat += "Recall Emergency Shuttle "
+ dat += "Organization Size: [gang_size] | Station Control: [round((gang_territory/start_state.num_territories)*100, 1)]% "
+ if(outfits > 0)
+ dat += "Create Gang Outfit "
+ else
+ dat += "Create Gang Outfit (Restocking) "
+ dat += "Send Gang-wide Message "
+ if(gangmode)
+ dat += "Recall Emergency Shuttle "
+
dat += " "
+
dat += "Influence: [points] "
- dat += "Time until Influence grows: [(points >= 100) ? ("--:--") : (time2text(ticker.mode.gang_points.next_point_time - world.time, "mm:ss"))] "
- dat += "Purchase Items: "
-
- dat += "(5 Influence) "
- if(points >= 5)
- dat += "Send Gang-wide Message "
- else
- dat += "Send Gang-wide Message "
-
- dat += "(10 Influence) "
- if(points >= 10)
- dat += "Territory Spraycan "
- else
- dat += "Territory Spraycan "
+ dat += "Time until Influence grows: [(points >= 999) ? ("--:--") : (time2text(ticker.mode.gang_points.next_point_time - world.time, "mm:ss"))] "
+ dat += " "
+ dat += "Purchase Weapons: "
dat += "(10 Influence) "
if(points >= 10)
@@ -64,8 +70,8 @@
else
dat += "Switchblade "
- dat += "(25 Influence) "
- if(points >= 25)
+ dat += "(20 Influence) "
+ if(points >= 20)
dat += "10mm Pistol "
else
dat += "10mm Pistol "
@@ -76,8 +82,29 @@
else
dat += "10mm Ammo "
- dat += "(40 Influence) "
- if(points >= 40)
+ dat += "(50 Influence) "
+ if(points >= 50)
+ dat += "Thompson SMG "
+ else
+ dat += "Thompson SMG "
+
+ dat += " "
+ dat += "Purchase Utilities: "
+
+ dat += "(5 Influence) "
+ if(points >= 5)
+ dat += "Territory Spraycan "
+ else
+ dat += "Territory Spraycan "
+
+ dat += "(10 Influence) "
+ if(points >= 10)
+ dat += "Bulletproof Vest "
+ else
+ dat += "Bulletproof Vest "
+
+ dat += "(30 Influence) "
+ if(points >= 30)
dat += "Recruitment Pen "
else
dat += "Recruitment Pen "
@@ -86,19 +113,28 @@
if(promotions >= 3)
dat += "(Out of stock) Promote a Gangster "
else
- dat += "([(promotions*20)+10] Influence, [3-promotions] left) "
- if(points >= (promotions*20)+10)
+ dat += "([(promotions*10)+10] Influence, [3-promotions] left) "
+ if(points >= (promotions*10)+10)
dat += "Promote a Gangster "
else
dat += "Promote a Gangster "
+ if(gangmode)
+ dat += "(30 Influence) "
+ if(points >= 30)
+ dat += "Station Dominator "
+ else
+ dat += "Station Dominator "
+ dat += "(Estimated Takeover Time: [round(max(180,900 - ((round((gang_territory/start_state.num_territories)*200, 10) - 60) * 15))/60,1)] minutes) "
dat += " "
dat += "Refresh "
- var/datum/browser/popup = new(user, "gangtool", "Welcome to GangTool v0.4")
+ var/datum/browser/popup = new(user, "gangtool", "Welcome to GangTool v0.4", 340, 600)
popup.set_content(dat)
popup.open()
+
+
/obj/item/device/gangtool/Topic(href, href_list)
if(!can_use(usr))
return
@@ -116,44 +152,77 @@
var/item_type
switch(href_list["purchase"])
if("spraycan")
- if(points >= 10)
+ if(points >= 5)
item_type = /obj/item/toy/crayon/spraycan/gang
- points = 10
+ points = 5
if("switchblade")
if(points >= 10)
item_type = /obj/item/weapon/switchblade
points = 10
if("pistol")
- if(points >= 25)
+ if(points >= 20)
item_type = /obj/item/weapon/gun/projectile/automatic/pistol
- points = 25
+ points = 20
if("ammo")
if(points >= 10)
item_type = /obj/item/ammo_box/magazine/m10mm
points = 10
+ if("SMG")
+ if(points >= 50)
+ item_type = /obj/item/weapon/gun/projectile/automatic/tommygun
+ points = 50
+ if("vest")
+ if(points >= 10)
+ item_type = /obj/item/clothing/suit/armor/bulletproof
+ points = 10
if("pen")
- if(points >= 40)
+ if(points >= 30)
item_type = /obj/item/weapon/pen/gang
- points = 40
+ points = 30
if("gangtool")
- if((promotions < 3) && (points >= (promotions*20)+10))
+ if((promotions < 3) && (points >= (promotions*10)+10))
item_type = /obj/item/device/gangtool/lt
- points = (promotions*20)+10
+ points = (promotions*10)+10
promotions++
+ if("dominator")
+ if(istype(ticker.mode, /datum/game_mode/gang))
+ var/datum/game_mode/gang/mode = ticker.mode
+ if(isnum((gang == "A") ? mode.A_timer : mode.B_timer))
+ return
+
+ var/usrarea = get_area(usr.loc)
+ var/usrturf = get_turf(usr.loc)
+ if(istype(usrarea,/area/space) || istype(usrturf,/turf/space) || usr.z != 1)
+ usr << "You can only use this on the station! "
+ return
+
+ for(var/obj/obj in usrturf)
+ if(obj.density)
+ usr << "There's not enough room here! "
+ return
+
+ if(points >= 30)
+ item_type = /obj/machinery/dominator
+ points = 30
if(item_type)
if(gang == "A")
ticker.mode.gang_points.A -= points
else if(gang == "B")
ticker.mode.gang_points.B -= points
- var/obj/purchased = new item_type(get_turf(usr))
- var/mob/living/carbon/human/H = usr
- H.put_in_any_hand_if_possible(purchased)
+ if(ispath(item_type))
+ var/obj/purchased = new item_type(get_turf(usr))
+ var/mob/living/carbon/human/H = usr
+ H.put_in_any_hand_if_possible(purchased)
ticker.mode.message_gangtools(((gang=="A")? ticker.mode.A_tools : ticker.mode.B_tools), "A [href_list["purchase"]] was purchased by [usr] for [points] Influence.")
log_game("A [href_list["purchase"]] was purchased by [key_name(usr)] for [points] Influence.")
else if(href_list["choice"])
switch(href_list["choice"])
+ if("outfit")
+ if(outfits > 0)
+ ticker.mode.gang_outfit(usr,src,gang)
+ outfits -= 1
if("recall")
recall(usr)
if("ping")
@@ -172,19 +241,17 @@
return
var/list/members = list()
if(gang == "A")
- if(ticker.mode.gang_points.A >= 5)
- members += ticker.mode.A_bosses | ticker.mode.A_gang
- ticker.mode.gang_points.A -= 5
+ members += ticker.mode.A_bosses | ticker.mode.A_gang
else if(gang == "B")
- if(ticker.mode.gang_points.B >= 5)
- members += ticker.mode.B_bosses | ticker.mode.B_gang
- ticker.mode.gang_points.B -= 5
+ members += ticker.mode.B_bosses | ticker.mode.B_gang
if(members.len)
+ var/ping = "[gang_name(gang)] [boss ? "Gang Boss" : "Gang Lieutenant"] : [message] "
for(var/datum/mind/ganger in members)
if(ganger.current.z <= 2)
- ganger.current << "BOSS: [message] "
- message_admins("[key_name_admin(user)] sent a global message to the [gang_name(gang)] Gang ([gang]): [message].")
- log_game("[key_name(user)] sent a global message to the [gang_name(gang)] Gang ([gang]): [message].")
+ ganger.current << ping
+ for(var/mob/M in dead_mob_list)
+ M << ping
+ log_game("[key_name(user)] Messaged [gang_name(gang)] Gang ([gang]): [message].")
/obj/item/device/gangtool/proc/register_device(var/mob/user)
@@ -196,6 +263,7 @@
if(user.mind in (ticker.mode.A_gang | ticker.mode.A_bosses))
ticker.mode.A_tools += src
gang = "A"
+ icon_state = "gangtool-a"
if(!(user.mind in ticker.mode.A_bosses))
ticker.mode.remove_gangster(user.mind, 0, 2)
ticker.mode.A_bosses += user.mind
@@ -206,6 +274,7 @@
else if(user.mind in (ticker.mode.B_gang | ticker.mode.B_bosses))
ticker.mode.B_tools += src
gang = "B"
+ icon_state = "gangtool-b"
if(!(user.mind in ticker.mode.B_bosses))
ticker.mode.remove_gangster(user.mind, 0, 2)
ticker.mode.B_bosses += user.mind
@@ -218,7 +287,7 @@
user << "You have been promoted to Lieutenant! "
ticker.mode.forge_gang_objectives(user.mind)
ticker.mode.greet_gang(user.mind,0)
- user << "The Gangtool you registered will allow you to use your gang's influence to purchase items and prevent the station from evacuating before your gang can take over. Use it to recall the emergency shuttle from anywhere on the station."
+ user << "The Gangtool you registered will allow you to purchase items, send messages to your gangsters and to recall the emergency shuttle from anywhere on the station."
user << "You may also now use recruitment pens to grow your gang membership. Use them on unsuspecting crew members to recruit them."
if(!gang)
usr << "ACCESS DENIED: Unauthorized user. "
@@ -227,6 +296,9 @@
if(recalling || !can_use(user))
return
+ if(!istype(ticker.mode, /datum/game_mode/gang))
+ return
+
recalling = 1
loc << "\icon[src]Generating shuttle recall order with codes retrieved from last call signal... "
diff --git a/code/game/gamemodes/intercept_report.dm b/code/game/gamemodes/intercept_report.dm
index e392f101ae7..6fe17405212 100644
--- a/code/game/gamemodes/intercept_report.dm
+++ b/code/game/gamemodes/intercept_report.dm
@@ -228,9 +228,9 @@
*/
/datum/intercept_text/proc/build_gang(datum/mind/correct_person)
- src.text += " We have recieved reports of a sudden increase of criminal activity in close proximity to our operations within your sector."
- src.text += "Ensure law and order is maintained on the station and be on the lookout for unusually territorial behavior from the crew."
- src.text += "In the event of a full-scale takeover attempt, sensitive research items are to be secured and the station evacuated ASAP."
+ src.text += " We have reports of criminal activity in close proximity to our operations within your sector."
+ src.text += "Ensure law and order is maintained on the station and be on the lookout for aggressive factionalism within the crew."
+ src.text += "In the event of a full-scale criminal takeover threat, sensitive research items are to be secured and the station evacuated ASAP."
src.text += " "
/datum/intercept_text/proc/build_wizard(datum/mind/correct_person)
@@ -289,3 +289,4 @@
*/
src.text += "These lifeforms are associated with the [orgname1] [orgname2] and may be attempting to acquire sensitive materials on their behalf. "
src.text += "Please take care not to alarm the crew, as [cname] may take advantage of a panic situation. Remember, they can be anybody, suspect everybody!"
+ src.text += " "
\ No newline at end of file
diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm
index 5ef07cdcbf5..90bb59dc92f 100644
--- a/code/game/gamemodes/malfunction/Malf_Modules.dm
+++ b/code/game/gamemodes/malfunction/Malf_Modules.dm
@@ -99,7 +99,7 @@
C.post_status("alert", "lockdown")
src.verbs += /mob/living/silicon/ai/proc/disablelockdown
- src << "Lockdown Initiated. "
+ src << "Lockdown Initiated. "
malf_cooldown = 1
spawn(30)
malf_cooldown = 0
@@ -127,7 +127,7 @@
else if(!D.stat) //Opens only powered doors.
D.open() //Open everything!
- src << "Lockdown Lifted. "
+ src << "Lockdown Lifted. "
malf_cooldown = 1
spawn(30)
malf_cooldown = 0
diff --git a/code/game/gamemodes/monkey/monkey.dm b/code/game/gamemodes/monkey/monkey.dm
index 18a62827b4f..d27155825c0 100644
--- a/code/game/gamemodes/monkey/monkey.dm
+++ b/code/game/gamemodes/monkey/monkey.dm
@@ -46,7 +46,7 @@
/datum/game_mode/monkey/proc/greet_carrier(var/datum/mind/carrier)
- carrier.current << "You are the Jungle Fever patient zero!! "
+ carrier.current << "You are the Jungle Fever patient zero!! "
carrier.current << "You have been planted onto this station by the Animal Rights Consortium. "
carrier.current << "Soon the disease will transform you into an ape. Afterwards, you will be able spread the infection to others with a bite. "
carrier.current << "While your infection strain is undetectable by scanners, any other infectees will show up on medical equipment. "
diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm
index 351f87f9c37..8a5b0de73ce 100644
--- a/code/game/gamemodes/wizard/soulstone.dm
+++ b/code/game/gamemodes/wizard/soulstone.dm
@@ -49,7 +49,7 @@
dat += "Captured Soul: [A.name] "
dat += {"Summon Shade "}
dat += " "
- dat += {" Close "}
+ dat += {"Close "}
user << browse(dat, "window=aicard")
onclose(user, "aicard")
return
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index 8a58076e663..2c9ea69ef97 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -182,6 +182,11 @@
log_name = "IS"
category = "Utility Spells"
+/datum/spellbook_entry/lichdom
+ name = "Bind Soul"
+ spell_type = /obj/effect/proc_holder/spell/targeted/lichdom
+ log_name = "LD"
+
/datum/spellbook_entry/lightningbolt
name = "Lightning Bolt"
spell_type = /obj/effect/proc_holder/spell/targeted/lightning
@@ -241,7 +246,7 @@
/datum/spellbook_entry/item/scryingorb
name = "Scrying Orb"
desc = "An incandescent orb of crackling energy, using it will allow you to ghost while alive, allowing you to spy upon the station with ease. In addition, buying it will permanently grant you x-ray vision."
- item_path = /obj/item/weapon/gun/magic/staff/chaos
+ item_path = /obj/item/weapon/scrying
log_name = "SO"
/datum/spellbook_entry/item/scryingorb/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book)
@@ -292,6 +297,12 @@
item_path = /obj/item/weapon/antag_spawner/contract
log_name = "CT"
+/datum/spellbook_entry/item/bloodbottle
+ name = "Bottle of Blood"
+ desc = "A bottle of magically infused blood, the smell of which will attract extradimensional beings when broken. Be careful though, the kinds of creatures summoned by blood magic are indiscriminate in their killing, and you yourself may become a victim."
+ item_path = /obj/item/weapon/antag_spawner/slaughter_demon
+ log_name = "BB"
+
/datum/spellbook_entry/summon
name = "Summon Stuff"
category = "Rituals"
@@ -416,6 +427,10 @@
user << "You feed the contract back into the spellbook, refunding your points. "
src.uses++
qdel(O)
+ if(istype(O, /obj/item/weapon/antag_spawner/slaughter_demon))
+ user << "On second thought, maybe summoning a demon is a bad idea. You refund your points. "
+ src.uses++
+ qdel(O)
/obj/item/weapon/spellbook/proc/GetCategoryHeader(var/category)
var/dat = ""
@@ -477,7 +492,7 @@
dat += "Uses remaining : [uses] "
dat += ""
-
+
var/datum/spellbook_entry/E
for(var/i=1,i<=entries.len,i++)
var/spell_info = ""
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 78297803c2a..76623347eb9 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -18,7 +18,8 @@
var/list/injection_chems = list() //list of injectable chems except ephedrine, coz ephedrine is always avalible
var/list/possible_chems = list(list("morphine", "salbutamol", "salglu_solution"),
list("morphine", "salbutamol", "salglu_solution", "oculine"),
- list("morphine", "salbutamol", "salglu_solution", "oculine", "charcoal", "mutadone", "mannitol", "pen_acid"))
+ list("morphine", "salbutamol", "salglu_solution", "oculine", "charcoal", "mutadone", "mannitol", "pen_acid"),
+ list("morphine", "salbutamol", "salglu_solution", "oculine", "charcoal", "mutadone", "mannitol", "omnizine"))
/obj/machinery/sleeper/New()
..()
component_parts = list()
diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm
index 87eb95b4f42..d3d0057b928 100644
--- a/code/game/machinery/atmo_control.dm
+++ b/code/game/machinery/atmo_control.dm
@@ -78,6 +78,7 @@
set_frequency(frequency)
/obj/machinery/air_sensor/Destroy()
+ SSair.atmos_machinery -= src
if(radio_controller)
radio_controller.remove_object(src,frequency)
..()
@@ -87,11 +88,10 @@
/////////////////////////////////////////////////////////////
/obj/machinery/computer/general_air_control
- icon = 'icons/obj/computer.dmi'
- icon_state = "tank"
+ icon_screen = "tank"
+ icon_keyboard = "atmos_key"
circuit = /obj/item/weapon/circuitboard/air_management
- name = "computer"
var/frequency = 1439
var/list/sensors = list()
@@ -210,9 +210,6 @@
/////////////////////////////////////////////////////////////
/obj/machinery/computer/general_air_control/large_tank_control
- icon = 'icons/obj/computer.dmi'
- icon_state = "tank"
-
var/input_tag
var/output_tag
frequency = 1441
@@ -353,8 +350,7 @@ Rate: [volume_rate] L/sec "}
/////////////////////////////////////////////////////////////
/obj/machinery/computer/general_air_control/fuel_injection
- icon = 'icons/obj/computer.dmi'
- icon_state = "atmos"
+ icon_screen = "atmos"
var/device_tag
var/list/device_info
diff --git a/code/game/machinery/atmoalter/area_atmos_computer.dm b/code/game/machinery/atmoalter/area_atmos_computer.dm
index cdee1763795..2063e4d72ae 100644
--- a/code/game/machinery/atmoalter/area_atmos_computer.dm
+++ b/code/game/machinery/atmoalter/area_atmos_computer.dm
@@ -1,7 +1,8 @@
/obj/machinery/computer/area_atmos
name = "area air control computer"
desc = "A computer used to control the stationary scrubbers and pumps in the area."
- icon_state = "area_atmos"
+ icon_screen = "area_atmos"
+ icon_keyboard = "atmos_key"
circuit = "/obj/item/weapon/circuitboard/area_atmos"
var/list/connectedscrubbers = new()
diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm
index d8ba823694b..99bd769543a 100644
--- a/code/game/machinery/atmoalter/meter.dm
+++ b/code/game/machinery/atmoalter/meter.dm
@@ -18,6 +18,11 @@
src.target = locate(/obj/machinery/atmospherics/pipe) in loc
return 1
+/obj/machinery/meter/Destroy()
+ SSair.atmos_machinery -= src
+ src.target = null
+ ..()
+
/obj/machinery/meter/initialize()
if (!target)
src.target = locate(/obj/machinery/atmospherics/pipe) in loc
diff --git a/code/game/machinery/atmoalter/zvent.dm b/code/game/machinery/atmoalter/zvent.dm
index 26bd2cff6c1..42e1926ef4e 100644
--- a/code/game/machinery/atmoalter/zvent.dm
+++ b/code/game/machinery/atmoalter/zvent.dm
@@ -9,6 +9,14 @@
var/on = 0
var/volume_rate = 800
+/obj/machinery/zvent/New()
+ ..()
+ SSair.atmos_machinery += src
+
+/obj/machinery/zvent/Destroy()
+ SSair.atmos_machinery -= src
+ ..()
+
/obj/machinery/zvent/process_atmos()
//all this object does, is make its turf share air with the ones above and below it, if they have a vent too.
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index c5b55fe62af..1eab122f4e6 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -277,12 +277,12 @@
dat += "Metal amount: [src.m_amount] / [max_m_amount] cm3 "
dat += "Glass amount: [src.g_amount] / [max_g_amount] cm3 "
- dat += " "
var/line_length = 1
diff --git a/code/game/machinery/bots/floorbot.dm b/code/game/machinery/bots/floorbot.dm
index cfb4f7e5aed..1a5899ee4df 100644
--- a/code/game/machinery/bots/floorbot.dm
+++ b/code/game/machinery/bots/floorbot.dm
@@ -388,7 +388,7 @@ obj/machinery/bot/floorbot/process_scan(var/scan_target)
/obj/machinery/bot/floorbot/proc/eattile(var/obj/item/stack/tile/plasteel/T)
if(!istype(T, /obj/item/stack/tile/plasteel))
return
- visible_message(" [src] begins to collect tiles. ")
+ visible_message("[src] begins to collect tiles. ")
mode = BOT_REPAIRING
spawn(20)
if(isnull(T))
@@ -409,7 +409,7 @@ obj/machinery/bot/floorbot/process_scan(var/scan_target)
/obj/machinery/bot/floorbot/proc/maketile(var/obj/item/stack/sheet/metal/M)
if(!istype(M, /obj/item/stack/sheet/metal))
return
- visible_message(" [src] begins to create tiles. ")
+ visible_message("[src] begins to create tiles. ")
mode = BOT_REPAIRING
spawn(20)
if(isnull(M))
diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm
index 843cd92cc57..8bbce5dd7ec 100644
--- a/code/game/machinery/bots/mulebot.dm
+++ b/code/game/machinery/bots/mulebot.dm
@@ -117,14 +117,14 @@ obj/machinery/bot/mulebot/bot_reset()
"You repair [src]. "
)
else
- user << " [src] does not need a repair! "
+ user << "[src] does not need a repair! "
else if(istype(I, /obj/item/device/multitool) || istype(I, /obj/item/weapon/wirecutters))
if(open)
attack_hand(usr)
else if(load && ismob(load)) // chance to knock off rider
if(prob(1+I.force * 2))
unload(0)
- user.visible_message(" [user] knocks [load] off [src] with \the [I]! ", " You knock [load] off [src] with \the [I]! ")
+ user.visible_message("[user] knocks [load] off [src] with \the [I]! ", "You knock [load] off [src] with \the [I]! ")
else
user << "You hit [src] with \the [I] but to no effect! "
else
@@ -154,7 +154,7 @@ obj/machinery/bot/mulebot/bot_reset()
if(prob(50) && !isnull(load))
unload(0)
if(prob(25))
- visible_message(" Something shorts out inside [src]! ")
+ visible_message("Something shorts out inside [src]! ")
wires.RandomCut()
diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm
index d45db2442fe..5c19e12be61 100644
--- a/code/game/machinery/bots/secbot.dm
+++ b/code/game/machinery/bots/secbot.dm
@@ -156,7 +156,7 @@ Auto Patrol: []"},
if(open)
user << "Please close the access panel before locking it. "
else
- user << " Access denied. "
+ user << "Access denied. "
else
..()
if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm") // Any intent but harm will heal, so we shouldn't get angry.
@@ -173,7 +173,7 @@ Auto Patrol: []"},
if(emagged == 2)
if(user)
- user << " You short out [src]'s target assessment circuits. "
+ user << "You short out [src]'s target assessment circuits. "
oldtarget_name = user.name
audible_message("[src] buzzes oddly! ")
declare_arrests = 0
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index ca4b9fdd034..c6748849914 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -8,12 +8,12 @@
active_power_usage = 10
layer = 5
- var/datum/wires/camera/wires = null // Wires datum
+ var/health = 50
var/list/network = list("SS13")
var/c_tag = null
var/c_tag_order = 999
- var/status = 1.0
- anchored = 1.0
+ var/status = 1
+ anchored = 1
var/start_active = 0 //If it ignores the random chance to start broken on round start
var/invuln = null
var/obj/item/device/camera_bug/bug = null
@@ -30,8 +30,6 @@
var/emped = 0 //Number of consecutive EMP's on this camera
/obj/machinery/camera/New()
- wires = new(src)
-
assembly = new(src)
assembly.state = 4
assembly.anchored = 1
@@ -59,32 +57,32 @@
if(bug.current == src)
bug.current = null
bug = null
- qdel(wires)
cameranet.removeCamera(src) //Will handle removal from the camera network and the chunks, so we don't need to worry about that
..()
/obj/machinery/camera/emp_act(severity)
if(!isEmpProof())
- if(prob(100/severity))
+ if(prob(150/severity))
icon_state = "[initial(icon_state)]emp"
var/list/previous_network = network
network = list()
cameranet.removeCamera(src)
stat |= EMPED
SetLuminosity(0)
- triggerCameraAlarm()
emped = emped+1 //Increase the number of consecutive EMP's
var/thisemp = emped //Take note of which EMP this proc is for
spawn(900)
if(loc) //qdel limbo
+ triggerCameraAlarm() //camera alarm triggers even if multiple EMPs are in effect.
if(emped == thisemp) //Only fix it if the camera hasn't been EMP'd again
network = previous_network
icon_state = initial(icon_state)
stat &= ~EMPED
- cancelCameraAlarm()
if(can_use())
cameranet.addCamera(src)
emped = 0 //Resets the consecutive EMP count
+ spawn(100)
+ cancelCameraAlarm()
for(var/mob/O in mob_list)
if (O.client && O.client.eye == src)
O.unset_machine()
@@ -117,66 +115,71 @@
if(!istype(user))
return
user.do_attack_animation(src)
- status = 0
+ add_hiddenprint(user)
visible_message("\The [user] slashes at [src]! ")
playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
- icon_state = "[initial(icon_state)]1"
- add_hiddenprint(user)
- deactivate(user,0)
+ health = max(0, health - 30)
+ if(!health && status)
+ deactivate(user, 0)
-/obj/machinery/camera/attackby(W as obj, mob/living/user as mob, params)
- var/msg = "You attach [W] into the assembly inner circuits. "
- var/msg2 = "The camera already has that upgrade! "
+/obj/machinery/camera/attackby(obj/W, mob/living/user, params)
+ var/msg = "You attach [W] into the assembly's inner circuits. "
+ var/msg2 = "[src] already has that upgrade! "
// DECONSTRUCTION
if(istype(W, /obj/item/weapon/screwdriver))
- //user << "You start to [panel_open ? "close" : "open"] the camera's panel. "
- //if(toggle_panel(user)) // No delay because no one likes screwdrivers trying to be hip and have a duration cooldown
panel_open = !panel_open
- user.visible_message("[user] screws the camera's panel [panel_open ? "open" : "closed"]!",
- "You screw the camera's panel [panel_open ? "open" : "closed"]. ")
+ user << "You screw the camera's panel [panel_open ? "open" : "closed"]. "
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ return
- else if((istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/device/multitool)) && panel_open)
- wires.Interact(user)
+ if(panel_open)
+ if(istype(W, /obj/item/weapon/wirecutters)) //enable/disable the camera
+ deactivate(user, 1)
+ health = initial(health) //this is a pretty simplistic way to heal the camera, but there's no reason for this to be complex.
- else if(istype(W, /obj/item/weapon/weldingtool) && wires.CanDeconstruct())
- if(weld(W, user))
- user << "You unweld the camera leaving it as just a frame screwed to the wall. "
- if(!assembly)
- assembly = new()
- assembly.loc = src.loc
- assembly.state = 1
- assembly.dir = src.dir
- assembly.update_icon()
- assembly = null
- qdel(src)
- return
- else if(istype(W, /obj/item/device/analyzer) && panel_open) //XRay
- if(!isXRay())
- upgradeXRay()
- qdel(W)
- user << "[msg]"
- else
- user << "[msg2]"
+ else if(istype(W, /obj/item/device/multitool)) //change focus
+ setViewRange((view_range == initial(view_range)) ? short_range : initial(view_range))
+ user << "You [(view_range == initial(view_range)) ? "restore" : "mess up"] the camera's focus. "
- else if(istype(W, /obj/item/stack/sheet/mineral/plasma) && panel_open)
- if(!isEmpProof())
- upgradeEmpProof()
- user << "[msg]"
- qdel(W)
- else
- user << "[msg2]"
- else if(istype(W, /obj/item/device/assembly/prox_sensor) && panel_open)
- if(!isMotion())
- upgradeMotion()
- user << "[msg]"
- qdel(W)
- else
- user << "[msg2]"
+ else if(istype(W, /obj/item/weapon/weldingtool))
+ if(weld(W, user))
+ visible_message("[user] unwelds [src], leaving it as just a frame screwed to the wall. ", "You unweld [src], leaving it as just a frame screwed to the wall ")
+ if(!assembly)
+ assembly = new()
+ assembly.loc = src.loc
+ assembly.state = 1
+ assembly.dir = src.dir
+ assembly.update_icon()
+ assembly = null
+ qdel(src)
+ return
+
+ else if(istype(W, /obj/item/device/analyzer))
+ if(!isXRay())
+ upgradeXRay()
+ qdel(W)
+ user << "[msg]"
+ else
+ user << "[msg2]"
+
+ else if(istype(W, /obj/item/stack/sheet/mineral/plasma))
+ if(!isEmpProof())
+ upgradeEmpProof()
+ user << "[msg]"
+ qdel(W)
+ else
+ user << "[msg2]"
+ else if(istype(W, /obj/item/device/assembly/prox_sensor))
+ if(!isMotion())
+ upgradeMotion()
+ user << "[msg]"
+ qdel(W)
+ else
+ user << "[msg2]"
// OTHER
- else if ((istype(W, /obj/item/weapon/paper) || istype(W, /obj/item/device/pda)) && isliving(user))
+ if((istype(W, /obj/item/weapon/paper) || istype(W, /obj/item/device/pda)) && isliving(user))
var/mob/living/U = user
var/obj/item/weapon/paper/X = null
var/obj/item/device/pda/P = null
@@ -204,6 +207,7 @@
else if (O.client && O.client.eye == src)
O << "[U] holds \a [itemname] up to one of the cameras ..."
O << browse(text("[] [] ", itemname, info), text("window=[]", itemname))
+
else if (istype(W, /obj/item/device/camera_bug))
if (!src.can_use())
user << "Camera non-functional. "
@@ -216,33 +220,44 @@
user << "Camera bugged. "
src.bug = W
src.bug.bugged_cameras[src.c_tag] = src
+
else if(istype(W, /obj/item/device/laser_pointer))
var/obj/item/device/laser_pointer/L = W
L.laser_act(src, user)
+
else
- ..()
+ if(W.force >= 10) //fairly simplistic, but will do for now.
+ user.changeNext_move(CLICK_CD_MELEE)
+ visible_message("[user] hits [src] with [W]! ", "You hit [src] with [W]! ")
+ health = max(0, health - W.force)
+ user.do_attack_animation(src)
+ if(!health && status)
+ triggerCameraAlarm()
+ deactivate(user, 1)
return
-/obj/machinery/camera/proc/deactivate(user as mob, var/choice = 1)
- if(choice==1)
- status = !( src.status )
- if (!(src.status))
+/obj/machinery/camera/proc/deactivate(mob/user, displaymessage = 1) //this should be called toggle() but doing a find and replace for this would be ass
+ if(displaymessage)
+ status = !status
+ if(!status)
if(user)
visible_message("[user] deactivates [src]! ")
add_hiddenprint(user)
else
visible_message("\The [src] deactivates! ")
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
icon_state = "[initial(icon_state)]1"
-
else
if(user)
visible_message("[user] reactivates [src]! ")
add_hiddenprint(user)
else
visible_message("\The [src] reactivates! ")
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
+ triggerCameraAlarm()
icon_state = initial(icon_state)
+ spawn(100)
+ cancelCameraAlarm()
+ playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
+ cameranet.updateChunk(x, y, z)
// now disconnect anyone using the camera
//Apparently, this will disconnect anyone even if the camera was re-activated.
@@ -258,7 +273,6 @@
for(var/mob/living/silicon/S in mob_list)
S.triggerAlarm("Camera", get_area(src), list(src), src)
-
/obj/machinery/camera/proc/cancelCameraAlarm()
alarm_on = 0
for(var/mob/living/silicon/S in mob_list)
@@ -308,7 +322,6 @@
return null
/proc/near_range_camera(var/mob/M)
-
for(var/obj/machinery/camera/C in range(4, M))
if(C.can_use()) // check if camera disabled
return C
@@ -317,7 +330,6 @@
return null
/obj/machinery/camera/proc/weld(var/obj/item/weapon/weldingtool/WT, var/mob/living/user)
-
if(busy)
return 0
if(!WT.remove_fuel(0, user))
@@ -334,6 +346,12 @@
busy = 0
return 0
+/obj/machinery/camera/bullet_act(var/obj/item/projectile/proj)
+ if(proj.damage_type == BRUTE)
+ health = max(0, health - proj.damage)
+ if(!health && status)
+ triggerCameraAlarm()
+ deactivate(null, 1)
/obj/machinery/camera/portable //Cameras which are placed inside of things, such as helmets.
var/turf/prev_turf
@@ -347,4 +365,4 @@
/obj/machinery/camera/portable/process() //Updates whenever the camera is moved.
if(cameranet && get_turf(src) != prev_turf)
cameranet.updatePortableCamera(src)
- prev_turf = get_turf(src)
\ No newline at end of file
+ prev_turf = get_turf(src)
diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm
index 95664e9a49f..0dfc5d045d0 100644
--- a/code/game/machinery/camera/tracking.dm
+++ b/code/game/machinery/camera/tracking.dm
@@ -49,38 +49,13 @@
return list()
for(var/mob/living/M in mob_list)
- // Easy checks first.
- // Don't detect mobs on Centcom. Since the wizard den is on Centcom, we only need this.
- var/turf/T = get_turf(M)
- if(!T)
- continue
- if(T.z == ZLEVEL_CENTCOM)
- continue
- if(T.z >= ZLEVEL_SPACEMAX)
- continue
- if(M == usr)
- continue
- if(M.invisibility)//cloaked
- continue
- if(M.digitalcamo)
+ if(!M.can_track(usr))
continue
// Human check
var/human = 0
if(istype(M, /mob/living/carbon/human))
human = 1
- var/mob/living/carbon/human/H = M
- //Cameras can't track people wearing an agent card or a ninja hood.
- if(H.wear_id && istype(H.wear_id.GetID(), /obj/item/weapon/card/id/syndicate))
- continue
- if(istype(H.head, /obj/item/clothing/head))
- var/obj/item/clothing/head/hat = H.head
- if(hat.blockTracking)
- continue
-
- // Now, are they viewable by a camera? (This is last because it's the most intensive check)
- if(!near_camera(M))
- continue
var/name = M.name
if (name in track.names)
@@ -109,51 +84,57 @@
ai_actual_track(target)
-/mob/living/silicon/ai/proc/ai_actual_track(mob/living/target as mob)
+/mob/living/silicon/ai/proc/ai_actual_track(mob/living/target)
if(!istype(target)) return
var/mob/living/silicon/ai/U = usr
+
U.cameraFollow = target
- //U << text("Now tracking [] on camera.", target.name)
- //if (U.machine == null)
- // U.machine = U
- U << "Now tracking [target.get_visible_name()] on camera."
+ U.tracking = 1
- spawn (0)
- while (U.cameraFollow == target)
- if (U.cameraFollow == null)
- return
- if (istype(target, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = target
- if(H.wear_id && istype(H.wear_id.GetID(), /obj/item/weapon/card/id/syndicate))
- U << "Follow camera mode terminated."
- U.cameraFollow = null
- return
- if(istype(H.head, /obj/item/clothing/head))
- var/obj/item/clothing/head/hat = H.head
- if(hat.blockTracking)
- U << "Follow camera mode terminated."
- U.cameraFollow = null
- return
- if(H.digitalcamo)
- U << "Follow camera mode terminated."
- U.cameraFollow = null
- return
+ U << "Attempting to track [target.get_visible_name()]... "
+ sleep(min(30, get_dist(target, U.eyeobj) / 4))
+ spawn(15) //give the AI a grace period to stop moving.
+ U.tracking = 0
- if(istype(target.loc,/obj/effect/dummy))
- U << "Follow camera mode ended."
- U.cameraFollow = null
+ if(!target || !target.can_track(usr))
+ U << "Target is not near any active cameras. "
+ U.cameraFollow = null
+ return
+
+ U << "Now tracking [target.get_visible_name()] on camera. "
+
+ var/cameraticks = 0
+ spawn(0)
+ while(U.cameraFollow == target)
+ if(U.cameraFollow == null)
return
- if (!near_camera(target))
- U << "Target is not near any active cameras."
- sleep(100)
- continue
+ if(!target.can_track(usr))
+ U.tracking = 1
+ if(!cameraticks)
+ U << "Target is not near any active cameras. Attempting to reacquire... "
+ cameraticks++
+ if(cameraticks > 9)
+ U.cameraFollow = null
+ U << "Unable to reacquire, cancelling track... "
+ tracking = 0
+ return
+ else
+ sleep(10)
+ continue
+
+ else
+ cameraticks = 0
+ U.tracking = 0
if(U.eyeobj)
U.eyeobj.setLoc(get_turf(target))
+
else
view_core()
+ U.cameraFollow = null
return
+
sleep(10)
/proc/near_camera(var/mob/living/M)
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 87be0acbdf5..adb2c039ce8 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -44,6 +44,8 @@
for(var/obj/item/weapon/stock_parts/manipulator/P in component_parts)
speed_coeff += P.rating
heal_level = (efficiency * 15) + 10
+ if(heal_level > 100)
+ heal_level = 100
//The return of data disks?? Just for transferring between genetics machine/cloning machine.
//TO-DO: Make the genetics machine accept them.
@@ -122,7 +124,7 @@
//Clonepod
//Start growing a human clone in the pod!
-/obj/machinery/clonepod/proc/growclone(var/ckey, var/clonename, var/ui, var/se, var/mindref, var/datum/species/mrace, var/mcolor, var/factions)
+/obj/machinery/clonepod/proc/growclone(var/ckey, var/clonename, var/ui, var/se, var/mindref, var/datum/species/mrace, var/list/features, var/factions)
if(panel_open)
return 0
if(mess || attempting)
@@ -183,7 +185,7 @@
H.ckey = ckey
H << "Consciousness slowly creeps over you as your body regenerates. So this is what cloning feels like? "
- hardset_dna(H, ui, se, null, null, mrace, mcolor)
+ hardset_dna(H, ui, se, null, null, mrace, features)
H.faction |= factions
H.set_cloned_appearance()
diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm
index bc10565b0b4..eeddc434e5d 100644
--- a/code/game/machinery/computer/HolodeckControl.dm
+++ b/code/game/machinery/computer/HolodeckControl.dm
@@ -1,7 +1,8 @@
/obj/machinery/computer/HolodeckControl
name = "holodeck control console"
desc = "A computer used to control a nearby holodeck."
- icon_state = "holocontrol"
+ icon_screen = "holocontrol"
+ icon_keyboard = "tech_key"
var/area/linkedholodeck = null
var/area/target = null
var/active = 0
@@ -308,11 +309,11 @@
if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2)
var/obj/item/weapon/grab/G = W
if(G.state < GRAB_AGGRESSIVE)
- user << " You need a better grip to do that! "
+ user << "You need a better grip to do that! "
return
G.affecting.loc = src.loc
G.affecting.Weaken(5)
- visible_message(" [G.assailant] puts [G.affecting] on the table. ")
+ visible_message("[G.assailant] puts [G.affecting] on the table. ")
qdel(W)
return
@@ -435,7 +436,7 @@
return
else if (istype(W, /obj/item) && get_dist(src,user)<2)
user.drop_item(src)
- visible_message(" [user] dunks [W] into \the [src]! ", 3)
+ visible_message("[user] dunks [W] into \the [src]! ", 3)
return
/obj/structure/holohoop/CanPass(atom/movable/mover, turf/target, height=0)
@@ -445,9 +446,9 @@
return
if(prob(50))
I.loc = src.loc
- visible_message(" Swish! \the [I] lands in \the [src]. ", 3)
+ visible_message("Swish! \the [I] lands in \the [src]. ", 3)
else
- visible_message(" \the [I] bounces off of \the [src]'s rim! ", 3)
+ visible_message("\the [I] bounces off of \the [src]'s rim! ", 3)
return 0
else
return ..(mover, target, height)
diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm
index 5e000ff76d6..e446fe82255 100644
--- a/code/game/machinery/computer/Operating.dm
+++ b/code/game/machinery/computer/Operating.dm
@@ -1,9 +1,8 @@
/obj/machinery/computer/operating
name = "operating computer"
desc = "Used to monitor the vitals of a patient during surgery."
- icon_state = "operating"
- density = 1
- anchored = 1.0
+ icon_screen = "crew"
+ icon_keyboard = "med_key"
circuit = /obj/item/weapon/circuitboard/operating
var/mob/living/carbon/human/patient = null
var/obj/structure/optable/table = null
diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm
index 35d84985fbf..35d4c641cef 100644
--- a/code/game/machinery/computer/aifixer.dm
+++ b/code/game/machinery/computer/aifixer.dm
@@ -1,17 +1,12 @@
/obj/machinery/computer/aifixer
name = "\improper AI system integrity restorer"
desc = "Used with intelliCards containing nonfunctioning AIs to restore them to working order."
- icon = 'icons/obj/computer.dmi'
- icon_state = "ai-fixer"
req_access = list(access_captain, access_robotics, access_heads)
var/mob/living/silicon/ai/occupier = null
var/active = 0
circuit = /obj/item/weapon/circuitboard/aifixer
-
-/obj/machinery/computer/aifixer/New()
- src.overlays += image('icons/obj/computer.dmi', "ai-fixer-empty")
- ..()
-
+ icon_keyboard = "tech_key"
+ icon_screen = "ai-fixer"
/obj/machinery/computer/aifixer/attackby(I as obj, user as mob, params)
if(occupier && istype(I, /obj/item/weapon/screwdriver))
@@ -101,7 +96,6 @@
return
if (href_list["fix"])
src.active = 1
- src.overlays += image('icons/obj/computer.dmi', "ai-fixer-on")
while (src.occupier.health < 100)
src.occupier.adjustOxyLoss(-1)
src.occupier.adjustFireLoss(-1)
@@ -113,32 +107,28 @@
src.occupier.lying = 0
dead_mob_list -= src.occupier
living_mob_list += src.occupier
- src.overlays -= image('icons/obj/computer.dmi', "ai-fixer-404")
- src.overlays += image('icons/obj/computer.dmi', "ai-fixer-full")
src.updateUsrDialog()
+ update_icon()
sleep(10)
src.active = 0
- src.overlays -= image('icons/obj/computer.dmi', "ai-fixer-on")
-
-
src.add_fingerprint(usr)
src.updateUsrDialog()
+ update_icon()
return
/obj/machinery/computer/aifixer/update_icon()
..()
- // Broken / Unpowered
if((stat & BROKEN) || (stat & NOPOWER))
- overlays.Cut()
-
- // Working / Powered
+ return
else
+ if(active)
+ overlays += "ai-fixer-on"
if (occupier)
switch (occupier.stat)
if (0)
- overlays += image('icons/obj/computer.dmi', "ai-fixer-full")
+ overlays += "ai-fixer-full"
if (2)
- overlays += image('icons/obj/computer.dmi', "ai-fixer-404")
+ overlays += "ai-fixer-404"
else
- overlays += image('icons/obj/computer.dmi', "ai-fixer-empty")
+ overlays += "ai-fixer-empty"
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 23f042caebf..ebe873ae94e 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -1,8 +1,9 @@
/obj/machinery/computer/arcade/
name = "random arcade"
desc = "random arcade machine"
- icon = 'icons/obj/computer.dmi'
icon_state = "arcade"
+ icon_keyboard = null
+ icon_screen = "invaders"
var/list/prizes = list( /obj/item/weapon/storage/box/snappops = 2,
/obj/item/toy/AI = 2,
/obj/item/clothing/under/syndicate/tacticool = 2,
@@ -82,7 +83,6 @@
/obj/machinery/computer/arcade/battle
name = "arcade machine"
desc = "Does not support Pinball."
- icon = 'icons/obj/computer.dmi'
icon_state = "arcade"
circuit = /obj/item/weapon/circuitboard/arcade/battle
var/enemy_name = "Space Villian"
@@ -101,10 +101,10 @@
var/name_part1
var/name_part2
- name_action = pick("Defeat ", "Annihilate ", "Save ", "Strike ", "Stop ", "Destroy ", "Robust ", "Romance ", "Pwn ", "Own ")
+ name_action = pick("Defeat ", "Annihilate ", "Save ", "Strike ", "Stop ", "Destroy ", "Robust ", "Romance ", "Pwn ", "Own ", "Ban ")
name_part1 = pick("the Automatic ", "Farmer ", "Lord ", "Professor ", "the Cuban ", "the Evil ", "the Dread King ", "the Space ", "Lord ", "the Great ", "Duke ", "General ")
- name_part2 = pick("Melonoid", "Murdertron", "Sorcerer", "Ruin", "Jeff", "Ectoplasm", "Crushulon", "Uhangoid", "Vhakoid", "Peteoid", "slime", "Griefer", "ERPer", "Lizard Man", "Unicorn")
+ name_part2 = pick("Melonoid", "Murdertron", "Sorcerer", "Ruin", "Jeff", "Ectoplasm", "Crushulon", "Uhangoid", "Vhakoid", "Peteoid", "slime", "Griefer", "ERPer", "Lizard Man", "Unicorn", "Bloopers")
src.enemy_name = replacetext((name_part1 + name_part2), "the ", "")
src.name = (name_action + name_part1 + name_part2)
@@ -145,6 +145,7 @@
src.blocked = 1
var/attackamt = rand(2,6)
src.temp = "You attack for [attackamt] damage!"
+ playsound(src.loc, 'sound/arcade/Hit.ogg', 50, 1, extrarange = -3, falloff = 10)
src.updateUsrDialog()
if(turtle > 0)
turtle--
@@ -158,6 +159,7 @@
var/pointamt = rand(1,3)
var/healamt = rand(6,8)
src.temp = "You use [pointamt] magic to heal for [healamt] damage!"
+ playsound(src.loc, 'sound/arcade/Heal.ogg', 50, 1, extrarange = -3, falloff = 10)
src.updateUsrDialog()
turtle++
@@ -172,6 +174,7 @@
src.blocked = 1
var/chargeamt = rand(4,7)
src.temp = "You regain [chargeamt] points"
+ playsound(src.loc, 'sound/arcade/Mana.ogg', 50, 1, extrarange = -3, falloff = 10)
src.player_mp += chargeamt
if(turtle > 0)
turtle--
@@ -206,6 +209,7 @@
if(!gameover)
src.gameover = 1
src.temp = "[src.enemy_name] has fallen! Rejoice!"
+ playsound(src.loc, 'sound/arcade/Win.ogg', 50, 1, extrarange = -3, falloff = 10)
if(emagged)
feedback_inc("arcade_win_emagged")
@@ -222,11 +226,13 @@
else if (emagged && (turtle >= 4))
var/boomamt = rand(5,10)
src.temp = "[src.enemy_name] throws a bomb, exploding you for [boomamt] damage!"
+ playsound(src.loc, 'sound/arcade/Boom.ogg', 50, 1, extrarange = -3, falloff = 10)
src.player_hp -= boomamt
else if ((src.enemy_mp <= 5) && (prob(70)))
var/stealamt = rand(2,3)
src.temp = "[src.enemy_name] steals [stealamt] of your power!"
+ playsound(src.loc, 'sound/arcade/Steal.ogg', 50, 1, extrarange = -3, falloff = 10)
src.player_mp -= stealamt
src.updateUsrDialog()
@@ -234,6 +240,7 @@
src.gameover = 1
sleep(10)
src.temp = "You have been drained! GAME OVER"
+ playsound(src.loc, 'sound/arcade/Lose.ogg', 50, 1, extrarange = -3, falloff = 10)
if(emagged)
feedback_inc("arcade_loss_mana_emagged")
usr.gib()
@@ -242,17 +249,20 @@
else if ((src.enemy_hp <= 10) && (src.enemy_mp > 4))
src.temp = "[src.enemy_name] heals for 4 health!"
+ playsound(src.loc, 'sound/arcade/Heal.ogg', 50, 1, extrarange = -3, falloff = 10)
src.enemy_hp += 4
src.enemy_mp -= 4
else
var/attackamt = rand(3,6)
src.temp = "[src.enemy_name] attacks for [attackamt] damage!"
+ playsound(src.loc, 'sound/arcade/Hit.ogg', 50, 1, extrarange = -3, falloff = 10)
src.player_hp -= attackamt
if ((src.player_mp <= 0) || (src.player_hp <= 0))
src.gameover = 1
src.temp = "You have been crushed! GAME OVER"
+ playsound(src.loc, 'sound/arcade/Lose.ogg', 50, 1, extrarange = -3, falloff = 10)
if(emagged)
feedback_inc("arcade_loss_hp_emagged")
usr.gib()
@@ -288,7 +298,6 @@
/obj/machinery/computer/arcade/orion_trail
name = "The Orion Trail"
desc = "Learn how our ancestors got to Orion, and have fun in the process!"
- icon = 'icons/obj/computer.dmi'
icon_state = "arcade"
circuit = /obj/item/weapon/circuitboard/arcade/orion_trail
var/engine = 0
diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm
index 672624b5316..345b46e272c 100644
--- a/code/game/machinery/computer/atmos_alert.dm
+++ b/code/game/machinery/computer/atmos_alert.dm
@@ -5,7 +5,8 @@
name = "atmospheric alert console"
desc = "Used to access the station's atmospheric sensors."
circuit = /obj/item/weapon/circuitboard/atmos_alert
- icon_state = "alert:0"
+ icon_screen = "alert:0"
+ icon_keyboard = "atmos_key"
var/list/priority_alarms = list()
var/list/minor_alarms = list()
var/receive_frequency = 1437
@@ -61,23 +62,11 @@
src.updateDialog()
/obj/machinery/computer/atmos_alert/update_icon()
- SetLuminosity(brightness_on)
- if(stat & BROKEN)
- icon_state = "alert:b"
- return
- else if (stat & NOPOWER)
- icon_state = "alert:O"
- SetLuminosity(0)
- return
- else if(priority_alarms.len)
- icon_state = "alert:2"
-
+ ..()
+ if(priority_alarms.len)
+ overlays += "alert:2"
else if(minor_alarms.len)
- icon_state = "alert:1"
-
- else
- icon_state = "alert:0"
- return
+ overlays += "alert:1"
/obj/machinery/computer/atmos_alert/proc/return_text()
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index be509355564..df20505cc8d 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -83,6 +83,10 @@
/obj/item/weapon/circuitboard/card/centcom
name = "circuit board (Centcom ID Console)"
build_path = /obj/machinery/computer/card/centcom
+/obj/item/weapon/circuitboard/card/minor
+ name = "circuit board (Department Management Console)"
+ build_path = /obj/machinery/computer/card/minor
+ var/target_dept = 1
//obj/item/weapon/circuitboard/shield
// name = "Circuit board (Shield Control)"
// build_path = /obj/machinery/computer/stationshield
@@ -244,6 +248,13 @@
build_path = /obj/machinery/computer/libraryconsole
origin_tech = "programming=1"
+/obj/item/weapon/circuitboard/card/minor/attackby(obj/item/I as obj, mob/user as mob, params)
+ if(istype(I,/obj/item/device/multitool))
+ var/list/dept_list = list("general","security","medical","science","engineering")
+ var/choice = input("Currently set to [dept_list[target_dept]] personnel database. Changing to:","Multitool-Circuitboard interface") as null|anything in dept_list
+ if(choice)
+ target_dept = dept_list.Find(choice)
+ return
/obj/item/weapon/circuitboard/supplycomp/attackby(obj/item/I as obj, mob/user as mob, params)
if(istype(I,/obj/item/device/multitool))
diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index 4165bc0003a..10f396874eb 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -1,7 +1,8 @@
/obj/machinery/computer/security
name = "security camera console"
desc = "Used to access the various cameras on the station."
- icon_state = "cameras"
+ icon_screen = "cameras"
+ icon_keyboard = "security_key"
circuit = /obj/item/weapon/circuitboard/security
var/obj/machinery/camera/current = null
var/last_pic = 1.0
@@ -94,7 +95,6 @@
/obj/machinery/computer/security/telescreen/update_icon()
icon_state = initial(icon_state)
- SetLuminosity(brightness_on)
if(stat & BROKEN)
icon_state += "b"
return
@@ -108,16 +108,18 @@
density = 0
circuit = null
-
/obj/machinery/computer/security/wooden_tv
name = "security camera monitor"
desc = "An old TV hooked into the stations camera network."
- icon_state = "security_det"
+ icon_state = "television"
+ icon_keyboard = null
+ icon_screen = "detective_tv"
/obj/machinery/computer/security/mining
name = "outpost camera console"
desc = "Used to access the various cameras on the outpost."
- icon_state = "miningcameras"
+ icon_screen = "mining"
+ icon_keyboard = "mining_key"
network = list("MINE")
circuit = "/obj/item/weapon/circuitboard/mining"
diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm
index 169100a2ab8..d4f48946de1 100644
--- a/code/game/machinery/computer/camera_advanced.dm
+++ b/code/game/machinery/computer/camera_advanced.dm
@@ -1,8 +1,8 @@
/obj/machinery/computer/camera_advanced
name = "advanced camera console"
desc = "Used to access the various cameras on the station."
- icon_state = "cameras"
- //circuit = /obj/item/weapon/circuitboard/security
+ icon_screen = "cameras"
+ icon_keyboard = "security_key"
var/mob/camera/aiEye/remote/eyeobj
var/mob/living/carbon/human/current_user = null
var/list/networks = list("SS13")
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index 180f3dc2fd5..ce14c29f850 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -6,8 +6,9 @@ var/time_last_changed_position = 0
/obj/machinery/computer/card
name = "identification console"
- desc = "You can use this to change ID's."
- icon_state = "id"
+ desc = "You can use this to manage jobs and ID access."
+ icon_screen = "id"
+ icon_keyboard = "id_key"
req_one_access = list(access_heads, access_change_ids)
circuit = /obj/item/weapon/circuitboard/card
var/obj/item/weapon/card/id/scan = null
@@ -17,6 +18,7 @@ var/time_last_changed_position = 0
var/printing = null
var/list/region_access = null
var/list/head_subordinates = null
+ var/target_dept = 0 //Which department this computer has access to. 0=all departments
//Cooldown for closing positions in seconds
//if set to -1: No cooldown... probably a bad idea
@@ -117,7 +119,7 @@ var/time_last_changed_position = 0
dat += ""
dat += "Job Slots Open job Close job "
var/ID
- if(scan && (access_change_ids in scan.access))
+ if(scan && (access_change_ids in scan.access) && !target_dept)
ID = 1
else
ID = 0
@@ -279,14 +281,15 @@ var/time_last_changed_position = 0
else
body = "{Log in} "
body += "Access Crew Manifest "
- body += "Job Management "
+ if(!target_dept)
+ body += "Job Management "
dat = "[header][body] "
//user << browse(dat, "window=id_com;size=900x520")
//onclose(user, "id_com")
- var/datum/browser/popup = new(user, "id_com", "Identification Card Modifier Console", 900, 620)
+ var/datum/browser/popup = new(user, "id_com", src.name, 900, 620)
popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
@@ -330,27 +333,33 @@ var/time_last_changed_position = 0
if ("auth")
if ((!( authenticated ) && (scan || (istype(usr, /mob/living/silicon))) && (modify || mode)))
if (check_access(scan))
+ region_access = list()
+ head_subordinates = list()
if(access_change_ids in scan.access)
- authenticated = 2
+ if(target_dept)
+ head_subordinates = get_all_jobs()
+ region_access |= target_dept
+ authenticated = 1
+ else
+ authenticated = 2
+
else
- region_access = list()
- head_subordinates = list()
- if(access_hop in scan.access)
- region_access += 1
- region_access += 6
+ if((access_hop in scan.access) && ((target_dept==1) || !target_dept))
+ region_access |= 1
+ region_access |= 6
get_subordinates("Head of Personnel")
- if(access_rd in scan.access)
- region_access += 4
- get_subordinates("Research Director")
- if(access_ce in scan.access)
- region_access += 5
- get_subordinates("Chief Engineer")
- if(access_cmo in scan.access)
- region_access += 3
- get_subordinates("Chief Medical Officer")
- if(access_hos in scan.access)
- region_access += 2
+ if((access_hos in scan.access) && ((target_dept==2) || !target_dept))
+ region_access |= 2
get_subordinates("Head of Security")
+ if((access_cmo in scan.access) && ((target_dept==3) || !target_dept))
+ region_access |= 3
+ get_subordinates("Chief Medical Officer")
+ if((access_rd in scan.access) && ((target_dept==4) || !target_dept))
+ region_access |= 4
+ get_subordinates("Research Director")
+ if((access_ce in scan.access) && ((target_dept==5) || !target_dept))
+ region_access |= 5
+ get_subordinates("Chief Engineer")
if(region_access)
authenticated = 1
else if ((!( authenticated ) && (istype(usr, /mob/living/silicon))) && (!modify))
@@ -418,7 +427,7 @@ var/time_last_changed_position = 0
if("make_job_available")
// MAKE ANOTHER JOB POSITION AVAILABLE FOR LATE JOINERS
- if(scan && (access_change_ids in scan.access))
+ if(scan && (access_change_ids in scan.access) && !target_dept)
var/edit_job_target = href_list["job"]
var/datum/job/j = SSjob.GetJob(edit_job_target)
if(!j)
@@ -432,7 +441,7 @@ var/time_last_changed_position = 0
if("make_job_unavailable")
// MAKE JOB POSITION UNAVAILABLE FOR LATE JOINERS
- if(scan && (access_change_ids in scan.access))
+ if(scan && (access_change_ids in scan.access) && !target_dept)
var/edit_job_target = href_list["job"]
var/datum/job/j = SSjob.GetJob(edit_job_target)
if(!j)
@@ -471,3 +480,30 @@ var/time_last_changed_position = 0
circuit = /obj/item/weapon/circuitboard/card/centcom
req_access = list(access_cent_captain)
+/obj/machinery/computer/card/minor
+ name = "department management console"
+ desc = "You can use this to change ID's for specific departments."
+ icon_screen = "idminor"
+ circuit = /obj/item/weapon/circuitboard/card/minor
+
+/obj/machinery/computer/card/minor/New()
+ ..()
+ var/obj/item/weapon/circuitboard/card/minor/typed_circuit = circuit
+ if(target_dept)
+ typed_circuit.target_dept = target_dept
+ else
+ target_dept = typed_circuit.target_dept
+ var/list/dept_list = list("general","security","medical","science","engineering")
+ name = "[dept_list[target_dept]] department console"
+
+/obj/machinery/computer/card/minor/hos
+ target_dept = 2
+
+/obj/machinery/computer/card/minor/cmo
+ target_dept = 3
+
+/obj/machinery/computer/card/minor/rd
+ target_dept = 4
+
+/obj/machinery/computer/card/minor/ce
+ target_dept = 5
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 38489cb1497..ff893a987a0 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -2,8 +2,8 @@
/obj/machinery/computer/cloning
name = "cloning console"
desc = "Used to clone people and manage DNA."
- icon = 'icons/obj/computer.dmi'
- icon_state = "dna"
+ icon_screen = "dna"
+ icon_keyboard = "med_key"
circuit = /obj/item/weapon/circuitboard/cloning
req_access = list(access_heads) //Only used for record deletion right now.
var/obj/machinery/dna_scannernew/scanner = null //Linked scanner. For scanning.
@@ -35,7 +35,7 @@
if(!(pod1.occupant || pod1.mess) && (pod1.efficiency > 5))
for(var/datum/data/record/R in records)
if(!(pod1.occupant || pod1.mess))
- if(pod1.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["mrace"], R.fields["mcolor"], R.fields["factions"]))
+ if(pod1.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["mrace"], R.fields["features"], R.fields["factions"]))
records -= R
/obj/machinery/computer/cloning/proc/updatemodules()
@@ -329,7 +329,7 @@
temp = "Clonepod malfunction. "
else if(!config.revival_cloning)
temp = "Unable to initiate cloning cycle. "
- else if(pod1.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["mcolor"], C.fields["factions"]))
+ else if(pod1.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["features"], C.fields["factions"]))
temp = "[C.fields["name"]] => Cloning cycle in progress... "
records.Remove(C)
if(active_record == C)
@@ -380,7 +380,7 @@
R.fields["UI"] = subject.dna.uni_identity
R.fields["SE"] = subject.dna.struc_enzymes
R.fields["blood_type"] = subject.dna.blood_type
- R.fields["mcolor"] = subject.dna.mutant_color
+ R.fields["features"] = subject.dna.features
R.fields["factions"] = subject.faction
//Add an implant if needed
var/obj/item/weapon/implant/health/imp = locate(/obj/item/weapon/implant/health, subject)
@@ -396,17 +396,4 @@
R.fields["mind"] = "\ref[subject.mind]"
src.records += R
- scantemp = "Subject successfully scanned."
-
-/obj/machinery/computer/cloning/update_icon()
- SetLuminosity(brightness_on)
- if(stat & BROKEN)
- icon_state = "commb"
- else
- if(stat & NOPOWER)
- src.icon_state = "c_unpowered"
- stat |= NOPOWER
- SetLuminosity(0)
- else
- icon_state = initial(icon_state)
- stat &= ~NOPOWER
\ No newline at end of file
+ scantemp = "Subject successfully scanned."
\ No newline at end of file
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index c335d4ad6f6..21dfa6b0585 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -6,7 +6,8 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
/obj/machinery/computer/communications
name = "communications console"
desc = "This can be used for various important functions. Still under developement."
- icon_state = "comm"
+ icon_screen = "comm"
+ icon_keyboard = "tech_key"
req_access = list(access_heads)
circuit = /obj/item/weapon/circuitboard/communications
var/authenticated = 0
@@ -49,7 +50,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
/obj/machinery/computer/communications/Topic(href, href_list)
if(..())
return
- if (src.z > ZLEVEL_STATION)
+ if (src.z > ZLEVEL_CENTCOM) //Can only use on centcom and SS13
usr << "Unable to establish a connection : \black You're too far away from the station!"
return
usr.set_machine(src)
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index 18f8925050f..5d0798690f8 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -1,6 +1,7 @@
/obj/machinery/computer
name = "computer"
icon = 'icons/obj/computer.dmi'
+ icon_state = "computer"
density = 1
anchored = 1.0
use_power = 1
@@ -9,6 +10,8 @@
var/obj/item/weapon/circuitboard/circuit = null //if circuit==null, computer can't disassembly
var/processing = 0
var/brightness_on = 2
+ var/icon_keyboard = "generic_key"
+ var/icon_screen = "generic"
/obj/machinery/computer/New(location, obj/item/weapon/circuitboard/C)
..(location)
@@ -18,6 +21,7 @@
if(circuit)
circuit = new circuit(null)
power_change()
+ update_icon()
/obj/machinery/computer/initialize()
power_change()
@@ -68,23 +72,22 @@
density = 0
/obj/machinery/computer/update_icon()
- ..()
- icon_state = initial(icon_state)
- SetLuminosity(brightness_on)
- // Broken
+ overlays.Cut()
+ if(stat & NOPOWER)
+ overlays += "[icon_keyboard]_off"
+ return
+ overlays += icon_keyboard
if(stat & BROKEN)
- icon_state += "b"
-
- // Unpowered
- else if(stat & NOPOWER)
- icon_state = initial(icon_state)
- icon_state += "0"
- SetLuminosity(0)
-
-
+ overlays += "[icon_state]_broken"
+ else
+ overlays += icon_screen
/obj/machinery/computer/power_change()
..()
+ if(stat & NOPOWER)
+ SetLuminosity(0)
+ else
+ SetLuminosity(brightness_on)
update_icon()
return
@@ -97,7 +100,7 @@
/obj/machinery/computer/attackby(I as obj, user as mob, params)
if(istype(I, /obj/item/weapon/screwdriver) && circuit)
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- user << " You start to disconnect the monitor... "
+ user << "You start to disconnect the monitor... "
if(do_after(user, 20))
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
A.circuit = circuit
@@ -106,12 +109,12 @@
for (var/obj/C in src)
C.loc = src.loc
if (src.stat & BROKEN)
- user << " The broken glass falls out. "
+ user << "The broken glass falls out. "
new /obj/item/weapon/shard( src.loc )
A.state = 3
A.icon_state = "3"
else
- user << " You disconnect the monitor. "
+ user << "You disconnect the monitor. "
A.state = 4
A.icon_state = "4"
qdel(src)
diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm
index 1f5862fc01c..32b7eab5df5 100644
--- a/code/game/machinery/computer/crew.dm
+++ b/code/game/machinery/computer/crew.dm
@@ -1,7 +1,8 @@
/obj/machinery/computer/crew
name = "crew monitoring console"
desc = "Used to monitor active health sensors built into most of the crew's uniforms."
- icon_state = "crew"
+ icon_screen = "crew"
+ icon_keyboard = "med_key"
use_power = 1
idle_power_usage = 250
active_power_usage = 500
diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm
index 0ab00973dd5..875cb4403ae 100644
--- a/code/game/machinery/computer/law.dm
+++ b/code/game/machinery/computer/law.dm
@@ -2,7 +2,7 @@
/obj/machinery/computer/upload
var/mob/living/silicon/current = null //The target of future law uploads
- icon_state = null //To make sure mappers understand THIS ISN'T A VALID TYPE
+ icon_screen = "command"
/obj/machinery/computer/upload/attackby(obj/item/O as obj, mob/user as mob, params)
if(istype(O, /obj/item/weapon/aiModule))
@@ -33,7 +33,6 @@
/obj/machinery/computer/upload/ai
name = "\improper AI upload console"
desc = "Used to upload laws to the AI."
- icon_state = "command"
circuit = /obj/item/weapon/circuitboard/aiupload
/obj/machinery/computer/upload/ai/attack_hand(var/mob/user as mob)
@@ -58,7 +57,6 @@
/obj/machinery/computer/upload/borg
name = "cyborg upload console"
desc = "Used to upload laws to Cyborgs."
- icon_state = "command"
circuit = /obj/item/weapon/circuitboard/borgupload
/obj/machinery/computer/upload/borg/attack_hand(var/mob/user as mob)
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index 8a52e787827..1782bab8845 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -3,7 +3,8 @@
/obj/machinery/computer/med_data//TODO:SANITY
name = "medical records console"
desc = "This can be used to check medical records."
- icon_state = "medcomp"
+ icon_screen = "medcomp"
+ icon_keyboard = "med_key"
req_one_access = list(access_medical, access_forensics_lockers)
circuit = /obj/item/weapon/circuitboard/med_data
var/obj/item/weapon/card/id/scan = null
@@ -508,7 +509,7 @@
else
//Foreach continue //goto(3229)
if(!( src.active2 ))
- src.temp = text("Could not locate record [].", t1)
+ src.temp = text("Could not locate record [].", sanitize(t1))
else
for(var/datum/data/record/E in data_core.general)
if((E.fields["name"] == src.active2.fields["name"] || E.fields["id"] == src.active2.fields["id"]))
@@ -590,4 +591,6 @@
/obj/machinery/computer/med_data/laptop
name = "medical laptop"
desc = "A cheap Nanotrasen medical laptop, it functions as a medical records computer. It's bolted to the table."
- icon_state = "medlaptop"
+ icon_state = "laptop"
+ icon_screen = "medlaptop"
+ icon_keyboard = "laptop_key"
diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm
index 19b4fdd5169..7d31061f0ba 100644
--- a/code/game/machinery/computer/message.dm
+++ b/code/game/machinery/computer/message.dm
@@ -7,9 +7,7 @@
/obj/machinery/computer/message_monitor
name = "message monitor console"
desc = "Used to Monitor the crew's messages, that are sent via PDA. Can also be used to view Request Console messages."
- icon_state = "comm_logs"
- var/hack_icon = "comm_logsc"
- var/normal_icon = "comm_logs"
+ icon_screen = "comm_logs"
circuit = /obj/item/weapon/circuitboard/message_monitor
//Server linked to.
var/obj/machinery/message_server/linkedServer = null
@@ -42,7 +40,6 @@
/obj/machinery/computer/message_monitor/emag_act(user as mob)
if(!emagged)
if(!isnull(src.linkedServer))
- icon_state = hack_icon // An error screen I made in the computers.dmi
emagged = 1
screen = 2
spark_system.set_up(5, 0, src)
@@ -56,15 +53,6 @@
else
user << "A no server error appears on the screen. "
-/obj/machinery/computer/message_monitor/update_icon()
- ..()
- if(stat & (NOPOWER|BROKEN))
- return
- if(emagged || hacking)
- icon_state = hack_icon
- else
- icon_state = normal_icon
-
/obj/machinery/computer/message_monitor/initialize()
//Is the server isn't linked to a server, and there's a server available, default it to the first one in the list.
if(!linkedServer)
@@ -140,7 +128,7 @@
break
// Del - Sender - Recepient - Message
// X - Al Green - Your Mom - WHAT UP!?
- dat += "X [pda.sender] [pda.recipient] [pda.message] "
+ dat += "X [pda.sender] [pda.recipient] [pda.message][pda.photo ? "(Photo) ":""] "
dat += "
"
//Hacking screen.
if(2)
@@ -263,11 +251,9 @@
var/currentKey = src.linkedServer.decryptkey
user << "Brute-force completed! The key is '[currentKey]'. "
src.hacking = 0
- src.icon_state = normal_icon
src.screen = 0 // Return the screen back to normal
/obj/machinery/computer/message_monitor/proc/UnmagConsole()
- src.icon_state = normal_icon
src.emagged = 0
/obj/machinery/computer/message_monitor/proc/ResetMessage()
@@ -365,7 +351,6 @@
if(issilicon(usr) && is_special_character(usr))
src.hacking = 1
src.screen = 2
- src.icon_state = hack_icon
//Time it takes to bruteforce is dependant on the password length.
spawn(100*length(src.linkedServer.decryptkey))
if(src && src.linkedServer && usr)
diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm
index 5b93f9e6d53..8d503badcea 100644
--- a/code/game/machinery/computer/pod.dm
+++ b/code/game/machinery/computer/pod.dm
@@ -1,7 +1,6 @@
/obj/machinery/computer/pod
name = "mass driver launch control"
desc = "A combined blastdoor and mass driver control unit."
- icon_state = "computer_generic"
var/obj/machinery/mass_driver/connected = null
var/title = "Mass Driver Controls"
var/id = 1
@@ -120,9 +119,11 @@
/obj/machinery/computer/pod/old
- icon_state = "old"
name = "\improper DoorMex control console"
title = "Door Controls"
+ icon_state = "oldcomp"
+ icon_screen = "library"
+ icon_keyboard = null
/obj/machinery/computer/pod/old/syndicate
diff --git a/code/game/machinery/computer/power.dm b/code/game/machinery/computer/power.dm
index 9671df6d94f..1911b1067b3 100644
--- a/code/game/machinery/computer/power.dm
+++ b/code/game/machinery/computer/power.dm
@@ -3,10 +3,8 @@
/obj/machinery/computer/monitor
name = "power monitoring console"
desc = "It monitors power levels across the station."
- icon = 'icons/obj/computer.dmi'
- icon_state = "power"
- density = 1
- anchored = 1
+ icon_screen = "power"
+ icon_keyboard = "power_key"
use_power = 2
idle_power_usage = 20
active_power_usage = 80
diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm
index c021d2e158a..48e12d07b80 100644
--- a/code/game/machinery/computer/prisoner.dm
+++ b/code/game/machinery/computer/prisoner.dm
@@ -1,8 +1,8 @@
/obj/machinery/computer/prisoner
name = "prisoner management console"
desc = "Used to manage tracking implants placed inside criminals."
- icon = 'icons/obj/computer.dmi'
- icon_state = "explosive"
+ icon_screen = "explosive"
+ icon_keyboard = "security_key"
req_access = list(access_brig)
circuit = "/obj/item/weapon/circuitboard/prisoner"
var/id = 0.0
diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm
index 305e8d9ea58..8cb27943cf8 100644
--- a/code/game/machinery/computer/robot.dm
+++ b/code/game/machinery/computer/robot.dm
@@ -4,8 +4,8 @@
/obj/machinery/computer/robotics
name = "robotics control console"
desc = "Used to remotely lockdown or detonate linked Cyborgs."
- icon = 'icons/obj/computer.dmi'
- icon_state = "robot"
+ icon_screen = "robot"
+ icon_keyboard = "rd_key"
req_access = list(access_robotics)
circuit = /obj/item/weapon/circuitboard/robotics
var/temp = null
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index 3ac9f1abf03..8a0c5dab87a 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -3,7 +3,8 @@
/obj/machinery/computer/secure_data//TODO:SANITY
name = "security records console"
desc = "Used to view and edit personnel's security records"
- icon_state = "security"
+ icon_screen = "security"
+ icon_keyboard = "security_key"
req_one_access = list(access_security, access_forensics_lockers)
circuit = /obj/item/weapon/circuitboard/secure_data
var/obj/item/weapon/card/id/scan = null
@@ -518,7 +519,7 @@ What a mess.*/
switch(href_list["field"])
if("name")
if(istype(active1, /datum/data/record) || istype(active2, /datum/data/record))
- var/t1 = stripped_input(usr, "Please input name:", "Secure. records", active1.fields["name"], null)
+ var/t1 = copytext(sanitize(input("Please input name:", "Secure. records", active1.fields["name"], null) as text),1,MAX_MESSAGE_LEN)
if(!canUseSecurityRecordsConsole(usr, t1, a1))
return
if(istype(active1, /datum/data/record))
@@ -743,7 +744,3 @@ What a mess.*/
if(!record2 || record2 == active2)
return 1
return 0
-
-/obj/machinery/computer/secure_data/detective_computer
- icon = 'icons/obj/computer.dmi'
- icon_state = "messyfiles"
diff --git a/code/game/machinery/computer/shuttle.dm b/code/game/machinery/computer/shuttle.dm
index 87e1389167d..b1460042e8a 100644
--- a/code/game/machinery/computer/shuttle.dm
+++ b/code/game/machinery/computer/shuttle.dm
@@ -1,7 +1,8 @@
/obj/machinery/computer/emergency_shuttle
name = "emergency shuttle console"
desc = "For shuttle control."
- icon_state = "shuttle"
+ icon_screen = "shuttle"
+ icon_keyboard = "tech_key"
var/auth_need = 3.0
var/list/authorized = list()
@@ -128,8 +129,7 @@
/obj/machinery/computer/supplycomp
name = "supply shuttle console"
desc = "Used to order supplies."
- icon = 'icons/obj/computer.dmi'
- icon_state = "supply"
+ icon_screen = "supply"
req_access = list(access_cargo)
circuit = /obj/item/weapon/circuitboard/supplycomp
verb_say = "flashes"
@@ -150,8 +150,7 @@
/obj/machinery/computer/ordercomp
name = "supply ordering console"
desc = "Used to order supplies from cargo staff."
- icon = 'icons/obj/computer.dmi'
- icon_state = "request"
+ icon_screen = "request"
circuit = /obj/item/weapon/circuitboard/ordercomp
verb_say = "flashes"
verb_ask = "flashes"
diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm
index 113ab773c84..1d2b1e5c7ce 100644
--- a/code/game/machinery/computer/station_alert.dm
+++ b/code/game/machinery/computer/station_alert.dm
@@ -2,13 +2,11 @@
/obj/machinery/computer/station_alert
name = "station alert console"
desc = "Used to access the station's automated alert system."
- icon_state = "alert:0"
+ icon_screen = "alert:0"
+ icon_keyboard = "atmos_key"
circuit = /obj/item/weapon/circuitboard/stationalert
var/alarms = list("Fire"=list(), "Atmosphere"=list(), "Power"=list())
-
-
-
/obj/machinery/computer/station_alert/attack_hand(mob/user)
if(..())
return
@@ -99,20 +97,12 @@
return
/obj/machinery/computer/station_alert/update_icon()
- SetLuminosity(brightness_on)
- if(stat & BROKEN)
- icon_state = "alert:b"
- return
- else if (stat & NOPOWER)
- icon_state = "alert:O"
- SetLuminosity(0)
- return
+ ..()
var/active_alarms = 0
for (var/cat in src.alarms)
var/list/L = src.alarms[cat]
if(L.len) active_alarms = 1
if(active_alarms)
- icon_state = "alert:2"
+ overlays += "alert:2"
else
- icon_state = "alert:0"
- return
\ No newline at end of file
+ overlays += "alert:0"
\ No newline at end of file
diff --git a/code/game/machinery/computer/syndicate_shuttle.dm b/code/game/machinery/computer/syndicate_shuttle.dm
index d13bef052f8..8a0ee76c872 100644
--- a/code/game/machinery/computer/syndicate_shuttle.dm
+++ b/code/game/machinery/computer/syndicate_shuttle.dm
@@ -1,8 +1,8 @@
/obj/machinery/computer/shuttle/syndicate
name = "syndicate shuttle terminal"
- icon_state = "syndishuttle"
+ icon_screen = "syndishuttle"
+ icon_keyboard = "syndie_key"
req_access = list(access_syndicate)
-
shuttleId = "syndicate"
possible_destinations = "syndicate_away;syndicate_z5;syndicate_z3;syndicate_z4;syndicate_ne;syndicate_nw;syndicate_n;syndicate_se;syndicate_sw;syndicate_s"
@@ -12,7 +12,8 @@
/obj/machinery/computer/shuttle/syndicate/whiteship
name = "ship control terminal"
- icon_state = "shuttle"
+ icon_screen = "shuttle"
+ icon_keyboard = "tech_key"
shuttleId = "whiteship"
req_access = list( )
possible_destinations = "whiteship_ss13;whiteship_home;whiteship_z4"
\ No newline at end of file
diff --git a/code/game/machinery/computer/telecrystalconsoles.dm b/code/game/machinery/computer/telecrystalconsoles.dm
index 79032b6f001..d20776f350c 100644
--- a/code/game/machinery/computer/telecrystalconsoles.dm
+++ b/code/game/machinery/computer/telecrystalconsoles.dm
@@ -7,13 +7,14 @@ var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","F
name = "\improper Telecrystal assignment station"
desc = "A device used to manage telecrystals during group operations. You shouldn't be looking at this particular one..."
icon_state = "tcstation"
+ icon_keyboard = "tcstation_key"
+ icon_screen = "syndie"
/////////////////////////////////////////////
/obj/machinery/computer/telecrystals/uplinker
name = "\improper Telecrystal upload/receive station"
desc = "A device used to manage telecrystals during group operations. To use, simply insert your uplink. With your uplink installed \
you can upload your telecrystals to the group's pool using the console, or be assigned additional telecrystals by your lieutenant."
- icon_state = "tcstation"
var/obj/item/uplinkholder = null
var/obj/machinery/computer/telecrystals/boss/linkedboss = null
@@ -50,7 +51,7 @@ var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","F
/obj/machinery/computer/telecrystals/uplinker/update_icon()
- overlays.Cut()
+ ..()
if(uplinkholder)
overlays += "[initial(icon_state)]-closed"
@@ -126,7 +127,9 @@ var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","F
desc = "A device used to manage telecrystals during group operations. To use, simply initialize the machine by scanning for nearby uplink stations. \
Once the consoles are linked up, you can assign any telecrystals amongst your operatives; be they donated by your agents or rationed to the squad \
based on the danger rating of the mission."
- icon_state = "tcboss"
+ icon_state = "computer"
+ icon_screen = "tcboss"
+ icon_keyboard = "syndie_key"
var/virgin = 1
var/scanrange = 10
var/storedcrystals = 0
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index 4f7c4dfad82..5530c7cc5a1 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -265,6 +265,15 @@ to destroy them and players will be able to make replacements.
/obj/item/weapon/stock_parts/cell = 5,
/obj/item/weapon/stock_parts/capacitor = 1)
+/obj/item/weapon/circuitboard/emitter
+ name = "circuit board (Emitter)"
+ build_path = /obj/machinery/power/emitter
+ board_type = "machine"
+ origin_tech = "programming=4;powerstorage=5;engineering=5"
+ req_components = list(
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1)
+
/obj/item/weapon/circuitboard/power_compressor
name = "circuit board (Power Compressor)"
build_path = /obj/machinery/power/compressor
@@ -384,6 +393,7 @@ to destroy them and players will be able to make replacements.
origin_tech = "programming=1;biotech=1"
req_components = list(
/obj/item/weapon/stock_parts/matter_bin = 2,
+ /obj/item/weapon/stock_parts/manipulator = 1,
/obj/item/weapon/stock_parts/console_screen = 1)
/obj/item/weapon/circuitboard/microwave
@@ -393,9 +403,71 @@ to destroy them and players will be able to make replacements.
origin_tech = "programming=1"
req_components = list(
/obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/matter_bin = 1,
/obj/item/stack/cable_coil = 2,
/obj/item/weapon/stock_parts/console_screen = 1)
+/obj/item/weapon/circuitboard/gibber
+ name = "circuit board (Gibber)"
+ build_path = /obj/machinery/gibber
+ board_type = "machine"
+ origin_tech = "programming=1"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1)
+
+/obj/item/weapon/circuitboard/processor
+ name = "circuit board (Food processor)"
+ build_path = /obj/machinery/processor
+ board_type = "machine"
+ origin_tech = "programming=1"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1)
+
+/obj/item/weapon/circuitboard/recycler
+ name = "circuit board (Recycler)"
+ build_path = /obj/machinery/recycler
+ board_type = "machine"
+ origin_tech = "programming=1"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1)
+
+/obj/item/weapon/circuitboard/seed_extractor
+ name = "circuit board (Seed Extractor)"
+ build_path = /obj/machinery/seed_extractor
+ board_type = "machine"
+ origin_tech = "programming=1"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1)
+
+/obj/item/weapon/circuitboard/smartfridge
+ name = "circuit board (Smartfridge)"
+ build_path = /obj/machinery/smartfridge
+ board_type = "machine"
+ origin_tech = "programming=1"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1)
+
+/obj/item/weapon/circuitboard/monkey_recycler
+ name = "circuit board (Monkey Recycler)"
+ build_path = /obj/machinery/monkey_recycler
+ board_type = "machine"
+ origin_tech = "programming=1"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1)
+
+/obj/item/weapon/circuitboard/holopad
+ name = "circuit board (AI Holopad)"
+ build_path = /obj/machinery/hologram/holopad
+ board_type = "machine"
+ origin_tech = "programming=1"
+ req_components = list(
+ /obj/item/weapon/stock_parts/capacitor = 1)
+
/obj/item/weapon/circuitboard/chem_dispenser
name = "circuit board (Portable Chem Dispenser)"
build_path = /obj/machinery/chem_dispenser/constructable
@@ -639,6 +711,8 @@ obj/item/weapon/circuitboard/rdserver
req_components = list(
/obj/item/weapon/stock_parts/console_screen = 1,
/obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1,
/obj/item/device/assembly/igniter = 1)
/obj/item/weapon/circuitboard/mining_equipment_vendor
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index c7b8dc92fe8..99b4bb8ad46 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -46,6 +46,8 @@
var/hasShocked = 0 //Prevents multiple shocks from happening
var/autoclose = 1
+ explosion_block = 1
+
/obj/machinery/door/airlock/command
icon = 'icons/obj/doors/Doorcom.dmi'
doortype = /obj/structure/door_assembly/door_assembly_com
@@ -89,6 +91,7 @@
icon = 'icons/obj/doors/vault.dmi'
opacity = 1
doortype = /obj/structure/door_assembly/door_assembly_vault
+ explosion_block = 2
/obj/machinery/door/airlock/glass_large
name = "glass airlock"
@@ -268,6 +271,7 @@
name = "high tech security airlock"
icon = 'icons/obj/doors/hightechsecurity.dmi'
doortype = /obj/structure/door_assembly/door_assembly_highsecurity
+ explosion_block = 2
/obj/machinery/door/airlock/shuttle
name = "shuttle airlock"
@@ -562,16 +566,16 @@ About the new airlock wires panel:
if(src.isWireCut(AIRLOCK_WIRE_SAFETY))
t1 += text("Door force sensors not responding. \n")
else if(src.safe)
- t1 += text("Door safeties operating normally. Override? \n",src)
+ t1 += text("Door safeties operating normally. Override? \n",src)
else
- t1 += text("Danger. Door safeties disabled. Restore? \n",src)
+ t1 += text("Danger. Door safeties disabled. Restore? \n",src)
if(src.isWireCut(AIRLOCK_WIRE_SPEED))
t1 += text("Door timing circuitry not responding. \n")
else if(src.normalspeed)
- t1 += text("Door timing circuitry operating normally. Override? \n",src)
+ t1 += text("Door timing circuitry operating normally. Override? \n",src)
else
- t1 += text("Warning. Door timing circuitry operating abnormally. Restore? \n",src)
+ t1 += text("Warning. Door timing circuitry operating abnormally. Restore? \n",src)
@@ -970,9 +974,9 @@ About the new airlock wires panel:
qdel(src)
return
else if(hasPower())
- user << " The airlock's motors resist your efforts to force it! "
+ user << "The airlock's motors resist your efforts to force it! "
else if(locked)
- user << " The airlock's bolts prevent it from being forced! "
+ user << "The airlock's bolts prevent it from being forced! "
else if( !welded && !operating)
if(density)
if(beingcrowbarred == 0) //being fireaxe'd
diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm
index e558ccbac61..c1836108462 100644
--- a/code/game/machinery/doors/poddoor.dm
+++ b/code/game/machinery/doors/poddoor.dm
@@ -6,6 +6,7 @@
var/id = 1
var/auto_close = 0 // Time in seconds to automatically close when opened, 0 if it doesn't.
sub_door = 1
+ explosion_block = 3
heat_proof = 1
/obj/machinery/door/poddoor/preopen
@@ -87,318 +88,27 @@
operating = 0
+//"BLAST" doors are obviously stronger than regular doors when it comes to BLASTS.
+/obj/machinery/door/poddoor/ex_act(severity, target)
+ switch(severity)
+ if(1.0)
+ if(prob(80))
+ qdel(src)
+ else
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(2, 1, src)
+ s.start()
+ if(2.0)
+ if(prob(20))
+ qdel(src)
+ else
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(2, 1, src)
+ s.start()
+ if(3.0)
+ if(prob(80))
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(2, 1, src)
+ s.start()
-/*
-/obj/machinery/door/poddoor/two_tile_hor/open()
- if (src.operating == 1) //doors can still open when emag-disabled
- return
- if (!ticker)
- return 0
- if(!src.operating) //in case of emag
- src.operating = 1
- flick("pdoorc0", src)
- src.icon_state = "pdoor0"
- src.SetOpacity(0)
- f1.SetOpacity(0)
- f2.SetOpacity(0)
-
- sleep(10)
- src.density = 0
- f1.density = 0
- f2.density = 0
-
- update_nearby_tiles()
-
- if(operating == 1) //emag again
- src.operating = 0
- if(autoclose)
- spawn(150)
- autoclose()
- return 1
-
-/obj/machinery/door/poddoor/two_tile_hor/close()
- if (src.operating)
- return
- src.operating = 1
- flick("pdoorc1", src)
- src.icon_state = "pdoor1"
-
- src.density = 1
- f1.density = 1
- f2.density = 1
-
- sleep(10)
- src.SetOpacity(initial(opacity))
- f1.SetOpacity(initial(opacity))
- f2.SetOpacity(initial(opacity))
-
- update_nearby_tiles()
-
- src.operating = 0
- return
-
-/obj/machinery/door/poddoor/four_tile_hor/open()
- if (src.operating == 1) //doors can still open when emag-disabled
- return
- if (!ticker)
- return 0
- if(!src.operating) //in case of emag
- src.operating = 1
- flick("pdoorc0", src)
- src.icon_state = "pdoor0"
- sleep(10)
- src.density = 0
- src.sd_SetOpacity(0)
-
- f1.density = 0
- f1.sd_SetOpacity(0)
- f2.density = 0
- f2.sd_SetOpacity(0)
- f3.density = 0
- f3.sd_SetOpacity(0)
- f4.density = 0
- f4.sd_SetOpacity(0)
-
- update_nearby_tiles()
-
- if(operating == 1) //emag again
- src.operating = 0
- if(autoclose)
- spawn(150)
- autoclose()
- return 1
-
-/obj/machinery/door/poddoor/four_tile_hor/close()
- if (src.operating)
- return
- src.operating = 1
- flick("pdoorc1", src)
- src.icon_state = "pdoor1"
- src.density = 1
-
- f1.density = 1
- f1.sd_SetOpacity(1)
- f2.density = 1
- f2.sd_SetOpacity(1)
- f3.density = 1
- f3.sd_SetOpacity(1)
- f4.density = 1
- f4.sd_SetOpacity(1)
-
- if (src.visible)
- src.sd_SetOpacity(1)
- update_nearby_tiles()
-
- sleep(10)
- src.operating = 0
- return
-
-/obj/machinery/door/poddoor/two_tile_ver/open()
- if (src.operating == 1) //doors can still open when emag-disabled
- return
- if (!ticker)
- return 0
- if(!src.operating) //in case of emag
- src.operating = 1
- flick("pdoorc0", src)
- src.icon_state = "pdoor0"
- sleep(10)
- src.density = 0
- src.sd_SetOpacity(0)
-
- f1.density = 0
- f1.sd_SetOpacity(0)
- f2.density = 0
- f2.sd_SetOpacity(0)
-
- update_nearby_tiles()
-
- if(operating == 1) //emag again
- src.operating = 0
- if(autoclose)
- spawn(150)
- autoclose()
- return 1
-
-/obj/machinery/door/poddoor/two_tile_ver/close()
- if (src.operating)
- return
- src.operating = 1
- flick("pdoorc1", src)
- src.icon_state = "pdoor1"
- src.density = 1
-
- f1.density = 1
- f1.sd_SetOpacity(1)
- f2.density = 1
- f2.sd_SetOpacity(1)
-
- if (src.visible)
- src.sd_SetOpacity(1)
- update_nearby_tiles()
-
- sleep(10)
- src.operating = 0
- return
-
-/obj/machinery/door/poddoor/four_tile_ver/open()
- if (src.operating == 1) //doors can still open when emag-disabled
- return
- if (!ticker)
- return 0
- if(!src.operating) //in case of emag
- src.operating = 1
- flick("pdoorc0", src)
- src.icon_state = "pdoor0"
- sleep(10)
- src.density = 0
- src.sd_SetOpacity(0)
-
- f1.density = 0
- f1.sd_SetOpacity(0)
- f2.density = 0
- f2.sd_SetOpacity(0)
- f3.density = 0
- f3.sd_SetOpacity(0)
- f4.density = 0
- f4.sd_SetOpacity(0)
-
- update_nearby_tiles()
-
- if(operating == 1) //emag again
- src.operating = 0
- if(autoclose)
- spawn(150)
- autoclose()
- return 1
-
-/obj/machinery/door/poddoor/four_tile_ver/close()
- if (src.operating)
- return
- src.operating = 1
- flick("pdoorc1", src)
- src.icon_state = "pdoor1"
- src.density = 1
-
- f1.density = 1
- f1.sd_SetOpacity(1)
- f2.density = 1
- f2.sd_SetOpacity(1)
- f3.density = 1
- f3.sd_SetOpacity(1)
- f4.density = 1
- f4.sd_SetOpacity(1)
-
- if (src.visible)
- src.sd_SetOpacity(1)
- update_nearby_tiles()
-
- sleep(10)
- src.operating = 0
- return
-
-
-
-
-/obj/machinery/door/poddoor/two_tile_hor
- var/obj/machinery/door/poddoor/filler_object/f1
- var/obj/machinery/door/poddoor/filler_object/f2
- icon = 'icons/obj/doors/1x2blast_hor.dmi'
-
- New()
- ..()
- f1 = new/obj/machinery/door/poddoor/filler_object (src.loc)
- f2 = new/obj/machinery/door/poddoor/filler_object (get_step(src,EAST))
- f1.density = density
- f2.density = density
- f1.sd_SetOpacity(opacity)
- f2.sd_SetOpacity(opacity)
-
- Destroy()
- qdel(f1)
- qdel(f2)
- ..()
-
-/obj/machinery/door/poddoor/two_tile_ver
- var/obj/machinery/door/poddoor/filler_object/f1
- var/obj/machinery/door/poddoor/filler_object/f2
- icon = 'icons/obj/doors/1x2blast_vert.dmi'
-
- New()
- ..()
- f1 = new/obj/machinery/door/poddoor/filler_object (src.loc)
- f2 = new/obj/machinery/door/poddoor/filler_object (get_step(src,NORTH))
- f1.density = density
- f2.density = density
- f1.sd_SetOpacity(opacity)
- f2.sd_SetOpacity(opacity)
-
- Destroy()
- qdel(f1)
- qdel(f2)
- ..()
-
-/obj/machinery/door/poddoor/four_tile_hor
- var/obj/machinery/door/poddoor/filler_object/f1
- var/obj/machinery/door/poddoor/filler_object/f2
- var/obj/machinery/door/poddoor/filler_object/f3
- var/obj/machinery/door/poddoor/filler_object/f4
- icon = 'icons/obj/doors/1x4blast_hor.dmi'
-
- New()
- ..()
- f1 = new/obj/machinery/door/poddoor/filler_object (src.loc)
- f2 = new/obj/machinery/door/poddoor/filler_object (get_step(f1,EAST))
- f3 = new/obj/machinery/door/poddoor/filler_object (get_step(f2,EAST))
- f4 = new/obj/machinery/door/poddoor/filler_object (get_step(f3,EAST))
- f1.density = density
- f2.density = density
- f3.density = density
- f4.density = density
- f1.sd_SetOpacity(opacity)
- f2.sd_SetOpacity(opacity)
- f4.sd_SetOpacity(opacity)
- f3.sd_SetOpacity(opacity)
-
- Destroy()
- qdel(f1)
- qdel(f2)
- qdel(f3)
- qdel(f4)
- ..()
-
-/obj/machinery/door/poddoor/four_tile_ver
- var/obj/machinery/door/poddoor/filler_object/f1
- var/obj/machinery/door/poddoor/filler_object/f2
- var/obj/machinery/door/poddoor/filler_object/f3
- var/obj/machinery/door/poddoor/filler_object/f4
- icon = 'icons/obj/doors/1x4blast_vert.dmi'
-
- New()
- ..()
- f1 = new/obj/machinery/door/poddoor/filler_object (src.loc)
- f2 = new/obj/machinery/door/poddoor/filler_object (get_step(f1,NORTH))
- f3 = new/obj/machinery/door/poddoor/filler_object (get_step(f2,NORTH))
- f4 = new/obj/machinery/door/poddoor/filler_object (get_step(f3,NORTH))
- f1.density = density
- f2.density = density
- f3.density = density
- f4.density = density
- f1.sd_SetOpacity(opacity)
- f2.sd_SetOpacity(opacity)
- f4.sd_SetOpacity(opacity)
- f3.sd_SetOpacity(opacity)
-
- Destroy()
- qdel(f1)
- qdel(f2)
- qdel(f3)
- qdel(f4)
- ..()
-
-/obj/machinery/door/poddoor/filler_object
- name = ""
- icon_state = ""
-
-*/
\ No newline at end of file
diff --git a/code/game/machinery/doors/unpowered.dm b/code/game/machinery/doors/unpowered.dm
index df94284c2c5..f8c634f9724 100644
--- a/code/game/machinery/doors/unpowered.dm
+++ b/code/game/machinery/doors/unpowered.dm
@@ -21,4 +21,5 @@
name = "door"
icon_state = "door1"
opacity = 1
- density = 1
\ No newline at end of file
+ density = 1
+ explosion_block = 1
\ No newline at end of file
diff --git a/code/game/machinery/embedded_controller/airlock_controller.dm b/code/game/machinery/embedded_controller/airlock_controller.dm
index 6ef3d8e0dd6..85468c5a944 100644
--- a/code/game/machinery/embedded_controller/airlock_controller.dm
+++ b/code/game/machinery/embedded_controller/airlock_controller.dm
@@ -283,10 +283,10 @@
Current Status:
[current_status]
-
\> Chamber Pressure:
[sensor_pressure] kPa
-
\> Control Pump:
[pump_status]
-
\> Interior Door:
[interior_status]
-
\> Exterior Door:
[exterior_status]
+
\> Chamber Pressure:
[sensor_pressure] kPa
+
\> Control Pump:
[pump_status]
+
\> Interior Door:
[interior_status]
+
\> Exterior Door:
[exterior_status]
[state_options]"}
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 6f20b8ce9f6..299a8c01b38 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -42,6 +42,35 @@ var/const/HOLOPAD_MODE = RANGE_BASED
var/holo_range = 5 // Change to change how far the AI can move away from the holopad before deactivating.
var/temp = ""
+/obj/machinery/hologram/holopad/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/holopad(null)
+ component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
+ RefreshParts()
+
+/obj/machinery/hologram/holopad/RefreshParts()
+ var/holograph_range = 4
+ for(var/obj/item/weapon/stock_parts/capacitor/B in component_parts)
+ holograph_range += 1 * B.rating
+ holo_range = holograph_range
+
+/obj/machinery/hologram/holopad/attackby(obj/item/P as obj, mob/user as mob, params)
+ if(default_deconstruction_screwdriver(user, "holopad_open", "holopad0", P))
+ return
+
+ if(exchange_parts(user, P))
+ return
+
+ if(default_pry_open(P))
+ return
+
+ if(default_unfasten_wrench(user, P))
+ return
+
+ default_deconstruction_crowbar(P)
+
+
/obj/machinery/hologram/holopad/attack_hand(var/mob/living/carbon/human/user) //Carn: Hologram requests.
if(!istype(user))
return
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index 8d07ebf090d..e5961c09fc9 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -93,7 +93,7 @@
return PROCESS_KILL
if(!(get_dist(src, attached) <= 1 && isturf(attached.loc)))
- attached << "The IV drip needle is ripped out of you, doesn't that hurt? "
+ attached << "The IV drip needle is ripped out of you! "
attached.apply_damage(3, BRUTE, pick("r_arm", "l_arm"))
attached = null
update_icon()
@@ -103,10 +103,10 @@
// Give blood
if(mode)
if(beaker.volume > 0)
- var/transfer_amount = REAGENTS_METABOLISM
+ var/transfer_amount = 5
if(istype(beaker, /obj/item/weapon/reagent_containers/blood))
// speed up transfer on blood packs
- transfer_amount = 4
+ transfer_amount = 10
beaker.reagents.reaction(attached, INGEST, 1,0) //make reagents reacts, but don't spam messages
beaker.reagents.trans_to(attached, transfer_amount)
update_icon()
@@ -205,4 +205,4 @@
else
usr << "No chemicals are attached. "
- usr << "[attached ? attached : "No one"] is attached. "
\ No newline at end of file
+ usr << "[attached ? attached : "No one"] is attached. "
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index c616c2d6301..949f7b05dd3 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -324,7 +324,7 @@ Class Procs:
. = !(state_open || panel_open || is_operational()) && istype(C)
if(.)
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
- visible_message("[usr] pry open \the [src]. ", "You pry open \the [src]. ")
+ visible_message("[usr] pry open \the [src]. ", "You pry open \the [src]. ")
open_machine()
return 1
@@ -377,9 +377,13 @@ Class Procs:
/obj/machinery/proc/exchange_parts(mob/user, obj/item/weapon/storage/part_replacer/W)
var/shouldplaysound = 0
if(istype(W) && component_parts)
- if(panel_open)
+ if(panel_open || W.works_from_distance)
var/obj/item/weapon/circuitboard/CB = locate(/obj/item/weapon/circuitboard) in component_parts
var/P
+ if(W.works_from_distance)
+ user << "Following parts detected in the machine: "
+ for(var/var/obj/item/C in component_parts)
+ user << " [C.name] "
for(var/obj/item/weapon/stock_parts/A in component_parts)
for(var/D in CB.req_components)
if(ispath(A.type, D))
@@ -400,7 +404,7 @@ Class Procs:
else
user << "Following parts detected in the machine: "
for(var/var/obj/item/C in component_parts)
- user << " [C.name] "
+ user << " [C.name] "
if(shouldplaysound)
W.play_rped_sound()
return 1
diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm
index e23456392ae..fed05fe9ce7 100644
--- a/code/game/machinery/navbeacon.dm
+++ b/code/game/machinery/navbeacon.dm
@@ -141,7 +141,7 @@ Transponder Codes:"}
t += "[key] ... [codes[key]]"
t += " Edit "
t += " Delete "
- t += " Add New "
+ t += " Add New "
t+= ""
var/datum/browser/popup = new(user, "navbeacon", "Navigation Beacon", 300, 400)
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index 5c3e80e238d..f5693f0a3fa 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -478,9 +478,9 @@ var/list/obj/machinery/newscaster/allCasters = list()
dat+="Description : [msg] "
dat+="Attach Photo : [(photo ? "Photo Attached" : "No Photo")]"
if(wanted_already)
- dat+="Wanted Issue created by: [news_network.wanted_issue.scannedUser] "
+ dat+="Wanted Issue created by: [news_network.wanted_issue.scannedUser] "
else
- dat+="Wanted Issue will be created under prosecutor: [scanned_user] "
+ dat+="Wanted Issue will be created under prosecutor: [scanned_user] "
dat+="[(wanted_already) ? ("Edit Issue") : ("Submit")] "
if(wanted_already)
dat+="Take down Issue "
diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm
index 7c1751ff821..c8a121619cd 100644
--- a/code/game/machinery/recycler.dm
+++ b/code/game/machinery/recycler.dm
@@ -13,12 +13,38 @@ var/const/SAFETY_COOLDOWN = 100
var/icon_name = "grinder-o"
var/blood = 0
var/eat_dir = WEST
+ var/amount_produced = 1
+ var/probability_mod = 1
+ var/extra_materials = 0
+ var/list/blacklist = list(/obj/item/pipe, /obj/item/pipe_meter, /obj/structure/disposalconstruct, /obj/item/weapon/reagent_containers, /obj/item/weapon/paper, /obj/item/stack/, /obj/item/weapon/pen, /obj/item/weapon/storage/, /obj/item/clothing/mask/cigarette) // Don't allow us to grind things we can poop out at 200 a second for free.
/obj/machinery/recycler/New()
// On us
..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/recycler(null)
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
+ RefreshParts()
update_icon()
+/obj/machinery/recycler/RefreshParts()
+ var/amt_made = 0
+ var/prob_mod = 0
+ for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts)
+ amt_made = 1 * B.rating
+ for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
+ if(M.rating > 1)
+ prob_mod = 2 * M.rating
+ else
+ prob_mod = 1 * M.rating
+ if(M.rating >= 3)
+ extra_materials = 1
+ else
+ extra_materials = 0
+ probability_mod = prob_mod
+ amount_produced = amt_made
+
/obj/machinery/recycler/examine(mob/user)
..()
user << "The power light is [(stat & NOPOWER) ? "off" : "on"]."
@@ -31,15 +57,22 @@ var/const/SAFETY_COOLDOWN = 100
/obj/machinery/recycler/attackby(var/obj/item/I, var/mob/user, params)
- if(istype(I, /obj/item/weapon/screwdriver))
- if(emagged)
- emagged = 0
- update_icon()
- user << "You reset the crusher to its default factory settings. "
- else
- ..()
+ if(default_deconstruction_screwdriver(user, "grinder-oOpen", "grinder-o0", I))
return
+
+ if(exchange_parts(user, I))
+ return
+
+ if(default_pry_open(I))
+ return
+
+ if(default_unfasten_wrench(user, I))
+ return
+
+ default_deconstruction_crowbar(I)
+ ..()
add_fingerprint(user)
+ return
/obj/machinery/recycler/emag_act(user as mob)
if(!emagged)
@@ -70,13 +103,6 @@ var/const/SAFETY_COOLDOWN = 100
return
if(safety_mode)
return
- // If we're not already grinding something.
- if(!grinding)
- grinding = 1
- spawn(1)
- grinding = 0
- else
- return
var/move_dir = get_dir(loc, AM.loc)
if(move_dir == eat_dir)
@@ -93,15 +119,40 @@ var/const/SAFETY_COOLDOWN = 100
/obj/machinery/recycler/proc/recycle(var/obj/item/I, var/sound = 1)
I.loc = src.loc
+ if(is_type_in_list(I, blacklist))
+ qdel(I)
+ if(sound)
+ playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
+ return
qdel(I)
- if(prob(15))
- new /obj/item/stack/sheet/metal(loc)
- if(prob(10))
- new /obj/item/stack/sheet/glass(loc)
- if(prob(2))
- new /obj/item/stack/sheet/plasteel(loc)
- if(prob(1))
- new /obj/item/stack/sheet/rglass(loc)
+ if(prob(15 + probability_mod))
+ var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal(loc)
+ M.amount = amount_produced
+ if(prob(10 + probability_mod))
+ var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(loc)
+ G.amount = amount_produced
+ if(prob(2 + probability_mod))
+ var/obj/item/stack/sheet/plasteel/P = new /obj/item/stack/sheet/plasteel(loc)
+ P.amount = amount_produced
+ if(prob(1 + probability_mod))
+ var/obj/item/stack/sheet/rglass/R = new /obj/item/stack/sheet/rglass(loc)
+ R.amount = amount_produced
+ if(extra_materials)
+ if(prob(4 + probability_mod))
+ var/obj/item/stack/sheet/mineral/plasma/PS = new /obj/item/stack/sheet/mineral/plasma(loc)
+ PS.amount = amount_produced
+ if(prob(3 + probability_mod))
+ var/obj/item/stack/sheet/mineral/gold/GS = new /obj/item/stack/sheet/mineral/gold(loc)
+ GS.amount = amount_produced
+ if(prob(2 + probability_mod))
+ var/obj/item/stack/sheet/mineral/silver/S = new /obj/item/stack/sheet/mineral/silver(loc)
+ S.amount = amount_produced
+ if(prob(1 + probability_mod))
+ var/obj/item/stack/sheet/mineral/bananium/B = new /obj/item/stack/sheet/mineral/bananium(loc)
+ B.amount = amount_produced
+ if(prob(1 + probability_mod))
+ var/obj/item/stack/sheet/mineral/diamond/D = new /obj/item/stack/sheet/mineral/diamond(loc)
+ D.amount = amount_produced
if(sound)
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm
index 2e8aeeecb69..2e5db8f3827 100644
--- a/code/game/machinery/shieldgen.dm
+++ b/code/game/machinery/shieldgen.dm
@@ -263,13 +263,13 @@
return
if(!anchored && !isinspace())
playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
- user << " You secure \the [src] to the floor! "
+ user << "You secure \the [src] to the floor! "
anchored = 1
else if(anchored)
playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
- user << " You unsecure \the [src] from the floor! "
+ user << "You unsecure \the [src] from the floor! "
if(active)
- user << " \The [src] shuts off! "
+ user << "\The [src] shuts off! "
src.shields_down()
anchored = 0
diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm
index 0bc33615834..5af17c44572 100644
--- a/code/game/machinery/slotmachine.dm
+++ b/code/game/machinery/slotmachine.dm
@@ -293,14 +293,14 @@
return amount
-/obj/machinery/computer/slot_machine/proc/dispense(amount = 0, cointype = /obj/item/weapon/coin/silver, mob/living/target, throw = 0)
+/obj/machinery/computer/slot_machine/proc/dispense(amount = 0, cointype = /obj/item/weapon/coin/silver, mob/living/target, throwit = 0)
var/value = coinvalues["[cointype]"]
while(amount >= value)
var/obj/item/weapon/coin/C = new cointype(loc) //DOUBLE THE PAIN
amount -= value
- if(throw && target)
+ if(throwit && target)
C.throw_at(target, 3, 10)
else
random_step(C, 2, 40)
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index cc5c8e96fb8..e3993de167e 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -168,7 +168,7 @@
dat+= "Suit storage unit: Maintenance panel "
dat+= "Maintenance panel controls "
dat+= "The panel is ridden with controls, button and meters, labeled in strange signs and symbols that you cannot understand. Probably the manufactoring world's language. Among other things, a few controls catch your eye. "
- dat+= text("A small dial with a \"ë\" symbol embroidded on it. It's pointing towards a gauge that reads []. Turn towards [] ",(src.issuperUV ? "15nm" : "185nm"),src,(src.issuperUV ? "185nm" : "15nm") )
+ dat+= text("A small dial with a \"ë\" symbol embroidded on it. It's pointing towards a gauge that reads []. Turn towards [] ",(src.issuperUV ? "15nm" : "185nm"),src,(src.issuperUV ? "185nm" : "15nm") )
dat+= text("A thick old-style button, with 2 grimy LED lights next to it. The [] LED is on.Press button ",(src.safetieson? "GREEN " : "RED "),src)
dat+= text("Close panel ", user)
//user << browse(dat, "window=ssu_m_panel;size=400x500")
diff --git a/code/game/machinery/telecomms/computers/logbrowser.dm b/code/game/machinery/telecomms/computers/logbrowser.dm
index 8798f07c20c..8be4d941146 100644
--- a/code/game/machinery/telecomms/computers/logbrowser.dm
+++ b/code/game/machinery/telecomms/computers/logbrowser.dm
@@ -2,7 +2,7 @@
/obj/machinery/computer/telecomms/server
name = "telecommunications server monitoring console"
- icon_state = "comm_logs"
+ icon_screen = "comm_logs"
var/screen = 0 // the screen number:
var/list/servers = list() // the servers located by the computer
diff --git a/code/game/machinery/telecomms/computers/telemonitor.dm b/code/game/machinery/telecomms/computers/telemonitor.dm
index 432604dc15e..c6c3ab75a64 100644
--- a/code/game/machinery/telecomms/computers/telemonitor.dm
+++ b/code/game/machinery/telecomms/computers/telemonitor.dm
@@ -7,7 +7,7 @@
/obj/machinery/computer/telecomms/monitor
name = "telecommunications monitoring console"
- icon_state = "comm_monitor"
+ icon_screen = "comm_monitor"
var/screen = 0 // the screen number:
var/list/machinelist = list() // the machines located by the computer
diff --git a/code/game/machinery/telecomms/computers/traffic_control.dm b/code/game/machinery/telecomms/computers/traffic_control.dm
index 3edb25ff551..7dc9517abfc 100644
--- a/code/game/machinery/telecomms/computers/traffic_control.dm
+++ b/code/game/machinery/telecomms/computers/traffic_control.dm
@@ -2,7 +2,6 @@
/obj/machinery/computer/telecomms/traffic
name = "telecommunications traffic control console"
- icon_state = "computer_generic"
var/screen = 0 // the screen number:
var/list/servers = list() // the servers located by the computer
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index 1ec4c229900..6e41cf2856f 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -1,7 +1,8 @@
/obj/machinery/computer/teleporter
name = "Teleporter Control Console"
desc = "Used to control a linked teleportation Hub and Station."
- icon_state = "teleport"
+ icon_screen = "teleport"
+ icon_keyboard = "teleport_key"
circuit = "/obj/item/weapon/circuitboard/teleporter"
var/obj/item/device/gps/locked = null
var/regime_set = "Teleporter"
@@ -43,7 +44,7 @@
return
L.loc = src
locked = L
- user << "You insert the GPS device into the [name]'s slot. "
+ user << "You insert the GPS device into the [name]'s slot. "
else
..()
return
@@ -397,9 +398,9 @@
if(linked_stations.len < efficiency)
linked_stations.Add(M.buffer)
M.buffer = null
- user << "You upload the data from the [W.name]'s buffer. "
+ user << "You upload the data from the [W.name]'s buffer. "
else
- user << "This station can't hold more information, try to use better parts. "
+ user << "This station can't hold more information, try to use better parts. "
if(default_deconstruction_screwdriver(user, "controller-o", "controller", W))
update_icon()
return
@@ -413,11 +414,11 @@
if(istype(W, /obj/item/device/multitool))
var/obj/item/device/multitool/M = W
M.buffer = src
- user << "You download the data to the [W.name]'s buffer. "
+ user << "You download the data to the [W.name]'s buffer. "
return
if(istype(W, /obj/item/weapon/wirecutters))
link_console_and_hub()
- user << "You reconnect the station to nearby machinery. "
+ user << "You reconnect the station to nearby machinery. "
return
/obj/machinery/teleport/station/attack_paw()
diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm
index 08f454d379a..d2c467765a4 100644
--- a/code/game/mecha/mech_bay.dm
+++ b/code/game/mecha/mech_bay.dm
@@ -81,10 +81,8 @@
/obj/machinery/computer/mech_bay_power_console
name = "mech bay power control console"
desc = "Used to control mechbay power ports."
- density = 1
- anchored = 1
- icon = 'icons/obj/computer.dmi'
- icon_state = "recharge_comp"
+ icon_screen = "recharge_comp"
+ icon_keyboard = "rd_key"
circuit = /obj/item/weapon/circuitboard/mech_bay_power_console
var/obj/machinery/mech_bay_recharge_port/recharge_port
@@ -147,16 +145,10 @@
/obj/machinery/computer/mech_bay_power_console/update_icon()
- if(stat & NOPOWER)
- icon_state = "recharge_comp0"
- return
- if(stat & BROKEN)
- icon_state = "recharge_compb"
- return
+ ..()
if(!recharge_port || !recharge_port.recharging_mech || !recharge_port.recharging_mech.cell || !(recharge_port.recharging_mech.cell.charge < recharge_port.recharging_mech.cell.maxcharge))
- icon_state = "recharge_comp"
return
- icon_state = "recharge_comp_on"
+ overlays += "recharge_comp_on"
/obj/machinery/computer/mech_bay_power_console/initialize()
reconnect()
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index c9cc3e158d9..749d413b446 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -139,7 +139,7 @@
var/amount = min(res_max_amount, resources[resource])
output += "[material2name(resource)]: [amount] cm³"
if(amount>0)
- output += " - Remove \[1 \] | \[10 \] | \[All \] "
+ output += "- Remove \[1 \] | \[10 \] | \[All \] "
output += " "
return output
diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm
index b8bbbc23481..adc83c8da0d 100644
--- a/code/game/mecha/mecha_control_console.dm
+++ b/code/game/mecha/mecha_control_console.dm
@@ -1,8 +1,8 @@
/obj/machinery/computer/mecha
name = "exosuit control console"
desc = "Used to remotely locate or lockdown exosuits."
- icon = 'icons/obj/computer.dmi'
- icon_state = "mecha"
+ icon_screen = "mecha"
+ icon_keyboard = "tech_key"
req_access = list(access_robotics)
circuit = "/obj/item/weapon/circuitboard/mecha_control"
var/list/located = list()
@@ -58,16 +58,6 @@
updateUsrDialog()
return
-
-/obj/machinery/computer/mecha/update_icon()
- if(stat & NOPOWER)
- icon_state = "mecha0"
- return
- if(stat & BROKEN)
- icon_state = "mechab"
- return
- icon_state = "mecha"
-
/obj/item/mecha_parts/mecha_tracking
name = "exosuit tracking beacon"
desc = "Device used to transmit exosuit data."
diff --git a/code/game/objects/effects/spawners/structure.dm b/code/game/objects/effects/spawners/structure.dm
new file mode 100644
index 00000000000..774b9ca799d
--- /dev/null
+++ b/code/game/objects/effects/spawners/structure.dm
@@ -0,0 +1,33 @@
+/*
+Because mapping is already tedious enough this spawner let you spawn generic
+"sets" of objects rather than having to make the same object stack again and
+again.
+*/
+
+/obj/effect/spawner/structure
+ name = "map structure spawner"
+ var/list/spawn_list
+
+/obj/effect/spawner/structure/New()
+ if(spawn_list && spawn_list.len)
+ for(var/i = 1, i <= spawn_list.len, i++)
+ var/to_spawn = spawn_list[i]
+ new to_spawn(get_turf(src))
+ qdel(src)
+
+/obj/effect/spawner/structure/window
+ icon = 'icons/obj/structures.dmi'
+ icon_state = "window_spawner"
+ name = "window spawner"
+ spawn_list = list(
+ /obj/structure/grille,
+ /obj/structure/window/fulltile
+ )
+
+/obj/effect/spawner/structure/window/reinforced
+ name = "reenforced window spawner"
+ icon_state = "rwindow_spawner"
+ spawn_list = list(
+ /obj/structure/grille,
+ /obj/structure/window/reinforced/fulltile
+ )
diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm
index 63620b72676..3a7095a29a4 100644
--- a/code/game/objects/explosion.dm
+++ b/code/game/objects/explosion.dm
@@ -90,6 +90,18 @@
for(var/turf/T in trange(max_range, epicenter))
var/dist = cheap_pythag(T.x - x0,T.y - y0)
+
+ if(config.reactionary_explosions)
+ var/turf/Trajectory = T
+ while(Trajectory != epicenter)
+ Trajectory = get_step_towards(Trajectory, epicenter)
+ if(Trajectory.density && Trajectory.explosion_block)
+ dist += Trajectory.explosion_block
+
+ for(var/obj/machinery/door/D in Trajectory)
+ if(D.density && D.explosion_block)
+ dist += D.explosion_block
+
var/flame_dist = 0
var/throw_dist = dist
@@ -114,7 +126,7 @@
var/throw_dir = get_dir(epicenter,T)
for(var/obj/item/I in T)
spawn(0) //Simultaneously not one at a time
- if(I)
+ if(I && !I.anchored)
var/throw_range = rand(throw_dist, max_range)
var/turf/throw_at = get_ranged_target_turf(I, throw_dir, throw_range)
I.throw_speed = 4 //Temporarily change their throw_speed for embedding purposes (Reset when it finishes throwing, regardless of hitting anything)
@@ -138,3 +150,76 @@
/proc/secondaryexplosion(turf/epicenter, range)
for(var/turf/tile in trange(range, epicenter))
tile.ex_act(2)
+
+
+/client/proc/check_bomb_impacts()
+ set name = "Check Bomb Impact"
+ set category = "Debug"
+
+ var/newmode = alert("Use reactionary explosions?","Check Bomb Impact", "Yes", "No")
+ var/turf/epicenter = get_turf(mob)
+ if(!epicenter)
+ return
+
+ var/dev = 0
+ var/heavy = 0
+ var/light = 0
+ var/list/choices = list("Small Bomb","Medium Bomb","Big Bomb","Custom Bomb")
+ var/choice = input("Bomb Size?") in choices
+ switch(choice)
+ if(null)
+ return 0
+ if("Small Bomb")
+ dev = 1
+ heavy = 2
+ light = 3
+ if("Medium Bomb")
+ dev = 2
+ heavy = 3
+ light = 4
+ if("Big Bomb")
+ dev = 3
+ heavy = 5
+ light = 7
+ if("Custom Bomb")
+ dev = input("Devestation range (Tiles):") as num
+ heavy = input("Heavy impact range (Tiles):") as num
+ light = input("Light impact range (Tiles):") as num
+
+ var/max_range = max(dev, heavy, light)
+ var/x0 = epicenter.x
+ var/y0 = epicenter.y
+ var/list/wipe_colours = list()
+ for(var/turf/T in trange(max_range, epicenter))
+ wipe_colours += T
+ var/dist = cheap_pythag(T.x - x0, T.y - y0)
+
+ if(newmode == "Yes")
+ var/turf/TT = T
+ while(TT != epicenter)
+ TT = get_step_towards(TT,epicenter)
+ if(TT.density && TT.explosion_block)
+ dist += TT.explosion_block
+
+ for(var/obj/machinery/door/D in TT)
+ if(D.density && D.explosion_block)
+ dist += D.explosion_block
+
+ if(dist < dev)
+ T.color = "red"
+ T.maptext = "Dev"
+ else if (dist < heavy)
+ T.color = "yellow"
+ T.maptext = "Heavy"
+ else if (dist < light)
+ T.color = "blue"
+ T.maptext = "Light"
+ else
+ continue
+
+ sleep(100)
+ for(var/turf/T in wipe_colours)
+ T.color = null
+ T.maptext = ""
+
+
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index a098fc0bf08..cdedfe0733f 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -443,6 +443,7 @@
var/mob/living/carbon/human/H = A
if(can_embed(src))
if(prob(embed_chance) && !(PIERCEIMMUNE in H.dna.species.specflags))
+ H.throw_alert("embeddedobject")
var/obj/item/organ/limb/L = pick(H.organs)
L.embedded_objects |= src
add_blood(H)//it embedded itself in you, of course it's bloody!
diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm
index aeb17f0df26..53d7024076e 100644
--- a/code/game/objects/items/blueprints.dm
+++ b/code/game/objects/items/blueprints.dm
@@ -58,7 +58,7 @@
. = ..()
var/area/A = get_area()
if(get_area_type() == AREA_STATION)
- . += "According to \the [src], you are now in \"[strip_html_properly(A.name)]\" .
"
+ . += "According to \the [src], you are now in \"[html_encode(A.name)]\" .
"
var/datum/browser/popup = new(user, "blueprints", "[src]", 700, 500)
popup.set_content(.)
popup.open()
@@ -83,8 +83,8 @@
. = ..()
var/area/A = get_area()
if(get_area_type() == AREA_STATION)
- . += "According to \the [src], you are now in \"[strip_html_properly(A.name)]\" .
"
- . += "You may move an amendment to the drawing.
"
+ . += "According to \the [src], you are now in \"[html_encode(A.name)]\" .
"
+ . += "You may move an amendment to the drawing.
"
var/datum/browser/popup = new(user, "blueprints", "[src]", 700, 500)
popup.set_content(.)
popup.open()
diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm
index 731a7324b81..a512741096f 100644
--- a/code/game/objects/items/crayons.dm
+++ b/code/game/objects/items/crayons.dm
@@ -97,10 +97,7 @@
/obj/item/toy/crayon/spraycan/New()
..()
- if(gang)
- name = "Modified Paint Applicator"
- else
- name = "NanoTrasen-brand Rapid Paint Applicator"
+ name = "spray can"
update_icon()
/obj/item/toy/crayon/spraycan/examine(mob/user)
@@ -116,7 +113,7 @@
if("Toggle Cap")
user << "You [capped ? "Remove" : "Replace"] the cap of the [src] "
capped = capped ? 0 : 1
- icon_state = "spraycan[gang ? "_gang" : ""][capped ? "_cap" : ""]"
+ icon_state = "spraycan[capped ? "_cap" : ""]"
update_icon()
if("Change Drawing")
..()
@@ -155,8 +152,7 @@
overlays += I
/obj/item/toy/crayon/spraycan/gang
- desc = "A suspicious-looking spraycan modified to use special paint used by gangsters to mark territory."
- icon_state = "spraycan_gang_cap"
+ desc = "A modified container containing suspicious paint."
gang = 1
uses = 20
instant = -1
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 9225c031d28..6ef0a3fa4f8 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -50,6 +50,8 @@ var/global/list/obj/item/device/pda/PDAs = list()
var/list/ntrclog = list() //NTRC message log
var/new_ntrc_msg = 0
+ var/image/photo = null //Scanned photo
+
var/noreturn = 0 //whether the PDA can use the Return button, used for the aiPDA chatroom
/obj/item/device/pda/medical
@@ -815,13 +817,15 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(useTC != 2) // Does our recipient have a broadcaster on their level?
U << "ERROR: Cannot reach recipient."
return
- useMS.send_pda_message("[P.owner]","[owner]","[t]")
-
- tnote += "→ To [P.owner]: [t] "
- P.tnote += "← From [owner] ([ownjob]): [t] "
+ var/msg_ref = useMS.send_pda_message("[P.owner]","[owner]","[t]",photo)
+ var/photo_ref = ""
+ if(photo)
+ photo_ref = "(Photo) "
+ tnote += "→ To [P.owner]: [t][photo_ref] "
+ P.tnote += "← From [owner] ([ownjob]): [t][photo_ref] "
for(var/mob/M in player_list)
if(isobserver(M) && M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTPDA))
- M.show_message("PDA Message - [owner] -> [P.owner] : [t] ")
+ M.show_message("PDA Message - [owner] -> [P.owner] : [t][photo_ref] ")
if (!P.silent)
playsound(P.loc, 'sound/machines/twobeep.ogg', 50, 1)
@@ -835,9 +839,10 @@ var/global/list/obj/item/device/pda/PDAs = list()
L = get(P, /mob/living/silicon)
if(L)
- L << "\icon[P] Message from [src.owner] ([ownjob]), \"[t]\" (Reply )"
+ L << "\icon[P] Message from [src.owner] ([ownjob]), \"[t]\"[photo_ref] (Reply )"
log_pda("[usr] (PDA: [src.name]) sent \"[t]\" to [P.name]")
+ photo = null
P.overlays.Cut()
P.overlays += image('icons/obj/pda.dmi', "pda-r")
else
@@ -904,16 +909,16 @@ var/global/list/obj/item/device/pda/PDAs = list()
else
var/obj/item/I = user.get_active_hand()
if (istype(I, /obj/item/weapon/card/id))
- if(!user.drop_item())
+ if(!user.unEquip(I))
return 0
I.loc = src
id = I
else
var/obj/item/weapon/card/I = user.get_active_hand()
if (istype(I, /obj/item/weapon/card/id) && I:registered_name)
- var/obj/old_id = id
- if(!user.drop_item())
+ if(!user.unEquip(I))
return 0
+ var/obj/old_id = id
I.loc = src
id = I
user.put_in_hands(old_id)
@@ -924,7 +929,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
..()
if(istype(C, /obj/item/weapon/cartridge) && !cartridge)
cartridge = C
- if(!user.drop_item())
+ if(!user.unEquip(C))
return
cartridge.loc = src
user << "You insert [cartridge] into [src]. "
@@ -952,7 +957,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
return //Return in case of failed check or when successful.
updateSelfDialog()//For the non-input related code.
else if(istype(C, /obj/item/device/paicard) && !src.pai)
- if(!user.drop_item())
+ if(!user.unEquip(C))
return
C.loc = src
pai = C
@@ -963,10 +968,14 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(O)
user << "There is already a pen in \the [src]! "
else
- if(!user.drop_item())
+ if(!user.unEquip(C))
return
C.loc = src
user << "You slide \the [C] into \the [src]. "
+ else if(istype(C, /obj/item/weapon/photo))
+ var/obj/item/weapon/photo/P = C
+ photo = P.img
+ user << "You scan \the [C]. "
return
/obj/item/device/pda/attack(mob/living/carbon/C, mob/living/user as mob)
@@ -1032,7 +1041,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
note = replacetext(note, "", "\[*\]")
note = replacetext(note, "", "\[list\]")
note = replacetext(note, " ", "\[/list\]")
- note = strip_html_properly(note)
+ note = html_encode(note)
notescanned = 1
user << "Paper scanned. Saved to PDA's notekeeper. " //concept of scanning paper copyright brainoblivion 2009
@@ -1104,6 +1113,12 @@ var/global/list/obj/item/device/pda/PDAs = list()
return
var/selected = plist[c]
+
+ if(aicamera.aipictures.len>0)
+ var/add_photo = input(user,"Do you want to attach a photo?","Photo","No") as null|anything in list("Yes","No")
+ if(add_photo=="Yes")
+ var/datum/picture/Pic = aicamera.selectpicture(aicamera)
+ src.aiPDA.photo = Pic.fields["img"]
src.aiPDA.create_message(src, selected)
@@ -1186,7 +1201,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
//ntrc handler proc
/obj/item/device/pda/proc/msg_chat(channel as text, sender as text, message as text)
- var/msg = "[strip_html_properly(sender)] | [strip_html_properly(message)] "
+ var/msg = "[html_encode(sender)] | [html_encode(message)] "
if(!channel)
for(var/C in ntrclog)
ntrclog[C] = msg + ntrclog[C]
diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm
index 54996ca39bc..64196a74bd4 100644
--- a/code/game/objects/items/devices/PDA/cart.dm
+++ b/code/game/objects/items/devices/PDA/cart.dm
@@ -331,7 +331,7 @@ Code:
var/count = 0
for(var/obj/machinery/computer/monitor/pMon in powermonitors)
count++
- menu += " [pMon] "
+ menu += "[pMon] "
menu += ""
diff --git a/code/game/objects/items/devices/PDA/chatroom.dm b/code/game/objects/items/devices/PDA/chatroom.dm
index 1cc8d642cd3..a46b4def36f 100644
--- a/code/game/objects/items/devices/PDA/chatroom.dm
+++ b/code/game/objects/items/devices/PDA/chatroom.dm
@@ -66,7 +66,7 @@ var/list/chatchannels = list(default_ntrc_chatroom.name = default_ntrc_chatroom)
/datum/chatroom/proc/send_message(client,nick,message) //standard message
if(!message)
return 0
- logs.Insert(1,"[strip_html_properly(nick)]> [strip_html_properly(message)]")
+ logs.Insert(1,"[html_encode(nick)]> [html_encode(message)]")
log_chat("[usr]/([usr.ckey]) as [nick] sent to [name]: [message]")
events.fireEvent("msg_chat",name,nick,message)
return 1
diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm
index 40a78956230..6487e340422 100644
--- a/code/game/objects/items/devices/aicard.dm
+++ b/code/game/objects/items/devices/aicard.dm
@@ -65,7 +65,7 @@
dat += " "
dat += {"[A.radio_enabled ? "Disable" : "Enable"] Subspace Radio "}
dat += " "
- dat += {" Close "}
+ dat += {"Close "}
user << browse(dat, "window=aicard")
onclose(user, "aicard")
return
diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm
index 862fc2a89b8..bca8126ad81 100644
--- a/code/game/objects/items/devices/multitool.dm
+++ b/code/game/objects/items/devices/multitool.dm
@@ -30,23 +30,24 @@
..()
SSobj.processing += src
-
/obj/item/device/multitool/ai_detect/Destroy()
SSobj.processing -= src
..()
/obj/item/device/multitool/ai_detect/process()
-
if(track_delay > world.time)
return
var/found_eye = 0
var/turf/our_turf = get_turf(src)
- if(cameranet.chunkGenerated(our_turf.x, our_turf.y, our_turf.z))
+ for(var/mob/living/silicon/ai/AI in ai_list)
+ if(AI.cameraFollow == src)
+ found_eye = 1
+ break
+ if(!found_eye && cameranet.chunkGenerated(our_turf.x, our_turf.y, our_turf.z))
var/datum/camerachunk/chunk = cameranet.getCameraChunk(our_turf.x, our_turf.y, our_turf.z)
-
if(chunk)
if(chunk.seenby.len)
for(var/mob/camera/aiEye/A in chunk.seenby)
@@ -62,4 +63,3 @@
track_delay = world.time + 10 // 1 second
return
-
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index c3c6a846aea..23bc0cbbc42 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -80,10 +80,10 @@ MASS SPECTROMETER
/obj/item/device/healthanalyzer/attack_self(mob/user)
if(!scanchems)
- user << "You switch the health analyzer to scan chemical contents. "
+ user << "You switch the health analyzer to scan chemical contents. "
scanchems = 1
else
- user << "You switch the health analyzer to check physical health. "
+ user << "You switch the health analyzer to check physical health. "
scanchems = 0
return
/obj/item/device/healthanalyzer/attack(mob/living/M as mob, mob/living/carbon/human/user as mob)
@@ -198,9 +198,9 @@ MASS SPECTROMETER
if(H.reagents.reagent_list.len)
user << "Subject contains the following reagents: "
for(var/datum/reagent/R in H.reagents.reagent_list)
- user << "[R.volume] units of [R.name][R.overdosed == 1 ? " - OVERDOSING " : ". "]"
+ user << "[R.volume] units of [R.name][R.overdosed == 1 ? " - OVERDOSING " : "."]"
else
- user << "Subject contains no reagents. "
+ user << "Subject contains no reagents. "
if(H.reagents.addiction_list.len)
user << "Subject is addicted to the following reagents: "
for(var/datum/reagent/R in H.reagents.addiction_list)
diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm
index 2a8ef3cae0b..fd5cb821462 100644
--- a/code/game/objects/items/devices/taperecorder.dm
+++ b/code/game/objects/items/devices/taperecorder.dm
@@ -100,7 +100,7 @@
/obj/item/device/taperecorder/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans)
if(mytape && recording)
mytape.timestamp += mytape.used_capacity
- mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] [strip_html_properly(message)]"
+ mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] [html_encode(message)]"
/obj/item/device/taperecorder/verb/record()
set name = "Start Recording"
diff --git a/code/game/objects/items/holotape.dm b/code/game/objects/items/holotape.dm
index bd10a107cad..68070972d6e 100644
--- a/code/game/objects/items/holotape.dm
+++ b/code/game/objects/items/holotape.dm
@@ -153,6 +153,8 @@
charging = 0
/obj/item/holotape/Bumped(var/mob/M)
+ if(!ismob(M))
+ return
if(iscarbon(M))
var/mob/living/carbon/C = M
if(C.m_intent == "walk")
@@ -227,11 +229,11 @@
/obj/item/holotape/proc/breaktape()
var/dir[2]
- var/icon_dir = src.icon_state
- if(icon_dir == "[src.icon_base]_h")
+ var/icon_dir = icon_state
+ if(icon_dir == "[icon_base]_h")
dir[1] = EAST
dir[2] = WEST
- if(icon_dir == "[src.icon_base]_v")
+ if(icon_dir == "[icon_base]_v")
dir[1] = NORTH
dir[2] = SOUTH
diff --git a/code/game/objects/items/latexballoon.dm b/code/game/objects/items/latexballoon.dm
index 6c2c7849723..3c6bdb3b5b4 100644
--- a/code/game/objects/items/latexballoon.dm
+++ b/code/game/objects/items/latexballoon.dm
@@ -18,7 +18,7 @@
item_state = "latexballon"
user.update_inv_r_hand()
user.update_inv_l_hand()
- user << " You blow up [src] with [tank]. "
+ user << "You blow up [src] with [tank]. "
air_contents = tank.remove_air_volume(3)
/obj/item/latexballon/proc/burst()
diff --git a/code/game/objects/items/stacks/sheets/sheets.dm b/code/game/objects/items/stacks/sheets/sheets.dm
index 34522d2ec59..35d3ae089ce 100644
--- a/code/game/objects/items/stacks/sheets/sheets.dm
+++ b/code/game/objects/items/stacks/sheets/sheets.dm
@@ -8,18 +8,4 @@
throw_range = 3
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed")
var/perunit = MINERAL_MATERIAL_AMOUNT
- var/sheettype = null //this is used for girders in the creation of walls/false walls
-
-
-// Since the sheetsnatcher was consolidated into weapon/storage/bag we now use
-// item/attackby() properly, making this unnecessary
-
-/*/obj/item/stack/sheet/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if (istype(W, /obj/item/weapon/storage/bag/sheetsnatcher))
- var/obj/item/weapon/storage/bag/sheetsnatcher/S = W
- if(!S.mode)
- S.add(src,user)
- else
- for (var/obj/item/stack/sheet/stack in locate(src.x,src.y,src.z))
- S.add(stack,user)
- ..()*/
\ No newline at end of file
+ var/sheettype = null //this is used for girders in the creation of walls/false walls
\ No newline at end of file
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 00d1e1d32e7..ea9be2f7239 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -168,7 +168,7 @@
src.bullets--
user.visible_message("[user] fires [src] at [target]! ", \
"You fire [src] at [target]! ", \
- " You hear a gunshot! ")
+ "You hear a gunshot! ")
/obj/item/toy/ammo/gun
name = "capgun ammo"
@@ -533,7 +533,7 @@
s.set_up(3, 1, src)
s.start()
new /obj/effect/decal/cleanable/ash(src.loc)
- src.visible_message(" The [src.name] explodes! ","You hear a snap! ")
+ src.visible_message("The [src.name] explodes! ","You hear a snap! ")
playsound(src, 'sound/effects/snap.ogg', 50, 1)
qdel(src)
diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm
index deef2e3e927..ff828898c6a 100644
--- a/code/game/objects/items/weapons/AI_modules.dm
+++ b/code/game/objects/items/weapons/AI_modules.dm
@@ -239,11 +239,13 @@ AI MODULES
/obj/item/weapon/aiModule/reset/purge/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
..()
target.clear_inherent_laws()
+ target.clear_zeroth_law(0)
/******************* Full Core Boards *******************/
/obj/item/weapon/aiModule/core/full/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender) //These boards replace inherent laws.
target.clear_inherent_laws()
+ target.clear_zeroth_law(0)
..()
/******************** Asimov ********************/
diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm
index 07ea6047cde..59301721989 100644
--- a/code/game/objects/items/weapons/RCD.dm
+++ b/code/game/objects/items/weapons/RCD.dm
@@ -210,7 +210,7 @@ RCD
if(3)
if(istype(A, /turf/simulated/wall))
- var/turf/simulated/wall/W
+ var/turf/simulated/wall/W = A
if(istype(W, /turf/simulated/wall/r_wall) && !canRwall)
return 0
if(checkResource(5, user))
diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index 886ce709f86..81ac92e29f0 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -185,8 +185,5 @@
/obj/item/weapon/melee/energy/blade/dropped()
qdel(src)
-/obj/item/weapon/melee/energy/blade/proc/throw()
- qdel(src)
-
/obj/item/weapon/melee/energy/blade/attack_self(mob/user)
return
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index 92ebff9c716..7519804b005 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -335,3 +335,17 @@
..()
+/*
+ * Chemistry bag
+ */
+
+/obj/item/weapon/storage/bag/chemistry
+ name = "chemistry bag"
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bag"
+ desc = "A bag for storing pills, patches, and bottles."
+ storage_slots = 50
+ max_combined_w_class = 200
+ w_class = 1
+ preposition = "in"
+ can_hold = list(/obj/item/weapon/reagent_containers/pill, /obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/reagent_containers/glass/bottle)
diff --git a/code/game/objects/items/weapons/storage/book.dm b/code/game/objects/items/weapons/storage/book.dm
index 9a71db5ab8d..1efe547141c 100644
--- a/code/game/objects/items/weapons/storage/book.dm
+++ b/code/game/objects/items/weapons/storage/book.dm
@@ -68,11 +68,9 @@ var/global/list/bibleitemstates = list("bible", "koran", "scrapbook", "bible", "
/obj/item/weapon/storage/book/bible/proc/setupbiblespecifics(var/obj/item/weapon/storage/book/bible/B, var/mob/living/carbon/human/H)
switch(B.icon_state)
if("honk1","honk2")
- new /obj/item/weapon/grown/bananapeel(B)
- new /obj/item/weapon/grown/bananapeel(B)
-
- if(B.icon_state == "honk1")
- H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(H), slot_wear_mask)
+ new /obj/item/weapon/bikehorn(B)
+ H.dna.add_mutation(CLOWNMUT)
+ H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(H), slot_wear_mask)
if("bible")
for(var/area/chapel/main/A in world)
@@ -204,11 +202,11 @@ var/global/list/bibleitemstates = list("bible", "koran", "scrapbook", "bible", "
A.reagents.del_reagent("water")
A.reagents.add_reagent("holywater",water2holy)
if(A.reagents && A.reagents.has_reagent("unholywater")) //yeah yeah, copy pasted code - sue me
- user << " You purify [A]. "
+ user << "You purify [A]. "
var/unholy2clean = A.reagents.get_reagent_amount("unholywater")
A.reagents.del_reagent("unholywater")
A.reagents.add_reagent("holywater",unholy2clean)
/obj/item/weapon/storage/book/bible/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
playsound(src.loc, "rustle", 50, 1, -5)
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 58c98b443d8..71ab242d878 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -128,8 +128,10 @@
/obj/item/weapon/twohanded/required/attack_hand(mob/user)//Can't even pick it up without both hands empty
var/obj/item/weapon/twohanded/required/H = user.get_inactive_hand()
+ if(get_dist(src,user) > 1)
+ return 0
if(H != null)
- user.visible_message("[src.name] is too cumbersome to carry in one hand! ")
+ user << "[src.name] is too cumbersome to carry in one hand! "
return
var/obj/item/weapon/twohanded/offhand/O = new(user)
user.put_in_inactive_hand(O)
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index 9ac736d1a28..bfda5735a2b 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -16,7 +16,7 @@
/obj/item/weapon/banhammer/attack(mob/M, mob/user)
M << " You have been banned FOR NO REISIN by [user] "
- user << " You have BANNED [M] "
+ user << "You have BANNED [M] "
playsound(loc, 'sound/effects/adminhelp.ogg', 15) //keep it at 15% volume so people don't jump out of their skin too much
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index bae96ce7ef0..dde6cba1c31 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -1,6 +1,5 @@
/obj
languages = HUMAN
- //var/datum/module/mod //not used
var/crit_fail = 0
var/unacidable = 0 //universal "unacidabliness" var, here so you can use it in any obj.
animate_movement = 2
diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/objects/structures/ai_core.dm
similarity index 96%
rename from code/game/machinery/computer/ai_core.dm
rename to code/game/objects/structures/ai_core.dm
index 801e2f82332..907b4db38e1 100644
--- a/code/game/machinery/computer/ai_core.dm
+++ b/code/game/objects/structures/ai_core.dm
@@ -109,12 +109,14 @@
if(istype(P, /obj/item/weapon/aiModule/core/full)) //Allows any full core boards to be applied to AI cores.
var/obj/item/weapon/aiModule/core/M = P
laws.clear_inherent_laws()
+ laws.clear_zeroth_law(0)
for(var/templaw in M.laws)
laws.add_inherent_law(templaw)
usr << "Law module applied. "
if(istype(P, /obj/item/weapon/aiModule/reset/purge))
laws.clear_inherent_laws()
+ laws.clear_zeroth_law(0)
usr << "Laws cleared applied. "
diff --git a/code/game/objects/structures/barsigns.dm b/code/game/objects/structures/barsigns.dm
index a63de87b926..aa8e229a0bb 100644
--- a/code/game/objects/structures/barsigns.dm
+++ b/code/game/objects/structures/barsigns.dm
@@ -50,7 +50,7 @@
/obj/structure/sign/barsign/attack_hand(mob/user as mob)
if (!src.allowed(user))
- user << "Access denied. "
+ user << "Access denied. "
return
if (broken)
user << "The controls seem unresponsive. "
@@ -62,7 +62,7 @@
/obj/structure/sign/barsign/attackby(var/obj/item/I, var/mob/user)
if(!allowed(user))
- user << "Access denied. "
+ user << "Access denied. "
return
if( istype(I, /obj/item/weapon/screwdriver))
if(!panel_open)
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 85f3f7582bb..43b887493ca 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -68,7 +68,7 @@
return (!density)
/obj/structure/closet/proc/can_open()
- if(src.welded || src.locked)
+ if(welded || locked)
return 0
return 1
@@ -81,32 +81,32 @@
/obj/structure/closet/proc/dump_contents()
for(var/obj/O in src)
- O.loc = src.loc
+ O.loc = loc
for(var/mob/M in src)
- M.loc = src.loc
+ M.loc = loc
if(M.client)
M.client.eye = M.client.mob
M.client.perspective = MOB_PERSPECTIVE
/obj/structure/closet/proc/take_contents()
- for(var/atom/movable/AM in src.loc)
+ for(var/atom/movable/AM in loc)
if(insert(AM) == -1) // limit reached
break
/obj/structure/closet/proc/open()
- if(src.opened)
+ if(opened)
return 0
- if(!src.can_open())
+ if(!can_open())
return 0
- src.dump_contents()
+ dump_contents()
- src.opened = 1
+ opened = 1
if(istype(src, /obj/structure/closet/body_bag))
- playsound(src.loc, 'sound/items/zip.ogg', 15, 1, -3)
+ playsound(loc, 'sound/items/zip.ogg', 15, 1, -3)
else
- playsound(src.loc, 'sound/machines/click.ogg', 15, 1, -3)
+ playsound(loc, 'sound/machines/click.ogg', 15, 1, -3)
density = 0
update_icon()
return 1
@@ -139,25 +139,25 @@
return 1
/obj/structure/closet/proc/close()
- if(!src.opened)
+ if(!opened)
return 0
- if(!src.can_close())
+ if(!can_close())
return 0
take_contents()
- src.opened = 0
+ opened = 0
if(istype(src, /obj/structure/closet/body_bag))
- playsound(src.loc, 'sound/items/zip.ogg', 15, 1, -3)
+ playsound(loc, 'sound/items/zip.ogg', 15, 1, -3)
else
- playsound(src.loc, 'sound/machines/click.ogg', 15, 1, -3)
+ playsound(loc, 'sound/machines/click.ogg', 15, 1, -3)
density = 1
update_icon()
return 1
/obj/structure/closet/proc/toggle()
- if(src.opened)
- return src.close()
- return src.open()
+ if(opened)
+ return close()
+ return open()
/obj/structure/closet/ex_act(severity, target)
contents_explosion(severity, target)
@@ -192,9 +192,9 @@
return
if(opened)
if(istype(W, /obj/item/weapon/grab))
- if(src.large)
+ if(large)
var/obj/item/weapon/grab/G = W
- src.MouseDrop_T(G.affecting, user) //act like they were dragged onto the closet
+ MouseDrop_T(G.affecting, user) //act like they were dragged onto the closet
user.drop_item()
else
user << "The locker is too small to stuff [W] into! "
@@ -210,7 +210,7 @@
if( !opened || !istype(src, /obj/structure/closet) || !user || !WT || !WT.isOn() || !user.loc )
return
playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
- new /obj/item/stack/sheet/metal(src.loc)
+ new /obj/item/stack/sheet/metal(loc)
visible_message("[user] has cut \the [src] apart with \the [WT].", "You hear welding. ")
qdel(src)
return
@@ -239,10 +239,10 @@
user << "The locker appears to be broken. "
return
if(!place(user, W) && !isnull(W))
- src.attack_hand(user)
+ attack_hand(user)
/obj/structure/closet/proc/place(var/mob/user, var/obj/item/I)
- if(!src.opened && secure)
+ if(!opened && secure)
togglelock(user)
return 1
return 0
@@ -258,21 +258,21 @@
return 0
if(!istype(user.loc, /turf)) // are you in a container/closet/pod/etc? Will also check for null loc
return 0
- if(needs_opened && !src.opened)
+ if(needs_opened && !opened)
return 0
if(istype(O, /obj/structure/closet))
return 0
if(move_them)
- step_towards(O, src.loc)
+ step_towards(O, loc)
if(show_message && user != O)
user.show_viewers("[user] stuffs [O] into [src]! ")
- src.add_fingerprint(user)
+ add_fingerprint(user)
return 1
/obj/structure/closet/relaymove(mob/user as mob)
- if(user.stat || !isturf(src.loc))
+ if(user.stat || !isturf(loc))
return
- if(!src.open())
+ if(!open())
user << "It won't budge! "
if(world.time > lastbang+5)
lastbang = world.time
@@ -281,19 +281,20 @@
/obj/structure/closet/attack_paw(mob/user as mob)
- return src.attack_hand(user)
+ return attack_hand(user)
/obj/structure/closet/attack_hand(mob/user as mob)
- src.add_fingerprint(user)
+ add_fingerprint(user)
if(user.lying && get_dist(src, user) > 0)
return
- if(!src.toggle())
- return src.attackby(null, user)
+ if(!toggle())
+ togglelock(user)
+ return
// tk grab then use on self
/obj/structure/closet/attack_self_tk(mob/user as mob)
- return src.attack_hand(user)
+ return attack_hand(user)
/obj/structure/closet/verb/verb_toggleopen()
set src in oview(1)
@@ -304,7 +305,7 @@
return
if(iscarbon(usr) || issilicon(usr))
- src.attack_hand(usr)
+ attack_hand(usr)
else
usr << "This mob type can't use this verb. "
@@ -322,7 +323,7 @@
if(istype(user.loc, /obj/structure/closet/critter) && !welded)
breakout_time = 0.75 //45 seconds if it's an unwelded critter crate
- if( opened || (!welded && !locked && !istype(src.loc, /obj/mecha)) )
+ if( opened || (!welded && !locked && !istype(loc, /obj/mecha)) )
return //Door's open, not locked or welded or inside a mech, no point in resisting.
//okay, so the closet is either welded or locked... resist!!!
@@ -332,7 +333,7 @@
for(var/mob/O in viewers(src))
O << "[src] begins to shake violently! "
if(do_after(user,(breakout_time*60*10))) //minutes * 60seconds * 10deciseconds
- if(!user || user.stat != CONSCIOUS || user.loc != src || opened || (!locked && !welded && !istype(src.loc, /obj/mecha)) )
+ if(!user || user.stat != CONSCIOUS || user.loc != src || opened || (!locked && !welded && !istype(loc, /obj/mecha)) )
return
//we check after a while whether there is a point of resisting anymore and whether the user is capable of resisting
@@ -340,11 +341,11 @@
locked = 0 //applies to critter crates and secure lockers only
broken = 1 //applies to secure lockers only
user.visible_message("[user] successfully broke out of [src]! ", "You successfully break out of [src]! ")
- if(istype( src.loc, /obj/structure/bigDelivery))
- var/obj/structure/bigDelivery/D = src.loc
+ if(istype( loc, /obj/structure/bigDelivery))
+ var/obj/structure/bigDelivery/D = loc
qdel(D)
- else if(istype( src.loc, /obj/mecha))
- src.loc = get_turf(src.loc)
+ else if(istype( loc, /obj/mecha))
+ loc = get_turf(loc)
open()
else
user << "You fail to break out of [src]! "
@@ -354,7 +355,7 @@
if(!user.canUseTopic(user) || broken)
user << "You can't do that right now! "
return
- if(src.opened || !secure || !in_range(src, user))
+ if(opened || !secure || !in_range(src, user))
return
else
togglelock(user)
@@ -364,20 +365,20 @@
O.emp_act(severity)
if(secure && !broken)
if(prob(50/severity))
- src.locked = !src.locked
- src.update_icon()
+ locked = !locked
+ update_icon()
if(prob(20/severity) && !opened)
if(!locked)
open()
else
- src.req_access = list()
- src.req_access += pick(get_all_accesses())
+ req_access = list()
+ req_access += pick(get_all_accesses())
..()
/obj/structure/closet/proc/togglelock(mob/user as mob)
if(secure)
- if(src.allowed(user))
- src.locked = !src.locked
+ if(allowed(user))
+ locked = !locked
add_fingerprint(user)
for(var/mob/O in viewers(user, 3))
if((O.client && !( O.eye_blind )))
diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
index 41786c4b092..bf94d93a874 100644
--- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
@@ -23,11 +23,11 @@
if (isrobot(user) || src.locked)
if(istype(O, /obj/item/device/multitool))
- user << " Resetting circuitry... "
+ user << "Resetting circuitry... "
playsound(user, 'sound/machines/lockreset.ogg', 50, 1)
if(do_after(user, 20))
src.locked = 0
- user << " You disable the locking modules. "
+ user << "You disable the locking modules. "
update_icon()
return
else if(istype(O, /obj/item/weapon))
@@ -43,7 +43,7 @@
user.do_attack_animation(src)
playsound(user, 'sound/effects/Glasshit.ogg', 100, 1) //We don't want this playing every time
if(W.force < 15)
- user << " The cabinet's protective glass glances off the hit. "
+ user << "The cabinet's protective glass glances off the hit. "
else
src.hitstaken++
if(src.hitstaken == 4)
@@ -56,12 +56,12 @@
if (istype(O, /obj/item/weapon/twohanded/fireaxe) && src.localopened)
if(!fireaxe)
if(O:wielded)
- user << " Unwield the axe first. "
+ user << "Unwield the axe first. "
return
fireaxe = O
user.drop_item()
src.contents += O
- user << " You place the fire axe back in the [src.name]. "
+ user << "You place the fire axe back in the [src.name]. "
update_icon()
else
if(src.smashed)
@@ -84,11 +84,11 @@
spawn(10) update_icon()
return
else
- user << " Resetting circuitry... "
+ user << "Resetting circuitry... "
playsound(user, 'sound/machines/lockenable.ogg', 50, 1)
if(do_after(user, 20))
src.locked = 1
- user << " You re-enable the locking modules. "
+ user << "You re-enable the locking modules. "
return
else
localopened = !localopened
@@ -144,13 +144,13 @@
hasaxe = 1
if(src.locked)
- user <<" The cabinet won't budge! "
+ user <<"The cabinet won't budge! "
return
if(localopened)
if(fireaxe)
user.put_in_hands(fireaxe)
fireaxe = null
- user << " You take the fire axe from the [name]. "
+ user << "You take the fire axe from the [name]. "
src.add_fingerprint(user)
update_icon()
else
@@ -177,7 +177,7 @@
/obj/structure/closet/fireaxecabinet/attack_tk(mob/user as mob)
if(localopened && fireaxe)
fireaxe.loc = loc
- user << " You telekinetically remove the fire axe. "
+ user << "You telekinetically remove the fire axe. "
fireaxe = null
update_icon()
return
@@ -221,14 +221,14 @@
/obj/structure/closet/fireaxecabinet/attack_ai(mob/user as mob)
if(src.smashed)
- user << " The security of the cabinet is compromised. "
+ user << "The security of the cabinet is compromised. "
return
else
locked = !locked
if(locked)
- user << " Cabinet locked. "
+ user << "Cabinet locked. "
else
- user << " Cabinet unlocked. "
+ user << "Cabinet unlocked. "
return
/obj/structure/closet/fireaxecabinet/update_icon() //Template: fireaxe[has fireaxe][is opened][hits taken][is smashed]. If you want the opening or closing animations, add "opening" or "closing" right after the numbers
diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
index a4510966df7..37433c2423c 100644
--- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
@@ -311,6 +311,8 @@
new /obj/item/weapon/storage/backpack/chemistry(src)
new /obj/item/weapon/storage/backpack/satchel_chem(src)
new /obj/item/weapon/storage/backpack/satchel_chem(src)
+ new /obj/item/weapon/storage/bag/chemistry(src)
+ new /obj/item/weapon/storage/bag/chemistry(src)
return
diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm
index dcffa3e0891..a0fa16da823 100644
--- a/code/game/objects/structures/door_assembly.dm
+++ b/code/game/objects/structures/door_assembly.dm
@@ -436,7 +436,7 @@
if(mineral && mineral != "glass")
mineral = null //I know this is stupid, but until we change glass to a boolean it's how this code works.
- user << " You change the paintjob on the airlock assembly. "
+ user << "You change the paintjob on the airlock assembly. "
else if(istype(W, /obj/item/weapon/weldingtool) && !anchored )
var/obj/item/weapon/weldingtool/WT = W
@@ -448,7 +448,7 @@
if(do_after(user, 40))
if( !WT.isOn() )
return
- user << " You disassemble the airlock assembly. "
+ user << "You disassemble the airlock assembly. "
new /obj/item/stack/sheet/metal(get_turf(src), 4)
if (mineral)
if (mineral == "glass")
@@ -480,7 +480,7 @@
if(do_after(user, 40))
if( src.anchored )
return
- user << " You secure the airlock assembly. "
+ user << "You secure the airlock assembly. "
src.name = "secured airlock assembly"
src.anchored = 1
else
@@ -494,7 +494,7 @@
if(do_after(user, 40))
if( !src.anchored )
return
- user << " You unsecure the airlock assembly. "
+ user << "You unsecure the airlock assembly. "
src.name = "airlock assembly"
src.anchored = 0
@@ -520,7 +520,7 @@
if(do_after(user, 40))
if( src.state != 1 )
return
- user << " You cut the wires from the airlock assembly. "
+ user << "You cut the wires from the airlock assembly. "
new/obj/item/stack/cable_coil(get_turf(user), 1)
src.state = 0
src.name = "secured airlock assembly"
@@ -535,7 +535,7 @@
user.drop_item()
W.loc = src
- user << " You install the airlock electronics. "
+ user << "You install the airlock electronics. "
src.state = 2
src.name = "near finished airlock assembly"
src.electronics = W
@@ -549,7 +549,7 @@
if(do_after(user, 40))
if( src.state != 2 )
return
- user << " You remove the airlock electronics. "
+ user << "You remove the airlock electronics. "
src.state = 1
src.name = "wired airlock assembly"
var/obj/item/weapon/airlock_electronics/ae
@@ -614,7 +614,7 @@
if(do_after(user, 40))
if(src.loc && state == 2)
- user << " You finish the airlock. "
+ user << "You finish the airlock. "
var/obj/machinery/door/airlock/door
if(mineral == "glass")
door = new src.glass_type( src.loc )
diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm
index 6eb5f7b9317..50597091b3b 100644
--- a/code/game/objects/structures/mirror.dm
+++ b/code/game/objects/structures/mirror.dm
@@ -106,7 +106,22 @@
name = "magic mirror"
desc = "Turn and face the strange... face."
icon_state = "magic_mirror"
+ var/list/races_blacklist = list("skeleton")
+ var/list/choosable_races = list()
+/obj/structure/mirror/magic/New()
+ if(!choosable_races.len)
+ for(var/speciestype in typesof(/datum/species) - /datum/species)
+ var/datum/species/S = new speciestype()
+ if(!(S.id in races_blacklist))
+ choosable_races += S.id
+ ..()
+
+/obj/structure/mirror/magic/badmin/New()
+ for(var/speciestype in typesof(/datum/species) - /datum/species)
+ var/datum/species/S = new speciestype()
+ choosable_races += S.id
+ ..()
/obj/structure/mirror/magic/attack_hand(mob/user as mob)
if(!ishuman(user))
@@ -130,7 +145,7 @@
if("race")
var/newrace
- var/racechoice = input(H, "What are we again?", "Race change") as null|anything in species_list
+ var/racechoice = input(H, "What are we again?", "Race change") as null|anything in choosable_races
newrace = species_list[racechoice]
if(!newrace || !H.dna)
@@ -150,7 +165,7 @@
var/temp_hsv = RGBtoHSV(new_mutantcolor)
if(ReadHSV(temp_hsv)[3] >= ReadHSV("#7F7F7F")[3]) // mutantcolors must be bright
- H.dna.mutant_color = sanitize_hexcolor(new_mutantcolor)
+ H.dna.features["mcolor"] = sanitize_hexcolor(new_mutantcolor)
else
H << "Invalid color. Your color is not bright enough. "
diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm
index 9a2a5da2cee..9b120060ced 100644
--- a/code/game/objects/structures/musician.dm
+++ b/code/game/objects/structures/musician.dm
@@ -348,20 +348,20 @@
if (istype(O, /obj/item/weapon/wrench))
if (!anchored && !isinspace())
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- user << " You begin to tighten \the [src] to the floor... "
+ user << "You begin to tighten \the [src] to the floor... "
if (do_after(user, 20))
user.visible_message( \
"[user] tightens \the [src]'s casters.", \
- " You tighten \the [src]'s casters. Now it can be played again. ", \
+ "You tighten \the [src]'s casters. Now it can be played again. ", \
"You hear ratchet. ")
anchored = 1
else if(anchored)
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- user << " You begin to loosen \the [src]'s casters... "
+ user << "You begin to loosen \the [src]'s casters... "
if (do_after(user, 40))
user.visible_message( \
"[user] loosens \the [src]'s casters.", \
- " You loosen \the [src]. Now it can be pulled somewhere else. ", \
+ "You loosen \the [src]. Now it can be pulled somewhere else. ", \
"You hear ratchet. ")
anchored = 0
else
diff --git a/code/game/objects/structures/showcase.dm b/code/game/objects/structures/showcase.dm
index 3a5be7f1b01..ca3fc4ba68f 100644
--- a/code/game/objects/structures/showcase.dm
+++ b/code/game/objects/structures/showcase.dm
@@ -11,10 +11,18 @@
name = "\improper Centcom identification console"
desc = "You can use this to change ID's."
icon = 'icons/obj/computer.dmi'
- icon_state = "id"
+ icon_state = "computer"
+
+/obj/structure/showcase/fakeid/New()
+ overlays += "id"
+ overlays += "id_key"
/obj/structure/showcase/fakesec
name = "\improper Centcom security records"
desc = "Used to view and edit personnel's security records"
icon = 'icons/obj/computer.dmi'
- icon_state = "security"
\ No newline at end of file
+ icon_state = "computer"
+
+/obj/structure/showcase/fakesec/New()
+ overlays += "security"
+ overlays += "security_key"
\ No newline at end of file
diff --git a/code/game/objects/structures/table_frames.dm b/code/game/objects/structures/table_frames.dm
index 4e44968971b..0b1f15d41b3 100644
--- a/code/game/objects/structures/table_frames.dm
+++ b/code/game/objects/structures/table_frames.dm
@@ -32,28 +32,37 @@
return
if(istype(I, /obj/item/stack/sheet/plasteel))
var/obj/item/stack/sheet/plasteel/P = I
+ if(P.get_amount() < 1)
+ user << "You need one plasteel sheet to do this! "
+ return
user << "You start adding [P] to [src]... "
if(do_after(user, 50))
+ P.use(1)
new /obj/structure/table/reinforced(src.loc)
qdel(src)
- P.use(1)
- return
+ return
if(istype(I, /obj/item/stack/sheet/metal))
var/obj/item/stack/sheet/metal/M = I
+ if(M.get_amount() < 1)
+ user << "You need one metal sheet to do this! "
+ return
user << "You start adding [M] to [src]... "
if(do_after(user, 20))
+ M.use(1)
new /obj/structure/table(src.loc)
qdel(src)
- M.use(1)
- return
+ return
if(istype(I, /obj/item/stack/sheet/glass))
var/obj/item/stack/sheet/glass/G = I
+ if(G.get_amount() < 1)
+ user << "You need one glass sheet to do this! "
+ return
user << "You start adding [G] to [src]... "
if(do_after(user, 20))
+ G.use(1)
new /obj/structure/table/glass(src.loc)
qdel(src)
- G.use(1)
- return
+ return
/*
* Wooden Frames
@@ -71,17 +80,23 @@
..()
if(istype(I, /obj/item/stack/sheet/mineral/wood))
var/obj/item/stack/sheet/mineral/wood/W = I
+ if(W.get_amount() < 1)
+ user << "You need one wood sheet to do this! "
+ return
user << "You start adding [W] to [src]... "
if(do_after(user, 20))
+ W.use(1)
new /obj/structure/table/wood(src.loc)
qdel(src)
- W.use(1)
- return
+ return
if(istype(I, /obj/item/stack/tile/carpet))
var/obj/item/stack/tile/carpet/C = I
+ if(C.get_amount() < 1)
+ user << "You need one carpet sheet to do this! "
+ return
user << "You start adding [C] to [src]... "
if(do_after(user, 20))
+ C.use(1)
new /obj/structure/table/wood/poker(src.loc)
qdel(src)
- C.use(1)
- return
\ No newline at end of file
+ return
\ No newline at end of file
diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm
index b3a52450234..8262201bf28 100644
--- a/code/game/objects/structures/windoor_assembly.dm
+++ b/code/game/objects/structures/windoor_assembly.dm
@@ -29,7 +29,7 @@
/obj/structure/windoor_assembly/New(dir=NORTH)
..()
- src.ini_dir = src.dir
+ ini_dir = dir
air_update_turf(1)
/obj/structure/windoor_assembly/Destroy()
@@ -77,7 +77,7 @@
var/obj/item/weapon/weldingtool/WT = W
if (WT.remove_fuel(0,user))
user.visible_message("[user] disassembles the windoor assembly.", "You start to disassemble the windoor assembly... ")
- playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
+ playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
if(do_after(user, 40))
if(!src || !WT.isOn()) return
@@ -93,41 +93,41 @@
//Wrenching an unsecure assembly anchors it in place. Step 4 complete
if(istype(W, /obj/item/weapon/wrench) && !anchored)
- for(var/obj/machinery/door/window/WD in src.loc)
- if(WD.dir == src.dir)
+ for(var/obj/machinery/door/window/WD in loc)
+ if(WD.dir == dir)
user << "There is already a windoor in that location! "
return
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
+ playsound(loc, 'sound/items/Ratchet.ogg', 100, 1)
user.visible_message("[user] secures the windoor assembly to the floor.", "You start to secure the windoor assembly to the floor... ")
if(do_after(user, 40))
- if(!src || src.anchored)
+ if(!src || anchored)
return
- for(var/obj/machinery/door/window/WD in src.loc)
- if(WD.dir == src.dir)
+ for(var/obj/machinery/door/window/WD in loc)
+ if(WD.dir == dir)
user << "There is already a windoor in that location! "
return
user << "You secure the windoor assembly. "
- src.anchored = 1
- if(src.secure)
- src.name = "secure anchored windoor assembly"
+ anchored = 1
+ if(secure)
+ name = "secure anchored windoor assembly"
else
- src.name = "anchored windoor assembly"
+ name = "anchored windoor assembly"
//Unwrenching an unsecure assembly un-anchors it. Step 4 undone
else if(istype(W, /obj/item/weapon/wrench) && anchored)
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
+ playsound(loc, 'sound/items/Ratchet.ogg', 100, 1)
user.visible_message("[user] unsecures the windoor assembly to the floor.", "You start to unsecure the windoor assembly to the floor... ")
if(do_after(user, 40))
- if(!src || !src.anchored)
+ if(!src || !anchored)
return
user << "You unsecure the windoor assembly. "
- src.anchored = 0
- if(src.secure)
- src.name = "secure windoor assembly"
+ anchored = 0
+ if(secure)
+ name = "secure windoor assembly"
else
- src.name = "windoor assembly"
+ name = "windoor assembly"
//Adding plasteel makes the assembly a secure windoor assembly. Step 2 (optional) complete.
else if(istype(W, /obj/item/stack/sheet/plasteel) && !secure)
@@ -143,27 +143,29 @@
P.use(2)
user << "You reinforce the windoor. "
- src.secure = 1
- if(src.anchored)
- src.name = "secure anchored windoor assembly"
+ secure = 1
+ if(anchored)
+ name = "secure anchored windoor assembly"
else
- src.name = "secure windoor assembly"
+ name = "secure windoor assembly"
//Adding cable to the assembly. Step 5 complete.
else if(istype(W, /obj/item/stack/cable_coil) && anchored)
user.visible_message("[user] wires the windoor assembly.", "You start to wire the windoor assembly... ")
if(do_after(user, 40))
- if(!src || !src.anchored || src.state != "01")
+ if(!src || !anchored || state != "01")
return
var/obj/item/stack/cable_coil/CC = W
- CC.use(1)
+ if(!CC.use(1))
+ user << "You need more cable to do this! "
+ return
user << "You wire the windoor. "
- src.state = "02"
- if(src.secure)
- src.name = "secure wired windoor assembly"
+ state = "02"
+ if(secure)
+ name = "secure wired windoor assembly"
else
- src.name = "wired windoor assembly"
+ name = "wired windoor assembly"
else
..()
@@ -171,61 +173,61 @@
//Removing wire from the assembly. Step 5 undone.
if(istype(W, /obj/item/weapon/wirecutters))
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
+ playsound(loc, 'sound/items/Wirecutter.ogg', 100, 1)
user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly... ")
if(do_after(user, 40))
- if(!src || src.state != "02")
+ if(!src || state != "02")
return
user << "You cut the windoor wires. "
new/obj/item/stack/cable_coil(get_turf(user), 1)
- src.state = "01"
- if(src.secure)
- src.name = "secure anchored windoor assembly"
+ state = "01"
+ if(secure)
+ name = "secure anchored windoor assembly"
else
- src.name = "anchored windoor assembly"
+ name = "anchored windoor assembly"
//Adding airlock electronics for access. Step 6 complete.
else if(istype(W, /obj/item/weapon/airlock_electronics))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1)
user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly... ")
user.drop_item()
W.loc = src
if(do_after(user, 40))
- if(!src || src.electronics)
- W.loc = src.loc
+ if(!src || electronics)
+ W.loc = loc
return
user << "You install the airlock electronics. "
- src.name = "near finished windoor assembly"
- src.electronics = W
+ name = "near finished windoor assembly"
+ electronics = W
else
- W.loc = src.loc
+ W.loc = loc
//Screwdriver to remove airlock electronics. Step 6 undone.
else if(istype(W, /obj/item/weapon/screwdriver))
if(!electronics)
return
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1)
user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to uninstall electronics from the airlock assembly... ")
if(do_after(user, 40))
if(!src || !electronics)
return
user << "You remove the airlock electronics. "
- src.name = "wired windoor assembly"
+ name = "wired windoor assembly"
var/obj/item/weapon/airlock_electronics/ae
ae = electronics
electronics = null
- ae.loc = src.loc
+ ae.loc = loc
else if(istype(W, /obj/item/weapon/pen))
- var/t = stripped_input(user, "Enter the name for the door.", src.name, src.created_name,MAX_NAME_LEN)
+ var/t = stripped_input(user, "Enter the name for the door.", name, created_name,MAX_NAME_LEN)
if(!t)
return
- if(!in_range(src, usr) && src.loc != usr)
+ if(!in_range(src, usr) && loc != usr)
return
created_name = t
return
@@ -234,37 +236,37 @@
//Crowbar to complete the assembly, Step 7 complete.
else if(istype(W, /obj/item/weapon/crowbar))
- if(!src.electronics)
+ if(!electronics)
usr << "The assembly is missing electronics! "
return
usr << browse(null, "window=windoor_access")
- playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
+ playsound(loc, 'sound/items/Crowbar.ogg', 100, 1)
user.visible_message("[user] pries the windoor into the frame.", "You start prying the windoor into the frame... ")
if(do_after(user, 40))
- if(src.loc && src.electronics)
+ if(loc && electronics)
density = 1 //Shouldn't matter but just incase
user << "You finish the windoor. "
if(secure)
- var/obj/machinery/door/window/brigdoor/windoor = new /obj/machinery/door/window/brigdoor(src.loc)
- if(src.facing == "l")
+ var/obj/machinery/door/window/brigdoor/windoor = new /obj/machinery/door/window/brigdoor(loc)
+ if(facing == "l")
windoor.icon_state = "leftsecureopen"
windoor.base_state = "leftsecure"
else
windoor.icon_state = "rightsecureopen"
windoor.base_state = "rightsecure"
- windoor.dir = src.dir
+ windoor.dir = dir
windoor.density = 0
- if(src.electronics.use_one_access)
- windoor.req_one_access = src.electronics.conf_access
+ if(electronics.use_one_access)
+ windoor.req_one_access = electronics.conf_access
else
- windoor.req_access = src.electronics.conf_access
- windoor.electronics = src.electronics
- src.electronics.loc = windoor
+ windoor.req_access = electronics.conf_access
+ windoor.electronics = electronics
+ electronics.loc = windoor
if(created_name)
windoor.name = created_name
qdel(src)
@@ -272,19 +274,19 @@
else
- var/obj/machinery/door/window/windoor = new /obj/machinery/door/window(src.loc)
- if(src.facing == "l")
+ var/obj/machinery/door/window/windoor = new /obj/machinery/door/window(loc)
+ if(facing == "l")
windoor.icon_state = "leftopen"
windoor.base_state = "left"
else
windoor.icon_state = "rightopen"
windoor.base_state = "right"
- windoor.dir = src.dir
+ windoor.dir = dir
windoor.density = 0
- windoor.req_access = src.electronics.conf_access
- windoor.electronics = src.electronics
- src.electronics.loc = windoor
+ windoor.req_access = electronics.conf_access
+ windoor.electronics = electronics
+ electronics.loc = windoor
if(created_name)
windoor.name = created_name
qdel(src)
@@ -305,18 +307,18 @@
set src in oview(1)
if(usr.stat || !usr.canmove || usr.restrained())
return
- if (src.anchored)
+ if (anchored)
usr << "It is fastened to the floor; therefore, you can't rotate it! "
return 0
- //if(src.state != "01")
+ //if(state != "01")
//update_nearby_tiles(need_rebuild=1) //Compel updates before
- src.dir = turn(src.dir, 270)
+ dir = turn(dir, 270)
- //if(src.state != "01")
+ //if(state != "01")
//update_nearby_tiles(need_rebuild=1)
- src.ini_dir = src.dir
+ ini_dir = dir
update_icon()
return
@@ -328,11 +330,11 @@
if(usr.stat || !usr.canmove || usr.restrained())
return
- if(src.facing == "l")
+ if(facing == "l")
usr << "The windoor will now slide to the right. "
- src.facing = "r"
+ facing = "r"
else
- src.facing = "l"
+ facing = "l"
usr << "The windoor will now slide to the left. "
update_icon()
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index f773adc6714..131844894c1 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -235,7 +235,7 @@
else if(istype(I, /obj/item/weapon/wrench) && !anchored)
playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
- user << " You begin to disassemble [src]... "
+ user << "You begin to disassemble [src]... "
if(do_after(user, 40))
if(disassembled)
return //Prevents multiple deconstruction attempts
@@ -256,7 +256,7 @@
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
disassembled = 1
- user << " You successfully disassemble [src]. "
+ user << "You successfully disassemble [src]. "
qdel(src)
else
diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm
index 6e565879c9f..25f2ec88ecb 100644
--- a/code/game/turfs/simulated/floor/plating.dm
+++ b/code/game/turfs/simulated/floor/plating.dm
@@ -105,6 +105,28 @@
ChangeTurf(/turf/simulated/floor/plating)
return
+
+/turf/simulated/floor/engine/ex_act(severity,target)
+ switch(severity)
+ if(1.0)
+ if(prob(80))
+ ReplaceWithLattice()
+ else if(prob(50))
+ qdel(src)
+ else
+ make_plating(1)
+ if(2.0)
+ if(prob(50))
+ make_plating(1)
+
+
+/turf/simulated/floor/engine/cult
+ name = "engraved floor"
+ icon_state = "cult"
+
+/turf/simulated/floor/engine/cult/narsie_act()
+ return
+
/turf/simulated/floor/engine/n20/New()
..()
var/datum/gas_mixture/adding = new
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index af5a84bdc3c..2829c18e6c9 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -6,6 +6,7 @@
opacity = 1
density = 1
blocks_air = 1
+ explosion_block = 1
thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT
heat_capacity = 312500 //a little over 5 cm thick , 312500 for 1 m by 2.5 m by 0.25 m plasteel wall
diff --git a/code/game/turfs/simulated/walls_mineral.dm b/code/game/turfs/simulated/walls_mineral.dm
index c61a20cb100..fb73c1f61c6 100644
--- a/code/game/turfs/simulated/walls_mineral.dm
+++ b/code/game/turfs/simulated/walls_mineral.dm
@@ -17,6 +17,7 @@
mineral = "gold"
//var/electro = 1
//var/shocked = null
+ explosion_block = 0 //gold is a soft metal you dingus.
/turf/simulated/wall/mineral/silver
name = "silver wall"
@@ -34,6 +35,7 @@
walltype = "diamond"
mineral = "diamond"
slicing_duration = 200 //diamond wall takes twice as much time to slice
+ explosion_block = 3
/turf/simulated/wall/mineral/diamond/thermitemelt(mob/user as mob)
return
@@ -51,6 +53,7 @@
icon_state = "sandstone0"
walltype = "sandstone"
mineral = "sandstone"
+ explosion_block = 0
/turf/simulated/wall/mineral/uranium
name = "uranium wall"
@@ -143,3 +146,4 @@
walltype = "wood"
mineral = "wood"
hardness = 70
+ explosion_block = 0
\ No newline at end of file
diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm
index aec87adc748..00f6f38825f 100644
--- a/code/game/turfs/simulated/walls_reinforced.dm
+++ b/code/game/turfs/simulated/walls_reinforced.dm
@@ -10,6 +10,7 @@
var/d_state = 0
hardness = 10
sheet_type = /obj/item/stack/sheet/plasteel
+ explosion_block = 2
/turf/simulated/wall/r_wall/break_wall()
builtin_sheet.loc = src
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 986a46fab05..f068de3737a 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -322,9 +322,9 @@ var/global/floorIsLava = 0
dat+="Criminal Name : [src.admincaster_wanted_message.criminal] "
dat+="Description : [src.admincaster_wanted_message.body] "
if(wanted_already)
- dat+="Wanted Issue created by: [news_network.wanted_issue.scannedUser] "
+ dat+="Wanted Issue created by: [news_network.wanted_issue.scannedUser] "
else
- dat+="Wanted Issue will be created under prosecutor: [src.admincaster_signature] "
+ dat+="Wanted Issue will be created under prosecutor: [src.admincaster_signature] "
dat+="[(wanted_already) ? ("Edit Issue") : ("Submit")] "
if(wanted_already)
dat+="Take down Issue "
@@ -399,91 +399,6 @@ var/global/floorIsLava = 0
usr << browse(dat, "window=admin2;size=210x180")
return
-/datum/admins/proc/Secrets()
- if(!check_rights(0)) return
-
- var/dat = "The first rule of adminbuse is: you don't talk about the adminbuse.
"
-
- dat +={"
- General Secrets
-
- Show Job Debug
- Admin Log
- Show Admin List
-
- "}
-
- if(check_rights(R_ADMIN,0))
- dat += {"
- Admin Secrets
-
- Cure all diseases currently in existence
- Bombing List
- Show current traitors and objectives
- Show last [length(lastsignalers)] signalers
- Show last [length(lawchanges)] law changes
- Show AI Laws
- Show Game Mode
- Show Crew Manifest
- List DNA (Blood)
- List Fingerprints
-
- Shuttles
-
- Move Ferry
- Move Mining Shuttle
- Move Labor Shuttle
-
- "}
-
- if(check_rights(R_FUN,0))
- dat += {"
- Fun Secrets
-
- Reset Thunderdome to default state
- Trigger a Virus Outbreak
- Turn all humans into monkeys
- Change the species of all humans
- Make all areas powered
- Make all areas unpowered
- Power all SMES
- Triple AI mode (needs to be used in the lobby)
- Everyone is the traitor
- Summon Guns
- Summon Magic
- Summon Events (Toggle)
- There can only be one!
- Make all players retarded
- Egalitarian Station Mode
- Break all lights
- Fix all lights
- The floor is lava! (DANGEROUS: extremely lame)
-
- "}
-
-/* DEATH SQUADS
-Send in a strike team
-*/
- if(check_rights(R_SERVER,0))
- dat += "Toggle bomb cap "
-
- dat += " "
-
- if(check_rights(R_DEBUG,0))
- dat += {"
- Security Level Elevated
-
- Change all maintenance doors to engie/brig access only
- Change all maintenance doors to brig access only
- Remove cap on security officers
-
- "}
-
- usr << browse(dat, "window=secrets")
- return
-
-
-
/////////////////////////////////////////////////////////////////////////////////////////////////admins2.dm merge
//i.e. buttons/verbs
diff --git a/code/modules/admin/admin_memo.dm b/code/modules/admin/admin_memo.dm
index 89f9116aeaf..5ca3ea9942f 100644
--- a/code/modules/admin/admin_memo.dm
+++ b/code/modules/admin/admin_memo.dm
@@ -37,7 +37,7 @@
var/savefile/F = new(MEMOFILE)
if(F)
for(var/ckey in F.dir)
- src << "Admin Memo by [F[ckey]] "
+ src << "Admin Memo by [F[ckey]] "
//delete your own or somebody else's memo
/client/proc/admin_memo_delete()
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 740ec63b06e..1c073505ab8 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -10,6 +10,7 @@ var/list/admin_verbs_default = list(
/client/proc/deadchat, /*toggles deadchat on/off*/
/client/proc/dsay, /*talk in deadchat using our ckey/fakekey*/
/client/proc/toggleprayers, /*toggles prayers on/off*/
+ /client/verb/toggleprayersounds, /*Toggles prayer sounds (HALLELUJAH!)*/
/client/proc/toggle_hear_radio, /*toggles whether we hear the radio*/
/client/proc/investigate_show, /*various admintools for investigation. Such as a singulo grief-log*/
/client/proc/secrets,
@@ -120,7 +121,9 @@ var/list/admin_verbs_debug = list(
/client/proc/SDQL2_query,
/client/proc/test_movable_UI,
/client/proc/test_snap_UI,
- /client/proc/debugNatureMapGenerator
+ /client/proc/debugNatureMapGenerator,
+ /client/proc/check_bomb_impacts,
+ /proc/machine_upgrade
)
var/list/admin_verbs_possess = list(
/proc/possess,
@@ -547,7 +550,7 @@ var/list/admin_verbs_hideable = list(
var/list/Lines = file2list("config/admins.txt")
for(var/line in Lines)
var/list/splitline = text2list(line, " = ")
- if(splitline[1] == ckey)
+ if(lowertext(splitline[1]) == ckey)
if(splitline.len >= 2)
rank = ckeyEx(splitline[2])
break
diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm
new file mode 100644
index 00000000000..4390f383d8b
--- /dev/null
+++ b/code/modules/admin/secrets.dm
@@ -0,0 +1,612 @@
+/datum/admins/proc/Secrets()
+ if(!check_rights(0)) return
+
+ var/dat = "The first rule of adminbuse is: you don't talk about the adminbuse. "
+
+ dat +={"
+ General Secrets
+
+ Show Job Debug
+ Admin Log
+ Show Admin List
+
+ "}
+
+ if(check_rights(R_ADMIN,0))
+ dat += {"
+ Admin Secrets
+
+ Cure all diseases currently in existence
+ Bombing List
+ Show current traitors and objectives
+ Show last [length(lastsignalers)] signalers
+ Show last [length(lawchanges)] law changes
+ Show AI Laws
+ Show Game Mode
+ Show Crew Manifest
+ List DNA (Blood)
+ List Fingerprints
+ Reset Thunderdome to default state
+
+ Shuttles
+
+ Move Ferry
+ Move Mining Shuttle
+ Move Labor Shuttle
+
+ "}
+
+ if(check_rights(R_FUN,0))
+ dat += {"
+ Fun Secrets
+
+
+ Trigger a Virus Outbreak
+ Turn all humans into monkeys
+ Change the species of all humans
+ Make all areas powered
+ Make all areas unpowered
+ Power all SMES
+ Triple AI mode (needs to be used in the lobby)
+ Everyone is the traitor
+ Summon Guns
+ Summon Magic
+ Summon Events (Toggle)
+ There can only be one!
+ Make all players retarded
+ Egalitarian Station Mode
+ Break all lights
+ Fix all lights
+ The floor is lava! (DANGEROUS: extremely lame)
+
+ Change bomb cap
+ "}
+
+ dat += " "
+
+ if(check_rights(R_DEBUG,0))
+ dat += {"
+ Security Level Elevated
+
+ Change all maintenance doors to engie/brig access only
+ Change all maintenance doors to brig access only
+ Remove cap on security officers
+
+ "}
+
+ usr << browse(dat, "window=secrets")
+ return
+
+
+
+
+
+/datum/admins/proc/Secrets_topic(var/item,var/href_list)
+ var/datum/round_event/E
+ var/ok = 0
+ switch(item)
+ if("admin_log")
+ var/dat = "Admin Log "
+ for(var/l in admin_log)
+ dat += "[l] "
+ if(!admin_log.len)
+ dat += "No-one has done anything this round!"
+ usr << browse(dat, "window=admin_log")
+
+ if("list_job_debug")
+ var/dat = "Job Debug info. "
+ if(SSjob)
+ for(var/line in SSjob.job_debug)
+ dat += "[line] "
+ dat+= "******* "
+ for(var/datum/job/job in SSjob.occupations)
+ if(!job) continue
+ dat += "job: [job.title], current_positions: [job.current_positions], total_positions: [job.total_positions] "
+ usr << browse(dat, "window=jobdebug;size=600x500")
+
+ if("show_admins")
+ var/dat = "Current admins: "
+ if(admin_datums)
+ for(var/ckey in admin_datums)
+ var/datum/admins/D = admin_datums[ckey]
+ dat += "[ckey] - [D.rank.name] "
+ usr << browse(dat, "window=showadmins;size=600x500")
+
+ if("tdomereset")
+ if(!check_rights(R_ADMIN))
+ return
+ var/delete_mobs = alert("Clear all mobs?","Confirm","Yes","No","Cancel")
+ if(delete_mobs == "Cancel")
+ return
+
+ log_admin("[key_name(usr)] reset the thunderdome to default with delete_mobs==[delete_mobs].", 1)
+ message_admins("[key_name_admin(usr)] reset the thunderdome to default with delete_mobs==[delete_mobs]. ")
+
+ var/area/thunderdome = locate(/area/tdome/arena)
+ if(delete_mobs == "Yes")
+ for(var/mob/living/mob in thunderdome)
+ qdel(mob) //Clear mobs
+ for(var/obj/obj in thunderdome)
+ if(!istype(obj,/obj/machinery/camera))
+ qdel(obj) //Clear objects
+
+ var/area/template = locate(/area/tdome/arena_source)
+ template.copy_contents_to(thunderdome)
+
+ if("clear_virus")
+
+ var/choice = input("Are you sure you want to cure all disease?") in list("Yes", "Cancel")
+ if(choice == "Yes")
+ message_admins("[key_name_admin(usr)] has cured all diseases.")
+ for(var/datum/disease/D in SSdisease.processing)
+ D.cure(D)
+
+ if("list_bombers")
+ if(!check_rights(R_ADMIN))
+ return
+ var/dat = "Bombing List "
+ for(var/l in bombers)
+ dat += text("[l] ")
+ usr << browse(dat, "window=bombers")
+
+ if("list_signalers")
+ if(!check_rights(R_ADMIN))
+ return
+ var/dat = "Showing last [length(lastsignalers)] signalers. "
+ for(var/sig in lastsignalers)
+ dat += "[sig] "
+ usr << browse(dat, "window=lastsignalers;size=800x500")
+
+ if("list_lawchanges")
+ if(!check_rights(R_ADMIN))
+ return
+ var/dat = "Showing last [length(lawchanges)] law changes. "
+ for(var/sig in lawchanges)
+ dat += "[sig] "
+ usr << browse(dat, "window=lawchanges;size=800x500")
+
+ if("check_antagonist")
+ if(!check_rights(R_ADMIN))
+ return
+ check_antagonists()
+
+ if("moveminingshuttle")
+ if(!check_rights(R_ADMIN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","ShM")
+ if(!SSshuttle.toggleShuttle("mining","mining_home","mining_away"))
+ message_admins("[key_name_admin(usr)] moved mining shuttle")
+ log_admin("[key_name(usr)] moved the mining shuttle")
+
+ if("movelaborshuttle")
+ if(!check_rights(R_ADMIN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","ShL")
+ if(!SSshuttle.toggleShuttle("laborcamp","laborcamp_home","laborcamp_away"))
+ message_admins("[key_name_admin(usr)] moved labor shuttle")
+ log_admin("[key_name(usr)] moved the labor shuttle")
+
+ if("moveferry")
+ if(!check_rights(R_ADMIN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","ShF")
+ if(!SSshuttle.toggleShuttle("ferry","ferry_home","ferry_away"))
+ message_admins("[key_name_admin(usr)] moved the centcom ferry")
+ log_admin("[key_name(usr)] moved the centcom ferry")
+
+ if("kick_all_from_lobby")
+ if(!check_rights(R_ADMIN))
+ return
+ if(ticker && ticker.current_state == GAME_STATE_PLAYING)
+ var/afkonly = text2num(href_list["afkonly"])
+ if(alert("Are you sure you want to kick all [afkonly ? "AFK" : ""] clients from the lobby??","Message","Yes","Cancel") != "Yes")
+ usr << "Kick clients from lobby aborted"
+ return
+ var/list/listkicked = kick_clients_in_lobby("The admin [usr.ckey] issued a 'kick all clients from lobby' command. ", afkonly)
+ var/strkicked = ""
+ for(var/name in listkicked)
+ strkicked += "[name], "
+ message_admins("[key_name_admin(usr)] has kicked [afkonly ? "all AFK" : "all"] clients from the lobby. [length(listkicked)] clients kicked: [strkicked ? strkicked : "--"]")
+ log_admin("[key_name(usr)] has kicked [afkonly ? "all AFK" : "all"] clients from the lobby. [length(listkicked)] clients kicked: [strkicked ? strkicked : "--"]")
+ else
+ usr << "You may only use this when the game is running"
+
+ if("showailaws")
+ if(!check_rights(R_ADMIN))
+ return
+ output_ai_laws()
+ if("showgm")
+ if(!check_rights(R_ADMIN))
+ return
+ if(!ticker)
+ alert("The game hasn't started yet!")
+ else if (ticker.mode)
+ alert("The game mode is [ticker.mode.name]")
+ else alert("For some reason there's a ticker, but not a game mode")
+ if("manifest")
+ if(!check_rights(R_ADMIN))
+ return
+ var/dat = "Showing Crew Manifest. "
+ dat += "Name Position "
+ for(var/datum/data/record/t in data_core.general)
+ dat += "[t.fields["name"]] [t.fields["rank"]] "
+ dat += "
"
+ usr << browse(dat, "window=manifest;size=440x410")
+ if("DNA")
+ if(!check_rights(R_ADMIN))
+ return
+ var/dat = "Showing DNA from blood. "
+ dat += "Name DNA Blood Type "
+ for(var/mob/living/carbon/human/H in mob_list)
+ if(H.dna && H.ckey)
+ dat += "[H] [H.dna.unique_enzymes] [H.blood_type] "
+ dat += "
"
+ usr << browse(dat, "window=DNA;size=440x410")
+ if("fingerprints")
+ if(!check_rights(R_ADMIN))
+ return
+ var/dat = "Showing Fingerprints. "
+ dat += "Name Fingerprints "
+ for(var/mob/living/carbon/human/H in mob_list)
+ if(H.ckey)
+ if(H.dna && H.dna.uni_identity)
+ dat += "[H] [md5(H.dna.uni_identity)] "
+ else if(H.dna && !H.dna.uni_identity)
+ dat += "[H] H.dna.uni_identity = null "
+ else if(!H.dna)
+ dat += "[H] H.dna = null "
+ dat += "
"
+ usr << browse(dat, "window=fingerprints;size=440x410")
+
+ if("monkey")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","M")
+ for(var/mob/living/carbon/human/H in mob_list)
+ spawn(0)
+ H.monkeyize()
+ ok = 1
+
+ if("allspecies")
+ if(!check_rights(R_FUN))
+ return
+ var/result = input(usr, "Please choose a new species","Species") as null|anything in species_list
+ if(result)
+ log_admin("[key_name(usr)] turned all humans into [result]", 1)
+ message_admins("\blue [key_name_admin(usr)] turned all humans into [result]")
+ var/newtype = species_list[result]
+ for(var/mob/living/carbon/human/H in mob_list)
+ hardset_dna(H, null, null, null, null, newtype)
+ H.regenerate_icons()
+
+ if("corgi")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","M")
+ for(var/mob/living/carbon/human/H in mob_list)
+ spawn(0)
+ H.corgize()
+ ok = 1
+
+ if("tripleAI")
+ if(!check_rights(R_FUN))
+ return
+ usr.client.triple_ai()
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","TriAI")
+
+ if("power")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","P")
+ log_admin("[key_name(usr)] made all areas powered", 1)
+ message_admins("[key_name_admin(usr)] made all areas powered ")
+ power_restore()
+
+ if("unpower")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","UP")
+ log_admin("[key_name(usr)] made all areas unpowered", 1)
+ message_admins("[key_name_admin(usr)] made all areas unpowered ")
+ power_failure()
+
+ if("quickpower")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","QP")
+ log_admin("[key_name(usr)] made all SMESs powered", 1)
+ message_admins("[key_name_admin(usr)] made all SMESs powered ")
+ power_restore_quick()
+
+ if("traitor_all")
+ if(!check_rights(R_FUN))
+ return
+ if(!ticker)
+ alert("The game hasn't started yet!")
+ return
+ var/objective = copytext(sanitize(input("Enter an objective")),1,MAX_MESSAGE_LEN)
+ if(!objective)
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","TA([objective])")
+ for(var/mob/living/carbon/human/H in player_list)
+ if(H.stat == 2 || !H.client || !H.mind) continue
+ if(is_special_character(H)) continue
+ //traitorize(H, objective, 0)
+ ticker.mode.traitors += H.mind
+ H.mind.special_role = "traitor"
+ var/datum/objective/new_objective = new
+ new_objective.owner = H
+ new_objective.explanation_text = objective
+ H.mind.objectives += new_objective
+ ticker.mode.greet_traitor(H.mind)
+ //ticker.mode.forge_traitor_objectives(H.mind)
+ ticker.mode.finalize_traitor(H.mind)
+ for(var/mob/living/silicon/A in player_list)
+ if(A.stat == 2 || !A.client || !A.mind) continue
+ if(ispAI(A)) continue
+ else if(is_special_character(A)) continue
+ ticker.mode.traitors += A.mind
+ A.mind.special_role = "traitor"
+ var/datum/objective/new_objective = new
+ new_objective.owner = A
+ new_objective.explanation_text = objective
+ A.mind.objectives += new_objective
+ ticker.mode.greet_traitor(A.mind)
+ ticker.mode.finalize_traitor(A.mind)
+ message_admins("[key_name_admin(usr)] used everyone is a traitor secret. Objective is [objective] ")
+ log_admin("[key_name(usr)] used everyone is a traitor secret. Objective is [objective]")
+
+ if("changebombcap")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","BC")
+
+ var/newBombCap = input(usr,"What would you like the new bomb cap to be. (entered as the light damage range (the 3rd number in common (1,2,3) notation)) Must be between 4 and 128)", "New Bomb Cap", MAX_EX_LIGHT_RANGE) as num|null
+ if (newBombCap < 4)
+ return
+ if (newBombCap > 128)
+ newBombCap = 128
+
+ MAX_EX_DEVESTATION_RANGE = round(newBombCap/4)
+ MAX_EX_HEAVY_RANGE = round(newBombCap/2)
+ MAX_EX_LIGHT_RANGE = newBombCap
+ //I don't know why these are their own variables, but fuck it, they are.
+ MAX_EX_FLASH_RANGE = newBombCap
+ MAX_EX_FLAME_RANGE = newBombCap
+
+ message_admins("[key_name_admin(usr)] changed the bomb cap to [MAX_EX_DEVESTATION_RANGE], [MAX_EX_HEAVY_RANGE], [MAX_EX_LIGHT_RANGE] ")
+ log_admin("[key_name(usr)] changed the bomb cap to [MAX_EX_DEVESTATION_RANGE], [MAX_EX_HEAVY_RANGE], [MAX_EX_LIGHT_RANGE]")
+
+
+ if("lightsout")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","LO")
+ message_admins("[key_name_admin(usr)] has broke a lot of lights")
+ E = new /datum/round_event/electrical_storm{lightsoutAmount = 2}()
+
+ if("blackout")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","BO")
+ message_admins("[key_name_admin(usr)] broke all lights")
+ for(var/obj/machinery/light/L in world)
+ L.broken()
+
+ if("whiteout")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","WO")
+ message_admins("[key_name_admin(usr)] fixed all lights")
+ for(var/obj/machinery/light/L in world)
+ L.fix()
+
+ if("floorlava")
+ if(!check_rights(R_FUN))
+ return
+ if(floorIsLava)
+ usr << "The floor is lava already."
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","LF")
+
+ //Options
+ var/length = input(usr, "How long will the lava last? (in seconds)", "Length", 180) as num
+ length = min(abs(length), 1200)
+
+ var/damage = input(usr, "How deadly will the lava be?", "Damage", 2) as num
+ damage = min(abs(damage), 100)
+
+ var/sure = alert(usr, "Are you sure you want to do this?", "Confirmation", "YES!", "Nah")
+ if(sure == "Nah")
+ return
+ floorIsLava = 1
+
+ message_admins("[key_name_admin(usr)] made the floor LAVA! It'll last [length] seconds and it will deal [damage] damage to everyone.")
+
+ for(var/turf/simulated/floor/F in world)
+ if(F.z == ZLEVEL_STATION)
+ F.name = "lava"
+ F.desc = "The floor is LAVA!"
+ F.overlays += "lava"
+ F.lava = 1
+
+ spawn(0)
+ for(var/i = i, i < length, i++) // 180 = 3 minutes
+ if(damage)
+ for(var/mob/living/carbon/L in living_mob_list)
+ if(istype(L.loc, /turf/simulated/floor)) // Are they on LAVA?!
+ var/turf/simulated/floor/F = L.loc
+ if(F.lava)
+ var/safe = 0
+ for(var/obj/structure/O in F.contents)
+ if(O.level > F.level && !istype(O, /obj/structure/window)) // Something to stand on and it isn't under the floor!
+ safe = 1
+ break
+ if(!safe)
+ L.adjustFireLoss(damage)
+
+
+ sleep(10)
+
+ for(var/turf/simulated/floor/F in world) // Reset everything.
+ if(F.z == ZLEVEL_STATION)
+ F.name = initial(F.name)
+ F.desc = initial(F.desc)
+ F.overlays.Cut()
+ F.lava = 0
+ F.update_icon()
+ floorIsLava = 0
+ return
+
+ if("virus")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","V")
+ switch(alert("Do you want this to be a random disease or do you have something in mind?",,"Make Your Own","Random","Choose"))
+ if("Make Your Own")
+ AdminCreateVirus(usr.client)
+ if("Random")
+ E = new /datum/round_event/disease_outbreak()
+ if("Choose")
+ var/virus = input("Choose the virus to spread", "BIOHAZARD") as null|anything in typesof(/datum/disease)
+ E = new /datum/round_event/disease_outbreak{}()
+ var/datum/round_event/disease_outbreak/DO = E
+ DO.virus_type = virus
+
+ if("retardify")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","RET")
+ for(var/mob/living/carbon/human/H in player_list)
+ H << "You suddenly feel stupid. "
+ H.setBrainLoss(60)
+ message_admins("[key_name_admin(usr)] made everybody retarded")
+
+ if("eagles")//SCRAW
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","EgL")
+ for(var/obj/machinery/door/airlock/W in world)
+ if(W.z == ZLEVEL_STATION && !istype(get_area(W), /area/bridge) && !istype(get_area(W), /area/crew_quarters) && !istype(get_area(W), /area/security/prison))
+ W.req_access = list()
+ message_admins("[key_name_admin(usr)] activated Egalitarian Station mode")
+ priority_announce("Centcom airlock control override activated. Please take this time to get acquainted with your coworkers.", null, 'sound/AI/commandreport.ogg')
+
+ if("guns")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","SG")
+ var/survivor_probability = 0
+ switch(alert("Do you want this to create survivors antagonists?",,"No Antags","Some Antags","All Antags!"))
+ if("Some Antags")
+ survivor_probability = 25
+ if("All Antags!")
+ survivor_probability = 100
+
+ rightandwrong(0, usr, survivor_probability)
+
+ if("magic")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","SM")
+ var/survivor_probability = 0
+ switch(alert("Do you want this to create survivors antagonists?",,"No Antags","Some Antags","All Antags!"))
+ if("Some Antags")
+ survivor_probability = 25
+ if("All Antags!")
+ survivor_probability = 100
+
+ rightandwrong(1, usr, survivor_probability)
+
+ if("events")
+ if(!check_rights(R_FUN))
+ return
+ if(!SSevent.wizardmode)
+ if(alert("Do you want to toggle summon events on?",,"Yes","No") == "Yes")
+ summonevents()
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","SE")
+
+ else
+ switch(alert("What would you like to do?",,"Intensify Summon Events","Turn Off Summon Events","Nothing"))
+ if("Intensify Summon Events")
+ summonevents()
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","SE")
+ if("Turn Off Summon Events")
+ SSevent.toggleWizardmode()
+ SSevent.resetFrequency()
+
+ if("dorf")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","DF")
+ for(var/mob/living/carbon/human/B in mob_list)
+ B.facial_hair_style = "Dward Beard"
+ B.update_hair()
+ message_admins("[key_name_admin(usr)] activated dorf mode")
+
+ if("onlyone")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","OO")
+ usr.client.only_one()
+// message_admins("[key_name_admin(usr)] has triggered a battle to the death (only one)")
+
+ if("maint_access_brig")
+ if(!check_rights(R_DEBUG))
+ return
+ for(var/obj/machinery/door/airlock/maintenance/M in world)
+ M.check_access()
+ if (access_maint_tunnels in M.req_access)
+ M.req_access = list(access_brig)
+ message_admins("[key_name_admin(usr)] made all maint doors brig access-only.")
+ if("maint_access_engiebrig")
+ if(!check_rights(R_DEBUG))
+ return
+ for(var/obj/machinery/door/airlock/maintenance/M in world)
+ M.check_access()
+ if (access_maint_tunnels in M.req_access)
+ M.req_access = list()
+ M.req_one_access = list(access_brig,access_engine)
+ message_admins("[key_name_admin(usr)] made all maint doors engineering and brig access-only.")
+ if("infinite_sec")
+ if(!check_rights(R_DEBUG))
+ return
+ var/datum/job/J = SSjob.GetJob("Security Officer")
+ if(!J) return
+ J.total_positions = -1
+ J.spawn_positions = -1
+ message_admins("[key_name_admin(usr)] has removed the cap on security officers.")
+ if(E)
+ E.processing = 0
+ if(E.announceWhen>0)
+ if(alert(usr, "Would you like to alert the crew?", "Alert", "Yes", "No") == "No")
+ E.announceWhen = -1
+ E.processing = 1
+ if (usr)
+ log_admin("[key_name(usr)] used secret [item]")
+ if (ok)
+ world << text("A secret has been activated by []! ", usr.key)
\ No newline at end of file
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 334190fbd20..d73dce75058 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -307,7 +307,7 @@
if(ratio)
config.midround_antag_life_check = ratio/100
- message_admins("[key_name_admin(usr)] edited the midround antagonist living crew ratio to [ratio * 100]% alive. ")
+ message_admins("[key_name_admin(usr)] edited the midround antagonist living crew ratio to [ratio]% alive. ")
check_antagonists()
else if(href_list["toggle_noncontinuous_behavior"])
@@ -1337,7 +1337,7 @@
sleep(5)
M.loc = pick(tdomeobserve)
spawn(50)
- M << " You have been sent to the Thunderdome. "
+ M << "You have been sent to the Thunderdome. "
log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Observer.)")
message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the thunderdome. (Observer.)")
@@ -1605,6 +1605,7 @@
message_admins("[key_name(H)] got their cookie, spawned by [key_name(src.owner)]")
feedback_inc("admin_cookies_spawned",1)
H << "Your prayers have been answered!! You received the best cookie ! "
+ H << 'sound/effects/pray_chaplain.ogg'
else if(href_list["BlueSpaceArtillery"])
var/mob/living/M = locate(href_list["BlueSpaceArtillery"])
@@ -1811,465 +1812,8 @@
break
return
- else if(href_list["secretsfun"])
- if(!check_rights(R_FUN)) return
- var/datum/round_event/E
- var/ok = 0
- switch(href_list["secretsfun"])
- if("tdomereset")
- var/delete_mobs = alert("Clear all mobs?","Confirm","Yes","No","Cancel")
- if(delete_mobs == "Cancel")
- return
-
- log_admin("[key_name(usr)] reset the thunderdome to default with delete_mobs==[delete_mobs].", 1)
- message_admins("[key_name_admin(usr)] reset the thunderdome to default with delete_mobs==[delete_mobs]. ")
-
- var/area/thunderdome = locate(/area/tdome/arena)
- if(delete_mobs == "Yes")
- for(var/mob/living/mob in thunderdome)
- qdel(mob) //Clear mobs
- for(var/obj/obj in thunderdome)
- if(!istype(obj,/obj/machinery/camera))
- qdel(obj) //Clear objects
-
- var/area/template = locate(/area/tdome/arena_source)
- template.copy_contents_to(thunderdome)
-
- if("monkey")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","M")
- for(var/mob/living/carbon/human/H in mob_list)
- spawn(0)
- H.monkeyize()
- ok = 1
- if("allspecies")
- var/result = input(usr, "Please choose a new species","Species") as null|anything in species_list
- if(result)
- log_admin("[key_name(usr)] turned all humans into [result]", 1)
- message_admins("\blue [key_name_admin(usr)] turned all humans into [result]")
- var/newtype = species_list[result]
- for(var/mob/living/carbon/human/H in mob_list)
- hardset_dna(H, null, null, null, null, newtype)
- H.regenerate_icons()
- if("corgi")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","M")
- for(var/mob/living/carbon/human/H in mob_list)
- spawn(0)
- H.corgize()
- ok = 1
-/* DEATH SQUADS
- if("striketeam")
- if(usr.client.strike_team())
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","Strike")
-*/
- if("tripleAI")
- usr.client.triple_ai()
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","TriAI")
- if("power")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","P")
- log_admin("[key_name(usr)] made all areas powered", 1)
- message_admins("[key_name_admin(usr)] made all areas powered ")
- power_restore()
- if("unpower")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","UP")
- log_admin("[key_name(usr)] made all areas unpowered", 1)
- message_admins("[key_name_admin(usr)] made all areas unpowered ")
- power_failure()
- if("quickpower")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","QP")
- log_admin("[key_name(usr)] made all SMESs powered", 1)
- message_admins("[key_name_admin(usr)] made all SMESs powered ")
- power_restore_quick()
- if("traitor_all")
- if(!ticker)
- alert("The game hasn't started yet!")
- return
- var/objective = copytext(sanitize(input("Enter an objective")),1,MAX_MESSAGE_LEN)
- if(!objective)
- return
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","TA([objective])")
- for(var/mob/living/carbon/human/H in player_list)
- if(H.stat == 2 || !H.client || !H.mind) continue
- if(is_special_character(H)) continue
- //traitorize(H, objective, 0)
- ticker.mode.traitors += H.mind
- H.mind.special_role = "traitor"
- var/datum/objective/new_objective = new
- new_objective.owner = H
- new_objective.explanation_text = objective
- H.mind.objectives += new_objective
- ticker.mode.greet_traitor(H.mind)
- //ticker.mode.forge_traitor_objectives(H.mind)
- ticker.mode.finalize_traitor(H.mind)
- for(var/mob/living/silicon/A in player_list)
- if(A.stat == 2 || !A.client || !A.mind) continue
- if(ispAI(A)) continue
- else if(is_special_character(A)) continue
- ticker.mode.traitors += A.mind
- A.mind.special_role = "traitor"
- var/datum/objective/new_objective = new
- new_objective.owner = A
- new_objective.explanation_text = objective
- A.mind.objectives += new_objective
- ticker.mode.greet_traitor(A.mind)
- ticker.mode.finalize_traitor(A.mind)
- message_admins("[key_name_admin(usr)] used everyone is a traitor secret. Objective is [objective] ")
- log_admin("[key_name(usr)] used everyone is a traitor secret. Objective is [objective]")
- if("togglebombcap")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","BC")
- switch(MAX_EX_LIGHT_RANGE)
- if(14)
- MAX_EX_LIGHT_RANGE = 16
- MAX_EX_HEAVY_RANGE = 8
- MAX_EX_DEVESTATION_RANGE = 4
- if(16)
- MAX_EX_LIGHT_RANGE = 20
- MAX_EX_HEAVY_RANGE = 10
- MAX_EX_DEVESTATION_RANGE = 5
- if(20)
- MAX_EX_LIGHT_RANGE = 28
- MAX_EX_HEAVY_RANGE = 14
- MAX_EX_DEVESTATION_RANGE = 7
- if(28)
- MAX_EX_LIGHT_RANGE = 56
- MAX_EX_HEAVY_RANGE = 28
- MAX_EX_DEVESTATION_RANGE = 14
- if(56)
- MAX_EX_LIGHT_RANGE = 128
- MAX_EX_HEAVY_RANGE = 64
- MAX_EX_DEVESTATION_RANGE = 32
- if(128)
- MAX_EX_LIGHT_RANGE = 14
- MAX_EX_HEAVY_RANGE = 7
- MAX_EX_DEVESTATION_RANGE = 3
- message_admins("[key_name_admin(usr)] changed the bomb cap to [MAX_EX_DEVESTATION_RANGE], [MAX_EX_HEAVY_RANGE], [MAX_EX_LIGHT_RANGE] ")
- log_admin("[key_name(usr)] changed the bomb cap to [MAX_EX_DEVESTATION_RANGE], [MAX_EX_HEAVY_RANGE], [MAX_EX_LIGHT_RANGE]")
-
- if("lightsout")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","LO")
- message_admins("[key_name_admin(usr)] has broke a lot of lights")
- E = new /datum/round_event/electrical_storm{lightsoutAmount = 2}()
- if("blackout")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","BO")
- message_admins("[key_name_admin(usr)] broke all lights")
- for(var/obj/machinery/light/L in world)
- L.broken()
- if("whiteout")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","WO")
- message_admins("[key_name_admin(usr)] fixed all lights")
- for(var/obj/machinery/light/L in world)
- L.fix()
- if("floorlava")
- if(floorIsLava)
- usr << "The floor is lava already."
- return
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","LF")
-
- //Options
- var/length = input(usr, "How long will the lava last? (in seconds)", "Length", 180) as num
- length = min(abs(length), 1200)
-
- var/damage = input(usr, "How deadly will the lava be?", "Damage", 2) as num
- damage = min(abs(damage), 100)
-
- var/sure = alert(usr, "Are you sure you want to do this?", "Confirmation", "YES!", "Nah")
- if(sure == "Nah")
- return
- floorIsLava = 1
-
- message_admins("[key_name_admin(usr)] made the floor LAVA! It'll last [length] seconds and it will deal [damage] damage to everyone.")
-
- for(var/turf/simulated/floor/F in world)
- if(F.z == ZLEVEL_STATION)
- F.name = "lava"
- F.desc = "The floor is LAVA!"
- F.overlays += "lava"
- F.lava = 1
-
- spawn(0)
- for(var/i = i, i < length, i++) // 180 = 3 minutes
- if(damage)
- for(var/mob/living/carbon/L in living_mob_list)
- if(istype(L.loc, /turf/simulated/floor)) // Are they on LAVA?!
- var/turf/simulated/floor/F = L.loc
- if(F.lava)
- var/safe = 0
- for(var/obj/structure/O in F.contents)
- if(O.level > F.level && !istype(O, /obj/structure/window)) // Something to stand on and it isn't under the floor!
- safe = 1
- break
- if(!safe)
- L.adjustFireLoss(damage)
-
-
- sleep(10)
-
- for(var/turf/simulated/floor/F in world) // Reset everything.
- if(F.z == ZLEVEL_STATION)
- F.name = initial(F.name)
- F.desc = initial(F.desc)
- F.overlays.Cut()
- F.lava = 0
- F.update_icon()
- floorIsLava = 0
- return
- if("virus")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","V")
- switch(alert("Do you want this to be a random disease or do you have something in mind?",,"Make Your Own","Random","Choose"))
- if("Make Your Own")
- AdminCreateVirus(usr.client)
- if("Random")
- E = new /datum/round_event/disease_outbreak()
- if("Choose")
- var/virus = input("Choose the virus to spread", "BIOHAZARD") as null|anything in typesof(/datum/disease)
- E = new /datum/round_event/disease_outbreak{}()
- var/datum/round_event/disease_outbreak/DO = E
- DO.virus_type = virus
- if("retardify")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","RET")
- for(var/mob/living/carbon/human/H in player_list)
- H << "You suddenly feel stupid. "
- H.setBrainLoss(60)
- message_admins("[key_name_admin(usr)] made everybody retarded")
- if("eagles")//SCRAW
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","EgL")
- for(var/obj/machinery/door/airlock/W in world)
- if(W.z == ZLEVEL_STATION && !istype(get_area(W), /area/bridge) && !istype(get_area(W), /area/crew_quarters) && !istype(get_area(W), /area/security/prison))
- W.req_access = list()
- message_admins("[key_name_admin(usr)] activated Egalitarian Station mode")
- priority_announce("Centcom airlock control override activated. Please take this time to get acquainted with your coworkers.", null, 'sound/AI/commandreport.ogg')
- if("guns")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","SG")
- var/survivor_probability = 0
- switch(alert("Do you want this to create survivors antagonists?",,"No Antags","Some Antags","All Antags!"))
- if("Some Antags")
- survivor_probability = 25
- if("All Antags!")
- survivor_probability = 100
-
- rightandwrong(0, usr, survivor_probability)
- if("magic")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","SM")
- var/survivor_probability = 0
- switch(alert("Do you want this to create survivors antagonists?",,"No Antags","Some Antags","All Antags!"))
- if("Some Antags")
- survivor_probability = 25
- if("All Antags!")
- survivor_probability = 100
-
- rightandwrong(1, usr, survivor_probability)
- if("events")
- if(!SSevent.wizardmode)
- if(alert("Do you want to toggle summon events on?",,"Yes","No") == "Yes")
- summonevents()
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","SE")
-
- else
- switch(alert("What would you like to do?",,"Intensify Summon Events","Turn Off Summon Events","Nothing"))
- if("Intensify Summon Events")
- summonevents()
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","SE")
- if("Turn Off Summon Events")
- SSevent.toggleWizardmode()
- SSevent.resetFrequency()
- if("dorf")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","DF")
- for(var/mob/living/carbon/human/B in mob_list)
- B.facial_hair_style = "Dward Beard"
- B.update_hair()
- message_admins("[key_name_admin(usr)] activated dorf mode")
- if("onlyone")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","OO")
- usr.client.only_one()
-// message_admins("[key_name_admin(usr)] has triggered a battle to the death (only one)")
- if(E)
- E.processing = 0
- if(E.announceWhen>0)
- if(alert(usr, "Would you like to alert the crew?", "Alert", "Yes", "No") == "No")
- E.announceWhen = -1
- E.processing = 1
- if(usr)
- log_admin("[key_name(usr)] used secret [href_list["secretsfun"]]")
- if (ok)
- world << text("A secret has been activated by []! ", usr.key)
-
- else if(href_list["secretsadmin"])
- if(!check_rights(R_ADMIN)) return
-
- var/ok = 0
- switch(href_list["secretsadmin"])
- if("clear_virus")
- var/choice = input("Are you sure you want to cure all disease?") in list("Yes", "Cancel")
- if(choice == "Yes")
- message_admins("[key_name_admin(usr)] has cured all diseases.")
- for(var/datum/disease/D in SSdisease.processing)
- D.cure(D)
- if("list_bombers")
- var/dat = "Bombing List "
- for(var/l in bombers)
- dat += text("[l] ")
- usr << browse(dat, "window=bombers")
- if("list_signalers")
- var/dat = "Showing last [length(lastsignalers)] signalers. "
- for(var/sig in lastsignalers)
- dat += "[sig] "
- usr << browse(dat, "window=lastsignalers;size=800x500")
- if("list_lawchanges")
- var/dat = "Showing last [length(lawchanges)] law changes. "
- for(var/sig in lawchanges)
- dat += "[sig] "
- usr << browse(dat, "window=lawchanges;size=800x500")
- if("check_antagonist")
- check_antagonists()
-
- if("moveminingshuttle")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","ShM")
- if(!SSshuttle.toggleShuttle("mining","mining_home","mining_away"))
- message_admins("[key_name_admin(usr)] moved mining shuttle")
- log_admin("[key_name(usr)] moved the mining shuttle")
-
- if("movelaborshuttle")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","ShL")
- if(!SSshuttle.toggleShuttle("laborcamp","laborcamp_home","laborcamp_away"))
- message_admins("[key_name_admin(usr)] moved labor shuttle")
- log_admin("[key_name(usr)] moved the labor shuttle")
-
- if("moveferry")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","ShF")
- if(!SSshuttle.toggleShuttle("ferry","ferry_home","ferry_away"))
- message_admins("[key_name_admin(usr)] moved the centcom ferry")
- log_admin("[key_name(usr)] moved the centcom ferry")
-
- if("kick_all_from_lobby")
- if(ticker && ticker.current_state == GAME_STATE_PLAYING)
- var/afkonly = text2num(href_list["afkonly"])
- if(alert("Are you sure you want to kick all [afkonly ? "AFK" : ""] clients from the lobby??","Message","Yes","Cancel") != "Yes")
- usr << "Kick clients from lobby aborted"
- return
- var/list/listkicked = kick_clients_in_lobby("The admin [usr.ckey] issued a 'kick all clients from lobby' command. ", afkonly)
- var/strkicked = ""
- for(var/name in listkicked)
- strkicked += "[name], "
- message_admins("[key_name_admin(usr)] has kicked [afkonly ? "all AFK" : "all"] clients from the lobby. [length(listkicked)] clients kicked: [strkicked ? strkicked : "--"]")
- log_admin("[key_name(usr)] has kicked [afkonly ? "all AFK" : "all"] clients from the lobby. [length(listkicked)] clients kicked: [strkicked ? strkicked : "--"]")
- else
- usr << "You may only use this when the game is running"
- if("showailaws")
- output_ai_laws()
- if("showgm")
- if(!ticker)
- alert("The game hasn't started yet!")
- else if (ticker.mode)
- alert("The game mode is [ticker.mode.name]")
- else alert("For some reason there's a ticker, but not a game mode")
- if("manifest")
- var/dat = "Showing Crew Manifest. "
- dat += "Name Position "
- for(var/datum/data/record/t in data_core.general)
- dat += "[t.fields["name"]] [t.fields["rank"]] "
- dat += "
"
- usr << browse(dat, "window=manifest;size=440x410")
- if("DNA")
- var/dat = "Showing DNA from blood. "
- dat += "Name DNA Blood Type "
- for(var/mob/living/carbon/human/H in mob_list)
- if(H.dna && H.ckey)
- dat += "[H] [H.dna.unique_enzymes] [H.blood_type] "
- dat += "
"
- usr << browse(dat, "window=DNA;size=440x410")
- if("fingerprints")
- var/dat = "Showing Fingerprints. "
- dat += "Name Fingerprints "
- for(var/mob/living/carbon/human/H in mob_list)
- if(H.ckey)
- if(H.dna && H.dna.uni_identity)
- dat += "[H] [md5(H.dna.uni_identity)] "
- else if(H.dna && !H.dna.uni_identity)
- dat += "[H] H.dna.uni_identity = null "
- else if(!H.dna)
- dat += "[H] H.dna = null "
- dat += "
"
- usr << browse(dat, "window=fingerprints;size=440x410")
- else
- if (usr)
- log_admin("[key_name(usr)] used secret [href_list["secretsadmin"]]")
- if (ok)
- world << text("A secret has been activated by []! ", usr.key)
-
- else if(href_list["secretsgeneral"])
- switch(href_list["secretsgeneral"])
- if("spawn_objects")
- var/dat = "Admin Log "
- for(var/l in admin_log)
- dat += "[l] "
- if(!admin_log.len)
- dat += "No-one has done anything this round!"
- usr << browse(dat, "window=admin_log")
- if("list_job_debug")
- var/dat = "Job Debug info. "
- if(SSjob)
- for(var/line in SSjob.job_debug)
- dat += "[line] "
- dat+= "******* "
- for(var/datum/job/job in SSjob.occupations)
- if(!job) continue
- dat += "job: [job.title], current_positions: [job.current_positions], total_positions: [job.total_positions] "
- usr << browse(dat, "window=jobdebug;size=600x500")
- if("show_admins")
- var/dat = "Current admins: "
- if(admin_datums)
- for(var/ckey in admin_datums)
- var/datum/admins/D = admin_datums[ckey]
- dat += "[ckey] - [D.rank.name] "
- usr << browse(dat, "window=showadmins;size=600x500")
-
- else if(href_list["secretscoder"])
- if(!check_rights(R_DEBUG)) return
-
- switch(href_list["secretscoder"])
- if("maint_access_brig")
- for(var/obj/machinery/door/airlock/maintenance/M in world)
- M.check_access()
- if (access_maint_tunnels in M.req_access)
- M.req_access = list(access_brig)
- message_admins("[key_name_admin(usr)] made all maint doors brig access-only.")
- if("maint_access_engiebrig")
- for(var/obj/machinery/door/airlock/maintenance/M in world)
- M.check_access()
- if (access_maint_tunnels in M.req_access)
- M.req_access = list()
- M.req_one_access = list(access_brig,access_engine)
- message_admins("[key_name_admin(usr)] made all maint doors engineering and brig access-only.")
- if("infinite_sec")
- var/datum/job/J = SSjob.GetJob("Security Officer")
- if(!J) return
- J.total_positions = -1
- J.spawn_positions = -1
- message_admins("[key_name_admin(usr)] has removed the cap on security officers.")
+ else if(href_list["secrets"])
+ Secrets_topic(href_list["secrets"],href_list)
else if(href_list["ac_view_wanted"]) //Admin newscaster Topic() stuff be here
src.admincaster_screen = 18 //The ac_ prefix before the hrefs stands for AdminCaster.
diff --git a/code/modules/admin/verbs/buildmode.dm b/code/modules/admin/verbs/buildmode.dm
index 767f30e1380..d06bd7e61c8 100644
--- a/code/modules/admin/verbs/buildmode.dm
+++ b/code/modules/admin/verbs/buildmode.dm
@@ -1,3 +1,10 @@
+#define BASIC_BUILDMODE 1
+#define ADV_BUILDMODE 2
+#define VAR_BUILDMODE 3
+#define THROW_BUILDMODE 4
+#define AREA_BUILDMODE 5
+#define NUM_BUILDMODES 5
+
/proc/togglebuildmode(mob/M as mob in player_list)
set name = "Toggle Build Mode"
set category = "Special Verbs"
@@ -35,7 +42,7 @@
M.client.screen += D
H.cl = M.client
-/obj/effect/bmode//Cleaning up the tree a bit
+/obj/effect/bmode //Cleaning up the tree a bit
density = 1
anchored = 1
layer = 20
@@ -68,7 +75,7 @@
/obj/effect/bmode/buildhelp/Click()
switch(master.cl.buildmode)
- if(1)
+ if(BASIC_BUILDMODE)
usr << "\blue ***********************************************************"
usr << "\blue Left Mouse Button = Construct / Upgrade"
usr << "\blue Right Mouse Button = Deconstruct / Delete / Downgrade"
@@ -78,7 +85,7 @@
usr << "\blue Use the button in the upper left corner to"
usr << "\blue change the direction of built objects."
usr << "\blue ***********************************************************"
- if(2)
+ if(ADV_BUILDMODE)
usr << "\blue ***********************************************************"
usr << "\blue Right Mouse Button on buildmode button = Set object type"
usr << "\blue Left Mouse Button on turf/obj = Place objects"
@@ -87,17 +94,23 @@
usr << "\blue Use the button in the upper left corner to"
usr << "\blue change the direction of built objects."
usr << "\blue ***********************************************************"
- if(3)
+ if(VAR_BUILDMODE)
usr << "\blue ***********************************************************"
usr << "\blue Right Mouse Button on buildmode button = Select var(type) & value"
usr << "\blue Left Mouse Button on turf/obj/mob = Set var(type) & value"
usr << "\blue Right Mouse Button on turf/obj/mob = Reset var's value"
usr << "\blue ***********************************************************"
- if(4)
+ if(THROW_BUILDMODE)
usr << "\blue ***********************************************************"
usr << "\blue Left Mouse Button on turf/obj/mob = Select"
usr << "\blue Right Mouse Button on turf/obj/mob = Throw"
usr << "\blue ***********************************************************"
+ if(AREA_BUILDMODE)
+ usr << "\blue ***********************************************************"
+ usr << "\blue Left Mouse Button on turf/obj/mob = Select corner"
+ usr << "\blue Right Mouse Button on buildmode button = Select generator"
+ usr << "\blue ***********************************************************"
+
return 1
/obj/effect/bmode/buildquit
@@ -117,6 +130,13 @@
var/obj/effect/bmode/buildmode/buildmode = null
var/obj/effect/bmode/buildquit/buildquit = null
var/atom/movable/throw_atom = null
+ var/turf/cornerA = null
+ var/turf/cornerB = null
+ var/generator_path = null
+
+/obj/effect/bmode/buildholder/proc/Reset()//Reset temporary variables
+ cornerA = null
+ cornerB = null
/obj/effect/bmode/buildmode
icon_state = "buildmode1"
@@ -129,25 +149,15 @@
var/list/pa = params2list(params)
if(pa.Find("left"))
- switch(master.cl.buildmode)
- if(1)
- master.cl.buildmode = 2
- src.icon_state = "buildmode2"
- if(2)
- master.cl.buildmode = 3
- src.icon_state = "buildmode3"
- if(3)
- master.cl.buildmode = 4
- src.icon_state = "buildmode4"
- if(4)
- master.cl.buildmode = 1
- src.icon_state = "buildmode1"
+ master.cl.buildmode = (master.cl.buildmode % NUM_BUILDMODES) +1
+ master.Reset()
+ src.icon_state = "buildmode[master.cl.buildmode]"
else if(pa.Find("right"))
switch(master.cl.buildmode)
- if(1)
+ if(BASIC_BUILDMODE)
return 1
- if(2)
+ if(ADV_BUILDMODE)
objholder = text2path(input(usr,"Enter typepath:" ,"Typepath","/obj/structure/closet"))
if(!ispath(objholder))
objholder = /obj/structure/closet
@@ -155,7 +165,7 @@
else
if(ispath(objholder,/mob) && !check_rights(R_DEBUG,0))
objholder = /obj/structure/closet
- if(3)
+ if(VAR_BUILDMODE)
var/list/locked = list("vars", "key", "ckey", "client", "firemut", "ishulk", "telekinesis", "xray", "virus", "viruses", "cuffed", "ka", "last_eaten", "urine")
master.buildmode.varholder = input(usr,"Enter variable name:" ,"Name", "name")
@@ -174,6 +184,16 @@
master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value") as obj in world
if("turf-reference")
master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value") as turf in world
+ if(AREA_BUILDMODE)
+ var/list/gen_paths = typesof(/datum/mapGenerator) - /datum/mapGenerator
+
+ var/type = input(usr,"Select Generator Type","Type") as null|anything in gen_paths
+ if(!type) return
+
+ master.generator_path = type
+ master.cornerA = null
+ master.cornerB = null
+
return 1
@@ -186,8 +206,11 @@
if(!holder) return
var/list/pa = params2list(params)
+ if(istype(object,/obj/effect/bmode))
+ return
+
switch(buildmode)
- if(1)
+ if(BASIC_BUILDMODE)
if(istype(object,/turf) && pa.Find("left") && !pa.Find("alt") && !pa.Find("ctrl") )
var/turf/T = object
if(istype(object,/turf/space))
@@ -233,7 +256,7 @@
var/obj/structure/window/reinforced/WIN = new/obj/structure/window/reinforced(get_turf(object))
WIN.dir = NORTHWEST
log_admin("Build Mode: [key_name(usr)] built a window at ([object.x],[object.y],[object.z])")
- if(2)
+ if(ADV_BUILDMODE)
if(pa.Find("left"))
if(ispath(holder.buildmode.objholder,/turf))
var/turf/T = get_turf(object)
@@ -248,7 +271,7 @@
log_admin("Build Mode: [key_name(usr)] deleted [object] at ([object.x],[object.y],[object.z])")
qdel(object)
- if(3)
+ if(VAR_BUILDMODE)
if(pa.Find("left")) //I cant believe this shit actually compiles.
if(object.vars.Find(holder.buildmode.varholder))
log_admin("Build Mode: [key_name(usr)] modified [object.name]'s [holder.buildmode.varholder] to [holder.buildmode.valueholder]")
@@ -262,7 +285,7 @@
else
usr << "[initial(object.name)] does not have a var called '[holder.buildmode.varholder]' "
- if(4)
+ if(THROW_BUILDMODE)
if(pa.Find("left"))
if(isturf(object))
return
@@ -271,4 +294,35 @@
if(holder.throw_atom)
holder.throw_atom.throw_at(object, 10, 1)
log_admin("Build Mode: [key_name(usr)] threw [holder.throw_atom] at [object] ([object.x],[object.y],[object.z])")
-
+ if(AREA_BUILDMODE)
+ if(!holder.cornerA)
+ holder.cornerA = get_turf(object)
+ return
+ if(holder.cornerA && !holder.cornerB)
+ holder.cornerB = get_turf(object)
+
+ if(pa.Find("left")) //rectangular
+ if(holder.cornerA && holder.cornerB)
+ if(!holder.generator_path)
+ usr << "Select generator type first. "
+ var/datum/mapGenerator/G = new holder.generator_path
+ G.defineRegion(holder.cornerA,holder.cornerB,1)
+ G.generate()
+ holder.cornerA = null
+ holder.cornerB = null
+ return
+ /* Something wrong with this, will check later
+ if(pa.Find("right")) // circular
+ if(holder.cornerA && holder.cornerB)
+ if(!holder.generator_path)
+ usr << "Select generator type first. "
+ var/datum/mapGenerator/G = new holder.generator_path
+ G.defineCircularRegion(holder.cornerA,holder.cornerB,1)
+ G.generate()
+ holder.cornerA = null
+ holder.cornerB = null
+ return
+ */
+ //Something wrong - Reset
+ holder.cornerA = null
+ holder.cornerB = null
\ No newline at end of file
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index f1f0b88a848..c5f1a2bb22f 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -1091,6 +1091,8 @@ var/global/list/g_fancy_list_of_types = null
usr << browse(dat, "window=dellog")
+
+
//Deathsquad
/proc/equip_deathsquad(var/mob/living/carbon/human/M, var/officer)
var/obj/item/device/radio/R = new /obj/item/device/radio/headset/headset_cent/alt(M)
diff --git a/code/modules/admin/verbs/machine_upgrade.dm b/code/modules/admin/verbs/machine_upgrade.dm
new file mode 100644
index 00000000000..9c1089c5fff
--- /dev/null
+++ b/code/modules/admin/verbs/machine_upgrade.dm
@@ -0,0 +1,10 @@
+/proc/machine_upgrade(obj/machinery/M as obj in world)
+ set name = "Tweak Component Ratings"
+ set category = "Debug"
+ var/new_rating = input("Enter new rating:","Num") as num
+ if(new_rating && M.component_parts)
+ for(var/obj/item/weapon/stock_parts/P in M.component_parts)
+ P.rating = new_rating
+ M.RefreshParts()
+
+ feedback_add_details("admin_verb","MU") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm
index f14df6a3fc9..3125067f32b 100644
--- a/code/modules/admin/verbs/modifyvariables.dm
+++ b/code/modules/admin/verbs/modifyvariables.dm
@@ -142,15 +142,33 @@ var/list/VVckey_edit = list("key", "ckey")
if(confirm != "Continue")
return
- var/list/names = sortList(L)
+ var/assoc = 0
+ if(L.len > 0)
+ var/a = L[1]
+ if(istext(a) && L[a] != null)
+ assoc = 1 //This is pretty weak test but i can't think of anything else
+ usr << "List appears to be associative."
- var/variable = input("Which var?","Var") as null|anything in names + "(ADD VAR)"
+ var/list/names = null
+ if(!assoc)
+ names = sortList(L)
+
+ var/variable
+ var/assoc_key
+ if(assoc)
+ variable = input("Which var?","Var") as null|anything in L + "(ADD VAR)"
+ else
+ variable = input("Which var?","Var") as null|anything in names + "(ADD VAR)"
if(variable == "(ADD VAR)")
mod_list_add(L, O, original_name, objectvar)
return
- if(!variable)
+ if(assoc)
+ assoc_key = variable
+ variable = L[assoc_key]
+
+ if(!assoc && !variable || assoc && !assoc_key)
return
var/default
@@ -240,7 +258,12 @@ var/list/VVckey_edit = list("key", "ckey")
if(holder.marked_datum && class == "marked datum ([holder.marked_datum.type])")
class = "marked datum"
- var/original_var = L[L.Find(variable)]
+ var/original_var
+ if(assoc)
+ original_var = L[assoc_key]
+ else
+ original_var = L[L.Find(variable)]
+
var/new_var
switch(class) //Spits a runtime error if you try to modify an entry in the contents list. Dunno how to fix it, yet.
@@ -249,7 +272,10 @@ var/list/VVckey_edit = list("key", "ckey")
if("restore to default")
new_var = initial(variable)
- L[L.Find(variable)] = new_var
+ if(assoc)
+ L[assoc_key] = new_var
+ else
+ L[L.Find(variable)] = new_var
if("edit referenced object")
modify_variables(variable)
@@ -263,35 +289,59 @@ var/list/VVckey_edit = list("key", "ckey")
if("text")
new_var = input("Enter new text:","Text") as text
- L[L.Find(variable)] = new_var
+ if(assoc)
+ L[assoc_key] = new_var
+ else
+ L[L.Find(variable)] = new_var
if("num")
new_var = input("Enter new number:","Num") as num
- L[L.Find(variable)] = new_var
+ if(assoc)
+ L[assoc_key] = new_var
+ else
+ L[L.Find(variable)] = new_var
if("type")
new_var = input("Enter type:","Type") in typesof(/obj,/mob,/area,/turf)
- L[L.Find(variable)] = new_var
+ if(assoc)
+ L[assoc_key] = new_var
+ else
+ L[L.Find(variable)] = new_var
if("reference")
new_var = input("Select reference:","Reference") as mob|obj|turf|area in world
- L[L.Find(variable)] = new_var
+ if(assoc)
+ L[assoc_key] = new_var
+ else
+ L[L.Find(variable)] = new_var
if("mob reference")
new_var = input("Select reference:","Reference") as mob in world
- L[L.Find(variable)] = new_var
+ if(assoc)
+ L[assoc_key] = new_var
+ else
+ L[L.Find(variable)] = new_var
if("file")
new_var = input("Pick file:","File") as file
- L[L.Find(variable)] = new_var
+ if(assoc)
+ L[assoc_key] = new_var
+ else
+ L[L.Find(variable)] = new_var
if("icon")
new_var = input("Pick icon:","Icon") as icon
- L[L.Find(variable)] = new_var
+ if(assoc)
+ L[assoc_key] = new_var
+ else
+ L[L.Find(variable)] = new_var
if("marked datum")
new_var = holder.marked_datum
- L[L.Find(variable)] = new_var
+ if(assoc)
+ L[assoc_key] = new_var
+ else
+ L[L.Find(variable)] = new_var
world.log << "### ListVarEdit by [src]: [O.type] [objectvar]: [original_var]=[new_var]"
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: [original_var]=[new_var]")
@@ -539,4 +589,4 @@ var/list/VVckey_edit = list("key", "ckey")
world.log << "### VarEdit by [src]: [O.type] [variable]=[html_encode("[O.vars[variable]]")]"
log_admin("[key_name(src)] modified [original_name]'s [variable] to [O.vars[variable]]")
- message_admins("[key_name_admin(src)] modified [original_name]'s [variable] to [O.vars[variable]]")
\ No newline at end of file
+ message_admins("[key_name_admin(src)] modified [original_name]'s [variable] to [O.vars[variable]]")
diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm
index 85fb049bd4d..fe8c95b2868 100644
--- a/code/modules/admin/verbs/pray.dm
+++ b/code/modules/admin/verbs/pray.dm
@@ -17,11 +17,21 @@
return
var/image/cross = image('icons/obj/storage.dmi',"bible")
- msg = "\icon[cross] PRAY: [key_name(src, 1)] (? ) (PP ) (VV ) (SM ) (JMP ) (TP ) (SC ): [msg] "
-
+ if(usr.job == "Chaplain")
+ cross = image('icons/obj/storage.dmi',"kingyellow")
+ msg = "\icon[cross] CHAPLAIN PRAYER: [key_name(src, 1)] (? ) (PP ) (VV ) (SM ) (JMP ) (TP ) (SC ): [msg] "
+ else if(iscultist(usr))
+ cross = image('icons/obj/storage.dmi',"tome")
+ msg = "\icon[cross] CULTIST PRAYER: [key_name(src, 1)] (? ) (PP ) (VV ) (SM ) (JMP ) (TP ) (SC ): [msg] "
+ else
+ cross = image('icons/obj/storage.dmi',"bible")
+ msg = "\icon[cross] PRAYER: [key_name(src, 1)] (? ) (PP ) (VV ) (SM ) (JMP ) (TP ) (SC ): [msg] "
for(var/client/C in admins)
if(C.prefs.chat_toggles & CHAT_PRAYER)
C << msg
+ if(C.prefs.toggles & SOUND_PRAYERS)
+ if(usr.job == "Chaplain")
+ C << 'sound/effects/pray.ogg'
usr << "Your prayers have been received by the gods."
feedback_add_details("admin_verb","PR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -29,7 +39,7 @@
/proc/Centcomm_announce(var/text , var/mob/Sender)
var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN)
- msg = " CENTCOM: [key_name(Sender, 1)] (? ) (PP ) (VV ) (SM ) (JMP ) (TP ) (BSA ) (RPLY ): [msg] "
+ msg = "CENTCOM: [key_name(Sender, 1)] (? ) (PP ) (VV ) (SM ) (JMP ) (TP ) (BSA ) (RPLY ): [msg] "
admins << msg
/proc/Syndicate_announce(var/text , var/mob/Sender)
@@ -39,6 +49,6 @@
/proc/Nuke_request(var/text , var/mob/Sender)
var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN)
- msg = " NUKE CODE REQUEST: [key_name(Sender, 1)] (? ) (PP ) (VV ) (SM ) (JMP ) (TP ) (BSA ) (RPLY ): [msg] "
+ msg = "NUKE CODE REQUEST: [key_name(Sender, 1)] (? ) (PP ) (VV ) (SM ) (JMP ) (TP ) (BSA ) (RPLY ): [msg] "
admins << msg
admins << "At this current time, the nuke must have the code manually set via varedit. "
\ No newline at end of file
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 87ebd141d1d..8a455d9e69c 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -298,7 +298,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
//DNA
if(record_found)//Pull up their name from database records if they did have a mind.
- hardset_dna(new_character, record_found.fields["identity"], record_found.fields["enzymes"], record_found.fields["name"], record_found.fields["blood_type"], record_found.fields["species"], record_found.fields["mcolor"])
+ hardset_dna(new_character, record_found.fields["identity"], record_found.fields["enzymes"], record_found.fields["name"], record_found.fields["blood_type"], record_found.fields["species"], record_found.fields["features"])
else//If they have no records, we just do a random DNA for them, based on their random appearance/savefile.
ready_dna(new_character)
diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm
index 5d5aefac0be..1769315acab 100644
--- a/code/modules/assembly/holder.dm
+++ b/code/modules/assembly/holder.dm
@@ -21,6 +21,7 @@
attach(A2,user)
name = "[A.name]-[A2.name] assembly"
update_icon()
+ feedback_add_details("assembly_made","[name]")
/obj/item/device/assembly_holder/proc/attach(var/obj/item/device/assembly/A, var/mob/user)
if(!A.remove_item_from_storage(src))
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 47cfb2c51db..1b737182ae9 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -61,7 +61,8 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
var/skin_tone = "caucasian1" //Skin color
var/eye_color = "000" //Eye color
var/datum/species/pref_species = new /datum/species/human() //Mutant race
- var/mutant_color = "FFF" //Mutant race skin color
+ var/list/features = list("mcolor" = "FFF", "tail" = "Smooth", "snout" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None")
+
var/list/custom_names = list("clown", "mime", "ai", "cyborg", "religion", "deity")
//Mob preview
@@ -243,7 +244,61 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
dat += "Alien Color "
- dat += " Change "
+ dat += " Change "
+
+ dat += ""
+
+ if("tail" in pref_species.mutant_bodyparts)
+ dat += " "
+
+ dat += "Tail "
+
+ dat += "[features["tail"]] "
+
+ dat += " "
+
+ if("snout" in pref_species.mutant_bodyparts)
+ dat += ""
+
+ dat += "Snout "
+
+ dat += "[features["snout"]] "
+
+ dat += " "
+
+ if("horns" in pref_species.mutant_bodyparts)
+ dat += ""
+
+ dat += "Horns "
+
+ dat += "[features["horns"]] "
+
+ dat += " "
+
+ if("frills" in pref_species.mutant_bodyparts)
+ dat += ""
+
+ dat += "Frills "
+
+ dat += "[features["frills"]] "
+
+ dat += " "
+
+ if("spines" in pref_species.mutant_bodyparts)
+ dat += ""
+
+ dat += "Spines "
+
+ dat += "[features["spines"]] "
+
+ dat += " "
+
+ if("body_markings" in pref_species.mutant_bodyparts)
+ dat += ""
+
+ dat += "Body Markings "
+
+ dat += "[features["body_markings"]] "
dat += " "
@@ -264,7 +319,7 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
dat += "Pull requests: [(chat_toggles & CHAT_PULLR) ? "Yes" : "No"] "
dat += "Midround Antagonist: [(toggles & MIDROUND_ANTAG) ? "Yes" : "No"] "
if(config.allow_Metadata)
- dat += "OOC Notes: Edit "
+ dat += "OOC Notes: Edit "
if(user.client)
if(user.client.holder)
@@ -736,19 +791,54 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
if(result)
var/newtype = roundstart_species[result]
pref_species = new newtype()
- if(mutant_color == "#000")
- mutant_color = pref_species.default_color
+ if(features["mcolor"] == "#000")
+ features["mcolor"] = pref_species.default_color
if("mutant_color")
var/new_mutantcolor = input(user, "Choose your character's alien skin color:", "Character Preference") as color|null
if(new_mutantcolor)
var/temp_hsv = RGBtoHSV(new_mutantcolor)
if(new_mutantcolor == "#000000")
- mutant_color = pref_species.default_color
+ features["mcolor"] = pref_species.default_color
else if(ReadHSV(temp_hsv)[3] >= ReadHSV("#7F7F7F")[3]) // mutantcolors must be bright
- mutant_color = sanitize_hexcolor(new_mutantcolor)
+ features["mcolor"] = sanitize_hexcolor(new_mutantcolor)
else
user << "Invalid color. Your color is not bright enough. "
+ if("tail")
+ var/new_tail
+ new_tail = input(user, "Choose your character's tail:", "Character Preference") as null|anything in tails_list
+ if(new_tail)
+ features["tail"] = new_tail
+
+ if("snout")
+ var/new_snout
+ new_snout = input(user, "Choose your character's snout:", "Character Preference") as null|anything in snouts_list
+ if(new_snout)
+ features["snout"] = new_snout
+
+ if("horns")
+ var/new_horns
+ new_horns = input(user, "Choose your character's horns:", "Character Preference") as null|anything in horns_list
+ if(new_horns)
+ features["horns"] = new_horns
+
+ if("frills")
+ var/new_frills
+ new_frills = input(user, "Choose your character's frills:", "Character Preference") as null|anything in frills_list
+ if(new_frills)
+ features["frills"] = new_frills
+
+ if("spines")
+ var/new_spines
+ new_spines = input(user, "Choose your character's spines:", "Character Preference") as null|anything in spines_list
+ if(new_spines)
+ features["spines"] = new_spines
+
+ if("body_markings")
+ var/new_body_markings
+ new_body_markings = input(user, "Choose your character's body markings:", "Character Preference") as null|anything in body_markings_list
+ if(new_body_markings)
+ features["body_markings"] = new_body_markings
if("s_tone")
var/new_s_tone = input(user, "Choose your character's skin-tone:", "Character Preference") as null|anything in skin_tones
@@ -919,10 +1009,9 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
if(character.dna)
character.dna.real_name = character.real_name
if(pref_species != /datum/species/human && config.mutant_races)
- hardset_dna(character, null, null, null, null, pref_species.type)
+ hardset_dna(character, null, null, null, null, pref_species.type, features)
else
- hardset_dna(character, null, null, null, null, /datum/species/human)
- character.dna.mutant_color = mutant_color
+ hardset_dna(character, null, null, null, null, /datum/species/human, features)
character.update_mutcolor()
character.gender = gender
@@ -940,6 +1029,8 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
character.undershirt = undershirt
character.socks = socks
+ character.features = features
+
if(backbag > 3 || backbag < 1)
backbag = 1 //Same as above
character.backbag = backbag
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index f2da84ddd52..a239561ede0 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -166,8 +166,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
else
pref_species = new /datum/species/human()
- if(!S["mutant_color"] || S["mutant_color"] == "#000")
- S["mutant_color"] << "#FFF"
+ if(!S["features["mcolor"]"] || S["features["mcolor"]"] == "#000")
+ S["features["mcolor"]"] << "#FFF"
//Character
S["OOC_Notes"] >> metadata
@@ -186,7 +186,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["undershirt"] >> undershirt
S["socks"] >> socks
S["backbag"] >> backbag
- S["mutant_color"] >> mutant_color
+ S["feature_mcolor"] >> features["mcolor"]
+ S["feature_lizard_tail"] >> features["tail"]
+ S["feature_lizard_snout"] >> features["snout"]
+ S["feature_lizard_horns"] >> features["horns"]
+ S["feature_lizard_frills"] >> features["frills"]
+ S["feature_lizard_spines"] >> features["spines"]
+ S["feature_lizard_body_markings"] >> features["body_markings"]
S["clown_name"] >> custom_names["clown"]
S["mime_name"] >> custom_names["mime"]
S["ai_name"] >> custom_names["ai"]
@@ -213,8 +219,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//Sanitize
metadata = sanitize_text(metadata, initial(metadata))
real_name = reject_bad_name(real_name)
- if(!mutant_color || mutant_color == "#000")
- mutant_color = "#FFF"
+ if(!features["mcolor"] || features["mcolor"] == "#000")
+ features["mcolor"] = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F")
if(!real_name) real_name = random_name(gender)
be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name))
be_random_body = sanitize_integer(be_random_body, 0, 1, initial(be_random_body))
@@ -238,7 +244,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
eye_color = sanitize_hexcolor(eye_color, 3, 0)
skin_tone = sanitize_inlist(skin_tone, skin_tones)
backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag))
- mutant_color = sanitize_hexcolor(mutant_color, 3, 0)
+ features["mcolor"] = sanitize_hexcolor(features["mcolor"], 3, 0)
+ features["tail"] = sanitize_inlist(features["tail"], tails_list)
+ features["snout"] = sanitize_inlist(features["snout"], snouts_list)
+ features["horns"] = sanitize_inlist(features["horns"], horns_list)
+ features["frills"] = sanitize_inlist(features["frills"], frills_list)
+ features["spines"] = sanitize_inlist(features["spines"], spines_list)
+ features["body_markings"] = sanitize_inlist(features["body_markings"], body_markings_list)
userandomjob = sanitize_integer(userandomjob, 0, 1, initial(userandomjob))
job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high))
@@ -279,7 +291,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["socks"] << socks
S["backbag"] << backbag
S["species"] << pref_species.name
- S["mutant_color"] << mutant_color
+ S["feature_mcolor"] << features["mcolor"]
+ S["feature_lizard_tail"] << features["tail"]
+ S["feature_lizard_snout"] << features["snout"]
+ S["feature_lizard_horns"] << features["horns"]
+ S["feature_lizard_frills"] << features["frills"]
+ S["feature_lizard_spines"] << features["spines"]
+ S["feature_lizard_body_markings"] << features["body_markings"]
S["clown_name"] << custom_names["clown"]
S["mime_name"] << custom_names["mime"]
S["ai_name"] << custom_names["ai"]
diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm
index db9fbce26e5..99218130f57 100644
--- a/code/modules/client/preferences_toggles.dm
+++ b/code/modules/client/preferences_toggles.dm
@@ -82,6 +82,18 @@
src << "You will [(prefs.chat_toggles & CHAT_PRAYER) ? "now" : "no longer"] see prayerchat."
feedback_add_details("admin_verb","TP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/client/verb/toggleprayersounds()
+ set name = "Hear/Silence Prayer Sounds"
+ set category = "Preferences"
+ set desc = "Toggles hearing pray sounds."
+ prefs.toggles ^= SOUND_PRAYERS
+ prefs.save_preferences()
+ if(prefs.toggles & SOUND_PRAYERS)
+ src << "You will now hear prayer sounds."
+ else
+ src << "You will no longer prayer sounds."
+ feedback_add_details("admin_verb", "PSounds")
+
/client/verb/togglePRs()
set name = "Show/Hide Pull Request Announcements"
set category = "Preferences"
@@ -208,7 +220,8 @@
var/list/ghost_forms = list("ghost","ghostking","ghostian2","skeleghost","ghost_red","ghost_black", \
"ghost_blue","ghost_yellow","ghost_green","ghost_pink", \
"ghost_cyan","ghost_dblue","ghost_dred","ghost_dgreen", \
- "ghost_dcyan","ghost_grey","ghost_dyellow","ghost_dpink")
+ "ghost_dcyan","ghost_grey","ghost_dyellow","ghost_dpink", "ghost_purpleswirl","ghost_funkypurp","ghost_pinksherbert","ghost_blazeit",\
+ "ghost_mellow","ghost_rainbow","ghost_camo","ghost_fire")
/client/verb/pick_form()
set name = "Choose Ghost Form"
set category = "Preferences"
diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm
index e1d1e53e8b8..cf491f337dd 100644
--- a/code/modules/clothing/head/hardhat.dm
+++ b/code/modules/clothing/head/hardhat.dm
@@ -6,7 +6,7 @@
var/brightness_on = 4 //luminosity when on
var/on = 0
item_color = "yellow" //Determines used sprites: hardhat[on]_[item_color] and hardhat[on]_[item_color]2 (lying down sprite)
- armor = list(melee = 30, bullet = 5, laser = 20,energy = 10, bomb = 20, bio = 10, rad = 20)
+ armor = list(melee = 15, bullet = 5, laser = 20,energy = 10, bomb = 20, bio = 10, rad = 20)
flags_inv = 0
action_button_name = "Toggle Helmet Light"
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 16e472094d2..39658cc78e5 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -4,7 +4,7 @@
icon_state = "helmet"
flags = HEADCOVERSEYES | HEADBANGPROTECT
item_state = "helmet"
- armor = list(melee = 50, bullet = 15, laser = 50,energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 25, bullet = 15, laser = 25,energy = 10, bomb = 25, bio = 0, rad = 0)
flags_inv = HIDEEARS|HIDEEYES
cold_protection = HEAD
min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT
@@ -39,7 +39,7 @@
desc = "A bulletproof combat helmet that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent."
icon_state = "helmetalt"
item_state = "helmetalt"
- armor = list(melee = 25, bullet = 80, laser = 10, energy = 10, bomb = 40, bio = 0, rad = 0)
+ armor = list(melee = 15, bullet = 40, laser = 10, energy = 10, bomb = 40, bio = 0, rad = 0)
/obj/item/clothing/head/helmet/riot
name = "riot helmet"
@@ -50,7 +50,7 @@
alt_toggle_message = "You push the visor up on"
can_toggle = 1
flags = HEADCOVERSEYES|HEADCOVERSMOUTH|HEADBANGPROTECT
- armor = list(melee = 82, bullet = 15, laser = 5,energy = 5, bomb = 5, bio = 2, rad = 0)
+ armor = list(melee = 41, bullet = 15, laser = 5,energy = 5, bomb = 5, bio = 2, rad = 0)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
strip_delay = 80
action_button_name = "Toggle Helmet Visor"
@@ -104,7 +104,7 @@
desc = "An extremely robust, space-worthy helmet with the Nanotrasen logo emblazoned on the top."
icon_state = "swat"
item_state = "swat"
- armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0)
+ armor = list(melee = 40, bullet = 30, laser = 25,energy = 25, bomb = 50, bio = 10, rad = 0)
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
heat_protection = HEAD
@@ -116,7 +116,7 @@
desc = "'Let the battle commence!' "
icon_state = "thunderdome"
item_state = "thunderdome"
- armor = list(melee = 80, bullet = 60, laser = 50,energy = 10, bomb = 25, bio = 10, rad = 0)
+ armor = list(melee = 40, bullet = 30, laser = 25,energy = 10, bomb = 25, bio = 10, rad = 0)
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
heat_protection = HEAD
@@ -152,7 +152,7 @@
icon_state = "redtaghelm"
flags = HEADCOVERSEYES
item_state = "redtaghelm"
- armor = list(melee = 30, bullet = 10, laser = 20,energy = 10, bomb = 20, bio = 0, rad = 0)
+ armor = list(melee = 15, bullet = 10, laser = 20,energy = 10, bomb = 20, bio = 0, rad = 0)
// Offer about the same protection as a hardhat.
flags_inv = HIDEEARS|HIDEEYES
@@ -162,7 +162,7 @@
icon_state = "bluetaghelm"
flags = HEADCOVERSEYES
item_state = "bluetaghelm"
- armor = list(melee = 30, bullet = 10, laser = 20,energy = 10, bomb = 20, bio = 0, rad = 0)
+ armor = list(melee = 15, bullet = 10, laser = 20,energy = 10, bomb = 20, bio = 0, rad = 0)
// Offer about the same protection as a hardhat.
flags_inv = HIDEEARS|HIDEEYES
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index 256138f8beb..4f25a633e2e 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -16,7 +16,7 @@
icon_state = "captain"
item_state = "that"
flags_inv = 0
- armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
strip_delay = 60
//Captain: This is no longer space-worthy
@@ -31,7 +31,7 @@
name = "head of personnel's cap"
icon_state = "hopcap"
desc = "The symbol of true bureaucratic micromanagement."
- armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
//Chaplain
/obj/item/clothing/head/nun_hood
@@ -44,7 +44,7 @@
name = "detective's fedora"
desc = "There's only one man who can sniff out the dirty stench of crime, and he's likely wearing this hat."
icon_state = "detective"
- armor = list(melee = 50, bullet = 5, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 25, bullet = 5, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
//Mime
/obj/item/clothing/head/beret
@@ -58,7 +58,7 @@
name = "head of security cap"
desc = "The robust standard-issue cap of the Head of Security. For showing the officers who's in charge."
icon_state = "hoscap"
- armor = list(melee = 80, bullet = 60, laser = 50, energy = 10, bomb = 25, bio = 10, rad = 0)
+ armor = list(melee = 40, bullet = 30, laser = 25, energy = 10, bomb = 25, bio = 10, rad = 0)
strip_delay = 80
/obj/item/clothing/head/HoS/beret
@@ -70,7 +70,7 @@
name = "warden's police hat"
desc = "It's a special armored hat issued to the Warden of a security force. Protects the head from impacts."
icon_state = "policehelm"
- armor = list(melee = 60, bullet = 5, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 5, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
strip_delay = 60
/obj/item/clothing/head/beret/sec
@@ -89,7 +89,7 @@
name = "warden's beret"
desc = "A special beret with the Warden's insignia emblazoned on it. For wardens with class."
icon_state = "wardenberet"
- armor = list(melee = 60, bullet = 5, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 5, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
strip_delay = 60
/obj/item/clothing/head/beret/sec/navyofficer
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 266bfda4689..955e194aeac 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -6,7 +6,7 @@
desc = "It's good to be emperor."
item_state = "that"
flags_inv = 0
- armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0)
strip_delay = 80
/obj/item/clothing/head/powdered_wig
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 3675ba81ded..e651a87e18a 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -19,7 +19,7 @@
desc = "High speed, low drag combat boots."
icon_state = "jackboots"
item_state = "jackboots"
- armor = list(melee = 50, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 10, rad = 0)
+ armor = list(melee = 25, bullet = 25, laser = 25, energy = 25, bomb = 50, bio = 10, rad = 0)
strip_delay = 70
/obj/item/clothing/shoes/combat/swat //overpowered boots for death squads
@@ -27,7 +27,7 @@
desc = "High speed, no drag combat boots."
permeability_coefficient = 0.01
flags = NOSLIP
- armor = list(melee = 80, bullet = 60, laser = 50, energy = 50, bomb = 50, bio = 30, rad = 30)
+ armor = list(melee = 40, bullet = 30, laser = 25, energy = 25, bomb = 50, bio = 30, rad = 30)
/obj/item/clothing/shoes/sandal
desc = "A pair of rather plain, wooden sandals."
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index e8746d637c6..4c0d46b7c43 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -135,7 +135,7 @@
icon_state = "hardsuit0-mining"
item_state = "mining_helm"
item_color = "mining"
- armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
+ armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
brightness_on = 7
@@ -144,7 +144,7 @@
name = "mining hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has reinforced plating for wildlife encounters."
item_state = "mining_hardsuit"
- armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
+ armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals,/obj/item/weapon/storage/bag/ore,/obj/item/weapon/pickaxe)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/mining
@@ -158,7 +158,7 @@
icon_state = "hardsuit1-syndi"
item_state = "syndie_helm"
item_color = "syndi"
- armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
+ armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
on = 0
var/obj/item/clothing/suit/space/hardsuit/syndi/linkedsuit = null
action_button_name = "Toggle Helmet Mode"
@@ -229,7 +229,7 @@
slowdown = 1
w_class = 3
action_button_name = "Toggle Helmet"
- armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
+ armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index cf8a9d9e5a6..9fedcc0e3a8 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -6,7 +6,7 @@
desc = "A special helmet designed for only the most fashionable of military figureheads."
flags_inv = HIDEFACE
permeability_coefficient = 0.01
- armor = list(melee = 65, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50)
+ armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50)
/obj/item/clothing/suit/space/captain
name = "captain's space suit"
@@ -16,7 +16,7 @@
w_class = 4
allowed = list(/obj/item/weapon/tank/internals, /obj/item/device/flashlight,/obj/item/weapon/gun/energy, /obj/item/weapon/gun/projectile, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs)
slowdown = 1
- armor = list(melee = 65, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50)
+ armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50)
//Death squad armored space suits, not hardsuits!
@@ -25,7 +25,7 @@
desc = "That's not red paint. That's real blood."
icon_state = "deathsquad"
item_state = "deathsquad"
- armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100)
+ armor = list(melee = 50, bullet = 40, laser = 30, energy = 50, bomb = 50, bio = 100, rad = 100)
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
unacidable = 1
@@ -40,7 +40,7 @@
icon_state = "deathsquad"
item_state = "swat_suit"
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
- armor = list(melee = 80, bullet = 80, laser = 50,energy = 50, bomb = 100, bio = 100, rad = 100)
+ armor = list(melee = 50, bullet = 40, laser = 30,energy = 50, bomb = 50, bio = 100, rad = 100)
slowdown = 1
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
@@ -53,7 +53,7 @@
icon_state = "beret_badge"
flags = STOPSPRESSUREDMAGE
flags_inv = 0
- armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100)
+ armor = list(melee = 50, bullet = 40, laser = 30, energy = 50, bomb = 50, bio = 100, rad = 100)
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
unacidable = 1
@@ -68,7 +68,7 @@
flags_inv = 0
w_class = 3
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
- armor = list(melee = 80, bullet = 80, laser = 50,energy = 50, bomb = 100, bio = 100, rad = 100)
+ armor = list(melee = 50, bullet = 40, laser = 30,energy = 50, bomb = 50, bio = 100, rad = 100)
slowdown = 1
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
@@ -114,7 +114,7 @@
desc = "Yarr."
icon_state = "pirate"
item_state = "pirate"
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
+ armor = list(melee = 30, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
flags = HEADCOVERSEYES | BLOCKHAIR | STOPSPRESSUREDMAGE
strip_delay = 40
put_on_delay = 20
@@ -128,7 +128,7 @@
flags_inv = 0
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
slowdown = 0
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
+ armor = list(melee = 30, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
strip_delay = 40
put_on_delay = 20
@@ -151,7 +151,7 @@
item_state = "ert_command"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
- armor = list(melee = 65, bullet = 50, laser = 50, energy = 50, bomb = 50, bio = 100, rad = 100)
+ armor = list(melee = 30, bullet = 50, laser = 30, energy = 50, bomb = 50, bio = 100, rad = 100)
slowdown = 0
strip_delay = 130
@@ -216,7 +216,7 @@
desc = "An advanced, space-proof helmet. It appears to be modeled after an old-world eagle."
icon_state = "griffinhat"
item_state = "griffinhat"
- armor = list(melee = 40, bullet = 40, laser = 30, energy = 25, bomb = 100, bio = 100, rad = 100)
+ armor = list(melee = 20, bullet = 40, laser = 30, energy = 25, bomb = 100, bio = 100, rad = 100)
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
unacidable = 1
@@ -227,7 +227,7 @@
icon_state = "freedom"
item_state = "freedom"
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
- armor = list(melee = 40, bullet = 40, laser = 30,energy = 25, bomb = 100, bio = 100, rad = 100)
+ armor = list(melee = 20, bullet = 40, laser = 30,energy = 25, bomb = 100, bio = 100, rad = 100)
slowdown = 1
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
diff --git a/code/modules/clothing/spacesuits/syndi.dm b/code/modules/clothing/spacesuits/syndi.dm
index 4f96b191df6..71f7a5d98ae 100644
--- a/code/modules/clothing/spacesuits/syndi.dm
+++ b/code/modules/clothing/spacesuits/syndi.dm
@@ -5,7 +5,7 @@
icon_state = "syndicate"
item_state = "syndicate"
desc = "Has a tag: Totally not property of an enemy corporation, honest."
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
+ armor = list(melee = 40, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
/obj/item/clothing/suit/space/syndicate
name = "red space suit"
@@ -15,7 +15,7 @@
w_class = 3
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
slowdown = 1
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
+ armor = list(melee = 40, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
//Green syndicate space suit
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index d65ea343015..f5a4fb0b4fb 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -14,7 +14,7 @@
icon_state = "armor"
item_state = "armor"
blood_overlay_type = "armor"
- armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
/obj/item/clothing/suit/armor/hos
name = "armored greatcoat"
@@ -22,7 +22,7 @@
icon_state = "hos"
item_state = "greatcoat"
body_parts_covered = CHEST|GROIN|ARMS|LEGS
- armor = list(melee = 65, bullet = 30, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0)
flags_inv = HIDEJUMPSUIT
cold_protection = CHEST|GROIN|LEGS|ARMS
heat_protection = CHEST|GROIN|LEGS|ARMS
@@ -57,7 +57,7 @@
icon_state = "capcarapace"
item_state = "armor"
body_parts_covered = CHEST|GROIN
- armor = list(melee = 50, bullet = 30, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 50, bullet = 40, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
/obj/item/clothing/suit/armor/riot
@@ -65,11 +65,10 @@
desc = "A suit of armor with heavy padding to protect against melee attacks. Looks like it might impair movement."
icon_state = "riot"
item_state = "swat_suit"
- slowdown = 1
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- armor = list(melee = 80, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
flags_inv = HIDEJUMPSUIT
strip_delay = 80
put_on_delay = 60
@@ -80,7 +79,7 @@
icon_state = "bulletproof"
item_state = "armor"
blood_overlay_type = "armor"
- armor = list(melee = 25, bullet = 80, laser = 10, energy = 10, bomb = 40, bio = 0, rad = 0)
+ armor = list(melee = 15, bullet = 60, laser = 10, energy = 10, bomb = 40, bio = 0, rad = 0)
strip_delay = 70
put_on_delay = 50
@@ -90,7 +89,7 @@
icon_state = "armor_reflec"
item_state = "armor_reflec"
blood_overlay_type = "armor"
- armor = list(melee = 10, bullet = 10, laser = 80, energy = 50, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 10, bullet = 10, laser = 60, energy = 50, bomb = 0, bio = 0, rad = 0)
var/hit_reflect_chance = 40
/obj/item/clothing/suit/armor/laserproof/IsReflect(var/def_zone)
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index dbb82e319f8..7bad9b13400 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -82,7 +82,7 @@
blood_overlay_type = "coat"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
allowed = list(/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder)
- armor = list(melee = 50, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 25, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
cold_protection = CHEST|GROIN|LEGS|ARMS
heat_protection = CHEST|GROIN|LEGS|ARMS
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 91098d07f84..37b771b0c15 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -271,13 +271,13 @@
/obj/item/clothing/suit/hooded/wintercoat/captain
name = "captain's winter coat"
icon_state = "coatcaptain"
- armor = list(melee = 50, bullet = 30, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 25, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0)
allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite,/obj/item/weapon/melee/classic_baton/telescopic)
/obj/item/clothing/suit/hooded/wintercoat/security
name = "security winter coat"
icon_state = "coatsecurity"
- armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 25, bullet = 15, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0)
allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite,/obj/item/weapon/melee/classic_baton/telescopic)
/obj/item/clothing/suit/hooded/wintercoat/medical
diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm
index 89a5f7bc936..c32db545664 100644
--- a/code/modules/clothing/suits/utility.dm
+++ b/code/modules/clothing/suits/utility.dm
@@ -56,7 +56,7 @@
desc = "Use in case of bomb."
icon_state = "bombsuit"
flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR|THICKMATERIAL
- armor = list(melee = 40, bullet = 0, laser = 20,energy = 10, bomb = 100, bio = 0, rad = 0)
+ armor = list(melee = 20, bullet = 0, laser = 20,energy = 10, bomb = 100, bio = 0, rad = 0)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
cold_protection = HEAD
min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT
@@ -77,7 +77,7 @@
flags = THICKMATERIAL
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
slowdown = 2
- armor = list(melee = 40, bullet = 0, laser = 20,energy = 10, bomb = 100, bio = 0, rad = 0)
+ armor = list(melee = 20, bullet = 0, laser = 20,energy = 10, bomb = 100, bio = 0, rad = 0)
flags_inv = HIDEJUMPSUIT
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm
index 2aecf9f789b..dd22a1e9f5c 100644
--- a/code/modules/clothing/suits/wiz_robe.dm
+++ b/code/modules/clothing/suits/wiz_robe.dm
@@ -19,6 +19,11 @@
desc = "Strange-looking yellow hat-wear that most certainly belongs to a powerful magic user."
icon_state = "yellowwizard"
+/obj/item/clothing/head/wizard/black
+ name = "black wizard hat"
+ desc = "Strange-looking black hat-wear that most certainly belongs to a real skeleton. Spooky."
+ icon_state = "blackwizard"
+
/obj/item/clothing/head/wizard/fake
name = "wizard hat"
desc = "It has WIZZARD written across it in sequins. Comes with a cool beard."
@@ -72,6 +77,12 @@
icon_state = "yellowwizard"
item_state = "yellowwizrobe"
+/obj/item/clothing/suit/wizrobe/black
+ name = "black wizard robe"
+ desc = "An unnerving black gem-lined robe that reeks of death and decay."
+ icon_state = "blackwizard"
+ item_state = "blackwizrobe"
+
/obj/item/clothing/suit/wizrobe/marisa
name = "witch robe"
desc = "Magic is all about the spell power, ZE!"
diff --git a/code/modules/crafting/table.dm b/code/modules/crafting/table.dm
index 75847c323f4..7f6e111599a 100644
--- a/code/modules/crafting/table.dm
+++ b/code/modules/crafting/table.dm
@@ -78,6 +78,7 @@
/obj/structure/table/proc/construct_item(mob/user, datum/table_recipe/R)
check_table()
+ var/send_feedback = 1
if(check_contents(R) && check_tools(user, R))
if(do_after(user, R.time))
if(!check_contents(R) || !check_tools(user, R))
@@ -86,6 +87,8 @@
if(istype(I, /obj/item/weapon/reagent_containers/food/snacks))
var/obj/item/weapon/reagent_containers/food/snacks/S = I
S.create_reagents(S.volume)
+ feedback_add_details("food_made","[S.name]")
+ send_feedback = 0
var/list/parts = del_reqs(R, I)
for(var/A in parts)
if(istype(A, /obj/item))
@@ -98,6 +101,8 @@
I.reagents = new /datum/reagents()
I.reagents.reagent_list.Add(A)
I.CheckParts()
+ if(send_feedback)
+ feedback_add_details("object_crafted","[I.name]")
return 1
return 0
diff --git a/code/modules/events/camerafailure.dm b/code/modules/events/camerafailure.dm
new file mode 100644
index 00000000000..458b50e9a83
--- /dev/null
+++ b/code/modules/events/camerafailure.dm
@@ -0,0 +1,20 @@
+/datum/round_event_control/camera_failure
+ name = "Camera Failure"
+ typepath = /datum/round_event/camera_failure
+ weight = 100
+ max_occurrences = 20
+ alertadmins = 0
+
+/datum/round_event/camera_failure
+ startWhen = 1
+ endWhen = 2
+ announceWhen = 0
+
+/datum/round_event/camera_failure/tick()
+ var/iterations = 1
+ var/obj/machinery/camera/C = pick(cameranet.cameras)
+ while(prob(round(100/iterations)))
+ while(!("SS13" in C.network))
+ C = pick(cameranet.cameras)
+ C.deactivate(null, 0)
+ iterations *= 2.5
diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm
index 3dad124aabe..078f7dab63b 100644
--- a/code/modules/events/dust.dm
+++ b/code/modules/events/dust.dm
@@ -1,12 +1,11 @@
/datum/round_event_control/meteor_wave/dust
name = "Minor Space Dust"
typepath = /datum/round_event/meteor_wave/dust
- weight = 300
+ weight = 200
max_occurrences = 1000
earliest_start = 0
alertadmins = 0
-
/datum/round_event/meteor_wave/dust
startWhen = 1
endWhen = 2
@@ -19,4 +18,4 @@
spawn_meteors(1, meteorsC)
/datum/round_event/meteor_wave/dust/tick()
- return
\ No newline at end of file
+ return
diff --git a/code/modules/events/event.dm b/code/modules/events/event.dm
index e9661d5dc7c..07dbff7d269 100644
--- a/code/modules/events/event.dm
+++ b/code/modules/events/event.dm
@@ -28,6 +28,7 @@
return PROCESS_KILL
var/datum/round_event/E = new typepath()
E.control = src
+ feedback_add_details("event_ran","[E]")
occurrences++
testing("[time2text(world.time, "hh:mm:ss")] [E.type]")
diff --git a/code/modules/events/wizard/race.dm b/code/modules/events/wizard/race.dm
index 4eb0c5bf1a7..bed5d08b5f4 100644
--- a/code/modules/events/wizard/race.dm
+++ b/code/modules/events/wizard/race.dm
@@ -10,9 +10,10 @@
var/all_the_same = 0
var/all_species = list()
- for(var/datum/species/S in typesof(/datum/species) - /datum/species)
+ for(var/speciestype in typesof(/datum/species) - /datum/species)
+ var/datum/species/S = new speciestype()
if(!S.dangerous_existence)
- all_species += S
+ all_species += speciestype
var/new_species = pick(all_species)
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index e3aa865a141..388da344db4 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -22,184 +22,346 @@ Gunshots/explosions/opening doors/less rare audio (done)
/mob/living/carbon/proc/handle_hallucinations()
if(handling_hal)
return
+
+ //Least obvious
+ var/list/minor = list("sounds"=20,"bolts_minor"=10,"whispers"=15,"message"=5)
+ //Something's wrong here
+ var/list/medium = list("hudscrew"=15,"items"=15,"dangerflash"=15,"bolts"=10,"flood"=10,"husks"=10,"battle"=10)
+ //AAAAH
+ var/list/major = list("fake"=10,"death"=5,"xeno"=10,"singulo"=10,"delusion"=10)
+
+ var/grade = 0
+ var/current = list()
+ var/trip_length = 0
+
handling_hal = 1
while(hallucination > 20)
sleep(rand(200,500)/(hallucination/25))
- var/halpick = rand(1,100)
- switch(halpick)
- if(0 to 15)
- //Screwy HUD
- //src << "Screwy HUD"
- hal_screwyhud = pick(1,2,3,3,4,4)
- spawn(rand(100,250))
- hal_screwyhud = 0
- if(16 to 25)
- //Strange items
- //src << "Traitor Items"
- if(!halitem)
- halitem = new
- var/list/slots_free = list(ui_lhand,ui_rhand)
- if(l_hand) slots_free -= ui_lhand
- if(r_hand) slots_free -= ui_rhand
- if(istype(src,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = src
- if(!H.belt) slots_free += ui_belt
- if(!H.l_store) slots_free += ui_storage1
- if(!H.r_store) slots_free += ui_storage2
- if(slots_free.len)
- halitem.screen_loc = pick(slots_free)
- halitem.layer = 50
- switch(rand(1,6))
- if(1) //revolver
- halitem.icon = 'icons/obj/guns/projectile.dmi'
- halitem.icon_state = "revolver"
- halitem.name = "Revolver"
- if(2) //c4
- halitem.icon = 'icons/obj/assemblies.dmi'
- halitem.icon_state = "plastic-explosive0"
- halitem.name = "Mysterious Package"
- if(prob(25))
- halitem.icon_state = "c4small_1"
- if(3) //sword
- halitem.icon = 'icons/obj/weapons.dmi'
- halitem.icon_state = "sword1"
- halitem.name = "Sword"
- if(4) //stun baton
- halitem.icon = 'icons/obj/weapons.dmi'
- halitem.icon_state = "stunbaton"
- halitem.name = "Stun Baton"
- if(5) //emag
- halitem.icon = 'icons/obj/card.dmi'
- halitem.icon_state = "emag"
- halitem.name = "Cryptographic Sequencer"
- if(6) //flashbang
- halitem.icon = 'icons/obj/grenade.dmi'
- halitem.icon_state = "flashbang1"
- halitem.name = "Flashbang"
- if(client) client.screen += halitem
- spawn(rand(100,250))
- qdel(halitem)
- if(26 to 40)
- //Flashes of danger
- //src << "Danger Flash"
- if(!halimage)
- var/list/possible_points = list()
- for(var/turf/simulated/floor/F in view(src,world.view))
- possible_points += F
- if(possible_points.len)
- var/turf/simulated/floor/target = pick(possible_points)
+ trip_length += 1
+ if(prob(min(20,trip_length*2)))
+ grade = min(3,grade+1)
+ if(prob(20))
+ continue
+ current = list()
+ for(var/a in minor)
+ current[a] = minor[a] * (grade==0?2:1)
+ for(var/b in medium)
+ current[b] = medium[b] * (grade==1?2:1)
+ for(var/c in major)
+ current[c] = major[c] * (grade==2?2:1)
- switch(rand(1,3))
- if(1)
- //src << "Space"
- halimage = image('icons/turf/space.dmi',target,"[rand(1,25)]",TURF_LAYER)
- if(2)
- //src << "Fire"
- halimage = image('icons/effects/fire.dmi',target,"1",TURF_LAYER)
- if(3)
- //src << "C4"
- halimage = image('icons/obj/assemblies.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01)
+ var/halpick = pickweight(current)
-
- if(client) client.images += halimage
- spawn(rand(10,50)) //Only seen for a brief moment.
- if(client) client.images -= halimage
- halimage = null
-
-
- if(41 to 65)
- //Strange audio
- //src << "Strange Audio"
- switch(rand(1,14))
- if(1) src << 'sound/machines/airlock.ogg'
- if(2)
- if(prob(50))src << 'sound/effects/Explosion1.ogg'
- else src << 'sound/effects/Explosion2.ogg'
- if(3) src << 'sound/effects/explosionfar.ogg'
- if(4) src << 'sound/effects/Glassbr1.ogg'
- if(5) src << 'sound/effects/Glassbr2.ogg'
- if(6) src << 'sound/effects/Glassbr3.ogg'
- if(7) src << 'sound/machines/twobeep.ogg'
- if(8) src << 'sound/machines/windowdoor.ogg'
- if(9)
- //To make it more realistic, I added two gunshots (enough to kill)
- src << 'sound/weapons/Gunshot.ogg'
- spawn(rand(10,30))
- src << 'sound/weapons/Gunshot.ogg'
- if(10) src << 'sound/weapons/smash.ogg'
- if(11)
- //Same as above, but with tasers.
- src << 'sound/weapons/Taser.ogg'
- spawn(rand(10,30))
- src << 'sound/weapons/Taser.ogg'
- //Rare audio
- if(12)
-//These sounds are (mostly) taken from Hidden: Source
- var/list/creepyasssounds = list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/Heart Beat.ogg', 'sound/effects/screech.ogg',\
- 'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\
- 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\
- 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\
- 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg')
- src << pick(creepyasssounds)
- if(13)
- src << "You feel a tiny prick! "
- if(14)
- src << "Priority Announcement "
- src << "The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle. "
- src << sound('sound/AI/shuttledock.ogg')
- if(66 to 70)
- //Flashes of danger
- if(!halbody)
- var/list/possible_points = list()
- for(var/turf/simulated/floor/F in view(src,world.view))
- possible_points += F
- if(possible_points.len)
- var/turf/simulated/floor/target = pick(possible_points)
- switch(rand(1,4))
- if(1)
- halbody = image('icons/mob/human.dmi',target,"husk_l",TURF_LAYER)
- if(2,3)
- halbody = image('icons/mob/human.dmi',target,"husk_s",TURF_LAYER)
- if(4)
- halbody = image('icons/mob/alien.dmi',target,"alienother",TURF_LAYER)
-
- if(client) client.images += halbody
- spawn(rand(50,80)) //Only seen for a brief moment.
- if(client) client.images -= halbody
- halbody = null
- if(71 to 72)
- //Fake death
- src.sleeping = 20
- hal_crit = 1
- hal_screwyhud = 1
- spawn(rand(50,100))
- src.sleeping = 0
- hal_crit = 0
- hal_screwyhud = 0
- if(73 to 75)
- fake_attack()
+ hallucinate(halpick)
handling_hal = 0
+/obj/effect/hallucination
+ invisibility = INVISIBILITY_OBSERVER
+ var/mob/living/carbon/target = null
-/mob/living/carbon/proc/fake_attack()
-// var/list/possible_clones = new/list()
+/obj/effect/hallucination/simple
+ var/image_icon = 'icons/mob/alien.dmi'
+ var/image_state = "alienh_pounce"
+ var/px = 0
+ var/py = 0
+ var/col_mod = null
+ var/image/current_image = null
+ var/image_layer = MOB_LAYER
+ var/active = 1 //qdelery
+
+/obj/effect/hallucination/simple/New(loc,var/mob/living/carbon/T)
+ target = T
+ current_image = GetImage()
+ if(target.client) target.client.images |= current_image
+ return
+
+/obj/effect/hallucination/simple/proc/GetImage()
+ var/image/I = image(image_icon,loc,image_state,image_layer,dir=src.dir)
+ I.pixel_x = px
+ I.pixel_y = py
+ if(col_mod)
+ I.color = col_mod
+ return I
+
+/obj/effect/hallucination/simple/proc/Show(var/update=1)
+ if(active)
+ if(target.client) target.client.images.Remove(current_image)
+ if(update)
+ current_image = GetImage()
+ if(target.client) target.client.images |= current_image
+
+/obj/effect/hallucination/simple/update_icon(var/new_state,var/new_icon,var/new_px=0,var/new_py=0)
+ image_state = new_state
+ if(new_icon)
+ image_icon = new_icon
+ else
+ image_icon = initial(image_icon)
+ px = new_px
+ py = new_py
+ Show()
+
+/obj/effect/hallucination/simple/Moved(atom/OldLoc, Dir)
+ Show()
+ return
+
+/obj/effect/hallucination/simple/Destroy()
+ if(target.client) target.client.images.Remove(current_image)
+ active = 0
+
+#define FAKE_FLOOD_EXPAND_TIME 30
+#define FAKE_FLOOD_MAX_RADIUS 7
+
+/obj/effect/hallucination/fake_flood
+ //Plasma/N2O starts flooding from the nearby vent
+ var/list/flood_images = list()
+ var/list/turf/flood_turfs = list()
+ var/image_icon = 'icons/effects/tile_effects.dmi'
+ var/image_state = "plasma"
+ var/radius = 0
+ var/next_expand = 0
+
+/obj/effect/hallucination/fake_flood/New(loc,var/mob/living/carbon/T)
+ ..()
+ target = T
+ for(var/obj/machinery/atmospherics/unary/vent_pump/U in orange(7,target))
+ if(!U.welded)
+ src.loc = U.loc
+ break
+ image_state = pick("plasma","sleeping_agent")
+ flood_images += image(image_icon,src,image_state,MOB_LAYER)
+ flood_turfs += get_turf(src.loc)
+ if(target.client) target.client.images |= flood_images
+ next_expand = world.time + FAKE_FLOOD_EXPAND_TIME
+ SSobj.processing |= src
+
+/obj/effect/hallucination/fake_flood/process()
+ if(next_expand <= world.time)
+ radius++
+ if(radius > FAKE_FLOOD_MAX_RADIUS)
+ qdel(src)
+ Expand()
+ next_expand = world.time + FAKE_FLOOD_EXPAND_TIME
+ return
+
+/obj/effect/hallucination/fake_flood/proc/Expand()
+ if(!flood_turfs) //for qdel
+ return
+ for(var/turf/T in circlerangeturfs(loc,radius))
+ if((T in flood_turfs)|| T.blocks_air)
+ continue
+ flood_images += image(image_icon,T,image_state,MOB_LAYER)
+ flood_turfs += T
+ if(target.client) target.client.images |= flood_images
+ return
+
+/obj/effect/hallucination/fake_flood/Destroy()
+ SSobj.processing.Remove(src)
+ del(flood_turfs)
+ if(target.client) target.client.images.Remove(flood_images)
+ target = null
+ del(flood_images)
+ return
+
+/obj/effect/hallucination/simple/xeno
+ image_icon = 'icons/mob/alien.dmi'
+ image_state = "alienh_pounce"
+
+/obj/effect/hallucination/simple/xeno/New(loc,var/mob/living/carbon/T)
+ ..()
+ name = "alien hunter ([rand(1, 1000)])"
+ return
+
+/obj/effect/hallucination/simple/xeno/throw_at(atom/target, range, speed) // TODO : Make diagonal trhow into proc/property
+ if(!target || !src || (flags & NODROP)) return 0
+
+ src.throwing = 1
+
+ var/dist_x = abs(target.x - src.x)
+ var/dist_y = abs(target.y - src.y)
+ var/dist_travelled = 0
+ var/dist_since_sleep = 0
+
+ var/tdist_x = dist_x;
+ var/tdist_y = dist_y;
+
+ if(dist_x <= dist_y)
+ tdist_x = dist_y;
+ tdist_y = dist_x;
+
+ var/error = tdist_x/2 - tdist_y
+ while(target && (((((dist_x > dist_y) && ((src.x < target.x) || (src.x > target.x))) || ((dist_x <= dist_y) && ((src.y < target.y) || (src.y > target.y))) || (src.x > target.x)) && dist_travelled < range) || !has_gravity(src)))
+
+ if(!src.throwing) break
+ if(!istype(src.loc, /turf)) break
+
+ var/atom/step = get_step(src, get_dir(src,target))
+ if(!step)
+ break
+ src.Move(step, get_dir(src, step))
+ hit_check()
+ error += (error < 0) ? tdist_x : -tdist_y;
+ dist_travelled++
+ dist_since_sleep++
+ if(dist_since_sleep >= speed)
+ dist_since_sleep = 0
+ sleep(1)
+
+
+ src.throwing = 0
+ src.throw_impact(get_turf(src))
+
+ return 1
+
+/obj/effect/hallucination/simple/xeno/throw_impact(A)
+ update_icon("alienh_pounce")
+ if(A == target)
+ target.Weaken(5)
+ target.visible_message("[target] flails around wildly. ","[name] pounces on you! ")
+
+/obj/effect/hallucination/xeno_attack
+ //Xeno crawls from nearby vent,jumps at you, and goes back in
+ var/obj/machinery/atmospherics/unary/vent_pump/pump = null
+ var/obj/effect/hallucination/simple/xeno/xeno = null
+
+/obj/effect/hallucination/xeno_attack/New(loc,var/mob/living/carbon/T)
+ target = T
+ for(var/obj/machinery/atmospherics/unary/vent_pump/U in orange(7,target))
+ if(!U.welded)
+ pump = U
+ break
+ xeno = new(pump.loc,target)
+ sleep(10)
+ xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32)
+ xeno.throw_at(target,7,1)
+ sleep(10)
+ xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32)
+ xeno.throw_at(pump,7,1)
+ sleep(10)
+ var/xeno_name = xeno.name
+ target << "[xeno_name] begins climbing into the ventilation system... "
+ sleep(10)
+ qdel(xeno)
+ target << "[xeno_name] scrambles into the ventilation ducts! "
+ qdel(src)
+
+/obj/effect/hallucination/singularity_scare
+ //Singularity moving towards you.
+ //todo Hide where it moved with fake space images
+ var/obj/effect/hallucination/simple/singularity/s = null
+
+/obj/effect/hallucination/singularity_scare/New(loc,var/mob/living/carbon/T)
+ target = T
+ var/turf/start = T.loc
+ var/screen_border = pick(SOUTH,EAST,WEST,NORTH)
+ for(var/i = 0,i<11,i++)
+ start = get_step(start,screen_border)
+ s = new(start,target)
+ for(var/i = 0,i<11,i++)
+ sleep(5)
+ s.loc = get_step(get_turf(s),get_dir(s,target))
+ s.Show()
+ s.Eat()
+ qdel(s)
+
+/obj/effect/hallucination/simple/singularity
+ image_icon = 'icons/effects/224x224.dmi'
+ image_state = "singularity_s7"
+ image_layer = 6
+ px = -96
+ py = -96
+
+/obj/effect/hallucination/simple/singularity/proc/Eat(atom/OldLoc, Dir)
+ var/target_dist = get_dist(src,target)
+ if(target_dist<=3) //"Eaten"
+ target.sleeping = 20
+ target.hal_crit = 1
+ target.hal_screwyhud = 1
+ spawn(rand(50,100))
+ target.sleeping = 0
+ target.hal_crit = 0
+ target.hal_screwyhud = 0
+
+/obj/effect/hallucination/battle
+
+/obj/effect/hallucination/battle/New(loc,var/mob/living/carbon/T)
+ target = T
+ var/hits = rand(3,6)
+ switch(rand(1,5))
+ if(1) //Laser fight
+ for(var/i=0,i[my_target] has attacked [src]!")
src.health -= P.force
-
-
return
/obj/effect/fake_attacker/Crossed(var/mob/M, somenumber)
@@ -266,20 +425,18 @@ Gunshots/explosions/opening doors/less rare audio (done)
for(var/mob/O in oviewers(world.view , my_target))
O << "[my_target] stumbles around. "
-/obj/effect/fake_attacker/New()
+/obj/effect/fake_attacker/New(loc,var/mob/living/carbon/T)
..()
+ my_target = T
spawn(300)
- if(my_target)
- my_target.hallucinations -= src
qdel(src)
step_away(src,my_target,2)
- spawn attack_loop()
+ spawn(0)
+ attack_loop()
/obj/effect/fake_attacker/proc/updateimage()
// del src.currentimage
-
-
if(src.dir == NORTH)
del src.currentimage
src.currentimage = new /image(up,src)
@@ -356,3 +513,251 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
/obj/item/clothing/under/rank/captain, /obj/item/device/aicard,\
/obj/item/clothing/shoes/magboots, /obj/item/areaeditor/blueprints, /obj/item/weapon/disk/nuclear,\
/obj/item/clothing/suit/space/nasavoid, /obj/item/weapon/tank)
+
+/obj/effect/hallucination/bolts
+ var/list/doors = list()
+
+/obj/effect/hallucination/bolts/New(loc,var/mob/living/carbon/T,var/door_number=-1) //-1 for sever 1-2 for subtle
+ target = T
+ var/image/I = null
+ var/count = 0
+ for(var/obj/machinery/door/airlock/A in range(target,7))
+ if(count>door_number && door_number>0)
+ break
+ count++
+ I = image(A.icon,A,"door_locked",layer=A.layer+0.1)
+ doors += I
+ if(target.client)
+ target.client.images |= I
+ sleep(2)
+ sleep(100)
+ for(var/image/B in doors)
+ if(target.client)
+ target.client.images.Remove(B)
+ qdel(src)
+
+/obj/effect/hallucination/whispers
+
+/obj/effect/hallucination/whispers/New(loc,var/mob/living/carbon/T)
+ target = T
+ var/speak_messages = list("I'm watching you...","[target.name]!","Go away!","Kchck-Chkck? Kchchck!","Did you hear that?","What did you do ?","Why?","Give me that!","Honk!","HELP!!")
+ var/radio_messages = list("Xenos!","Singularity loose!","They are arming the nuke!","They butchered Ian!","H-help!","[pick(teleportlocs)]!!","Where's [target.name]?","Call the shuttle!")
+
+ var/list/mob/living/carbon/people = list()
+ var/list/mob/living/carbon/person = null
+ for(var/mob/living/carbon/H in view(target))
+ if(H == target)
+ continue
+ if(!person)
+ person = H
+ else
+ if(get_dist(target,H)The light burns you!", \
+ "You don't feel like yourself. ", \
+ "Unknown has punched [target]! ", \
+ "You hear something squeezing through the ducts... ", \
+ "You hear a distant scream. ", \
+ "You feel invincible, nothing can hurt you! ", \
+ "[target] sneezes.", \
+ "You feel faint. ", \
+ "You hear a strange, alien voice in your head... [pick("Hiss","Ssss")]", \
+ "You can see...everything! ")
+ target << chosen
+ qdel(src)
+
+/mob/living/carbon/proc/hallucinate(var/hal_type) // Todo -> proc / defines
+ switch(hal_type)
+ if("xeno")
+ new /obj/effect/hallucination/xeno_attack(src.loc,src)
+ if("singulo")
+ new /obj/effect/hallucination/singularity_scare(src.loc,src)
+ if("battle")
+ new /obj/effect/hallucination/battle(src.loc,src)
+ if("flood")
+ new /obj/effect/hallucination/fake_flood(src.loc,src)
+ if("delusion")
+ new /obj/effect/hallucination/delusion(src.loc,src)
+ if("fake")
+ new /obj/effect/hallucination/fakeattacker(src.loc,src)
+ if("bolts")
+ new /obj/effect/hallucination/bolts(src.loc,src)
+ if("bolts_minor")
+ new /obj/effect/hallucination/bolts(src.loc,src,rand(1,2))
+ if("whispers")
+ new /obj/effect/hallucination/whispers(src.loc,src)
+ if("message")
+ new /obj/effect/hallucination/message(src.loc,src)
+ if("sounds")
+ //Strange audio
+ //src << "Strange Audio"
+ switch(rand(1,18))
+ if(1) src << 'sound/machines/airlock.ogg'
+ if(2)
+ if(prob(50))src << 'sound/effects/Explosion1.ogg'
+ else src << 'sound/effects/Explosion2.ogg'
+ if(3) src << 'sound/effects/explosionfar.ogg'
+ if(4) src << 'sound/effects/Glassbr1.ogg'
+ if(5) src << 'sound/effects/Glassbr2.ogg'
+ if(6) src << 'sound/effects/Glassbr3.ogg'
+ if(7) src << 'sound/machines/twobeep.ogg'
+ if(8) src << 'sound/machines/windowdoor.ogg'
+ if(9)
+ //To make it more realistic, I added two gunshots (enough to kill)
+ src << 'sound/weapons/Gunshot.ogg'
+ spawn(rand(10,30))
+ src << 'sound/weapons/Gunshot.ogg'
+ if(10) src << 'sound/weapons/smash.ogg'
+ if(11)
+ //Same as above, but with tasers.
+ src << 'sound/weapons/Taser.ogg'
+ spawn(rand(10,30))
+ src << 'sound/weapons/Taser.ogg'
+ //Rare audio
+ if(12)
+ //These sounds are (mostly) taken from Hidden: Source
+ var/list/creepyasssounds = list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/Heart Beat.ogg', 'sound/effects/screech.ogg',\
+ 'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\
+ 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\
+ 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\
+ 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg')
+ src << pick(creepyasssounds)
+ if(13)
+ src << "You feel a tiny prick! "
+ if(14)
+ src << "Priority Announcement "
+ src << "The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle. "
+ src << sound('sound/AI/shuttledock.ogg')
+ if(15)
+ src << 'sound/items/Welder.ogg'
+ if(16)
+ src << 'sound/items/Screwdriver.ogg'
+ if(17)
+ src << 'sound/weapons/saberon.ogg'
+ if(18)
+ src << 'sound/weapons/saberoff.ogg'
+ if("hudscrew")
+ //Screwy HUD
+ //src << "Screwy HUD"
+ hal_screwyhud = pick(1,2,3,3,4,4)
+ spawn(rand(100,250))
+ hal_screwyhud = 0
+ if("items")
+ //Strange items
+ //src << "Traitor Items"
+ if(!halitem)
+ halitem = new
+ var/list/slots_free = list(ui_lhand,ui_rhand)
+ if(l_hand) slots_free -= ui_lhand
+ if(r_hand) slots_free -= ui_rhand
+ if(istype(src,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = src
+ if(!H.belt) slots_free += ui_belt
+ if(!H.l_store) slots_free += ui_storage1
+ if(!H.r_store) slots_free += ui_storage2
+ if(slots_free.len)
+ halitem.screen_loc = pick(slots_free)
+ halitem.layer = 50
+ switch(rand(1,6))
+ if(1) //revolver
+ halitem.icon = 'icons/obj/guns/projectile.dmi'
+ halitem.icon_state = "revolver"
+ halitem.name = "Revolver"
+ if(2) //c4
+ halitem.icon = 'icons/obj/assemblies.dmi'
+ halitem.icon_state = "plastic-explosive0"
+ halitem.name = "Mysterious Package"
+ if(prob(25))
+ halitem.icon_state = "c4small_1"
+ if(3) //sword
+ halitem.icon = 'icons/obj/weapons.dmi'
+ halitem.icon_state = "sword1"
+ halitem.name = "Sword"
+ if(4) //stun baton
+ halitem.icon = 'icons/obj/weapons.dmi'
+ halitem.icon_state = "stunbaton"
+ halitem.name = "Stun Baton"
+ if(5) //emag
+ halitem.icon = 'icons/obj/card.dmi'
+ halitem.icon_state = "emag"
+ halitem.name = "Cryptographic Sequencer"
+ if(6) //flashbang
+ halitem.icon = 'icons/obj/grenade.dmi'
+ halitem.icon_state = "flashbang1"
+ halitem.name = "Flashbang"
+ if(client) client.screen += halitem
+ spawn(rand(100,250))
+ qdel(halitem)
+ if("dangerflash")
+ //Flashes of danger
+ //src << "Danger Flash"
+ if(!halimage)
+ var/list/possible_points = list()
+ for(var/turf/simulated/floor/F in view(src,world.view))
+ possible_points += F
+ if(possible_points.len)
+ var/turf/simulated/floor/target = pick(possible_points)
+
+ switch(rand(1,3))
+ if(1)
+ //src << "Space"
+ halimage = image('icons/turf/space.dmi',target,"[rand(1,25)]",TURF_LAYER)
+ if(2)
+ //src << "Fire"
+ halimage = image('icons/effects/fire.dmi',target,"1",TURF_LAYER)
+ if(3)
+ //src << "C4"
+ halimage = image('icons/obj/assemblies.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01)
+
+
+ if(client) client.images += halimage
+ spawn(rand(10,50)) //Only seen for a brief moment.
+ if(client) client.images -= halimage
+ halimage = null
+ if("death")
+ //Fake death
+ src.sleeping = 20
+ hal_crit = 1
+ hal_screwyhud = 1
+ spawn(rand(50,100))
+ src.sleeping = 0
+ hal_crit = 0
+ hal_screwyhud = 0
+ if("husks")
+ if(!halbody)
+ var/list/possible_points = list()
+ for(var/turf/simulated/floor/F in view(src,world.view))
+ possible_points += F
+ if(possible_points.len)
+ var/turf/simulated/floor/target = pick(possible_points)
+ switch(rand(1,4))
+ if(1)
+ var/image/body = image('icons/mob/human.dmi',target,"husk_s",TURF_LAYER)
+ var/matrix/M = matrix()
+ M.Turn(90)
+ body.transform = M
+ halbody = body
+ if(2,3)
+ halbody = image('icons/mob/human.dmi',target,"husk_s",TURF_LAYER)
+ if(4)
+ halbody = image('icons/mob/alien.dmi',target,"alienother",TURF_LAYER)
+
+ if(client) client.images += halbody
+ spawn(rand(50,80)) //Only seen for a brief moment.
+ if(client) client.images -= halbody
+ halbody = null
\ No newline at end of file
diff --git a/code/modules/food&drinks/drinks/drinks.dm b/code/modules/food&drinks/drinks/drinks.dm
index dbcff950089..1f07766a523 100644
--- a/code/modules/food&drinks/drinks/drinks.dm
+++ b/code/modules/food&drinks/drinks/drinks.dm
@@ -81,7 +81,7 @@
return
var/refill = reagents.get_master_reagent_id()
var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
- user << " You transfer [trans] units of the solution to [target]. "
+ user << "You transfer [trans] units of the solution to [target]. "
if(isrobot(user)) //Cyborg modules that include drinks automatically refill themselves, but drain the borg's cell
var/mob/living/silicon/robot/bro = user
diff --git a/code/modules/food&drinks/kitchen machinery/gibber.dm b/code/modules/food&drinks/kitchen machinery/gibber.dm
index 38a52ffa9ff..e5111bfb000 100644
--- a/code/modules/food&drinks/kitchen machinery/gibber.dm
+++ b/code/modules/food&drinks/kitchen machinery/gibber.dm
@@ -9,7 +9,9 @@
var/operating = 0 //Is it on?
var/dirty = 0 // Does it need cleaning?
var/gibtime = 40 // Time from starting until meat appears
- var/typeofmeat = /obj/item/weapon/reagent_containers/food/snacks/meat/
+ var/typeofmeat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human
+ var/meat_produced = 0
+ var/ignore_clothing = 0
use_power = 1
idle_power_usage = 2
active_power_usage = 500
@@ -47,6 +49,21 @@
/obj/machinery/gibber/New()
..()
src.overlays += image('icons/obj/kitchen.dmi', "grjam")
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/gibber(null)
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
+ RefreshParts()
+
+/obj/machinery/gibber/RefreshParts()
+ var/gib_time = 40
+ for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts)
+ meat_produced += 3 * B.rating
+ for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
+ gib_time -= 5 * M.rating
+ gibtime = gib_time
+ if(M.rating >= 2)
+ ignore_clothing = 1
/obj/machinery/gibber/update_icon()
overlays.Cut()
@@ -77,29 +94,43 @@
else
src.startgibbing(user)
-/obj/machinery/gibber/attackby(obj/item/weapon/grab/G as obj, mob/user as mob, params)
- if(default_unfasten_wrench(user, G))
+/obj/machinery/gibber/attackby(obj/item/P as obj, mob/user as mob, params)
+ if (istype(P, /obj/item/weapon/grab))
+ var/obj/item/weapon/grab/G = P
+ if(!istype(G.affecting, /mob/living/carbon/))
+ user << "This item is not suitable for the gibber! "
+ return
+ if(G.affecting.abiotic(1) && !ignore_clothing)
+ user << "Subject may not have abiotic items on. "
+ return
+
+ user.visible_message("[user] starts to put [G.affecting] into the gibber! ")
+ src.add_fingerprint(user)
+ if(do_after(user, gibtime) && G && G.affecting && !occupant)
+ user.visible_message("[user] stuffs [G.affecting] into the gibber! ")
+ var/mob/M = G.affecting
+ if(M.client)
+ M.client.perspective = EYE_PERSPECTIVE
+ M.client.eye = src
+ M.loc = src
+ src.occupant = M
+ qdel(G)
+ update_icon()
+
+ if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", P))
return
- if (!( istype(G, /obj/item/weapon/grab)) || !(istype(G.affecting, /mob/living/carbon/human)))
- user << "This item is not suitable for the gibber! "
- return
- if(G.affecting.abiotic(1))
- user << "Subject may not have abiotic items on. "
+ if(exchange_parts(user, P))
return
- user.visible_message("[user] starts to put [G.affecting] into the gibber! ")
- src.add_fingerprint(user)
- if(do_after(user, 30) && G && G.affecting && !occupant)
- user.visible_message("[user] stuffs [G.affecting] into the gibber! ")
- var/mob/M = G.affecting
- if(M.client)
- M.client.perspective = EYE_PERSPECTIVE
- M.client.eye = src
- M.loc = src
- src.occupant = M
- qdel(G)
- update_icon()
+ if(default_pry_open(P))
+ return
+
+ if(default_unfasten_wrench(user, P))
+ return
+
+ default_deconstruction_crowbar(P)
+
/obj/machinery/gibber/verb/eject()
@@ -125,15 +156,21 @@
return
use_power(1000)
visible_message("You hear a loud squelchy grinding sound. ")
+ playsound(src.loc, 'sound/machines/juicer.ogg', 50, 1)
src.operating = 1
update_icon()
+ var/offset = prob(50) ? -2 : 2
+ animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking
var/sourcename = src.occupant.real_name
- var/sourcejob = src.occupant.job
+ var/sourcejob
+ if(ishuman(occupant))
+ var/mob/living/carbon/human/gibee = occupant
+ sourcejob = gibee.job
var/sourcenutriment = src.occupant.nutrition / 15
var/sourcetotalreagents = src.occupant.reagents.total_volume
- var/totalslabs = 3
+ var/gibtype = /obj/effect/decal/cleanable/blood/gibs
- var/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/allmeat[totalslabs]
+ var/obj/item/weapon/reagent_containers/food/snacks/meat/slab/allmeat[meat_produced]
if(ishuman(occupant))
var/mob/living/carbon/human/gibee = occupant
@@ -141,13 +178,19 @@
typeofmeat = gibee.dna.species.meat
else
typeofmeat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human
- for (var/i=1 to totalslabs)
- var/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/newmeat = new typeofmeat
+ else
+ if(iscarbon(occupant))
+ var/mob/living/carbon/C = occupant
+ typeofmeat = C.type_of_meat
+ gibtype = C.gib_type
+ for (var/i=1 to meat_produced)
+ var/obj/item/weapon/reagent_containers/food/snacks/meat/slab/newmeat = new typeofmeat
newmeat.name = sourcename + newmeat.name
newmeat.subjectname = sourcename
- newmeat.subjectjob = sourcejob
- newmeat.reagents.add_reagent ("nutriment", sourcenutriment / totalslabs) // Thehehe. Fat guys go first
- src.occupant.reagents.trans_to (newmeat, round (sourcetotalreagents / totalslabs, 1)) // Transfer all the reagents from the
+ if(sourcejob)
+ newmeat.subjectjob = sourcejob
+ newmeat.reagents.add_reagent ("nutriment", sourcenutriment / meat_produced) // Thehehe. Fat guys go first
+ src.occupant.reagents.trans_to (newmeat, round (sourcetotalreagents / meat_produced, 1)) // Transfer all the reagents from the
allmeat[i] = newmeat
add_logs(user, occupant, "gibbed")
@@ -157,13 +200,17 @@
spawn(src.gibtime)
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
operating = 0
- for (var/i=1 to totalslabs)
+ for (var/i=1 to meat_produced)
+ var/list/nearby_turfs = orange(3, get_turf(src))
var/obj/item/meatslab = allmeat[i]
- var/turf/Tx = locate(src.x - i, src.y, src.z)
meatslab.loc = src.loc
- meatslab.throw_at(Tx,i,3)
- if (!Tx.density)
- new /obj/effect/decal/cleanable/blood/gibs(Tx,i)
+ meatslab.throw_at(pick(nearby_turfs),i,3)
+ for (var/turfs=1 to meat_produced*3)
+ var/turf/gibturf = pick(nearby_turfs)
+ if (!gibturf.density && src in viewers(gibturf))
+ new gibtype(gibturf,i)
+
+ pixel_x = initial(pixel_x) //return to its spot after shaking
src.operating = 0
update_icon()
diff --git a/code/modules/food&drinks/kitchen machinery/microwave.dm b/code/modules/food&drinks/kitchen machinery/microwave.dm
index ff196ae88db..b04ac183825 100644
--- a/code/modules/food&drinks/kitchen machinery/microwave.dm
+++ b/code/modules/food&drinks/kitchen machinery/microwave.dm
@@ -12,7 +12,7 @@
var/operating = 0 // Is it on?
var/dirty = 0 // = {0..100} Does it need cleaning?
var/broken = 0 // ={0,1,2} How broken is it???
- var/global/max_n_of_items = 10
+ var/max_n_of_items = 10 // whatever fat fuck made this a global var needs to look at themselves in the mirror sometime
var/efficiency = 0
var/microwavepower = 1
@@ -28,15 +28,20 @@
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/microwave(null)
component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
component_parts += new /obj/item/stack/cable_coil(null, 2)
RefreshParts()
/obj/machinery/microwave/RefreshParts()
var/E
+ var/max_items = 10
for(var/obj/item/weapon/stock_parts/micro_laser/M in component_parts)
E += M.rating
+ for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
+ max_items = 10 * M.rating
efficiency = E
+ max_n_of_items = max_items
/*******************
* Item Adding
@@ -246,6 +251,7 @@
if(F.cooked_type)
var/obj/item/weapon/reagent_containers/food/snacks/S = new F.cooked_type (get_turf(src))
F.initialize_cooked_food(S, efficiency)
+ feedback_add_details("food_made","[F.name]")
else
new /obj/item/weapon/reagent_containers/food/snacks/badrecipe(src)
if(dirty < 100)
diff --git a/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm b/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm
index 7d709d9cf8f..bb88e5ec867 100644
--- a/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm
+++ b/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm
@@ -10,12 +10,44 @@
idle_power_usage = 5
active_power_usage = 50
var/grinded = 0
+ var/required_grind = 5
+ var/cube_production = 1
+/obj/machinery/monkey_recycler/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/monkey_recycler(null)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
+ RefreshParts()
+
+/obj/machinery/monkey_recycler/RefreshParts()
+ var/req_grind = 5
+ var/cubes_made = 1
+ for(var/obj/item/weapon/stock_parts/manipulator/B in component_parts)
+ req_grind -= B.rating
+ for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
+ cubes_made = M.rating
+ cube_production = cubes_made
+ required_grind = req_grind
+
/obj/machinery/monkey_recycler/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
- if(default_unfasten_wrench(user, O))
+ if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", O))
return
+ if(exchange_parts(user, O))
+ return
+
+ if(default_pry_open(O))
+ return
+
+ if(default_unfasten_wrench(user, O))
+ power_change()
+ return
+
+ default_deconstruction_crowbar(O)
+
if (src.stat != 0) //NOPOWER etc
return
if (istype(O, /obj/item/weapon/grab))
@@ -32,8 +64,12 @@
qdel(target)
user << "You stuff the monkey in the machine. "
playsound(src.loc, 'sound/machines/juicer.ogg', 50, 1)
+ var/offset = prob(50) ? -2 : 2
+ animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking
use_power(500)
src.grinded++
+ sleep(50)
+ pixel_x = initial(pixel_x) //return to its spot after shaking
user << "The machine now has [grinded] monkey\s worth of material stored. "
else
@@ -43,12 +79,13 @@
/obj/machinery/monkey_recycler/attack_hand(var/mob/user as mob)
if (src.stat != 0) //NOPOWER etc
return
- if(grinded >= 5)
+ if(grinded >= required_grind)
user << "The machine hisses loudly as it condenses the grinded monkey meat. After a moment, it dispenses a brand new monkey cube. "
playsound(src.loc, 'sound/machines/hiss.ogg', 50, 1)
- grinded -= 5
- new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped(src.loc)
+ grinded -= required_grind
+ for(var/i = 0, i < cube_production, i++)
+ new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped(src.loc)
user << "The machine's display flashes that it has [grinded] monkeys worth of material left. "
else
- user << "The machine needs at least 5 monkeys worth of material to produce a monkey cube. It only has [grinded]. "
+ user << "The machine needs at least [required_grind] monkey(s) worth of material to produce a monkey cube. It only has [grinded]. "
return
diff --git a/code/modules/food&drinks/kitchen machinery/processor.dm b/code/modules/food&drinks/kitchen machinery/processor.dm
index cde0bf70683..78038266d98 100644
--- a/code/modules/food&drinks/kitchen machinery/processor.dm
+++ b/code/modules/food&drinks/kitchen machinery/processor.dm
@@ -12,16 +12,31 @@
use_power = 1
idle_power_usage = 5
active_power_usage = 50
+ var/rating_speed = 1
+ var/rating_amount = 1
+/obj/machinery/processor/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/processor(null)
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
+ RefreshParts()
+/obj/machinery/processor/RefreshParts()
+ for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts)
+ rating_amount = B.rating
+ for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
+ rating_speed = M.rating
/datum/food_processor_process
var/input
var/output
var/time = 40
-/datum/food_processor_process/proc/process_food(loc, what)
- if (src.output && loc)
- new src.output(loc)
+/datum/food_processor_process/proc/process_food(loc, what, var/obj/machinery/processor/processor)
+ if (src.output && loc && processor)
+ for(var/i = 0, i < processor.rating_amount, i++)
+ new src.output(loc)
if (what)
qdel(what) // Note to self: Make this safer
@@ -60,18 +75,18 @@
/* mobs */
-/datum/food_processor_process/mob/process_food(loc, what)
+/datum/food_processor_process/mob/process_food(loc, what, processor)
..()
-/datum/food_processor_process/mob/slime/process_food(loc, what)
+/datum/food_processor_process/mob/slime/process_food(loc, what, var/obj/machinery/processor/processor)
var/mob/living/simple_animal/slime/S = what
var/C = S.cores
if(S.stat != DEAD)
S.loc = loc
S.visible_message("[C] crawls free of the processor! ")
return
- for(var/i = 1, i <= C, i++)
+ for(var/i = 1, i <= C + processor.rating_amount, i++)
new S.coretype(loc)
feedback_add_details("slime_core_harvested","[replacetext(S.colour," ","_")]")
..()
@@ -79,7 +94,7 @@
/datum/food_processor_process/mob/slime/input = /mob/living/simple_animal/slime
/datum/food_processor_process/mob/slime/output = null
-/datum/food_processor_process/mob/monkey/process_food(loc, what)
+/datum/food_processor_process/mob/monkey/process_food(loc, what, processor)
var/mob/living/carbon/monkey/O = what
if (O.client) //grief-proof
O.loc = loc
@@ -123,8 +138,20 @@
if(src.processing)
user << "The processor is in the process of processing! "
return 1
+ if(default_deconstruction_screwdriver(user, "processor1", "processor", O))
+ return
+
+ if(exchange_parts(user, O))
+ return
+
+ if(default_pry_open(O))
+ return
+
if(default_unfasten_wrench(user, O))
return
+
+ default_deconstruction_crowbar(O)
+
var/what = O
if (istype(O, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = O
@@ -151,20 +178,30 @@
if(src.contents.len == 0)
user << "The processor is empty! "
return 1
+ src.processing = 1
+ user.visible_message("[user] turns on [src].", \
+ "You turn on [src]. ", \
+ "You hear a food processor. ")
+ playsound(src.loc, 'sound/machines/blender.ogg', 50, 1)
+ use_power(500)
+ var/total_time = 0
+ for(var/O in src.contents)
+ var/datum/food_processor_process/P = select_recipe(O)
+ if (!P)
+ log_admin("DEBUG: [O] in processor havent suitable recipe. How do you put it in?") //-rastaf0 // DEAR GOD THIS BURNS MY EYES HAVE YOU EVER LOOKED IN AN ENGLISH DICTONARY BEFORE IN YOUR LIFE AAAAAAAAAAAAAAAAAAAAA - Iamgoofball
+ continue
+ total_time += P.time
+ var/offset = prob(50) ? -2 : 2
+ animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = (total_time / rating_speed)*5) //start shaking
+ sleep(total_time / rating_speed)
for(var/O in src.contents)
var/datum/food_processor_process/P = select_recipe(O)
if (!P)
log_admin("DEBUG: [O] in processor havent suitable recipe. How do you put it in?") //-rastaf0
continue
- src.processing = 1
- user.visible_message("[user] turns on \a [src].", \
- "You turn on \a [src]. ", \
- "You hear a food processor. ")
- playsound(src.loc, 'sound/machines/blender.ogg', 50, 1)
- use_power(500)
- sleep(P.time)
- P.process_food(src.loc, O)
- src.processing = 0
+ P.process_food(src.loc, O, src)
+ pixel_x = initial(pixel_x) //return to its spot after shaking
+ src.processing = 0
src.visible_message("\the [src] finishes processing.")
/obj/machinery/processor/verb/eject()
diff --git a/code/modules/food&drinks/kitchen machinery/smartfridge.dm b/code/modules/food&drinks/kitchen machinery/smartfridge.dm
index 9746ee4a83c..dce85ce5ed2 100644
--- a/code/modules/food&drinks/kitchen machinery/smartfridge.dm
+++ b/code/modules/food&drinks/kitchen machinery/smartfridge.dm
@@ -13,11 +13,22 @@
idle_power_usage = 5
active_power_usage = 100
flags = NOREACT
- var/global/max_n_of_items = 999 // Sorry but the BYOND infinite loop detector doesn't like things over 1000.
+ var/max_n_of_items = 1500
var/icon_on = "smartfridge"
var/icon_off = "smartfridge-off"
var/item_quants = list()
+/obj/machinery/smartfridge/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/smartfridge(null)
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
+ RefreshParts()
+
+/obj/machinery/smartfridge/RefreshParts()
+ for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts)
+ max_n_of_items = 1500 * B.rating
+
/obj/machinery/smartfridge/power_change()
..()
update_icon()
@@ -35,9 +46,21 @@
********************/
/obj/machinery/smartfridge/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
+ if(default_deconstruction_screwdriver(user, "smartfridge_open", "smartfridge", O))
+ return
+
+ if(exchange_parts(user, O))
+ return
+
+ if(default_pry_open(O))
+ return
+
if(default_unfasten_wrench(user, O))
power_change()
return
+
+ default_deconstruction_crowbar(O)
+
if(stat)
return 0
diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm
index 41d7dedaaa5..ba32bb2c6ff 100644
--- a/code/modules/hydroponics/biogenerator.dm
+++ b/code/modules/hydroponics/biogenerator.dm
@@ -13,6 +13,7 @@
var/menustat = "menu"
var/efficiency = 0
var/productivity = 0
+ var/max_items = 40
/obj/machinery/biogenerator/New()
..()
@@ -28,12 +29,15 @@
/obj/machinery/biogenerator/RefreshParts()
var/E = 0
var/P = 0
+ var/max_storage = 40
for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts)
P += B.rating
+ max_storage = 40 * B.rating
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
E += M.rating
efficiency = E
productivity = P
+ max_items = max_storage
/obj/machinery/biogenerator/on_reagent_change() //When the reagents change, change the icon as well.
update_icon()
@@ -65,15 +69,15 @@
var/i = 0
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents)
i++
- if(i >= 10)
+ if(i >= max_items)
user << "The biogenerator is already full! Activate it. "
else
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in O.contents)
- if(i >= 10)
+ if(i >= max_items)
break
G.loc = src
i++
- if(i<10)
+ if(iYou empty the plant bag into the biogenerator."
else if(O.contents.len == 0)
user << "You empty the plant bag into the biogenerator, filling it to its capacity. "
@@ -87,7 +91,7 @@
var/i = 0
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents)
i++
- if(i >= 10)
+ if(i >= max_items)
user << "The biogenerator is full! Activate it. "
else
user.unEquip(O)
@@ -155,6 +159,7 @@
dat += "Book bag: Make ([200/efficiency]) "
dat += "Plant bag: Make ([200/efficiency]) "
dat += "Mining satchel: Make ([200/efficiency]) "
+ dat += "Chemistry bag: Make ([200/efficiency]) "
dat += "Botanical gloves: Make ([250/efficiency]) "
dat += "Utility belt: Make ([300/efficiency]) "
dat += "Security belt: Make ([300/efficiency]) "
@@ -266,6 +271,9 @@
if("mnbag")
if (check_cost(200/efficiency)) return 0
else new/obj/item/weapon/storage/bag/ore(src.loc)
+ if("chbag")
+ if (check_cost(200/efficiency)) return 0
+ else new/obj/item/weapon/storage/bag/chemistry(src.loc)
if("gloves")
if (check_cost(250/efficiency)) return 0
else new/obj/item/clothing/gloves/botanic_leather(src.loc)
diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm
index df14126ae63..07ee7c17a2e 100644
--- a/code/modules/hydroponics/growninedible.dm
+++ b/code/modules/hydroponics/growninedible.dm
@@ -89,7 +89,7 @@
qdel(src)
return
else
- usr << " You must dry this first! "
+ usr << "You must dry this first! "
/obj/item/weapon/grown/log/steel
seed = /obj/item/seeds/steelmycelium
@@ -115,7 +115,7 @@
/obj/item/weapon/grown/sunflower/attack(mob/M as mob, mob/user as mob)
M << " [user] smacks you with a sunflower! FLOWER POWER "
- user << " Your sunflower's FLOWER POWER strikes [M] "
+ user << "Your sunflower's FLOWER POWER strikes [M] "
/obj/item/weapon/grown/novaflower
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index 78a92dc1481..3b3b9ab28d2 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -22,6 +22,7 @@
var/planted = 0 //Is it occupied?
var/harvest = 0 //Ready to harvest?
var/obj/item/seeds/myseed = null //The currently planted seed
+ var/rating = 1
var/unwrenchable = 1
pixel_y=8
@@ -37,22 +38,34 @@
component_parts += new /obj/item/weapon/circuitboard/hydroponics(null)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
RefreshParts()
/obj/machinery/hydroponics/constructable/RefreshParts()
- var tmp_capacity = 0
+ var/tmp_capacity = 0
for (var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
tmp_capacity += M.rating
+ for (var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
+ rating = M.rating
maxwater = tmp_capacity * 50 // Up to 300
maxnutri = tmp_capacity * 5 // Up to 30
waterlevel = maxwater
nutrilevel = 3
/obj/machinery/hydroponics/constructable/attackby(obj/item/I, mob/user, params)
+ if(default_deconstruction_screwdriver(user, "hydrotray3", "hydrotray3", I))
+ return
+
if(exchange_parts(user, I))
return
+ if(default_pry_open(I))
+ return
+
+ if(default_unfasten_wrench(user, I))
+ return
+
if(istype(I, /obj/item/weapon/crowbar))
if(anchored==2)
user << "Unscrew the hoses first!"
@@ -89,10 +102,10 @@
mutate()
else if(istype(Proj ,/obj/item/projectile/energy/florayield))
if(myseed.yield == 0)//Oh god don't divide by zero you'll doom us all.
- adjustSYield(1)
+ adjustSYield(1 * rating)
//world << "Yield increased by 1, from 0, to a total of [myseed.yield]"
else if(prob(1/(myseed.yield * myseed.yield) * 100))//This formula gives you diminishing returns based on yield. 100% with 1 yield, decreasing to 25%, 11%, 6, 4, 2...
- adjustSYield(1)
+ adjustSYield(1 * rating)
//world << "Yield increased by 1, to a total of [myseed.yield]"
else
..()
@@ -115,7 +128,7 @@
//Nutrients//////////////////////////////////////////////////////////////
// Nutrients deplete slowly
if(prob(50))
- adjustNutri(-1)
+ adjustNutri(-1 / rating)
// Lack of nutrients hurts non-weeds
if(nutrilevel <= 0 && myseed.plant_type != 1)
@@ -128,56 +141,56 @@
var/lightAmt = currentTurf.lighting_lumcount
if(myseed.plant_type == 2) // Mushroom
if(lightAmt < 2)
- adjustHealth(-1)
+ adjustHealth(-1 / rating)
else // Non-mushroom
if(lightAmt < 4)
- adjustHealth(-2)
+ adjustHealth(-2 / rating)
//Water//////////////////////////////////////////////////////////////////
// Drink random amount of water
- adjustWater(-rand(1,6))
+ adjustWater(-rand(1,6) / rating)
// If the plant is dry, it loses health pretty fast, unless mushroom
if(waterlevel <= 10 && myseed.plant_type != 2)
- adjustHealth(-rand(0,1))
+ adjustHealth(-rand(0,1) / rating)
if(waterlevel <= 0)
- adjustHealth(-rand(0,2))
+ adjustHealth(-rand(0,2) / rating)
// Sufficient water level and nutrient level = plant healthy
else if(waterlevel > 10 && nutrilevel > 0)
- adjustHealth(rand(1,2))
+ adjustHealth(rand(1,2) / rating)
if(prob(5)) //5 percent chance the weed population will increase
- adjustWeeds(1)
+ adjustWeeds(1 / rating)
//Toxins/////////////////////////////////////////////////////////////////
// Too much toxins cause harm, but when the plant drinks the contaiminated water, the toxins disappear slowly
if(toxic >= 40 && toxic < 80)
- adjustHealth(-1)
- adjustToxic(-rand(1,10))
+ adjustHealth(-1 / rating)
+ adjustToxic(-rand(1,10) / rating)
else if(toxic >= 80) // I don't think it ever gets here tbh unless above is commented out
adjustHealth(-3)
- adjustToxic(-rand(1,10))
+ adjustToxic(-rand(1,10) / rating)
//Pests & Weeds//////////////////////////////////////////////////////////
else if(pestlevel >= 5)
- adjustHealth(-1)
+ adjustHealth(-1 / rating)
// If it's a weed, it doesn't stunt the growth
if(weedlevel >= 5 && myseed.plant_type != 1 )
- adjustHealth(-1)
+ adjustHealth(-1 / rating)
//Health & Age///////////////////////////////////////////////////////////
// Plant dies if health <= 0
if(health <= 0)
plantdies()
- adjustWeeds(1) // Weeds flourish
+ adjustWeeds(1 / rating) // Weeds flourish
// If the plant is too old, lose health fast
if(age > myseed.lifespan)
- adjustHealth(-rand(1,5))
+ adjustHealth(-rand(1,5) / rating)
// Harvest code
if(age > myseed.production && (age - lastproduce) > myseed.production && (!harvest && !dead))
@@ -187,10 +200,10 @@
else
lastproduce = age
if(prob(5)) // On each tick, there's a 5 percent chance the pest population will increase
- adjustPests(1)
+ adjustPests(1 / rating)
else
if(waterlevel > 10 && nutrilevel > 0 && prob(10)) // If there's no plant, the percentage chance is 10%
- adjustWeeds(1)
+ adjustWeeds(1 / rating)
// Weeeeeeeeeeeeeeedddssss
@@ -436,18 +449,18 @@
// Nutriments
if(S.has_reagent("eznutriment", 1))
- yieldmod = 1
- mutmod = 1
+ yieldmod = 1 * rating
+ mutmod = 1 * rating
adjustNutri(round(S.get_reagent_amount("eznutriment") * 1))
if(S.has_reagent("left4zednutriment", 1))
- yieldmod = 0
- mutmod = 2
+ yieldmod = 0 * rating
+ mutmod = 2 * rating
adjustNutri(round(S.get_reagent_amount("left4zednutriment") * 1))
if(S.has_reagent("robustharvestnutriment", 1))
- yieldmod = 2
- mutmod = 0
+ yieldmod = 2 * rating
+ mutmod = 0 * rating
adjustNutri(round(S.get_reagent_amount("robustharvestnutriment") *1 ))
// Antitoxin binds shit pretty well. So the tox goes significantly down
@@ -671,25 +684,25 @@
else if(istype(O, /obj/item/device/analyzer/plant_analyzer))
if(planted && myseed)
user << "*** [myseed.plantname] ***" //Carn: now reports the plants growing, not the seeds.
- user << "-Plant Age: [age] "
- user << "-Plant Endurance: [myseed.endurance] "
- user << "-Plant Lifespan: [myseed.lifespan] "
+ user << "-Plant Age: [age] "
+ user << "-Plant Endurance: [myseed.endurance] "
+ user << "-Plant Lifespan: [myseed.lifespan] "
if(myseed.yield != -1)
- user << "-Plant Yield: [myseed.yield] "
- user << "-Plant Production: [myseed.production] "
+ user << "-Plant Yield: [myseed.yield] "
+ user << "-Plant Production: [myseed.production] "
if(myseed.potency != -1)
- user << "-Plant Potency: [myseed.potency] "
+ user << "-Plant Potency: [myseed.potency] "
var/list/text_strings = myseed.get_analyzer_text()
if(text_strings)
for(var/string in text_strings)
user << string
else
user << "No plant found. "
- user << "-Weed level: [weedlevel] / 10 "
- user << "-Pest level: [pestlevel] / 10 "
- user << "-Toxicity level: [toxic] / 100 "
- user << "-Water level: [waterlevel] / [maxwater] "
- user << "-Nutrition level: [nutrilevel] / [maxnutri] "
+ user << "-Weed level: [weedlevel] / 10 "
+ user << "-Pest level: [pestlevel] / 10 "
+ user << "-Toxicity level: [toxic] / 100 "
+ user << "-Water level: [waterlevel] / [maxwater] "
+ user << "-Nutrition level: [nutrilevel] / [maxnutri] "
user << ""
else if(istype(O, /obj/item/weapon/cultivator))
@@ -734,17 +747,17 @@
user.visible_message("[user] unwrenches [src].", \
"You unwrench [src]. ")
- else if(istype(O, /obj/item/weapon/screwdriver) && unwrenchable) //THIS NEED TO BE DONE DIFFERENTLY, SOMEONE REFACTOR THE TRAY CODE ALREADY
+ else if(istype(O, /obj/item/weapon/wirecutters) && unwrenchable) //THIS NEED TO BE DONE DIFFERENTLY, SOMEONE REFACTOR THE TRAY CODE ALREADY
if(anchored)
if(anchored == 2)
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
anchored = 1
- user << "You unscrew \the [src]'s hoses. "
+ user << "You snip \the [src]'s hoses. "
else if(anchored == 1)
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
anchored = 2
- user << "You screw in \the [src]'s hoses. "
+ user << "You reconnect \the [src]'s hoses. "
for(var/obj/machinery/hydroponics/h in range(1,src))
spawn()
@@ -789,7 +802,7 @@
var/t_amount = 0
var/list/result = list()
var/output_loc = parent.Adjacent(user) ? user.loc : parent.loc //needed for TK
-
+ var/product_name
while(t_amount < getYield())
var/obj/item/weapon/reagent_containers/food/snacks/grown/t_prod = new product(output_loc, potency)
result.Add(t_prod) // User gets a consumable
@@ -802,7 +815,9 @@
t_prod.potency = potency
t_prod.plant_type = plant_type
t_amount++
-
+ product_name = t_prod.name
+ if(getYield() >= 1)
+ feedback_add_details("food_harvested","[product_name]|[getYield()]")
parent.update_tray()
return result
@@ -848,9 +863,9 @@
podman.ckey = ckey_holder
podman.gender = blood_gender
podman.faction |= factions
- if(!mutant_color)
- mutant_color = "#59CE00"
- hardset_dna(podman,null,null,podman.real_name,blood_type,/datum/species/plant/pod,mutant_color)//Discard SE's and UI's, podman cloning is inaccurate, and always make them a podman
+ if(!features["mcolor"])
+ features["mcolor"] = "#59CE00"
+ hardset_dna(podman,null,null,podman.real_name,blood_type,/datum/species/plant/pod,features)//Discard SE's and UI's, podman cloning is inaccurate, and always make them a podman
podman.set_cloned_appearance()
else //else, one packet of seeds. maybe two
diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm
index c7169acc0c3..0ad83aeb190 100644
--- a/code/modules/hydroponics/seed_extractor.dm
+++ b/code/modules/hydroponics/seed_extractor.dm
@@ -1,7 +1,10 @@
-/proc/seedify(var/obj/item/O as obj, var/t_max)
+/proc/seedify(var/obj/item/O as obj, var/t_max, var/obj/machinery/seed_extractor/extractor)
var/t_amount = 0
if(t_max == -1)
- t_max = rand(1,4)
+ if(extractor)
+ t_max = rand(1,4) * extractor.seed_multiplier
+ else
+ t_max = rand(1,4)
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/))
var/obj/item/weapon/reagent_containers/food/snacks/grown/F = O
@@ -51,8 +54,39 @@
density = 1
anchored = 1
var/piles = list()
+ var/max_seeds = 1000
+ var/seed_multiplier = 1
+
+/obj/machinery/seed_extractor/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/seed_extractor(null)
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
+ RefreshParts()
+
+/obj/machinery/seed_extractor/RefreshParts()
+ for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts)
+ max_seeds = 1000 * B.rating
+ for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
+ seed_multiplier = M.rating
/obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
+
+ if(default_deconstruction_screwdriver(user, "sextractor_open", "sextractor", O))
+ return
+
+ if(exchange_parts(user, O))
+ return
+
+ if(default_pry_open(O))
+ return
+
+ if(default_unfasten_wrench(user, O))
+ return
+
+ default_deconstruction_crowbar(O)
+
if(isrobot(user))
return
@@ -60,7 +94,7 @@
var/obj/item/weapon/storage/P = O
var/loaded = 0
for(var/obj/item/seeds/G in P.contents)
- if(contents.len >= 999)
+ if(contents.len >= max_seeds)
break
++loaded
add(G)
diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm
index 05369322619..065d3d8d08f 100644
--- a/code/modules/hydroponics/seeds.dm
+++ b/code/modules/hydroponics/seeds.dm
@@ -36,14 +36,14 @@
/obj/item/seeds/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
if (istype(O, /obj/item/device/analyzer/plant_analyzer))
user << "*** [plantname] ***"
- user << "-Plant Endurance: [endurance] "
- user << "-Plant Lifespan: [lifespan] "
- user << "-Species Discovery Value: [rarity] "
+ user << "-Plant Endurance: [endurance] "
+ user << "-Plant Lifespan: [lifespan] "
+ user << "-Species Discovery Value: [rarity] "
if(yield != -1)
- user << "-Plant Yield: [yield] "
- user << "-Plant Production: [production] "
+ user << "-Plant Yield: [yield] "
+ user << "-Plant Production: [production] "
if(potency != -1)
- user << "-Plant Potency: [potency] "
+ user << "-Plant Potency: [potency] "
var/list/text_strings = get_analyzer_text()
if(text_strings)
for(var/string in text_strings)
@@ -90,7 +90,7 @@
var/datum/mind/mind = null
var/blood_gender = null
var/blood_type = null
- var/mutant_color = null
+ var/list/features = null
var/factions = null
var/contains_sample = 0
@@ -104,7 +104,7 @@
realName = bloodSample.data["real_name"]
blood_gender = bloodSample.data["gender"]
blood_type = bloodSample.data["blood_type"]
- mutant_color = bloodSample.data["mutant_color"]
+ features = bloodSample.data["features"]
factions = bloodSample.data["factions"]
W.reagents.clear_reagents()
user << "You inject the contents of the syringe into the seeds. "
diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm
index 254b383c7a4..c9d885d8f29 100644
--- a/code/modules/library/lib_machines.dm
+++ b/code/modules/library/lib_machines.dm
@@ -16,8 +16,9 @@
*/
/obj/machinery/computer/libraryconsole
name = "library visitor console"
- icon = 'icons/obj/computer.dmi'
- icon_state = "library"
+ icon_state = "oldcomp"
+ icon_screen = "library"
+ icon_keyboard = null
circuit = /obj/item/weapon/circuitboard/libraryconsole
var/screenstate = 0
var/title
diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm
index 1b81cbe8e9c..1dd002229be 100644
--- a/code/modules/mining/equipment_locker.dm
+++ b/code/modules/mining/equipment_locker.dm
@@ -16,6 +16,9 @@
var/stack_list[0] //Key: Type. Value: Instance of type.
var/obj/item/weapon/card/id/inserted_id
var/points = 0
+ var/ore_pickup_rate = 15
+ var/sheet_per_ore = 1
+ var/point_upgrade = 1
var/list/ore_values = list(("sand" = 1), ("iron" = 1), ("gold" = 20), ("silver" = 20), ("uranium" = 20), ("bananium" = 30), ("diamond" = 40), ("plasma" = 40))
/obj/machinery/mineral/ore_redemption/New()
@@ -23,10 +26,26 @@
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/ore_redemption(null)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
+ component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
component_parts += new /obj/item/device/assembly/igniter(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
RefreshParts()
+/obj/machinery/mineral/ore_redemption/RefreshParts()
+ var/ore_pickup_rate_temp = 15
+ var/point_upgrade_temp = 1
+ var/sheet_per_ore_temp = 1
+ for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts)
+ sheet_per_ore_temp = B.rating
+ for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
+ ore_pickup_rate_temp = 15 * M.rating
+ for(var/obj/item/weapon/stock_parts/micro_laser/L in component_parts)
+ point_upgrade_temp = L.rating
+ ore_pickup_rate = ore_pickup_rate_temp
+ point_upgrade = point_upgrade_temp
+ sheet_per_ore = sheet_per_ore_temp
+
/obj/machinery/mineral/ore_redemption/proc/process_sheet(obj/item/weapon/ore/O)
var/obj/item/stack/sheet/processed_sheet = SmeltMineral(O)
if(processed_sheet)
@@ -40,7 +59,7 @@
if(D.department == "Science" || D.department == "Robotics" || D.department == "Research Director's Desk" || (D.department == "Chemistry" && (s.name == "uranium" || s.name == "solid plasma")))
D.createmessage("Ore Redemption Machine", "New minerals available!", msg, 1, 0)
var/obj/item/stack/sheet/storage = stack_list[processed_sheet]
- storage.amount += 1 //Stack the sheets
+ storage.amount += sheet_per_ore //Stack the sheets
O.loc = null //Let the old sheet...
qdel(O) //... garbage collect
@@ -50,7 +69,7 @@
var/i
if(T)
if(locate(/obj/item/weapon/ore) in T)
- for (i = 0; i < 10; i++)
+ for (i = 0; i < ore_pickup_rate; i++)
var/obj/item/weapon/ore/O = locate() in T
if(O)
process_sheet(O)
@@ -59,7 +78,7 @@
else
var/obj/structure/ore_box/B = locate() in T
if(B)
- for (i = 0; i < 10; i++)
+ for (i = 0; i < ore_pickup_rate; i++)
var/obj/item/weapon/ore/O = locate() in B.contents
if(O)
process_sheet(O)
@@ -75,6 +94,14 @@
inserted_id = I
interact(user)
return
+ if(exchange_parts(user, W))
+ return
+
+ if(default_pry_open(W))
+ return
+
+ if(default_unfasten_wrench(user, W))
+ return
if(default_deconstruction_screwdriver(user, "ore_redemption-open", "ore_redemption", W))
updateUsrDialog()
return
@@ -88,7 +115,7 @@
/obj/machinery/mineral/ore_redemption/proc/SmeltMineral(var/obj/item/weapon/ore/O)
if(O.refined_type)
var/obj/item/stack/sheet/M = O.refined_type
- points += O.points
+ points += O.points * point_upgrade
return M
qdel(O)//No refined type? Purge it.
return
@@ -135,7 +162,7 @@
var/dat = ""
for(var/ore in ore_values)
var/value = ore_values[ore]
- dat += "[capitalize(ore)] [value] "
+ dat += "[capitalize(ore)] [value * point_upgrade] "
dat += "
"
return dat
diff --git a/code/modules/mining/laborcamp/laborshuttle.dm b/code/modules/mining/laborcamp/laborshuttle.dm
index 7f0992a502f..079eaeab8dd 100644
--- a/code/modules/mining/laborcamp/laborshuttle.dm
+++ b/code/modules/mining/laborcamp/laborshuttle.dm
@@ -1,8 +1,6 @@
/obj/machinery/computer/shuttle/labor
name = "labor shuttle console"
desc = "Used to call and send the labor camp shuttle."
- icon = 'icons/obj/computer.dmi'
- icon_state = "shuttle"
circuit = /obj/item/weapon/circuitboard/labor_shuttle
shuttleId = "laborcamp"
possible_destinations = "laborcamp_home;laborcamp_away"
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index e9067b526dc..ddfdd96ad9a 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -439,6 +439,7 @@ var/global/list/rockTurfEdgeCache
user << "You finish cutting into the rock. "
P.update_icon()
gets_drilled(user)
+ feedback_add_details("pick_used_mining","[P.name]")
else
return attack_hand(user)
return
@@ -448,6 +449,7 @@ var/global/list/rockTurfEdgeCache
var/i
for (i=0;i 0))
stat(null, "Time left: [max(malf.AI_win_timeleft/malf.apcs, 0)]")
+ if(istype(ticker.mode, /datum/game_mode/gang))
+ var/datum/game_mode/gang/mode = ticker.mode
+ if(isnum(mode.A_timer))
+ stat(null, "[gang_name("A")] Gang Takeover: [max(mode.A_timer, 0)]")
+ if(isnum(mode.B_timer))
+ stat(null, "[gang_name("B")] Gang Takeover: [max(mode.B_timer, 0)]")
+
/mob/dead/observer/verb/reenter_corpse()
set category = "Ghost"
set name = "Re-enter Corpse"
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index 0b33449b5ef..02d7cc2a8e2 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -12,6 +12,7 @@
ventcrawler = 2
languages = ALIEN
verb_say = "hisses"
+ type_of_meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno
var/nightvision = 1
var/storedPlasma = 250
var/max_plasma = 500
@@ -28,6 +29,7 @@
var/heat_protection = 0.5
var/leaping = 0
var/list/obj/effect/proc_holder/alien/abilities = list()
+ gib_type = /obj/effect/decal/cleanable/xenoblood/xgibs
/mob/living/carbon/alien/New()
verbs += /mob/living/proc/mob_sleep
diff --git a/code/modules/mob/living/carbon/alien/larva/emote.dm b/code/modules/mob/living/carbon/alien/larva/emote.dm
index 57c3783ed82..cf4f18c5d07 100644
--- a/code/modules/mob/living/carbon/alien/larva/emote.dm
+++ b/code/modules/mob/living/carbon/alien/larva/emote.dm
@@ -100,7 +100,7 @@
src << "Help for larva emotes. You can use these emotes with say \"*emote\":\n\nburp, choke, collapse, dance, drool, gasp, gnarl, hiss, jump, moan, nod, roll, scratch,\nscretch, shake, shiver, sign-#, sulk, sway, tail, twitch, whimper"
else
- src << " Unusable emote '[act]'. Say *help for a list. "
+ src << "Unusable emote '[act]'. Say *help for a list. "
if ((message && src.stat == 0))
log_emote("[name]/[key] : [message]")
diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm
index 469e4023946..093c727edc5 100644
--- a/code/modules/mob/living/carbon/alien/larva/powers.dm
+++ b/code/modules/mob/living/carbon/alien/larva/powers.dm
@@ -40,9 +40,9 @@
if(L.amount_grown >= L.max_grown) //TODO ~Carn
L << "You are growing into a beautiful alien! It is time to choose a caste. "
L << "There are three to choose from:"
- L << "Hunters are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves. "
- L << "Sentinels are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters. "
- L << "Drones are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded alien queen. "
+ L << "Hunters are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves. "
+ L << "Sentinels are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters. "
+ L << "Drones are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded alien queen. "
var/alien_caste = alert(L, "Please choose which alien caste you shall belong to.",,"Hunter","Sentinel","Drone")
var/mob/living/carbon/alien/humanoid/new_xeno
diff --git a/code/modules/mob/living/carbon/alien/screen.dm b/code/modules/mob/living/carbon/alien/screen.dm
index 731fc39b4f1..43a98198a02 100644
--- a/code/modules/mob/living/carbon/alien/screen.dm
+++ b/code/modules/mob/living/carbon/alien/screen.dm
@@ -4,7 +4,7 @@
/mob/living/carbon/alien/proc/updatePlasmaDisplay()
if(hud_used) //clientless aliens
- hud_used.alien_plasma_display.maptext = " [round(storedPlasma)]
"
+ hud_used.alien_plasma_display.maptext = "[round(storedPlasma)]
"
/mob/living/carbon/alien/larva/updatePlasmaDisplay()
return
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index bae07c42c8d..934a6f57e2e 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -251,7 +251,7 @@
if(istype(item, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = item
- item = G.throw() //throw the person instead of the grab
+ item = G.get_mob_if_throwable() //throw the person instead of the grab
qdel(G) //We delete the grab, as it needs to stay around until it's returned.
if(ismob(item))
var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors
@@ -306,7 +306,7 @@
Left Hand: [(l_hand && !(l_hand.flags&ABSTRACT)) ? l_hand : "Nothing"]
Right Hand: [(r_hand && !(r_hand.flags&ABSTRACT)) ? r_hand : "Nothing"] "}
- dat += "Back: [back ? back : "Nothing"] "
+ dat += "Back: [back ? back : "Nothing"] "
if(istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/weapon/tank))
dat += "[internal ? "Disable Internals" : "Set Internals"] "
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index 41a04d1273f..50a9c2c47fe 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -9,6 +9,9 @@
var/obj/item/handcuffed = null //Whether or not the mob is handcuffed
var/obj/item/legcuffed = null //Same as handcuffs but for legs. Bear traps use this.
+ var/list/features = list("mcolor" = "FFF", "tail" = "Smooth", "snout" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None")
+
+
//inventory slots
var/obj/item/back = null
var/obj/item/clothing/mask/wear_mask = null
@@ -23,5 +26,7 @@
var/co2overloadtime = null
var/temperature_resistance = T0C+75
has_limbs = 1
+ var/obj/item/weapon/reagent_containers/food/snacks/meat/slab/type_of_meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/
var/remote_view = 0
+ var/gib_type = /obj/effect/decal/cleanable/blood/gibs
diff --git a/code/modules/mob/living/carbon/human/blood.dm b/code/modules/mob/living/carbon/human/blood.dm
index e8b46b5ca51..289fb8e5ee8 100644
--- a/code/modules/mob/living/carbon/human/blood.dm
+++ b/code/modules/mob/living/carbon/human/blood.dm
@@ -30,7 +30,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
/mob/living/carbon/human/proc/fixblood()
for(var/datum/reagent/blood/B in vessel.reagent_list)
if(B.id == "blood")
- B.data = list("donor"=src,"viruses"=null,"blood_DNA"=dna.unique_enzymes,"blood_type"=dna.blood_type,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"mutant_color"=null, "factions"=null)
+ B.data = list("donor"=src,"viruses"=null,"blood_DNA"=dna.unique_enzymes,"blood_type"=dna.blood_type,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"features"=null, "factions"=null)
/mob/living/carbon/human/proc/suppress_bloodloss(var/amount)
if(bleedsuppress)
@@ -172,7 +172,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
B.data["blood_type"] = copytext(src.dna.blood_type,1,0)
B.data["gender"] = src.gender
B.data["real_name"] = src.real_name
- B.data["mutant_color"] = src.dna.mutant_color
+ B.data["features"] = src.dna.features
B.data["factions"] = src.faction
return B
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 1fda3b351f4..9a718fb01bc 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -355,7 +355,9 @@
return
if("tail" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "tail"
+ dna.species.mutant_bodyparts -= "spines"
dna.species.mutant_bodyparts |= "waggingtail"
+ dna.species.mutant_bodyparts |= "waggingspines"
update_body()
@@ -364,5 +366,8 @@
return
if("waggingtail" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "waggingtail"
+ dna.species.mutant_bodyparts -= "waggingspines"
dna.species.mutant_bodyparts |= "tail"
+ dna.species.mutant_bodyparts |= "spines"
+
update_body()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index b51e729b8d0..696c9a3b5a4 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -272,7 +272,7 @@
if(perpname)
var/datum/data/record/R = find_record("name", perpname, data_core.general)
if(R)
- msg += "Rank: [R.fields["rank"]] "
+ msg += "Rank: [R.fields["rank"]] "
msg += "\[Front photo\] "
msg += "\[Side photo\] "
if(istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(CIH,/obj/item/cybernetic_implant/eyes/hud/medical))
@@ -300,8 +300,8 @@
if(R)
criminal = R.fields["criminal"]
- msg += "Criminal status: \[[criminal]\] \n"
- msg += "Security record: \[View\] "
+ msg += "Criminal status: \[[criminal]\] \n"
+ msg += "Security record: \[View\] "
msg += "\[Add crime\] "
msg += "\[View comment log\] "
msg += "\[Add comment\] \n"
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 620d251ed54..16be6a0f49e 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -166,7 +166,7 @@
/mob/living/carbon/human/blob_act()
if(stat == DEAD) return
- show_message(" The blob attacks you! ")
+ show_message("The blob attacks you! ")
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
var/obj/item/organ/limb/affecting = get_organ(ran_zone(dam_zone))
apply_damage(5, BRUTE, affecting, run_armor_check(affecting, "melee"))
@@ -291,6 +291,8 @@
usr.put_in_hands(I)
usr.emote("scream")
usr.visible_message("[usr] successfully rips [I] out of their [L.getDisplayName()]!","You successfully remove [I] from your [L.getDisplayName()]. ")
+ if(!has_embedded_objects())
+ clear_alert("embeddedobject")
return
if(href_list["item"])
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index ab85a8f3d19..32086909dbf 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -130,6 +130,8 @@ emp_act
var/obj/item/organ/limb/affecting = get_organ(ran_zone(user.zone_sel.selecting))
var/hit_area = parse_zone(affecting.name)
var/target_area = parse_zone(target_limb.name)
+ feedback_add_details("item_used_for_combat","[I.name]|[I.force]")
+ feedback_add_details("zone_targeted","[def_zone]")
if(dna) // allows your species to affect the attacked_by code
return dna.species.spec_attacked_by(I,user,def_zone,affecting,hit_area,src.a_intent,target_limb,target_area,src)
@@ -154,7 +156,6 @@ emp_act
var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords)
apply_damage(I.force, I.damtype, affecting, armor , I)
-
var/bloody = 0
if(((I.damtype == BRUTE) && I.force && prob(25 + (I.force * 2))))
if(affecting.status == ORGAN_ORGANIC)
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index ecc7c49649e..8d08b29ecb2 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -136,3 +136,13 @@
return bypass // if it returns 0, it will run the usual on_mob_life for that reagent. otherwise, it will stop after running handle_chemicals for the species.
else
return 0
+
+/mob/living/carbon/human/can_track(mob/living/user)
+ if(wear_id && istype(wear_id.GetID(), /obj/item/weapon/card/id/syndicate))
+ return 0
+ if(istype(head, /obj/item/clothing/head))
+ var/obj/item/clothing/head/hat = head
+ if(hat.blockTracking)
+ return 0
+
+ return ..()
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index f55238a821b..b9321879663 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -31,7 +31,7 @@
/mob/living/carbon/human/experience_pressure_difference()
playsound(src, 'sound/effects/space_wind.ogg', 50, 1)
- if(shoes.flags&NOSLIP)
+ if(shoes && shoes.flags&NOSLIP)
return 0
. = ..()
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 4f953dff6e9..c99b39e3995 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -73,12 +73,14 @@
if (getBrainLoss() >= 60 && stat != DEAD)
if (prob(3))
- switch(pick(1,2,3))
+ switch(pick(1,2,3,4))
if(1)
- say(pick("IM A PONY NEEEEEEIIIIIIIIIGH", "without oxigen blob don't evoluate?", "CAPTAINS A COMDOM", "[pick("", "that faggot traitor")] [pick("joerge", "george", "gorge", "gdoruge")] [pick("mellens", "melons", "mwrlins")] is grifing me HAL;P!!!", "can u give me [pick("telikesis","halk","eppilapse")]?", "THe saiyans screwed", "Bi is THE BEST OF BOTH WORLDS>", "I WANNA PET TEH monkeyS", "stop grifing me!!!!", "SOTP IT#"))
+ say(pick("IM A PONY NEEEEEEIIIIIIIIIGH", "without oxigen blob don't evoluate?", "CAPTAINS A COMDOM", "[pick("", "that faggot traitor")] [pick("joerge", "george", "gorge", "gdoruge")] [pick("mellens", "melons", "mwrlins")] is grifing me HAL;P!!!", "can u give me [pick("telikesis","halk","eppilapse","kamelien","eksrey","glowey skin")]?", "THe saiyans screwed", "Bi is THE BEST OF BOTH WORLDS>", "I WANNA PET TEH monkeyS", "stop grifing me!!!!", "SOTP IT#", "shiggey diggey!!", "A PIRATE APPEAR"))
if(2)
- say(pick("FUS RO DAH","fucking 4rries!", "stat me", ">my face", "roll it easy!", "waaaaaagh!!!", "red wonz go fasta", "FOR TEH EMPRAH", "lol2cat", "dem dwarfs man, dem dwarfs", "SPESS MAHREENS", "hwee did eet fhor khayosss", "lifelike texture ;_;", "luv can bloooom", "PACKETS!!!"))
+ say(pick("FUS RO DAH","fucking 4rries!", "stat me", ">my face", "roll it easy!", "waaaaaagh!!!", "red wonz go fasta", "FOR TEH EMPRAH", "lol2cat", "dem dwarfs man, dem dwarfs", "SPESS MAHREENS", "hwee did eet fhor khayosss", "lifelike texture ;_;", "luv can bloooom", "PACKETS!!!", "port ba[pick("y", "i", "e")] med!!!!", "REVIRT GON CHEM!!!!!!!!", "youed call her a toeugh bithc", "closd for merbegging", "pray can u [pick("spawn", "MAke me", "creat")] [pick("zenomorfs", "ayleins", "treaitors", "sheadow linkgs", "ubdoocters")]???"))
if(3)
+ say(pick("GEY AWAY FROM ME U GREIFING PRICK!!!!", "ur a fuckeing autist!", ";HELP SHITECIRTY MURDERIN MEE!!!", "hwat dose tha [pick("g", "squid", "r")] mean?????", "CAL; TEH SHUTTLE!!!!!", "wearnig siNGUARLTY IS .... FIne xDDDDDDDDD", "AI laW 22 Open door", "this SI mY stATIon......", "who the HELL do u thenk u r?!!!!", "geT THE FUCK OUTTTT", "H U G B O X", ";;CRAGING THIS STTAYTION WITH NIO SURVIVROS", "[pick("bager", "syebl")] is down11!!!!!!!!!!!!!!!!!", "PSHOOOM"))
+ if(4)
emote("drool")
@@ -306,7 +308,7 @@
if(mind.changeling)
mind.changeling.regenerate()
hud_used.lingchemdisplay.invisibility = 0
- hud_used.lingchemdisplay.maptext = " [round(mind.changeling.chem_charges)]
"
+ hud_used.lingchemdisplay.maptext = "[round(mind.changeling.chem_charges)]
"
else
hud_used.lingchemdisplay.invisibility = 101
@@ -333,6 +335,8 @@
L.embedded_objects -= I
I.loc = get_turf(src)
visible_message("\the [I] falls out of [name]'s [L.getDisplayName()]! ","\the [I] falls out of your [L.getDisplayName()]! ")
+ if(!has_embedded_objects())
+ clear_alert("embeddedobject")
/mob/living/carbon/human/handle_heart()
if(!heart_attack)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index caa356eb117..ae6d8824d95 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -113,7 +113,7 @@
spec_base = image("icon" = 'icons/mob/human.dmi', "icon_state" = icon_state_string, "layer" = -SPECIES_LAYER)
- spec_base.color = "#[H.dna.mutant_color]"
+ spec_base.color = "#[H.dna.features["mcolor"]]"
standing = spec_base
if(standing)
@@ -136,7 +136,7 @@
if(hair_color)
if(hair_color == "mutcolor")
- img_facial_s.color = "#" + H.dna.mutant_color
+ img_facial_s.color = "#" + H.dna.features["mcolor"]
else
img_facial_s.color = "#" + hair_color
else
@@ -164,7 +164,7 @@
if(hair_color)
if(hair_color == "mutcolor")
- img_hair_s.color = "#" + H.dna.mutant_color
+ img_hair_s.color = "#" + H.dna.features["mcolor"]
else
img_hair_s.color = "#" + hair_color
else
@@ -240,33 +240,75 @@
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
bodyparts_to_add -= "tail"
+
if("waggingtail" in mutant_bodyparts)
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
bodyparts_to_add -= "waggingtail"
else if ("tail" in mutant_bodyparts)
bodyparts_to_add -= "waggingtail"
+ if("spines" in mutant_bodyparts)
+ if(!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
+ bodyparts_to_add -= "spines"
+
+ if("waggingspines" in mutant_bodyparts)
+ if(!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
+ bodyparts_to_add -= "waggingspines"
+ else if ("tail" in mutant_bodyparts)
+ bodyparts_to_add -= "waggingspines"
+
if("snout" in mutant_bodyparts) //Take a closer look at that snout!
if(H.wear_mask && (H.wear_mask.flags_inv & HIDEFACE))
bodyparts_to_add -= "snout"
+ if("frills" in mutant_bodyparts)
+ if(!H.dna.features["frills"] || H.dna.features["frills"] == "None" || H.head && (H.head.flags_inv & HIDEEARS))
+ bodyparts_to_add -= "frills"
+
+ if("horns" in mutant_bodyparts)
+ if(!H.dna.features["horns"] || H.dna.features["horns"] == "None" || H.head && (H.head.flags & BLOCKHAIR) || (H.wear_mask && (H.wear_mask.flags & BLOCKHAIR)))
+ bodyparts_to_add -= "horns"
+
if(!bodyparts_to_add)
return
- var/icon_state_string = "[id]_"
var/g = (H.gender == FEMALE) ? "f" : "m"
- var/image/I
- if(sexes)
- icon_state_string += "[g]_s"
- else
- icon_state_string += "_s"
+ var/image/I
for(var/layer in relevent_layers)
for(var/bodypart in bodyparts_to_add)
- I = image("icon" = 'icons/mob/mutant_bodyparts.dmi', "icon_state" = "[icon_state_string]_[bodypart]_[layer]", "layer" =- layer)
+ var/datum/sprite_accessory/S
+ switch(bodypart)
+ if("tail")
+ S = tails_list[H.dna.features["tail"]]
+ if("waggingtail")
+ S.= animated_tails_list[H.dna.features["tail"]]
+ if("spines")
+ S = spines_list[H.dna.features["spines"]]
+ if("waggingspines")
+ S.= animated_spines_list[H.dna.features["spines"]]
+ if("snout")
+ S = snouts_list[H.dna.features["snout"]]
+ if("frills")
+ S = frills_list[H.dna.features["frills"]]
+ if("horns")
+ S = horns_list[H.dna.features["horns"]]
+ if("body_markings")
+ S = body_markings_list[H.dna.features["body_markings"]]
+
+ if(!S || S.icon_state == "none")
+ continue
+ var/icon_string
+ if(S.gender_specific)
+ icon_string = "[id]_[g]_[bodypart]_[S.icon_state]_[layer]"
+ else
+ icon_string = "[id]_m_[bodypart]_[S.icon_state]_[layer]"
+
+ I = image("icon" = 'icons/mob/mutant_bodyparts.dmi', "icon_state" = icon_string, "layer" =- layer)
+
if(!(H.disabilities & HUSK))
- I.color = "#[H.dna.mutant_color]"
+ I.color = "#[H.dna.features["mcolor"]]"
standing += I
H.overlays_standing[layer] = standing.Copy()
standing = list()
@@ -558,8 +600,12 @@
H.client.screen += global_hud.darkMask
if(H.blind)
- if(H.eye_blind) H.blind.layer = 18
- else H.blind.layer = 0
+ if(H.eye_blind)
+ H.throw_alert("blind")
+ H.blind.layer = 18
+ else
+ H.clear_alert("blind")
+ H.blind.layer = 0
if(!H.client)//no client, no screen to update
return 1
@@ -567,7 +613,11 @@
if( H.disabilities & NEARSIGHT && !istype(H.glasses, /obj/item/clothing/glasses/regular) )
H.client.screen += global_hud.vimpaired
if(H.eye_blurry) H.client.screen += global_hud.blurry
- if(H.druggy) H.client.screen += global_hud.druggy
+ if(H.druggy)
+ H.client.screen += global_hud.druggy
+ H.throw_alert("high")
+ else
+ H.clear_alert("high")
if(H.eye_stat > 20)
diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm
index dd01e5a0420..79f84797b28 100644
--- a/code/modules/mob/living/carbon/human/species_types.dm
+++ b/code/modules/mob/living/carbon/human/species_types.dm
@@ -30,7 +30,7 @@
default_color = "00FF00"
roundstart = 1
specflags = list(MUTCOLORS,EYECOLOR,LIPS)
- mutant_bodyparts = list("tail", "snout")
+ mutant_bodyparts = list("tail", "snout", "spines", "horns", "frills", "body_markings")
attack_verb = "slash"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
diff --git a/code/modules/mob/living/carbon/human/whisper.dm b/code/modules/mob/living/carbon/human/whisper.dm
index 23bb31ead56..fd4573900c7 100644
--- a/code/modules/mob/living/carbon/human/whisper.dm
+++ b/code/modules/mob/living/carbon/human/whisper.dm
@@ -10,7 +10,7 @@
return
- message = trim(strip_html_properly(message))
+ message = trim(html_encode(message))
if(!can_speak(message))
return
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 120e7da4350..9ac7837148a 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -293,12 +293,16 @@
CheckStamina()
if(sleeping)
+ throw_alert("asleep")
handle_dreams()
adjustStaminaLoss(-10)
sleeping = max(sleeping-1, 0)
if( prob(10) && health && !hal_crit )
spawn(0)
emote("snore")
+ else
+ clear_alert("asleep")
+
var/restingpwr = 1 + 4 * resting
@@ -371,10 +375,6 @@
else
hallucination -= 2
- else
- for(var/atom/a in hallucinations)
- qdel(a)
-
//this handles hud updates. Calls update_vision() and handle_hud_icons()
/mob/living/carbon/handle_regular_hud_updates()
if(!client) return 0
diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm
index 1005cf6f2fc..bec6d68d0ae 100644
--- a/code/modules/mob/living/carbon/monkey/life.dm
+++ b/code/modules/mob/living/carbon/monkey/life.dm
@@ -145,7 +145,7 @@
if(mind.changeling)
mind.changeling.regenerate()
hud_used.lingchemdisplay.invisibility = 0
- hud_used.lingchemdisplay.maptext = " [round(mind.changeling.chem_charges)]
"
+ hud_used.lingchemdisplay.maptext = "[round(mind.changeling.chem_charges)]
"
else
hud_used.lingchemdisplay.invisibility = 101
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index 51b73cc9a7a..a7c821c9493 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -8,6 +8,8 @@
pass_flags = PASSTABLE
languages = MONKEY
ventcrawler = 1
+ type_of_meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey
+ gib_type = /obj/effect/decal/cleanable/blood/gibs
/mob/living/carbon/monkey/New()
create_reagents(1000)
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index af02c55f543..5beeeb3a847 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -170,8 +170,10 @@
if(blind)
if(eye_blind)
blind.layer = 18
+ throw_alert("blind")
else
blind.layer = 0
+ clear_alert("blind")
if (disabilities & NEARSIGHT)
client.screen += global_hud.vimpaired
@@ -181,6 +183,9 @@
if (druggy)
client.screen += global_hud.druggy
+ throw_alert("high")
+ else
+ clear_alert("high")
if(eye_stat > 20)
if(eye_stat > 30)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 0f1fe82505d..d23dcbabcc0 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -664,6 +664,10 @@ Sorry Giacom. Please don't be mad :(
/mob/living/update_gravity(has_gravity)
if(!ticker)
return
+ if(has_gravity)
+ clear_alert("weightless")
+ else
+ throw_alert("weightless")
float(!has_gravity)
/mob/living/proc/float(on)
@@ -816,3 +820,41 @@ Sorry Giacom. Please don't be mad :(
/mob/living/proc/get_standard_pixel_y_offset(lying = 0)
return initial(pixel_y)
+
+/mob/living/Stat()
+ ..()
+ if(statpanel("Status"))
+ if(ticker)
+ if(ticker.mode)
+ if(istype(ticker.mode, /datum/game_mode/gang))
+ var/datum/game_mode/gang/mode = ticker.mode
+ if(isnum(mode.A_timer))
+ stat(null, "[gang_name("A")] Gang Takeover: [max(mode.A_timer, 0)]")
+ if(isnum(mode.B_timer))
+ stat(null, "[gang_name("B")] Gang Takeover: [max(mode.B_timer, 0)]")
+
+/mob/living/cancel_camera()
+ ..()
+ cameraFollow = null
+
+/mob/living/proc/can_track(mob/living/user)
+ //basic fast checks go first. When overriding this proc, I recommend calling ..() at the end.
+ var/turf/T = get_turf(src)
+ if(!T)
+ return 0
+ if(T.z == ZLEVEL_CENTCOM) //dont detect mobs on centcomm
+ return 0
+ if(T.z >= ZLEVEL_SPACEMAX)
+ return 0
+ if(src == user)
+ return 0
+ if(invisibility || alpha == 0)//cloaked
+ return 0
+ if(digitalcamo)
+ return 0
+
+ // Now, are they viewable by a camera? (This is last because it's the most intensive check)
+ if(!near_camera(src))
+ return 0
+
+ return 1
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 59436c1028b..6509db4ac67 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -17,8 +17,6 @@
var/hallucination = 0 //Directly affects how long a mob will hallucinate for
- var/list/atom/hallucinations = list() //A list of hallucinated people that try to attack the mob. See /obj/effect/fake_attacker in hallucinations.dm
-
var/last_special = 0 //Used by the resist verb, likely used to prevent players from bypassing next_move by logging in/out.
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 9317991ac81..65479146645 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -35,6 +35,7 @@ var/list/ai_list = list()
var/obj/item/device/pda/ai/aiPDA = null
var/obj/item/device/multitool/aiMulti = null
var/obj/machinery/bot/Bot
+ var/tracking = 0 //this is 1 if the AI is currently tracking somebody, but the track has not yet been completed.
//MALFUNCTION
var/datum/module_picker/malf_picker
@@ -62,6 +63,13 @@ var/list/ai_list = list()
var/waypoint_mode = 0 //Waypoint mode is for selecting a turf via clicking.
var/apc_override = 0 //hack for letting the AI use its APC even when visionless
+ var/mob/camera/aiEye/eyeobj = new()
+ var/sprint = 10
+ var/cooldown = 0
+ var/acceleration = 1
+
+ var/obj/machinery/camera/portable/builtInCamera
+
/mob/living/silicon/ai/New(loc, var/datum/ai_laws/L, var/obj/item/device/mmi/B, var/safety = 0)
rename_self("ai", 1)
name = real_name
@@ -118,6 +126,13 @@ var/list/ai_list = list()
job = "AI"
ai_list += src
shuttle_caller_list += src
+
+ eyeobj.ai = src
+ eyeobj.name = "[src.name] (AI Eye)" // Give it a name
+ eyeobj.loc = src.loc
+
+ builtInCamera = new /obj/machinery/camera/portable(src)
+ builtInCamera.network = list("SS13")
..()
return
@@ -125,6 +140,7 @@ var/list/ai_list = list()
ai_list -= src
shuttle_caller_list -= src
SSshuttle.autoEvac()
+ qdel(eyeobj) // No AI, no Eye
..()
@@ -457,7 +473,8 @@ var/list/ai_list = list()
/mob/living/silicon/ai/proc/switchCamera(var/obj/machinery/camera/C)
- src.cameraFollow = null
+ if(!tracking)
+ cameraFollow = null
if (!C || stat == 2) //C.can_use())
return 0
@@ -589,7 +606,7 @@ var/list/ai_list = list()
set category = "AI Commands"
set name = "Jump To Network"
unset_machine()
- src.cameraFollow = null
+ cameraFollow = null
var/cameralist[0]
if(usr.stat == 2)
diff --git a/code/modules/mob/living/silicon/ai/freelook/chunk.dm b/code/modules/mob/living/silicon/ai/freelook/chunk.dm
index 48adee0e407..62edcd7bd03 100644
--- a/code/modules/mob/living/silicon/ai/freelook/chunk.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/chunk.dm
@@ -114,7 +114,7 @@
var/turf/t = turf
if(obscuredTurfs[t])
if(!t.obscured)
- t.obscured = image('icons/effects/cameravis.dmi', t, "black", 15)
+ t.obscured = image('icons/effects/cameravis.dmi', t, "black", 16)
obscured += t.obscured
for(var/eye in seenby)
@@ -169,7 +169,7 @@
for(var/turf in obscuredTurfs)
var/turf/t = turf
if(!t.obscured)
- t.obscured = image('icons/effects/cameravis.dmi', t, "black", 15)
+ t.obscured = image('icons/effects/cameravis.dmi', t, "black", 16)
obscured += t.obscured
#undef UPDATE_BUFFER
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm
index 33ba6d1056f..dd38dac92d1 100644
--- a/code/modules/mob/living/silicon/ai/freelook/eye.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm
@@ -36,30 +36,8 @@
return ai.client
return null
-
-// AI MOVEMENT
-
-// The AI's "eye". Described on the top of the page.
-
-/mob/living/silicon/ai
- var/mob/camera/aiEye/eyeobj = new()
- var/sprint = 10
- var/cooldown = 0
- var/acceleration = 1
-
-
-// Intiliaze the eye by assigning it's "ai" variable to us. Then set it's loc to us.
-/mob/living/silicon/ai/New()
- ..()
- eyeobj.ai = src
- eyeobj.name = "[src.name] (AI Eye)" // Give it a name
- spawn(5)
- eyeobj.loc = src.loc
-
-/mob/living/silicon/ai/Destroy()
- eyeobj.ai = null
- qdel(eyeobj) // No AI, no Eye
- eyeobj = null
+/mob/camera/aiEye/Destroy()
+ ai = null
..()
/atom/proc/move_camera_by_click()
@@ -92,7 +70,8 @@
else
user.sprint = initial
- user.cameraFollow = null
+ if(!user.tracking)
+ user.cameraFollow = null
//user.unset_machine() //Uncomment this if it causes problems.
//user.lightNearbyCamera()
@@ -115,10 +94,7 @@
src.eyeobj.ai = src
src.eyeobj.name = "[src.name] (AI Eye)" // Give it a name
- if(client && client.eye)
- client.eye = src
- for(var/datum/camerachunk/c in eyeobj.visibleCameraChunks)
- c.remove(eyeobj)
+ eyeobj.setLoc(loc)
/mob/living/silicon/ai/verb/toggle_acceleration()
set category = "AI Commands"
@@ -126,6 +102,3 @@
acceleration = !acceleration
usr << "Camera acceleration has been toggled [acceleration ? "on" : "off"]."
-
-
-
diff --git a/code/modules/mob/living/silicon/laws.dm b/code/modules/mob/living/silicon/laws.dm
index aed6b5c06a4..d78b2448e28 100644
--- a/code/modules/mob/living/silicon/laws.dm
+++ b/code/modules/mob/living/silicon/laws.dm
@@ -6,30 +6,37 @@
make_laws()
/mob/living/silicon/proc/set_zeroth_law(var/law, var/law_borg)
+ throw_alert("newlaw")
src.laws_sanity_check()
src.laws.set_zeroth_law(law, law_borg)
/mob/living/silicon/proc/add_inherent_law(var/law)
+ throw_alert("newlaw")
laws_sanity_check()
laws.add_inherent_law(law)
/mob/living/silicon/proc/clear_inherent_laws()
+ throw_alert("newlaw")
laws_sanity_check()
laws.clear_inherent_laws()
/mob/living/silicon/proc/add_supplied_law(var/number, var/law)
+ throw_alert("newlaw")
laws_sanity_check()
laws.add_supplied_law(number, law)
/mob/living/silicon/proc/clear_supplied_laws()
+ throw_alert("newlaw")
laws_sanity_check()
laws.clear_supplied_laws()
/mob/living/silicon/proc/add_ion_law(var/law)
+ throw_alert("newlaw")
laws_sanity_check()
laws.add_ion_law(law)
/mob/living/silicon/proc/clear_ion_laws()
+ throw_alert("newlaw")
laws_sanity_check()
laws.clear_ion_laws()
@@ -40,3 +47,8 @@
if(2)
var/datum/ai_laws/lawtype = pick(typesof(/datum/ai_laws/default) - /datum/ai_laws/default)
laws = new lawtype()
+ laws.associate(src)
+
+/mob/living/silicon/proc/clear_zeroth_law(var/force)
+ laws_sanity_check()
+ laws.clear_zeroth_law(force)
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index a324cdbbfe7..0e629e59283 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -163,9 +163,9 @@
// ok, we're alive, camera is good and in our network...
- src.set_machine(src)
- src:current = C
- src.reset_view(C)
+ set_machine(src)
+ current = C
+ reset_view(C)
return 1
diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm
index 4144a3a3ef2..5655b34bc97 100644
--- a/code/modules/mob/living/silicon/pai/software.dm
+++ b/code/modules/mob/living/silicon/pai/software.dm
@@ -632,9 +632,9 @@
var/dat = "Digital Messenger "
dat += {"Signal/Receiver Status:
- [(pda.toff) ? " \[Off\] " : " \[On\] "]
+ [(pda.toff) ? "\[Off\] " : "\[On\] "]
Ringer Status:
- [(pda.silent) ? " \[Off\] " : " \[On\] "] "}
+ [(pda.silent) ? "\[Off\] " : "\[On\] "] "}
dat += ""
if(!pda.toff)
for (var/obj/item/device/pda/P in sortNames(get_viewable_pdas()))
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index 46be3e6feb3..7ce41a2de6a 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -12,7 +12,6 @@
use_power()
/mob/living/silicon/robot/proc/clamp_values()
-
SetStunned(min(stunned, 30))
SetParalysis(min(paralysis, 30))
SetWeakened(min(weakened, 20))
@@ -23,29 +22,16 @@
adjustFireLoss(0)
/mob/living/silicon/robot/proc/use_power()
-
- if(cell)
- if(cell.charge <= 0)
+ if(cell && cell.charge)
+ if(cell.charge <= 100)
uneq_all()
- stat = UNCONSCIOUS
- else if (cell.charge <= 100)
- uneq_all()
- cell.use(1)
- else
- if(module_state_1)
- cell.use(5)
- if(module_state_2)
- cell.use(5)
- if(module_state_3)
- cell.use(5)
- cell.use(1)
+ cell.use(1)
else
uneq_all()
stat = UNCONSCIOUS
/mob/living/silicon/robot/handle_regular_status_updates()
-
if(camera && !scrambledcodes)
if(stat == DEAD || wires.IsCameraCut())
camera.status = 0
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 77e0040131f..a35b0988bca 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -556,13 +556,8 @@
if(user != src)//To prevent syndieborgs from emagging themselves
if(!opened)//Cover is closed
if(locked)
- if(prob(90))
- user << "You emag the cover lock. "
- locked = 0
- else
- user << "You fail to emag the cover lock! "
- if(prob(25))
- src << "Hack attempt detected. "
+ user << "You emag the cover lock. "
+ locked = 0
else
user << "The cover is already unlocked! "
return
@@ -573,42 +568,38 @@
return
else
sleep(6)
- if(prob(50))
- SetEmagged(1)
- SetLockdown(1) //Borgs were getting into trouble because they would attack the emagger before the new laws were shown
- lawupdate = 0
- connected_ai = null
- user << "You emag [src]'s interface. "
- message_admins("[key_name_admin(user)] emagged cyborg [key_name_admin(src)]. Laws overridden.")
- log_game("[key_name(user)] emagged cyborg [key_name(src)]. Laws overridden.")
- clear_supplied_laws()
- clear_inherent_laws()
- laws = new /datum/ai_laws/syndicate_override
- var/time = time2text(world.realtime,"hh:mm:ss")
- lawchanges.Add("[time] : [user.name]([user.key]) emagged [name]([key])")
- set_zeroth_law("Only [user.real_name] and people they designate as being such are Syndicate Agents.")
- src << "ALERT: Foreign software detected. "
- sleep(5)
- src << "Initiating diagnostics... "
- sleep(20)
- src << "SynBorg v1.7 loaded. "
- sleep(5)
- src << "LAW SYNCHRONISATION ERROR "
- sleep(5)
- src << "Would you like to send a report to NanoTraSoft? Y/N "
- sleep(10)
- src << "> N "
- sleep(20)
- src << "ERRORERRORERROR "
- src << "Obey these laws: "
- laws.show_laws(src)
- src << "ALERT: [user.real_name] is your new master. Obey your new laws and their commands. "
- SetLockdown(0)
- update_icons()
- else
- user << "You fail to [ locked ? "unlock" : "lock"] [src]'s interface! "
- if(prob(25))
- src << "ALERT: Hack attempt detected. "
+ SetEmagged(1)
+ SetLockdown(1) //Borgs were getting into trouble because they would attack the emagger before the new laws were shown
+ lawupdate = 0
+ connected_ai = null
+ user << "You emag [src]'s interface. "
+ message_admins("[key_name_admin(user)] emagged cyborg [key_name_admin(src)]. Laws overridden.")
+ log_game("[key_name(user)] emagged cyborg [key_name(src)]. Laws overridden.")
+ clear_supplied_laws()
+ clear_inherent_laws()
+ clear_zeroth_law(0)
+ laws = new /datum/ai_laws/syndicate_override
+ var/time = time2text(world.realtime,"hh:mm:ss")
+ lawchanges.Add("[time] : [user.name]([user.key]) emagged [name]([key])")
+ set_zeroth_law("Only [user.real_name] and people they designate as being such are Syndicate Agents.")
+ src << "ALERT: Foreign software detected. "
+ sleep(5)
+ src << "Initiating diagnostics... "
+ sleep(20)
+ src << "SynBorg v1.7 loaded. "
+ sleep(5)
+ src << "LAW SYNCHRONISATION ERROR "
+ sleep(5)
+ src << "Would you like to send a report to NanoTraSoft? Y/N "
+ sleep(10)
+ src << "> N "
+ sleep(20)
+ src << "ERRORERRORERROR "
+ src << "Obey these laws: "
+ laws.show_laws(src)
+ src << "ALERT: [user.real_name] is your new master. Obey your new laws and their commands. "
+ SetLockdown(0)
+ update_icons()
/mob/living/silicon/robot/verb/unlock_own_cover()
set category = "Robot Commands"
@@ -949,6 +940,10 @@
// They stay locked down if their wire is cut.
if(wires.LockedCut())
state = 1
+ if(state)
+ throw_alert("locked")
+ else
+ clear_alert("locked")
lockcharge = state
update_canmove()
@@ -963,6 +958,10 @@
if(hud_used)
hud_used.update_robot_modules_display() //Shows/hides the emag item if the inventory screen is already open.
update_icons()
+ if(emagged)
+ throw_alert("hacked")
+ else
+ clear_alert("hacked")
/mob/living/silicon/robot/verb/outputlaws()
set category = "Robot Commands"
diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm
index a04e155095f..c73a3443b09 100644
--- a/code/modules/mob/living/simple_animal/friendly/corgi.dm
+++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm
@@ -68,7 +68,7 @@
if( istype(inventory_head,/obj/item/clothing/head/helmet) && istype(inventory_back,/obj/item/clothing/suit/armor) )
if( O.force )
user << "[src] is wearing too much armor! You can't cause \him any damage. "
- visible_message(" [user] hits [src] with [O], however [src] is too armored. ")
+ visible_message("[user] hits [src] with [O], however [src] is too armored. ")
else
user << "[src] is wearing too much armor! You can't reach \his skin."
visible_message("[user] gently taps [src] with [O].")
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm
index 3ee98de3c03..c835c1c4e79 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm
@@ -112,4 +112,29 @@
/mob/living/simple_animal/drone/stripPanelEquip(obj/item/what, mob/who, where)
- ..(what, who, where, 1)
\ No newline at end of file
+ ..(what, who, where, 1)
+
+/mob/living/simple_animal/drone/verb/quick_equip()
+ set name = "quick-equip"
+ set hidden = 1
+ var/obj/item/I = get_active_hand()
+ var/obj/item/weapon/storage/S = get_inactive_hand()
+ var/obj/item/weapon/storage/T = internal_storage
+ if (!I)
+ usr << "You are not holding anything to equip! "
+ return
+ if(equip_to_appropriate_slot(I))
+ if(hand)
+ update_inv_l_hand(0)
+ else
+ update_inv_r_hand(0)
+ else if(s_active && s_active.can_be_inserted(I,1)) //if storage active insert there
+ s_active.handle_item_insertion(I)
+ else if(istype(S, /obj/item/weapon/storage) && S.can_be_inserted(I,1)) //see if we have box in other hand
+ S.handle_item_insertion(I)
+ else if (istype(T) && T.can_be_inserted(I,1)) // If carrying storage item like toolbox
+ T.handle_item_insertion(I)
+ else if(!internal_storage)
+ equip_to_slot(I, "drone_storage_slot")
+ else
+ usr << "You are unable to equip that! "
diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
index 066d484506d..1d3e90fb8e5 100644
--- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
+++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
@@ -155,6 +155,8 @@
var/T = src.loc
+ if(stat == DEAD)
+ return
if(busy != SPINNING_WEB)
busy = SPINNING_WEB
src.visible_message("\the [src] begins to secrete a sticky substance. ")
@@ -171,6 +173,8 @@
set category = "Spider"
set desc = "Wrap up prey to feast upon and objects for safe keeping."
+ if(stat == DEAD)
+ return
if(!cocoon_target)
var/list/choices = list()
for(var/mob/living/L in view(1,src))
@@ -228,6 +232,8 @@
set desc = "Lay a clutch of eggs, but you must wrap a creature for feeding first."
var/obj/effect/spider/eggcluster/E = locate() in get_turf(src)
+ if(stat == DEAD)
+ return
if(E)
src << "There is already a cluster of eggs here! "
else if(!fed)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
index 9e0296844b0..b4616ae9fb7 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -41,6 +41,10 @@
return
..()
+/mob/living/simple_animal/hostile/asteroid/death(gibbed)
+ feedback_add_details("mobs_killed_mining","[src.name]")
+ ..(gibbed)
+
/mob/living/simple_animal/hostile/asteroid/basilisk
name = "basilisk"
desc = "A territorial beast, covered in a thick shell that absorbs energy. Its stare causes victims to freeze from the inside."
@@ -110,6 +114,7 @@
D.layer = 4.1
..(gibbed)
+
/mob/living/simple_animal/hostile/asteroid/goldgrub
name = "goldgrub"
desc = "A worm that grows fat from eating everything in its sight. Seems to enjoy precious metals and other shiny things, hence the name."
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 4c2abe52a30..f7f81ef7c41 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -346,16 +346,16 @@
MED.amount -= 1
if(MED.amount <= 0)
qdel(MED)
- visible_message(" [user] applies [MED] on [src]. ")
+ visible_message("[user] applies [MED] on [src]. ")
return
else
- user << " [MED] won't help at all. "
+ user << "[MED] won't help at all. "
return
else
- user << " [src] is at full health. "
+ user << "[src] is at full health. "
return
else
- user << " [src] is dead, medical items won't bring it back to life. "
+ user << "[src] is dead, medical items won't bring it back to life. "
return
if((butcher_results) && (stat == DEAD))
@@ -494,11 +494,11 @@
/mob/living/simple_animal/update_transform()
var/matrix/ntransform = matrix(transform) //aka transform.Copy()
var/changed = 0
-
+
if(resize != RESIZE_DEFAULT_SIZE)
changed++
ntransform.Scale(resize)
resize = RESIZE_DEFAULT_SIZE
-
+
if(changed)
- animate(src, transform = ntransform, time = 2, easing = EASE_IN|EASE_OUT)
+ animate(src, transform = ntransform, time = 2, easing = EASE_IN|EASE_OUT)
diff --git a/code/modules/mob/living/simple_animal/slaughter/slaughter.dm b/code/modules/mob/living/simple_animal/slaughter/slaughter.dm
new file mode 100644
index 00000000000..267af8c2dd7
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/slaughter/slaughter.dm
@@ -0,0 +1,173 @@
+//////////////////The Monster
+
+/mob/living/simple_animal/slaughter
+ name = "Slaughter Demon"
+ real_name = "Slaughter Demon"
+ desc = "You should run."
+ speak_emote = list("gurgles")
+ emote_hear = list("wails","screeches")
+ response_help = "thinks better of touching"
+ response_disarm = "flails at"
+ response_harm = "punches"
+ icon = 'icons/mob/mob.dmi'
+ icon_state = "daemon"
+ speed = 0
+ a_intent = "harm"
+ stop_automated_movement = 1
+ status_flags = CANPUSH
+ attack_sound = 'sound/magic/demon_attack1.ogg'
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ minbodytemp = 0
+ faction = list("slaughter")
+ attacktext = "wildly tears into"
+ maxHealth = 250
+ health = 250
+ environment_smash = 1
+ melee_damage_lower = 30
+ melee_damage_upper = 30
+ see_in_dark = 8
+ see_invisible = SEE_INVISIBLE_MINIMUM
+ var/devoured = 0
+ var/phased = FALSE
+ var/holder = null
+ var/eating = FALSE
+ var/mob/living/kidnapped = null
+ var/playstyle_string = "You are the Slaughter Demon, a terible creature from another existence. You have a single desire: To kill. \
+ You may Ctrl+Click on blood pools to travel through them, appearing and dissaapearing from the station at will. \
+ Pulling a dead or critical mob while you enter a pool will pull them in with you, allowing you to feast. "
+
+
+/mob/living/simple_animal/slaughter/death()
+ ..(1)
+ new /obj/effect/decal/cleanable/blood (src.loc)
+ new /obj/item/weapon/demonheart (src.loc)
+ playsound(get_turf(src),'sound/magic/demon_dies.ogg', 200, 1)
+ visible_message("The [src] screams in anger as its form collapes into a pool of viscera. ")
+ ghostize()
+ qdel(src)
+ return
+
+
+
+////////////////////The Powers
+
+/mob/living/simple_animal/slaughter/proc/phaseout(var/obj/effect/decal/cleanable/B)
+ var/turf/mobloc = get_turf(src.loc)
+ var/turf/bloodloc = get_turf(B.loc)
+ if(Adjacent(bloodloc))
+ src.notransform = TRUE
+ spawn(0)
+ src.visible_message("The [src] sinks into the pool of blood.")
+ playsound(get_turf(src), 'sound/magic/enter_blood.ogg', 100, 1, -1)
+ var/obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter( mobloc )
+ src.ExtinguishMob()
+ if(src.buckled)
+ src.buckled.unbuckle_mob()
+ if(src.pulling)
+ if(istype(src.pulling, /mob/living))
+ var/mob/living/victim = src.pulling
+ if(victim.stat == CONSCIOUS)
+ src.visible_message("[victim] kicks free of the [src] at the last second!")
+ else
+ victim.loc = holder
+ src.visible_message("The [src] drags [victim] into the pool of blood! ")
+ src.kidnapped = victim
+ src.loc = holder
+ src.phased = TRUE
+ src.holder = holder
+ if(src.kidnapped)
+ src << "You being to feast on [kidnapped]. You can not move while you are doing this. "
+ src.eating = TRUE
+ playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
+ sleep(30)
+ playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
+ sleep(30)
+ playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
+ sleep(30)
+ src << "You devour [kidnapped]. Your health is fully restored. "
+ src.adjustBruteLoss(-1000)
+ kidnapped.ghostize()
+ qdel(kidnapped)
+ src.devoured++
+ src.kidnapped = null
+ src.eating = FALSE
+ src.notransform = 0
+
+/mob/living/simple_animal/slaughter/proc/phasein(var/obj/effect/decal/cleanable/B)
+ if(src.eating)
+ src << "Finish eating first! "
+ else
+ src.loc = B.loc
+ src.phased = FALSE
+ src.client.eye = src
+ src.visible_message("The [src] rises out of the pool of blood! ")
+ playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1)
+ qdel(src.holder)
+
+/obj/effect/decal/cleanable/blood/CtrlClick(var/mob/user)
+ ..()
+ if(istype(user, /mob/living/simple_animal/slaughter))
+ var/mob/living/simple_animal/slaughter/S = user
+ if(S.phased)
+ S.phasein(src)
+ else
+ S.phaseout(src)
+
+
+/obj/effect/decal/cleanable/trail_holder/CtrlClick(var/mob/user)
+ ..()
+ if(istype(user, /mob/living/simple_animal/slaughter))
+ var/mob/living/simple_animal/slaughter/S = user
+ if(S.phased)
+ S.phasein(src)
+ else
+ S.phaseout(src)
+
+
+
+/turf/CtrlClick(var/mob/user)
+ ..()
+ if(istype(user, /mob/living/simple_animal/slaughter))
+ var/mob/living/simple_animal/slaughter/S = user
+ for(var/obj/effect/decal/cleanable/B in src.contents)
+ if(istype(B, /obj/effect/decal/cleanable/blood) || istype(B, /obj/effect/decal/cleanable/trail_holder))
+ if(S.phased)
+ S.phasein(B)
+ break
+ else
+ S.phaseout(B)
+ break
+
+/obj/effect/dummy/slaughter //Can't use the wizard one, blocked by jaunt/slow
+ name = "water"
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "nothing"
+ var/canmove = 1
+ density = 0
+ anchored = 1
+
+obj/effect/dummy/slaughter/relaymove(var/mob/user, direction)
+ if (!src.canmove || !direction) return
+ var/turf/newLoc = get_step(src,direction)
+ loc = newLoc
+ src.canmove = 0
+ spawn(1)
+ src.canmove = 1
+
+/obj/effect/dummy/slaughter/ex_act(blah)
+ return
+/obj/effect/dummy/slaughter/bullet_act(blah)
+ return
+
+/obj/effect/dummy/slaughter/singularity_act(blah)
+ return
+
+
+//////////The Loot
+
+/obj/item/weapon/demonheart
+ name = "demon's heart"
+ desc = "It's still faintly beating with rage"
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "heart-on"
+ origin_tech = "combat=5;biotech=8"
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/slaughter/slaughterevent.dm b/code/modules/mob/living/simple_animal/slaughter/slaughterevent.dm
new file mode 100644
index 00000000000..3db4b52bcfd
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/slaughter/slaughterevent.dm
@@ -0,0 +1,67 @@
+
+/datum/round_event_control/slaughter
+ name = "Spawn Slaughter Demon"
+ typepath = /datum/round_event/slaughter
+ weight = 0 //Admin only
+ max_occurrences = 1
+ earliest_start = 30 //Spawn later with more blood, hopefully
+
+
+
+/datum/round_event/slaughter
+ var/key_of_slaughter
+
+
+/datum/round_event/slaughter/proc/get_slaughter(var/end_if_fail = 0)
+ key_of_slaughter = null
+ if(!key_of_slaughter)
+ var/list/candidates = get_candidates(BE_ALIEN)
+ if(!candidates.len)
+ if(end_if_fail)
+ return 0
+ return find_slaughter()
+ var/client/C = pick(candidates)
+ key_of_slaughter = C.key
+ if(!key_of_slaughter)
+ if(end_if_fail)
+ return 0
+ return find_slaughter()
+ var/datum/mind/player_mind = new /datum/mind(key_of_slaughter)
+ player_mind.active = 1
+ var/list/spawn_locs = list()
+ for(var/obj/effect/landmark/L in landmarks_list)
+ if(isturf(L.loc))
+ switch(L.name)
+ if("carpspawn")
+ spawn_locs += L.loc
+ if(!spawn_locs)
+ return find_slaughter()
+ var /obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(pick(spawn_locs))
+ var/mob/living/simple_animal/slaughter/S = new /mob/living/simple_animal/slaughter/(holder)
+ S.phased = TRUE
+ player_mind.transfer_to(S)
+ player_mind.assigned_role = "Slaughter Demon"
+ player_mind.special_role = "Slaughter Demon"
+ ticker.mode.traitors |= player_mind
+ S << S.playstyle_string
+ S << "You are currently not currently in the same plane of existence as the station. Ctrl+Click a blood pool to manifest. "
+ message_admins("[key_of_slaughter] has been made into a Slaughter Demon by an event.")
+ log_game("[key_of_slaughter] was spawned as a Slaughter Demon by an event.")
+ return 1
+
+
+
+/datum/round_event/slaughter/start()
+ get_slaughter()
+
+
+
+/datum/round_event/slaughter/proc/find_slaughter()
+ message_admins("Attempted to spawn a Slaughter Demon but there was no players available. Will try again momentarily.")
+ spawn(50)
+ if(get_slaughter(1))
+ message_admins("Situation has been resolved, [key_of_slaughter] has been spawned as a Slaughter Demon.")
+ log_game("[key_of_slaughter] was spawned as a Slaughter Demon by an event.")
+ return 0
+ message_admins("Unfortunately, no candidates were available for becoming a Slaugter Demon. Shutting down.")
+ return kill()
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm
index e3a8d4fcdef..d638788ed1d 100644
--- a/code/modules/mob/living/simple_animal/slime/slime.dm
+++ b/code/modules/mob/living/simple_animal/slime/slime.dm
@@ -235,7 +235,7 @@
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
else
- visible_message(" [M] manages to wrestle \the [name] off! ")
+ visible_message("[M] manages to wrestle \the [name] off! ")
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
discipline_slime(M)
@@ -247,7 +247,7 @@
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
else
- visible_message(" [M] manages to wrestle \the [name] off of [Victim]! ")
+ visible_message("[M] manages to wrestle \the [name] off of [Victim]! ")
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
discipline_slime(M)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index c5d468e9ae9..416fe4d1170 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -622,9 +622,6 @@ var/list/slot_equipment_priority = list( \
set category = "OOC"
reset_view(null)
unset_machine()
- if(istype(src, /mob/living))
- if(src:cameraFollow)
- src:cameraFollow = null
/mob/Topic(href, href_list)
if(href_list["mach_close"])
@@ -719,6 +716,7 @@ var/list/slot_equipment_priority = list( \
if(master_controller)
stat("MasterController:","[round(master_controller.cost,0.001)]ds (Interval:[master_controller.processing_interval] | Iteration:[master_controller.iteration])")
+ stat("Subsystem cost per second:","[round(master_controller.SSCostPerSecond,0.001)]ds")
for(var/datum/subsystem/SS in master_controller.subsystems)
if(SS.can_fire)
SS.stat_entry()
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index 233fcd4f485..45f84087221 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -47,7 +47,7 @@
..()
//Used by throw code to hand over the mob, instead of throwing the grab. The grab is then deleted by the throw code.
-/obj/item/weapon/grab/proc/throw()
+/obj/item/weapon/grab/proc/get_mob_if_throwable()
if(affecting)
if(affecting.buckled)
return null
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 08b04e3afff..3c1906ee7dc 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -182,7 +182,7 @@
return 0
/proc/stars(n, pr)
- n = strip_html_properly(n)
+ n = html_encode(n)
if (pr == null)
pr = 25
if (pr <= 0)
diff --git a/code/modules/mob/new_player/poll.dm b/code/modules/mob/new_player/poll.dm
index 8fd5ba2d93f..08b9a8939b2 100644
--- a/code/modules/mob/new_player/poll.dm
+++ b/code/modules/mob/new_player/poll.dm
@@ -149,7 +149,7 @@
else
output += "[O.optiontext] "
else
- output += " [O.optiontext] "
+ output += " [O.optiontext] "
output += ""
if(!voted) //Only make this a form if we have not voted yet
@@ -324,7 +324,7 @@
else
output += "[O.optiontext] "
else
- output += " [O.optiontext] "
+ output += " [O.optiontext] "
output += ""
if(!voted) //Only make this a form if we have not voted yet
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index 5415474439d..e28dcc3adab 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -14,8 +14,10 @@
hair_color = random_short_color()
facial_hair_color = hair_color
eye_color = random_eye_color()
- pref_species = new /datum/species/human()
+ if(!pref_species)
+ pref_species = new /datum/species/human()
backbag = 2
+ features = random_features()
age = rand(AGE_MIN,AGE_MAX)
/datum/preferences/proc/update_preview_icon() //seriously. This is horrendous.
@@ -45,24 +47,9 @@
preview_icon = new /icon('icons/mob/human.dmi', "[skin_tone]_[g]_s")
else
preview_icon = new /icon('icons/mob/human.dmi', "[pref_species.id]_[g]_s")
- preview_icon.Blend("#[mutant_color]", ICON_MULTIPLY)
+ preview_icon.Blend("#[features["mcolor"]]", ICON_MULTIPLY)
var/datum/sprite_accessory/S
- if(underwear)
- S = underwear_list[underwear]
- if(S)
- preview_icon.Blend(new /icon(S.icon, "[S.icon_state]_s"), ICON_OVERLAY)
-
- if(undershirt)
- S = undershirt_list[undershirt]
- if(S)
- preview_icon.Blend(new /icon(S.icon, "[S.icon_state]_s"), ICON_OVERLAY)
-
- if(socks)
- S = socks_list[socks]
- if(S)
- preview_icon.Blend(new /icon(S.icon, "[S.icon_state]_s"), ICON_OVERLAY)
-
var/icon/eyes_s = new/icon()
if(EYECOLOR in pref_species.specflags)
eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "[pref_species.eyes]_s")
@@ -90,10 +77,47 @@
for(var/layer in relevent_layers)
for(var/bodypart in pref_species.mutant_bodyparts)
- var/icon/part = new/icon("icon" = 'icons/mob/mutant_bodyparts.dmi', "icon_state" = "[icon_state_string]_[bodypart]_[layer]")
- part.Blend("#[mutant_color]", ICON_MULTIPLY)
+ switch(bodypart)
+ if("tail")
+ S = tails_list[features["tail"]]
+ if("spines")
+ S = spines_list[features["spines"]]
+ if("snout")
+ S = snouts_list[features["snout"]]
+ if("frills")
+ S = frills_list[features["frills"]]
+ if("horns")
+ S = horns_list[features["horns"]]
+ if("body_markings")
+ S = body_markings_list[features["body_markings"]]
+
+ if(!S || S.icon_state == "none")
+ continue
+ var/icon_string
+ if(S.gender_specific)
+ icon_string = "[pref_species.id]_[g]_[bodypart]_[S.icon_state]_[layer]"
+ else
+ icon_string = "[pref_species.id]_m_[bodypart]_[S.icon_state]_[layer]"
+ var/icon/part = new/icon("icon" = 'icons/mob/mutant_bodyparts.dmi', "icon_state" = icon_string)
+
+ part.Blend("#[features["mcolor"]]", ICON_MULTIPLY)
preview_icon.Blend(part, ICON_OVERLAY)
+ if(underwear)
+ S = underwear_list[underwear]
+ if(S)
+ preview_icon.Blend(new /icon(S.icon, "[S.icon_state]_s"), ICON_OVERLAY)
+
+ if(undershirt)
+ S = undershirt_list[undershirt]
+ if(S)
+ preview_icon.Blend(new /icon(S.icon, "[S.icon_state]_s"), ICON_OVERLAY)
+
+ if(socks)
+ S = socks_list[socks]
+ if(S)
+ preview_icon.Blend(new /icon(S.icon, "[S.icon_state]_s"), ICON_OVERLAY)
+
var/icon/clothes_s = null
if(job_civilian_low & ASSISTANT)//This gives the preview icon clothes depending on which job(if any) is set to 'high'
clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s")
diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm
index 8b42ef1bcb8..c28d4fd705c 100644
--- a/code/modules/mob/new_player/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories.dm
@@ -41,6 +41,7 @@
var/icon_state //the icon_state of the accessory
var/name //the preview name of the accessory
var/gender = NEUTER //Determines if the accessory will be skipped or included in random hair generations
+ var/gender_specific //Something that can be worn by either gender, but looks different on each
//////////////////////
// Hair Definitions //
@@ -1046,3 +1047,232 @@
name = "Pantyhose"
icon_state = "pantyhose"
gender = FEMALE
+
+//////////.//////////////////
+// MutantParts Definitions //
+/////////////////////////////
+
+/datum/sprite_accessory/body_markings
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/body_markings/none
+ name = "None"
+ icon_state = "none"
+
+/datum/sprite_accessory/body_markings/dstripe
+ name = "Dark Stripe"
+ icon_state = "dstripe"
+
+/datum/sprite_accessory/body_markings/lstripe
+ name = "Light Stripe"
+ icon_state = "lstripe"
+
+/datum/sprite_accessory/body_markings/dtiger
+ name = "Dark Tiger Body"
+ icon_state = "dtiger"
+
+/datum/sprite_accessory/body_markings/dtigerhead
+ name = "Dark Tiger Body + Head"
+ icon_state = "dtigerhead"
+
+/datum/sprite_accessory/body_markings/ltiger
+ name = "Light Tiger Body"
+ icon_state = "ltiger"
+
+/datum/sprite_accessory/body_markings/ltigerhead
+ name = "Light Tiger Body + Head"
+ icon_state = "ltigerhead"
+
+/datum/sprite_accessory/body_markings/lbelly
+ name = "Light Belly"
+ icon_state = "lbelly"
+ gender_specific = 1
+
+/datum/sprite_accessory/tails
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/tails_animated
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/tails/smooth
+ name = "Smooth"
+ icon_state = "smooth"
+
+/datum/sprite_accessory/tails_animated/smooth
+ name = "Smooth"
+ icon_state = "smooth"
+
+/datum/sprite_accessory/tails/light
+ name = "Light"
+ icon_state = "light"
+
+/datum/sprite_accessory/tails_animated/light
+ name = "Light"
+ icon_state = "light"
+
+/datum/sprite_accessory/tails/dstripe
+ name = "Dark Stripe"
+ icon_state = "dstripe"
+
+/datum/sprite_accessory/tails_animated/dstripe
+ name = "Dark Stripe"
+ icon_state = "dstripe"
+
+/datum/sprite_accessory/tails/lstripe
+ name = "Light Stripe"
+ icon_state = "lstripe"
+
+/datum/sprite_accessory/tails_animated/lstripe
+ name = "Light Stripe"
+ icon_state = "lstripe"
+
+/datum/sprite_accessory/tails/dtiger
+ name = "Dark Tiger"
+ icon_state = "dtiger"
+
+/datum/sprite_accessory/tails_animated/dtiger
+ name = "Dark Tiger"
+ icon_state = "dtiger"
+
+/datum/sprite_accessory/tails/ltiger
+ name = "Light Tiger"
+ icon_state = "ltiger"
+
+/datum/sprite_accessory/tails_animated/ltiger
+ name = "Light Tiger"
+ icon_state = "ltiger"
+
+/datum/sprite_accessory/tails/club
+ name = "Club"
+ icon_state = "club"
+
+/datum/sprite_accessory/tails_animated/club
+ name = "Club"
+ icon_state = "club"
+
+/datum/sprite_accessory/tails/aqua
+ name = "Aquatic"
+ icon_state = "aqua"
+
+/datum/sprite_accessory/tails_animated/aqua
+ name = "Aquatic"
+ icon_state = "aqua"
+
+/datum/sprite_accessory/snouts
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/snouts/sharp
+ name = "Sharp"
+ icon_state = "sharp"
+
+/datum/sprite_accessory/snouts/round
+ name = "Round"
+ icon_state = "round"
+
+/datum/sprite_accessory/snouts/sharplight
+ name = "Sharp + Light"
+ icon_state = "sharplight"
+
+/datum/sprite_accessory/snouts/roundlight
+ name = "Round + Light"
+ icon_state = "roundlight"
+
+/datum/sprite_accessory/horns
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/horns/none
+ name = "None"
+ icon_state = "none"
+
+/datum/sprite_accessory/horns/simple
+ name = "Simple"
+ icon_state = "simple"
+
+/datum/sprite_accessory/horns/short
+ name = "Short"
+ icon_state = "short"
+
+/datum/sprite_accessory/horns/curled
+ name = "Curled"
+ icon_state = "curled"
+
+/datum/sprite_accessory/horns/ram
+ name = "Ram"
+ icon_state = "ram"
+
+/datum/sprite_accessory/horns/angler
+ name = "Angeler"
+ icon_state = "angler"
+
+/datum/sprite_accessory/frills
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/frills/none
+ name = "None"
+ icon_state = "none"
+
+/datum/sprite_accessory/frills/simple
+ name = "Simple"
+ icon_state = "simple"
+
+/datum/sprite_accessory/frills/short
+ name = "Short"
+ icon_state = "short"
+
+/datum/sprite_accessory/frills/aquatic
+ name = "Aquatic"
+ icon_state = "aqua"
+
+/datum/sprite_accessory/spines
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/spines_animated
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/spines/none
+ name = "None"
+ icon_state = "none"
+
+/datum/sprite_accessory/spines_animated/none
+ name = "None"
+ icon_state = "none"
+
+/datum/sprite_accessory/spines/short
+ name = "Short"
+ icon_state = "short"
+
+/datum/sprite_accessory/spines_animated/short
+ name = "Short"
+ icon_state = "short"
+
+/datum/sprite_accessory/spines/shortmeme
+ name = "Short + Membrane"
+ icon_state = "shortmeme"
+
+/datum/sprite_accessory/spines_animated/shortmeme
+ name = "Short + Membrane"
+ icon_state = "shortmeme"
+
+/datum/sprite_accessory/spines/long
+ name = "Long"
+ icon_state = "long"
+
+/datum/sprite_accessory/spines_animated/long
+ name = "Long"
+ icon_state = "long"
+
+/datum/sprite_accessory/spines/longmeme
+ name = "Long + Membrane"
+ icon_state = "longmeme"
+
+/datum/sprite_accessory/spines_animated/longmeme
+ name = "Long + Membrane"
+ icon_state = "longmeme"
+
+/datum/sprite_accessory/spines/aqautic
+ name = "Aquatic"
+ icon_state = "aqua"
+
+/datum/sprite_accessory/spines_animated/aqautic
+ name = "Aquatic"
+ icon_state = "aqua"
diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm
index 6b67a64ac3f..5bebfcb8682 100644
--- a/code/modules/nano/nanoui.dm
+++ b/code/modules/nano/nanoui.dm
@@ -261,7 +261,7 @@ nanoui is used to open and update nano browser uis
head_content += " "
for (var/filename in stylesheets)
- head_content += " "
+ head_content += " "
var/templatel_data[0]
for (var/key in templates)
diff --git a/code/modules/ninja/suit/suit_initialisation.dm b/code/modules/ninja/suit/suit_initialisation.dm
index ef1e10ba35e..621ee154caa 100644
--- a/code/modules/ninja/suit/suit_initialisation.dm
+++ b/code/modules/ninja/suit/suit_initialisation.dm
@@ -40,7 +40,7 @@
break
lock_suit(U,1)//Check for icons.
U.regenerate_icons()
- U << " Linking neural-net interface...\nPattern \green GREEN , continuing operation. "
+ U << "Linking neural-net interface...\nPattern \green GREEN , continuing operation. "
if(4)
U << "VOID-shift device status: ONLINE .\nCLOAK-tech device status: ONLINE . "
if(5)
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index 341155a3721..0554c0ab656 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -24,6 +24,9 @@
pressure_resistance = 2
var/colour = "black" //what colour the ink is!
+/obj/item/weapon/pen/suicide_act(mob/user)
+ user.visible_message("[user] is scribbling numbers all over themself with [src]! It looks like they're trying to commit sudoku! ")
+ return(BRUTELOSS)
/obj/item/weapon/pen/blue
desc = "It's a normal blue ink pen."
@@ -95,24 +98,22 @@
if(user.mind in ticker.mode.A_bosses)
if(ticker.mode.add_gangster(M.mind,"A"))
M.Paralyse(5)
- cooldown(ticker.mode.A_gang.len, )
+ cooldown(max(0,ticker.mode.B_gang.len - ticker.mode.A_gang.len))
else
user << "This mind is resistant to recruitment! "
else if(user.mind in ticker.mode.B_bosses)
if(ticker.mode.add_gangster(M.mind,"B"))
M.Paralyse(5)
- cooldown(ticker.mode.B_gang.len)
+ cooldown(max(0,ticker.mode.A_gang.len - ticker.mode.B_gang.len))
else
user << "This mind is resistant to recruitment! "
else
user << "This mind is so vacant that it is not susceptible to influence! "
/obj/item/weapon/pen/gang/proc/cooldown(modifier)
- if(!modifier)
- return
cooldown = 1
icon_state = "pen_blink"
- spawn(600)
+ spawn(max(50,1200-(modifier*100)))
cooldown = 0
icon_state = "pen"
var/mob/M = get(src, /mob)
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index de17516ede9..7ddb67eefeb 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -580,14 +580,10 @@
user << "Nothing happens! "
else
flick("apc-spark", src)
- if (do_after(user,6))
- if(prob(50))
- emagged = 1
- locked = 0
- user << "You emag the APC interface. "
- update_icon()
- else
- user << "You fail to [ locked ? "unlock" : "lock"] the APC interface! "
+ emagged = 1
+ locked = 0
+ user << "You emag the APC interface. "
+ update_icon()
// attack with hand - remove cell (if cover open) or interact with the APC
@@ -1251,4 +1247,4 @@
/obj/item/weapon/module/power_control
name = "power control module"
icon_state = "power_mod"
- desc = "Heavy-duty switching circuits for power control."
\ No newline at end of file
+ desc = "Heavy-duty switching circuits for power control."
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 96c8a2ba049..67a15e73030 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -453,7 +453,9 @@ By design, d1 is the smallest direction and d2 is the highest
// Definitions
////////////////////////////////
-
+var/global/list/datum/stack_recipe/cable_coil_recipes = list ( \
+ new/datum/stack_recipe("cable restraints", /obj/item/weapon/restraints/handcuffs/cable, 15), \
+ )
/obj/item/stack/cable_coil
name = "cable coil"
@@ -501,6 +503,7 @@ By design, d1 is the smallest direction and d2 is the highest
pixel_x = rand(-2,2)
pixel_y = rand(-2,2)
update_icon()
+ recipes = cable_coil_recipes
///////////////////////////////////
// General procedures
@@ -533,38 +536,12 @@ By design, d1 is the smallest direction and d2 is the highest
icon_state = "coil_[item_color]"
name = "cable coil"
-/obj/item/stack/cable_coil/verb/make_restraint()
- set name = "Make Cable Restraints"
- set category = "Object"
- var/mob/M = usr
-
- if(ishuman(M) && !M.restrained() && !M.stat && M.canmove)
- if(!istype(usr.loc,/turf))
- return
- if(src.amount <= 14)
- usr << "You need at least 15 lengths to make restraints! "
- return
- var/obj/item/weapon/restraints/handcuffs/cable/B = new /obj/item/weapon/restraints/handcuffs/cable(usr.loc)
- B.icon_state = "cuff_[item_color]"
- usr << "You wind some cable together to make some restraints. "
- src.use(15)
- else
- usr << "You cannot do that! "
- ..()
// Items usable on a cable coil :
-// - Wirecutters : cut them duh !
// - Cable coil : merge cables
/obj/item/stack/cable_coil/attackby(obj/item/weapon/W, mob/user, params)
..()
- if( istype(W, /obj/item/weapon/wirecutters) && src.amount > 1)
- src.amount--
- new /obj/item/stack/cable_coil(user.loc, 1,item_color)
- user << "You cut a piece off the cable coil. "
- src.update_icon()
- return
-
- else if(istype(W, /obj/item/stack/cable_coil/cyborg))
+ if(istype(W, /obj/item/stack/cable_coil/cyborg))
var/obj/item/stack/cable_coil/cyborg/C = W
var/to_transfer = min(src.amount, round((C.source.max_energy - C.source.energy) / C.cost))
C.add(to_transfer)
@@ -588,22 +565,6 @@ By design, d1 is the smallest direction and d2 is the highest
src.use(amt)
return
-//remove cables from the stack
-/* This is probably reduntant
-/obj/item/stack/cable_coil/use(var/used)
- if(src.amount < used)
- return 0
- else if (src.amount == used)
- if(ismob(loc)) //handle mob icon update
- var/mob/M = loc
- M.unEquip(src)
- qdel(src)
- return 1
- else
- amount -= used
- update_icon()
- return 1
-*/
/obj/item/stack/cable_coil/use(var/used)
. = ..()
update_icon()
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index 125d19729e9..d90d7280cd2 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -43,6 +43,8 @@
return 0
if(charge < amount) return 0
charge = (charge - amount)
+ if(!istype(loc, /obj/machinery/power/apc))
+ feedback_add_details("cell_used","[src.name]")
return 1
// recharge the cell
@@ -217,6 +219,19 @@
..()
charge = 0
+/obj/item/weapon/stock_parts/cell/bluespace
+ name = "bluespace power cell"
+ origin_tech = "powerstorage=7"
+ icon_state = "bscell"
+ maxcharge = 40000
+ g_amt = 80
+ rating = 6
+ chargerate = 4000
+
+/obj/item/weapon/stock_parts/cell/bluespace/empty/New()
+ ..()
+ charge = 0
+
/obj/item/weapon/stock_parts/cell/infinite
name = "infinite-capacity power cell!"
icon_state = "icell"
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index 9a09974598c..92d7b8105c1 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -16,11 +16,36 @@
var/active = 0
var/powered = 0
var/fire_delay = 100
+ var/maximum_fire_delay = 100
+ var/minimum_fire_delay = 20
var/last_shot = 0
var/shot_number = 0
var/state = 0
var/locked = 0
+/obj/machinery/power/emitter/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/emitter(null)
+ component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
+ RefreshParts()
+
+/obj/machinery/power/emitter/RefreshParts()
+ var/max_firedelay = 120
+ var/firedelay = 120
+ var/min_firedelay = 24
+ var/power_usage = 350
+ for(var/obj/item/weapon/stock_parts/micro_laser/L in component_parts)
+ max_firedelay -= 20 * L.rating
+ min_firedelay -= 4 * L.rating
+ firedelay -= 20 * L.rating
+ maximum_fire_delay = max_firedelay
+ minimum_fire_delay = min_firedelay
+ fire_delay = firedelay
+ for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
+ power_usage -= 50 * M.rating
+ active_power_usage = power_usage
/obj/machinery/power/emitter/verb/rotate()
set name = "Rotate"
@@ -71,7 +96,7 @@
src.active = 1
user << "You turn on \the [src]. "
src.shot_number = 0
- src.fire_delay = 100
+ src.fire_delay = maximum_fire_delay
investigate_log("turned on by [user.key]","singulo")
update_icon()
else
@@ -119,7 +144,7 @@
src.fire_delay = 2
src.shot_number ++
else
- src.fire_delay = rand(20,100)
+ src.fire_delay = rand(minimum_fire_delay,maximum_fire_delay)
src.shot_number = 0
var/obj/item/projectile/beam/emitter/A = PoolOrNew(/obj/item/projectile/beam/emitter,src.loc)
@@ -221,6 +246,17 @@
user << "Access denied. "
return
+ if(default_deconstruction_screwdriver(user, "emitter_open", "emitter", W))
+ return
+
+ if(exchange_parts(user, W))
+ return
+
+ if(default_pry_open(W))
+ return
+
+ default_deconstruction_crowbar(W)
+
..()
return
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index 85d8089d926..9a30df83891 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -25,6 +25,7 @@
var/target = null //its target. moves towards the target if it has one
var/last_failed_movement = 0//Will not move in the same dir if it couldnt before, will help with the getting stuck on fields thing
var/last_warning
+ var/consumedSupermatter = 0 //If the singularity has eaten a supermatter shard and can go to stage six
allow_spin = 0
/obj/singularity/New(loc, var/starting_energy = 50, var/temp = 0)
//CARN: admin-alert for chuckle-fuckery.
@@ -129,6 +130,8 @@
var/temp_allowed_size = src.allowed_size
if(force_size)
temp_allowed_size = force_size
+ if(temp_allowed_size >= STAGE_SIX && !consumedSupermatter)
+ temp_allowed_size = STAGE_FIVE
switch(temp_allowed_size)
if(STAGE_ONE)
current_size = STAGE_ONE
@@ -185,6 +188,15 @@
grav_pull = 10
consume_range = 4
dissipate = 0 //It cant go smaller due to e loss
+ if(STAGE_SIX) //This only happens if a stage 5 singulo consumes a supermatter shard.
+ current_size = STAGE_SIX
+ icon = 'icons/effects/352x352.dmi'
+ icon_state = "singularity_s11"
+ pixel_x = -160
+ pixel_y = -160
+ grav_pull = 15
+ consume_range = 5
+ dissipate = 0
if(current_size == allowed_size)
investigate_log("grew to size [current_size] ","singulo")
return 1
@@ -199,6 +211,8 @@
investigate_log("collapsed.","singulo")
qdel(src)
return 0
+ if(energy > 2999 && !consumedSupermatter)
+ energy = 2000
switch(energy)//Some of these numbers might need to be changed up later -Mport
if(1 to 199)
allowed_size = STAGE_ONE
@@ -208,8 +222,10 @@
allowed_size = STAGE_THREE
if(1000 to 1999)
allowed_size = STAGE_FOUR
- if(2000 to INFINITY)
+ if(2000 to 2999)
allowed_size = STAGE_FIVE
+ if(3000 to INFINITY)
+ allowed_size = STAGE_SIX
if(current_size != allowed_size)
expand()
return 1
@@ -230,6 +246,11 @@
/obj/singularity/proc/consume(var/atom/A)
var/gain = A.singularity_act(current_size)
src.energy += gain
+ if(istype(A, /obj/machinery/power/supermatter_shard) && !consumedSupermatter)
+ desc = "[initial(desc)] It glows fiercely with inner fire."
+ name = "supermatter-charged [initial(name)]"
+ consumedSupermatter = 1
+ luminosity = 10
return
@@ -326,6 +347,10 @@
toxmob()
if(4)//Stun mobs who lack optic scanners
mezzer()
+ if(5,6) //Sets all nearby mobs on fire
+ if(current_size < STAGE_SIX)
+ return 0
+ combust_mobs()
else
return 0
return 1
@@ -347,6 +372,15 @@
return
+/obj/singularity/proc/combust_mobs()
+ for(var/mob/living/carbon/C in orange(20, src))
+ C.visible_message("[C]'s skin bursts into flame! ", \
+ "You feel an inner fire as your skin is suddenly covered in fire! ")
+ C.adjust_fire_stacks(5)
+ C.IgniteMob()
+ return
+
+
/obj/singularity/proc/mezzer()
for(var/mob/living/carbon/M in oviewers(8, src))
if(istype(M, /mob/living/carbon/brain)) //Ignore brains
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index 77c4aa75751..1c8838e4311 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -274,11 +274,13 @@
name = "solar panel control"
desc = "A controller for solar panel arrays."
icon = 'icons/obj/computer.dmi'
- icon_state = "solar"
+ icon_state = "computer"
anchored = 1
density = 1
use_power = 1
idle_power_usage = 250
+ var/icon_screen = "solar"
+ var/icon_keyboard = "power_key"
var/id = 0
var/cdir = 0
var/targetdir = 0 // target angle in manual tracking (since it updates every game minute)
@@ -351,19 +353,17 @@
set_panels(cdir)
/obj/machinery/power/solar_control/update_icon()
- if(stat & BROKEN)
- icon_state = "broken"
- overlays.Cut()
- return
- if(stat & NOPOWER)
- icon_state = "c_unpowered"
- overlays.Cut()
- return
- icon_state = "solar"
overlays.Cut()
+ if(stat & NOPOWER)
+ overlays += "[icon_keyboard]_off"
+ return
+ overlays += icon_keyboard
+ if(stat & BROKEN)
+ overlays += "[icon_state]_broken"
+ else
+ overlays += icon_screen
if(cdir > -1)
overlays += image('icons/obj/computer.dmi', "solcon-o", FLY_LAYER, angle2dir(cdir))
- return
/obj/machinery/power/solar_control/attack_hand(mob/user)
if(!..())
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index a04bf8dda44..dfab6aa6c08 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -18,7 +18,7 @@
/obj/machinery/power/supermatter_shard
name = "supermatter shard"
- desc = "A strangely translucent and iridescent crystal that looks like it used to be part of a larger structure. You get headaches just from looking at it. "
+ desc = "A strangely translucent and iridescent crystal that looks like it used to be part of a larger structure. You get headaches just from looking at it. "
icon = 'icons/obj/supermatter.dmi'
icon_state = "darkmatter_shard"
density = 1
@@ -187,6 +187,7 @@
return 1
+/obj/machinery/power/supermatter_shard
/obj/machinery/power/supermatter_shard/bullet_act(var/obj/item/projectile/Proj)
var/turf/L = loc
@@ -205,6 +206,16 @@
damage += Proj.damage * config_bullet_energy
return 0
+/obj/machinery/power/supermatter_shard/singularity_act()
+ var/gain = 100
+ investigate_log("Supermatter shard consumed by singularity.","singulo")
+ message_admins("Singularity has consumed a supermatter shard and can now become stage six.")
+ visible_message("[src] is consumed by the singularity! ")
+ for(var/mob/M in mob_list)
+ M << 'sound/effects/supermatter.ogg' //everyone goan know bout this
+ M << "A horrible screeching fills your ears, and a wave of dread washes over you... "
+ qdel(src)
+ return(gain)
/obj/machinery/power/supermatter_shard/attack_paw(mob/user as mob)
return attack_hand(user)
@@ -214,11 +225,11 @@
if(Adjacent(user))
return attack_hand(user)
else
- user << "You attempt to interface with the control circuits but find they are not connected to your network. Maybe in a future firmware update. "
+ user << "You attempt to interface with the control circuits but find they are not connected to your network. Maybe in a future firmware update. "
return
/obj/machinery/power/supermatter_shard/attack_ai(mob/user as mob)
- user << "You attempt to interface with the control circuits but find they are not connected to your network. Maybe in a future firmware update. "
+ user << "You attempt to interface with the control circuits but find they are not connected to your network. Maybe in a future firmware update. "
/obj/machinery/power/supermatter_shard/attack_hand(mob/living/user as mob)
if(!istype(user))
diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm
index 86e3930b58a..405880f4249 100644
--- a/code/modules/power/turbine.dm
+++ b/code/modules/power/turbine.dm
@@ -56,10 +56,8 @@
/obj/machinery/computer/turbine_computer
name = "gas turbine control computer"
desc = "A computer to remotely control a gas turbine"
- icon = 'icons/obj/computer.dmi'
- icon_state = "turbinecomp"
- anchored = 1
- density = 1
+ icon_screen = "turbinecomp"
+ icon_keyboard = "tech_key"
circuit = /obj/item/weapon/circuitboard/turbine_computer
var/obj/machinery/power/compressor/compressor
var/id = 0
diff --git a/code/modules/procedural mapping/mapGeneratorModules/helpers.dm b/code/modules/procedural mapping/mapGeneratorModules/helpers.dm
new file mode 100644
index 00000000000..bad449a9e8f
--- /dev/null
+++ b/code/modules/procedural mapping/mapGeneratorModules/helpers.dm
@@ -0,0 +1,44 @@
+//Helper Modules
+
+
+// Helper to repressurize the area in case it was run in space
+/datum/mapGeneratorModule/bottomLayer/repressurize
+ spawnableAtoms = list()
+ spawnableTurfs = list()
+
+/datum/mapGeneratorModule/bottomLayer/repressurize/generate()
+ if(!mother)
+ return
+ var/list/map = mother.map
+ for(var/turf/simulated/T in map)
+ SSair.remove_from_active(T)
+ for(var/turf/simulated/T in map)
+ if(T.air)
+ T.air.oxygen = T.oxygen
+ T.air.nitrogen = T.nitrogen
+ T.air.carbon_dioxide = T.carbon_dioxide
+ T.air.toxins = T.toxins
+ T.air.temperature = T.temperature
+ SSair.add_to_active(T)
+
+//Only places atoms/turfs on area borders
+/datum/mapGeneratorModule/border
+ clusterCheckFlags = CLUSTER_CHECK_NONE
+
+/datum/mapGeneratorModule/border/generate()
+ if(!mother)
+ return
+ var/list/map = mother.map
+ for(var/turf/T in map)
+ if(is_border(T))
+ place(T)
+
+/datum/mapGeneratorModule/border/proc/is_border(var/turf/T)
+ for(var/direction in list(SOUTH,EAST,WEST,NORTH))
+ if (get_step(T,direction) in mother.map)
+ continue
+ return 1
+ return 0
+
+/datum/mapGenerator/repressurize
+ modules = list(/datum/mapGeneratorModule/bottomLayer/repressurize)
\ No newline at end of file
diff --git a/code/modules/procedural mapping/mapGenerators/asteroid.dm b/code/modules/procedural mapping/mapGenerators/asteroid.dm
new file mode 100644
index 00000000000..4dc002aa56a
--- /dev/null
+++ b/code/modules/procedural mapping/mapGenerators/asteroid.dm
@@ -0,0 +1,45 @@
+//Asteroid turfs
+/datum/mapGeneratorModule/bottomLayer/asteroidTurfs
+ spawnableTurfs = list(/turf/simulated/floor/plating/asteroid = 100)
+
+/datum/mapGeneratorModule/bottomLayer/asteroidWalls
+ spawnableTurfs = list(/turf/simulated/mineral = 100)
+
+//Border walls
+/datum/mapGeneratorModule/border/asteroidWalls
+ spawnableAtoms = list()
+ spawnableTurfs = list(/turf/simulated/mineral = 100)
+
+//Random walls
+/datum/mapGeneratorModule/splatterLayer/asteroidWalls
+ clusterCheckFlags = CLUSTER_CHECK_NONE
+ spawnableAtoms = list()
+ spawnableTurfs = list(/turf/simulated/mineral = 30)
+
+//Monsters
+/datum/mapGeneratorModule/splatterLayer/asteroidMonsters
+ spawnableTurfs = list()
+ spawnableAtoms = list(/mob/living/simple_animal/hostile/asteroid/basilisk = 10, \
+ /mob/living/simple_animal/hostile/asteroid/hivelord = 10, \
+ /mob/living/simple_animal/hostile/asteroid/goliath = 10)
+
+
+// GENERATORS
+
+/datum/mapGenerator/asteroid/hollow
+ modules = list(/datum/mapGeneratorModule/bottomLayer/asteroidTurfs, \
+ /datum/mapGeneratorModule/border/asteroidWalls)
+
+/datum/mapGenerator/asteroid/hollow/random
+ modules = list(/datum/mapGeneratorModule/bottomLayer/asteroidTurfs, \
+ /datum/mapGeneratorModule/border/asteroidWalls, \
+ /datum/mapGeneratorModule/splatterLayer/asteroidWalls)
+
+/datum/mapGenerator/asteroid/hollow/random/monsters
+ modules = list(/datum/mapGeneratorModule/bottomLayer/asteroidTurfs, \
+ /datum/mapGeneratorModule/border/asteroidWalls, \
+ /datum/mapGeneratorModule/splatterLayer/asteroidWalls, \
+ /datum/mapGeneratorModule/splatterLayer/asteroidMonsters)
+
+/datum/mapGenerator/asteroid/filled
+ modules = list(/datum/mapGeneratorModule/bottomLayer/asteroidWalls)
\ No newline at end of file
diff --git a/code/modules/procedural mapping/mapGenerators/shuttle.dm b/code/modules/procedural mapping/mapGenerators/shuttle.dm
new file mode 100644
index 00000000000..7197b127d48
--- /dev/null
+++ b/code/modules/procedural mapping/mapGenerators/shuttle.dm
@@ -0,0 +1,15 @@
+/datum/mapGeneratorModule/bottomLayer/shuttleFloor
+ spawnableTurfs = list(/turf/simulated/floor/plasteel/shuttle = 100)
+
+/datum/mapGeneratorModule/border/shuttleWalls
+ spawnableAtoms = list()
+ spawnableTurfs = list(/turf/simulated/wall/shuttle = 100)
+// Generators
+
+/datum/mapGenerator/shuttle/full
+ modules = list(/datum/mapGeneratorModule/bottomLayer/shuttleFloor, \
+ /datum/mapGeneratorModule/border/shuttleWalls,\
+ /datum/mapGeneratorModule/bottomLayer/repressurize)
+
+/datum/mapGenerator/shuttle/floor
+ modules = list(/datum/mapGeneratorModule/bottomLayer/shuttleFloor)
diff --git a/code/modules/procedural mapping/mapGenerators/syndicate.dm b/code/modules/procedural mapping/mapGenerators/syndicate.dm
new file mode 100644
index 00000000000..e48fe718d00
--- /dev/null
+++ b/code/modules/procedural mapping/mapGenerators/syndicate.dm
@@ -0,0 +1,52 @@
+// Modules
+
+/turf/simulated/floor/plasteel/shuttle/red/syndicate
+ name = "floor" //Not Brig Floor
+
+/datum/mapGeneratorModule/bottomLayer/syndieFloor
+ spawnableTurfs = list(/turf/simulated/floor/plasteel/shuttle/red/syndicate = 100)
+
+/datum/mapGeneratorModule/border/syndieWalls
+ spawnableAtoms = list()
+ spawnableTurfs = list(/turf/simulated/wall/r_wall = 100)
+
+
+/datum/mapGeneratorModule/syndieFurniture
+ clusterCheckFlags = CLUSTER_CHECK_ALL
+ spawnableTurfs = list()
+ spawnableAtoms = list(/obj/structure/table = 20,/obj/structure/stool/bed/chair = 15,/obj/structure/stool = 10, \
+ /obj/structure/computerframe = 15, /obj/item/weapon/storage/toolbox/syndicate = 15 ,\
+ /obj/structure/closet/syndicate = 25, /obj/machinery/suit_storage_unit/syndicate = 15)
+
+/datum/mapGeneratorModule/splatterLayer/syndieMobs
+ spawnableAtoms = list(/mob/living/simple_animal/hostile/syndicate = 30, \
+ /mob/living/simple_animal/hostile/syndicate/melee = 20, \
+ /mob/living/simple_animal/hostile/syndicate/ranged = 20, \
+ /mob/living/simple_animal/hostile/viscerator = 30)
+ spawnableTurfs = list()
+
+// Generators
+
+/datum/mapGenerator/syndicate/empty //walls and floor only
+ modules = list(/datum/mapGeneratorModule/bottomLayer/syndieFloor, \
+ /datum/mapGeneratorModule/border/syndieWalls,\
+ /datum/mapGeneratorModule/bottomLayer/repressurize)
+
+/datum/mapGenerator/syndicate/mobsonly
+ modules = list(/datum/mapGeneratorModule/bottomLayer/syndieFloor, \
+ /datum/mapGeneratorModule/border/syndieWalls,\
+ /datum/mapGeneratorModule/splatterLayer/syndieMobs, \
+ /datum/mapGeneratorModule/bottomLayer/repressurize)
+
+/datum/mapGenerator/syndicate/furniture
+ modules = list(/datum/mapGeneratorModule/bottomLayer/syndieFloor, \
+ /datum/mapGeneratorModule/border/syndieWalls,\
+ /datum/mapGeneratorModule/syndieFurniture, \
+ /datum/mapGeneratorModule/bottomLayer/repressurize)
+
+/datum/mapGenerator/syndicate/full
+ modules = list(/datum/mapGeneratorModule/bottomLayer/syndieFloor, \
+ /datum/mapGeneratorModule/border/syndieWalls,\
+ /datum/mapGeneratorModule/syndieFurniture, \
+ /datum/mapGeneratorModule/splatterLayer/syndieMobs, \
+ /datum/mapGeneratorModule/bottomLayer/repressurize)
\ No newline at end of file
diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm
index 48f4b74cd9c..3e363056825 100644
--- a/code/modules/projectiles/ammunition/ammo_casings.dm
+++ b/code/modules/projectiles/ammunition/ammo_casings.dm
@@ -31,7 +31,6 @@
caliber = ".45"
projectile_type = /obj/item/projectile/bullet/midbullet
-
/obj/item/ammo_casing/shotgun
name = "shotgun slug"
desc = "A 12 gauge lead slug."
diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm
index b1296f8b2cf..342f7234c62 100644
--- a/code/modules/projectiles/ammunition/magazines.dm
+++ b/code/modules/projectiles/ammunition/magazines.dm
@@ -157,11 +157,11 @@
..()
icon_state = "c20r45-[round(ammo_count(),2)]"
-obj/item/ammo_box/magazine/tommygunm45
- name = "drum magazine (.45)"
+obj/item/ammo_box/magazine/tommygunm9mm
+ name = "drum magazine (9mm)"
icon_state = "drum45"
- ammo_type = /obj/item/ammo_casing/c45
- caliber = ".45"
+ ammo_type = /obj/item/ammo_casing/c9mm
+ caliber = "9mm"
max_ammo = 50
/obj/item/ammo_box/magazine/m50
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 4cc38cb4fc2..9b1666fd2f0 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -132,6 +132,7 @@
process_fire(target,user,1,params)
+
/obj/item/weapon/gun/proc/can_trigger_gun(mob/living/carbon/user)
if (!user.IsAdvancedToolUser())
user << "You don't have the dexterity to do this! "
@@ -218,7 +219,7 @@
user.update_inv_l_hand(0)
else
user.update_inv_r_hand(0)
-
+ feedback_add_details("gun_fired","[src.name]")
/obj/item/weapon/gun/attack(mob/M as mob, mob/user)
if(user.a_intent == "harm") //Flogging
diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm
index fdec6f437b9..badf178b878 100644
--- a/code/modules/projectiles/guns/projectile/automatic.dm
+++ b/code/modules/projectiles/guns/projectile/automatic.dm
@@ -230,13 +230,14 @@
return
/obj/item/weapon/gun/projectile/automatic/tommygun
- name = "tommy gun"
- desc = "A genuine 'Chicago Typewriter'."
+ name = "thompson SMG"
+ desc = "Based on the classic 'Chicago Typewriter'."
icon_state = "tommygun"
item_state = "shotgun"
+ w_class = 5
slot_flags = 0
origin_tech = "combat=5;materials=1;syndicate=2"
- mag_type = /obj/item/ammo_box/magazine/tommygunm45
+ mag_type = /obj/item/ammo_box/magazine/tommygunm9mm
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
can_suppress = 0
burst_size = 4
diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm
index 471b5401196..7178c36469f 100644
--- a/code/modules/projectiles/guns/projectile/revolver.dm
+++ b/code/modules/projectiles/guns/projectile/revolver.dm
@@ -37,7 +37,7 @@
CB.update_icon()
num_unloaded++
if (num_unloaded)
- user << "You unload [num_unloaded] shell\s from [src]. "
+ user << "You unload [num_unloaded] shell\s from [src]. "
else
user << "[src] is empty! "
@@ -170,7 +170,7 @@
CB.update_icon()
num_unloaded++
if (num_unloaded)
- user << "You unload [num_unloaded] shell\s from [src]. "
+ user << "You unload [num_unloaded] shell\s from [src]. "
else
user << "[src] is empty. "
diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm
index e5d5b462c6d..2d0da86aed1 100644
--- a/code/modules/projectiles/guns/projectile/shotgun.dm
+++ b/code/modules/projectiles/guns/projectile/shotgun.dm
@@ -173,7 +173,7 @@
CB.update_icon()
num_unloaded++
if (num_unloaded)
- user << "You break open \the [src] and unload [num_unloaded] shell\s. "
+ user << "You break open \the [src] and unload [num_unloaded] shell\s. "
else
user << "[src] is empty! "
diff --git a/code/modules/projectiles/guns/syringe_gun.dm b/code/modules/projectiles/guns/syringe_gun.dm
index 2fb641d6c56..f0a17314848 100644
--- a/code/modules/projectiles/guns/syringe_gun.dm
+++ b/code/modules/projectiles/guns/syringe_gun.dm
@@ -56,7 +56,7 @@
S.loc = user.loc
syringes.Remove(S)
- user << "You unload [S] from \the [src]. "
+ user << "You unload [S] from \the [src]. "
return 1
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 9542c6a289d..8fc1a4622f9 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -16,7 +16,7 @@
var/atom/original = null // the original target clicked
var/turf/starting = null // the projectile's starting turf
var/list/permutated = list() // we've passed through these atoms, don't try to hit them again
-
+ var/paused = FALSE //for suspending the projectile midair
var/p_x = 16
var/p_y = 16 // the pixel location of the tile that the player clicked. Default is the center
@@ -108,7 +108,6 @@
loc = target_turf
if(A)
permutated.Add(A)
- Range()
return 0
else
if(A && A.density && !ismob(A) && !(A.flags & ON_BORDER)) //if we hit a dense non-border obj or dense turf then we also hit one of the mobs on that tile.
@@ -130,17 +129,19 @@
if(kill_count < 1)
qdel(src)
return
- kill_count--
- if((!( current ) || loc == current))
- current = locate(Clamp(x+xo,1,world.maxx),Clamp(y+yo,1,world.maxy),z)
- step_towards(src, current)
- if((original && original.layer>=2.75) || ismob(original))
- if(loc == get_turf(original))
- if(!(original in permutated))
- Bump(original, 1)
+ if(!paused)
+ kill_count--
+ if((!( current ) || loc == current))
+ current = locate(Clamp(x+xo,1,world.maxx),Clamp(y+yo,1,world.maxy),z)
+ step_towards(src, current)
+ if((original && original.layer>=2.75) || ismob(original))
+ if(loc == get_turf(original))
+ if(!(original in permutated))
+ Bump(original, 1)
Range()
sleep(1)
+
/obj/item/projectile/Crossed(atom/movable/AM as mob) //A mob moving on a tile with a projectile is hit by it.
..()
if(isliving(AM) && AM.density && !checkpass(PASSMOB))
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index e87808254e6..00cd2fc1a42 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -30,6 +30,7 @@
icon_state = "xray"
damage = 15
irradiate = 30
+ range = 15
forcedodge = 1
/obj/item/projectile/beam/disabler
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index d2f5b3bcc38..efc20cedfd7 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -227,9 +227,10 @@
ready_dna(H)
if(H.dna && prob(50))
var/list/all_species = list()
- for(var/datum/species/S in typesof(/datum/species) - /datum/species)
+ for(var/speciestype in typesof(/datum/species) - /datum/species)
+ var/datum/species/S = new speciestype()
if(!S.dangerous_existence)
- all_species += S
+ all_species += speciestype
hardset_dna(H, null, null, null, null, pick(all_species))
H.update_icons()
else
@@ -268,7 +269,7 @@
S.icon = change.icon
if(H.mind)
H.mind.transfer_to(S)
- S << "You are an animate statue. You cannot move when monitored, but are nearly invincible and deadly when unobserved! Do not harm [firer.name], your creator. "
+ S << "You are an animate statue. You cannot move when monitored, but are nearly invincible and deadly when unobserved! Do not harm [firer.name], your creator. "
H = change
H.loc = S
qdel(src)
diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm
index 49461bfc6fc..94e40614ab8 100644
--- a/code/modules/reagents/Chemistry-Holder.dm
+++ b/code/modules/reagents/Chemistry-Holder.dm
@@ -260,7 +260,7 @@ var/const/INGEST = 2
R.addiction_act_stage4(M)
R.addiction_stage++
if(R.addiction_stage > 40)
- M << "You feel like you've gotten over your need for [R.name]. "
+ M << "You feel like you've gotten over your need for [R.name]. "
addiction_list.Remove(R)
addiction_tick++
update_total()
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index 92235739bdb..3dab9a3442a 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -192,7 +192,8 @@
dispensable_reagents = list()
var/list/special_reagents = list(list("hydrogen", "oxygen", "silicon", "phosphorus", "sulfur", "carbon", "nitrogen", "water"),
list("lithium", "sugar", "sacid", "copper", "mercury", "sodium","iodine","bromine"),
- list("ethanol", "chlorine", "potassium", "aluminium", "radium", "fluorine", "iron", "welding_fuel","silver","stable_plasma"))
+ list("ethanol", "chlorine", "potassium", "aluminium", "radium", "fluorine", "iron", "welding_fuel","silver","stable_plasma"),
+ list("oil", "ash", "acetone", "saltpetre", "ammonia", "diethylamine"))
/obj/machinery/chem_dispenser/constructable/New()
..()
@@ -1244,9 +1245,12 @@
if (!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume))
return
playsound(src.loc, 'sound/machines/juicer.ogg', 20, 1)
+ var/offset = prob(50) ? -2 : 2
+ animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 250) //start shaking
operating = 1
updateUsrDialog()
spawn(50)
+ pixel_x = initial(pixel_x) //return to its spot after shaking
operating = 0
updateUsrDialog()
@@ -1279,9 +1283,12 @@
if (!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume))
return
playsound(src.loc, 'sound/machines/blender.ogg', 50, 1)
+ var/offset = prob(50) ? -2 : 2
+ animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 250) //start shaking
operating = 1
updateUsrDialog()
spawn(60)
+ pixel_x = initial(pixel_x) //return to its spot after shaking
operating = 0
updateUsrDialog()
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index 2dede1c153d..2934c57a3c0 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -115,26 +115,26 @@
return
/datum/reagent/proc/overdose_start(var/mob/living/M as mob)
- M << "You feel like you took too much of [name]! "
+ M << "You feel like you took too much of [name]! "
return
/datum/reagent/proc/addiction_act_stage1(var/mob/living/M as mob)
if(prob(30))
- M << "You feel like some [name] right about now. "
+ M << "You feel like some [name] right about now. "
return
/datum/reagent/proc/addiction_act_stage2(var/mob/living/M as mob)
if(prob(30))
- M << "You feel like you need [name]. You just can't get enough. "
+ M << "You feel like you need [name]. You just can't get enough. "
return
/datum/reagent/proc/addiction_act_stage3(var/mob/living/M as mob)
if(prob(30))
- M << "You have an intense craving for [name]. "
+ M << "You have an intense craving for [name]. "
return
/datum/reagent/proc/addiction_act_stage4(var/mob/living/M as mob)
if(prob(30))
- M << "You're not feeling good at all! You really need some [name]. "
+ M << "You're not feeling good at all! You really need some [name]. "
return
diff --git a/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm
index a764dc654bf..c9ade32e68b 100644
--- a/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm
@@ -211,4 +211,4 @@
if(message_living && !issilicon(M))
totalmessage += message_living
totalmessage += "!"
- M << "[totalmessage] "
\ No newline at end of file
+ M << "[totalmessage] "
\ No newline at end of file
diff --git a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm
index 1ea2c600caa..7fd49928443 100644
--- a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm
@@ -57,7 +57,7 @@
overdose_threshold = 200 // Hyperglycaemic shock
/datum/reagent/consumable/sugar/overdose_start(var/mob/living/M as mob)
- M << "You go into hyperglycaemic shock! Lay off the twinkies! "
+ M << "You go into hyperglycaemic shock! Lay off the twinkies! "
M.sleeping += 30
return
diff --git a/code/modules/reagents/Chemistry-Reagents/Drug-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Drug-Reagents.dm
index 0b9f8c70847..579caddc98a 100644
--- a/code/modules/reagents/Chemistry-Reagents/Drug-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Drug-Reagents.dm
@@ -172,7 +172,7 @@
if(prob(20))
M.emote("laugh")
if(prob(33))
- M.visible_message("[M]'s hands flip out and flail everywhere! ")
+ M.visible_message("[M]'s hands flip out and flail everywhere! ")
var/obj/item/I = M.get_active_hand()
if(I)
M.drop_item()
diff --git a/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm
index e65a5e81de4..bbb31522bbb 100644
--- a/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm
@@ -494,7 +494,7 @@
if(3)
var/mob/living/carbon/human/H = M
if(!H.heart_attack)
- H.visible_message("[H] clutches at their chest as if their heart stopped! ")
+ H.visible_message("[H] clutches at their chest as if their heart stopped! ")
H.heart_attack = 1 // rip in pepperoni
else
H.losebreath += 10
diff --git a/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm b/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm
index fedbc5d0904..4b265fae1b9 100644
--- a/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm
+++ b/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm
@@ -59,7 +59,7 @@
required_reagents = list("blackpowder" = 1)
result_amount = 1
required_temp = 474
- mix_message = "Sparks start flying around the black powder! "
+ mix_message = "Sparks start flying around the black powder! "
/datum/chemical_reaction/blackpowder_explosion/on_reaction(var/datum/reagents/holder, var/created_volume)
sleep(rand(50,100))
diff --git a/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm b/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm
index be029b2220a..7c26d80e4c2 100644
--- a/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm
+++ b/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm
@@ -533,11 +533,29 @@
P.loc = get_turf(holder.my_atom)
//Sepia
+/datum/chemical_reaction/slimestop
+ name = "Slime Stop"
+ id = "m_stop"
+ result = null
+ required_reagents = list("plasma" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/sepia
+ required_other = 1
+
+/datum/chemical_reaction/slimestop/on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ var/mob/mob = get_mob_by_key(holder.my_atom.fingerprintslast)
+ var/obj/effect/timestop/T = new /obj/effect/timestop
+ T.loc = get_turf(holder.my_atom)
+ T.immune = mob
+ T.timestop()
+
+
/datum/chemical_reaction/slimecamera
name = "Slime Camera"
id = "m_camera"
result = null
- required_reagents = list("plasma" = 1)
+ required_reagents = list("blood" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/sepia
required_other = 1
@@ -551,7 +569,7 @@
name = "Slime Film"
id = "m_film"
result = null
- required_reagents = list("blood" = 1)
+ required_reagents = list("water" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/sepia
required_other = 1
@@ -561,7 +579,10 @@
var/obj/item/device/camera_film/P = new /obj/item/device/camera_film
P.loc = get_turf(holder.my_atom)
+
//Pyrite
+
+
/datum/chemical_reaction/slimepaint
name = "Slime Paint"
id = "s_paint"
@@ -577,4 +598,4 @@
var/chosen = pick(paints)
var/obj/P = new chosen
if(P)
- P.loc = get_turf(holder.my_atom)
\ No newline at end of file
+ P.loc = get_turf(holder.my_atom)
diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm
index f4304ba596a..d3c923f6e2c 100644
--- a/code/modules/reagents/reagent_containers/borghydro.dm
+++ b/code/modules/reagents/reagent_containers/borghydro.dm
@@ -23,7 +23,7 @@ Borg Hypospray
var/recharge_time = 5 //Time it takes for shots to recharge (in seconds)
var/list/datum/reagents/reagent_list = list()
- var/list/reagent_ids = list("salbutamol", "salglu_solution", "charcoal", "epinephrine", "spaceacillin")
+ var/list/reagent_ids = list("dexalin", "kelotane", "bicaridine", "antitoxin", "epinephrine", "spaceacillin")
//var/list/reagent_ids = list("salbutamol", "salglu_solution", "salglu_solution", "charcoal", "ephedrine", "spaceacillin")
var/list/modes = list() //Basically the inverse of reagent_ids. Instead of having numbers as "keys" and strings as values it has strings as keys and numbers as values.
//Used as list for input() in shakers.
@@ -199,4 +199,4 @@ Borg Shaker
charge_cost = 20 //Lots of reagents all regenerating at once, so the charge cost is lower. They also regenerate faster.
recharge_time = 3
- reagent_ids = list("beer2")
\ No newline at end of file
+ reagent_ids = list("beer2")
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index 90bcb8ea638..d3fa4a658a6 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -110,7 +110,7 @@
if(istype(I, /obj/item/weapon/storage/bag/trash))
var/obj/item/weapon/storage/bag/trash/T = I
- user << " You empty the bag. "
+ user << "You empty the bag. "
for(var/obj/item/O in T.contents)
T.remove_from_storage(O,src)
T.update_icon()
@@ -345,7 +345,8 @@
src.updateDialog()
if(flush && air_contents.return_pressure() >= SEND_PRESSURE ) // flush can happen even without power
- flush()
+ spawn(0)
+ flush()
if(stat & NOPOWER) // won't charge if no power
return
@@ -378,39 +379,32 @@
update()
return
-// perform a flush
/obj/machinery/disposal/proc/flush()
-
flushing = 1
- flick("[icon_state]-flush", src)
-
- var/wrapcheck = 0
- var/obj/structure/disposalholder/H = new() // virtual holder object which actually
- // travels through the pipes.
- for(var/obj/item/smallDelivery/O in src)
- wrapcheck = 1
-
- if(wrapcheck == 1)
- H.tomail = 1
-
+ flushAnimation()
+ var/obj/structure/disposalholder/H = new()
+ newHolderDestination(H)
sleep(10)
if(last_sound < world.time + 1)
playsound(src, 'sound/machines/disposalflush.ogg', 50, 0, 0)
last_sound = world.time
- sleep(5) // wait for animation to finish
-
- H.init(src) // copy the contents of disposer to holder
- air_contents = new() // new empty gas resv.
-
- H.start(src) // start the holder processing movement
+ sleep(5)
+ H.init(src)
+ air_contents = new()
+ H.start(src)
flushing = 0
- // now reset disposal state
flush = 0
- if(mode == 2) // if was ready,
- mode = 1 // switch to charging
+ if(mode == 2)
+ mode = 1
update()
- return
+/obj/machinery/disposal/proc/newHolderDestination(obj/structure/disposalholder/H)
+ for(var/obj/item/smallDelivery/O in src)
+ H.tomail = 1
+ return
+
+/obj/machinery/disposal/proc/flushAnimation()
+ flick("[icon_state]-flush", src)
// called when area power changes
/obj/machinery/disposal/power_change()
@@ -490,6 +484,8 @@
//hasmob effects whether the package goes to cargo or its tagged destination.
for(var/mob/living/M in D)
if(M && M.stat != DEAD)
+ if(M.client)
+ M.client.eye = src
hasmob = 1
//Checks 1 contents level deep. This means that players can be sent through disposals...
@@ -498,6 +494,8 @@
if(O.contents)
for(var/mob/living/M in O.contents)
if(M && M.stat != DEAD)
+ if(M.client)
+ M.client.eye = src
hasmob = 1
// now everything inside the disposal gets put into the holder
@@ -542,8 +540,6 @@
active = 0
return
-
-
// find the turf which should contain the next pipe
/obj/structure/disposalholder/proc/nextloc()
return get_step(loc,dir)
@@ -590,7 +586,7 @@
return
/obj/structure/disposalholder/allow_drop()
- return 0
+ return 1
// Disposal pipes
@@ -979,7 +975,7 @@
sortType = O.currTag
playsound(src.loc, 'sound/machines/twobeep.ogg', 100, 1)
var/tag = uppertext(TAGGERLOCATIONS[O.currTag])
- user << " Changed filter to [tag]. "
+ user << "Changed filter to [tag]. "
updatedesc()
@@ -1327,4 +1323,4 @@
else
dirs = alldirs.Copy()
- src.streak(dirs)
+ src.streak(dirs)
\ No newline at end of file
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index de834c2d80f..f4495358aed 100644
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -234,8 +234,6 @@
desc = "A chute for big and small packages alike!"
density = 1
icon_state = "intake"
-
- var/start_flush = 0
var/c_mode = 0
/obj/machinery/disposal/deliveryChute/New(loc,var/obj/structure/disposalconstruct/make_from)
@@ -287,40 +285,11 @@
/obj/mecha/disposalEnterTry()
return
-/obj/machinery/disposal/deliveryChute/flush()
- flushing = 1
+/obj/machinery/disposal/deliveryChute/flushAnimation()
flick("intake-closing", src)
- var/deliveryCheck = 0
- var/obj/structure/disposalholder/H = new() // virtual holder object which actually
- // travels through the pipes.
-/* for(var/obj/structure/bigDelivery/O in src)
- deliveryCheck = 1
- if(O.sortTag == 0) //This auto-sorts package wrapped objects to disposals
- O.sortTag = 1 //Cargo techs can do this themselves with their taggers
- for(var/obj/item/smallDelivery/O in src) //With this disabled packages will loop back round and come out the mail chute
- deliveryCheck = 1
- if(O.sortTag == 0)
- O.sortTag = 1 */
- if(deliveryCheck == 0)
- H.destinationTag = 1
- sleep(10)
- if((start_flush + 15) < world.time)
- start_flush = world.time
- playsound(src, 'sound/machines/disposalflush.ogg', 50, 0, 0)
- sleep(5) // wait for animation to finish
-
- H.init(src) // copy the contents of disposer to holder
- air_contents = new() // new empty gas resv.
-
- H.start(src) // start the holder processing movement
- flushing = 0
- // now reset disposal state
- flush = 0
- if(mode == 2) // if was ready,
- mode = 1 // switch to charging
- update()
- return
+/obj/machinery/disposal/deliveryChute/newHolderDestination(obj/structure/disposalholder/H)
+ H.destinationTag = 1
/obj/machinery/disposal/deliveryChute/attackby(var/obj/item/I, var/mob/user, params)
if(!I || !user)
diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm
index ee333ef117b..91d498bd90f 100644
--- a/code/modules/research/designs/machine_designs.dm
+++ b/code/modules/research/designs/machine_designs.dm
@@ -111,7 +111,7 @@
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/chem_dispenser
category = list ("Medical Machinery")
-
+
/datum/design/chem_master
name = "Machine Design (Chem Master Board)"
desc = "The circuit board for a Chem Master 2999."
@@ -252,6 +252,76 @@
build_path = /obj/item/weapon/circuitboard/microwave
category = list ("Misc. Machinery")
+/datum/design/gibber
+ name = "Machine Design (Gibber Board)"
+ desc = "The circuit board for a gibber."
+ id = "gibber"
+ req_tech = list("programming" = 1)
+ build_type = IMPRINTER
+ materials = list("$glass" = 1000, "sacid" = 20)
+ build_path = /obj/item/weapon/circuitboard/gibber
+ category = list ("Misc. Machinery")
+
+/datum/design/smartfridge
+ name = "Machine Design (Smartfridge Board)"
+ desc = "The circuit board for a smartfridge."
+ id = "smartfridge"
+ req_tech = list("programming" = 1)
+ build_type = IMPRINTER
+ materials = list("$glass" = 1000, "sacid" = 20)
+ build_path = /obj/item/weapon/circuitboard/smartfridge
+ category = list ("Misc. Machinery")
+
+/datum/design/monkey_recycler
+ name = "Machine Design (Monkey Recycler Board)"
+ desc = "The circuit board for a monkey recycler."
+ id = "smartfridge"
+ req_tech = list("programming" = 1)
+ build_type = IMPRINTER
+ materials = list("$glass" = 1000, "sacid" = 20)
+ build_path = /obj/item/weapon/circuitboard/monkey_recycler
+ category = list ("Misc. Machinery")
+
+/datum/design/seed_extractor
+ name = "Machine Design (Seed Extractor Board)"
+ desc = "The circuit board for a seed extractor."
+ id = "seed_extractor"
+ req_tech = list("programming" = 1)
+ build_type = IMPRINTER
+ materials = list("$glass" = 1000, "sacid" = 20)
+ build_path = /obj/item/weapon/circuitboard/seed_extractor
+ category = list ("Misc. Machinery")
+
+/datum/design/processor
+ name = "Machine Design (Processor Board)"
+ desc = "The circuit board for a processor."
+ id = "processor"
+ req_tech = list("programming" = 1)
+ build_type = IMPRINTER
+ materials = list("$glass" = 1000, "sacid" = 20)
+ build_path = /obj/item/weapon/circuitboard/processor
+ category = list ("Misc. Machinery")
+
+/datum/design/recycler
+ name = "Machine Design (Recycler Board)"
+ desc = "The circuit board for a recycler."
+ id = "recycler"
+ req_tech = list("programming" = 1)
+ build_type = IMPRINTER
+ materials = list("$glass" = 1000, "sacid" = 20)
+ build_path = /obj/item/weapon/circuitboard/recycler
+ category = list ("Misc. Machinery")
+
+/datum/design/holopad
+ name = "Machine Design (AI Holopad Board)"
+ desc = "The circuit board for a holopad."
+ id = "holopad"
+ req_tech = list("programming" = 1)
+ build_type = IMPRINTER
+ materials = list("$glass" = 1000, "sacid" = 20)
+ build_path = /obj/item/weapon/circuitboard/holopad
+ category = list ("Misc. Machinery")
+
/datum/design/autolathe
name = "Machine Design (Autolathe Board)"
desc = "The circuit board for an autolathe."
diff --git a/code/modules/research/designs/power_designs.dm b/code/modules/research/designs/power_designs.dm
index ddf3ff047de..f9749c7267b 100644
--- a/code/modules/research/designs/power_designs.dm
+++ b/code/modules/research/designs/power_designs.dm
@@ -48,6 +48,19 @@
build_path = /obj/item/weapon/stock_parts/cell/hyper
category = list("Misc","Power Designs")
+/datum/design/bluespace_cell
+ name = "Bluespace Power Cell"
+ desc = "A power cell that holds 40000 units of energy."
+ id = "bluespace_cell"
+ req_tech = list("powerstorage" = 6, "materials" = 5)
+ reliability = 70
+ build_type = PROTOLATHE | MECHFAB
+ materials = list("$metal" = 800, "$gold" = 300, "$silver" = 300, "$glass" = 160, "$diamond" = 160)
+ construction_time=100
+ build_path = /obj/item/weapon/stock_parts/cell/bluespace
+ category = list("Misc","Power Designs")
+
+
/datum/design/light_replacer
name = "Light Replacer"
desc = "A device to automatically replace lights. Refill with working lightbulbs."
diff --git a/code/modules/research/designs/stock_parts_designs.dm b/code/modules/research/designs/stock_parts_designs.dm
index 117722ecb4e..ccec5e20d26 100644
--- a/code/modules/research/designs/stock_parts_designs.dm
+++ b/code/modules/research/designs/stock_parts_designs.dm
@@ -9,10 +9,20 @@
req_tech = list("engineering" = 3,
"materials" = 3)
build_type = PROTOLATHE
- materials = list("$metal" = 15000, "$glass" = 5000) //hardcore
+ materials = list("$metal" = 10000, "$glass" = 5000) //hardcore
build_path = /obj/item/weapon/storage/part_replacer
category = list("Stock Parts")
+/datum/design/BS_RPED
+ name = "Bluespace RPED"
+ desc = "Powered by bluespace technology, this RPED variant can upgrade buildings from a distance, without needing to remove the panel first."
+ id = "bs_rped"
+ req_tech = list("engineering" = 3, "materials" = 5, "programming" = 3, "bluespace" = 3)
+ build_type = PROTOLATHE
+ materials = list("$metal" = 15000, "$glass" = 5000, "$silver" = 2500) //hardcore
+ build_path = /obj/item/weapon/storage/part_replacer/bluespace
+ category = list("Stock Parts")
+
//Capacitors
/datum/design/basic_capacitor
name = "Basic Capacitor"
@@ -45,6 +55,17 @@
build_path = /obj/item/weapon/stock_parts/capacitor/super
category = list("Stock Parts")
+/datum/design/quadratic_capacitor
+ name = "Quadratic Capacitor"
+ desc = "A stock part used in the construction of various devices."
+ id = "quadratic_capacitor"
+ req_tech = list("powerstorage" = 6, "materials" = 5)
+ build_type = PROTOLATHE
+ reliability = 71
+ materials = list("$metal" = 100, "$glass" = 100, "$diamond" = 40)
+ build_path = /obj/item/weapon/stock_parts/capacitor/quadratic
+ category = list("Stock Parts")
+
//Scanning modules
/datum/design/basic_scanning
name = "Basic Scanning Module"
@@ -77,6 +98,17 @@
build_path = /obj/item/weapon/stock_parts/scanning_module/phasic
category = list("Stock Parts")
+/datum/design/triphasic_scanning
+ name = "Triphasic Scanning Module"
+ desc = "A stock part used in the construction of various devices."
+ id = "triphasic_scanning"
+ req_tech = list("magnets" = 6, "materials" = 4)
+ build_type = PROTOLATHE
+ materials = list("$metal" = 100, "$glass" = 40, "$diamond" = 20)
+ reliability = 72
+ build_path = /obj/item/weapon/stock_parts/scanning_module/triphasic
+ category = list("Stock Parts")
+
//Maipulators
/datum/design/micro_mani
name = "Micro Manipulator"
@@ -109,6 +141,17 @@
build_path = /obj/item/weapon/stock_parts/manipulator/pico
category = list("Stock Parts")
+/datum/design/femto_mani
+ name = "Femto Manipulator"
+ desc = "A stock part used in the construction of various devices."
+ id = "femto_mani"
+ req_tech = list("materials" = 6, "programming" = 3)
+ build_type = PROTOLATHE
+ materials = list("$metal" = 60, "$diamond" = 30)
+ reliability = 73
+ build_path = /obj/item/weapon/stock_parts/manipulator/femto
+ category = list("Stock Parts")
+
//Micro-lasers
/datum/design/basic_micro_laser
name = "Basic Micro-Laser"
@@ -141,6 +184,17 @@
build_path = /obj/item/weapon/stock_parts/micro_laser/ultra
category = list("Stock Parts")
+/datum/design/quadultra_micro_laser
+ name = "Quad-Ultra Micro-Laser"
+ desc = "A stock part used in the construction of various devices."
+ id = "quadultra_micro_laser"
+ req_tech = list("magnets" = 6, "materials" = 6)
+ build_type = PROTOLATHE
+ materials = list("$metal" = 20, "$glass" = 40, "$uranium" = 20, "$diamond" = 20)
+ reliability = 70
+ build_path = /obj/item/weapon/stock_parts/micro_laser/quadultra
+ category = list("Stock Parts")
+
/datum/design/basic_matter_bin
name = "Basic Matter Bin"
desc = "A stock part used in the construction of various devices."
@@ -172,6 +226,17 @@
build_path = /obj/item/weapon/stock_parts/matter_bin/super
category = list("Stock Parts")
+/datum/design/bluespace_matter_bin
+ name = "Bluespace Matter Bin"
+ desc = "A stock part used in the construction of various devices."
+ id = "bluespace_matter_bin"
+ req_tech = list("materials" = 6)
+ build_type = PROTOLATHE
+ materials = list("$metal" = 160, "$diamond" = 200)
+ reliability = 75
+ build_path = /obj/item/weapon/stock_parts/matter_bin/bluespace
+ category = list("Stock Parts")
+
//T-Comms devices
/datum/design/subspace_ansible
name = "Subspace Ansible"
diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm
index b4b25eb9e42..6c584bc1a15 100644
--- a/code/modules/research/message_server.dm
+++ b/code/modules/research/message_server.dm
@@ -17,8 +17,9 @@ var/global/list/obj/machinery/message_server/message_servers = list()
var/recipient = "Unspecified" //name of the person
var/sender = "Unspecified" //name of the sender
var/message = "Blank" //transferred message
+ var/image/photo = null //Attached photo
-/datum/data_pda_msg/New(var/param_rec = "",var/param_sender = "",var/param_message = "")
+/datum/data_pda_msg/New(var/param_rec = "",var/param_sender = "",var/param_message = "",var/param_photo=null)
if(param_rec)
recipient = param_rec
@@ -26,6 +27,19 @@ var/global/list/obj/machinery/message_server/message_servers = list()
sender = param_sender
if(param_message)
message = param_message
+ if(param_photo)
+ photo = param_photo
+
+/datum/data_pda_msg/Topic(href,href_list)
+ ..()
+ if(href_list["photo"])
+ var/mob/M = usr
+ M << browse_rsc(photo, "pda_photo.png")
+ M << browse("PDA Photo " \
+ + "" \
+ + " " \
+ + "", "window=book;size=192x192")
+ onclose(M, "PDA Photo")
/datum/data_rc_msg
var/rec_dpt = "Unspecified" //name of the person
@@ -105,8 +119,9 @@ var/global/list/obj/machinery/message_server/message_servers = list()
/obj/machinery/message_server/proc/send_chat_message(var/sender = "", var/channel = "", var/message = "")
chat_msgs += new/datum/data_chat_msg(sender,channel,message)
-/obj/machinery/message_server/proc/send_pda_message(var/recipient = "",var/sender = "",var/message = "")
- pda_msgs += new/datum/data_pda_msg(recipient,sender,message)
+/obj/machinery/message_server/proc/send_pda_message(var/recipient = "",var/sender = "",var/message = "",var/photo=null)
+ . = new/datum/data_pda_msg(recipient,sender,message,photo)
+ pda_msgs += .
/obj/machinery/message_server/proc/send_rc_message(var/recipient = "",var/sender = "",var/message = "",var/stamp = "", var/id_auth = "", var/priority = 1)
rc_msgs += new/datum/data_rc_msg(recipient,sender,message,stamp,id_auth)
@@ -177,6 +192,7 @@ var/global/list/obj/machinery/message_server/message_servers = list()
/datum/feedback_variable/proc/add_details(var/text)
if (istext(text))
+ text = replacetext(text, " ", "_")
if (!details)
details = text
else
diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm
index 9322e7c9286..b616d036397 100644
--- a/code/modules/research/protolathe.dm
+++ b/code/modules/research/protolathe.dm
@@ -145,7 +145,7 @@ Note: Must be placed west/left of and R&D console to function.
if (disabled)
return
if (!linked_console)
- user << " The [src.name] must be linked to an R&D console first! "
+ user << "The [src.name] must be linked to an R&D console first! "
return 1
if (busy)
user << "The [src.name] is busy! Please wait for completion of previous operation. "
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index d076c813158..3182c0156d0 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -31,7 +31,8 @@ won't update every console in existence) but it's more of a hassle to do. Also,
/obj/machinery/computer/rdconsole
name = "R&D Console"
- icon_state = "rdcomp"
+ icon_screen = "rdcomp"
+ icon_keyboard = "rd_key"
circuit = /obj/item/weapon/circuitboard/rdconsole
var/datum/research/files //Stores all the collected research data.
var/obj/item/weapon/disk/tech_disk/t_disk = null //Stores the technology disk.
@@ -154,11 +155,11 @@ won't update every console in existence) but it's more of a hassle to do. Also,
if(istype(D, /obj/item/weapon/disk/tech_disk)) t_disk = D
else if (istype(D, /obj/item/weapon/disk/design_disk)) d_disk = D
else
- user << " Machine cannot accept disks in that format. "
+ user << "Machine cannot accept disks in that format. "
return
user.drop_item()
D.loc = src
- user << " You add the disk to the machine! "
+ user << "You add the disk to the machine! "
else
..()
src.updateUsrDialog()
@@ -168,7 +169,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
if(!emagged)
playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1)
emagged = 1
- user << " You disable the security protocols "
+ user << "You disable the security protocols "
/obj/machinery/computer/rdconsole/Topic(href, href_list)
if(..())
@@ -237,7 +238,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
else if(href_list["eject_item"]) //Eject the item inside the destructive analyzer.
if(linked_destroy)
if(linked_destroy.busy)
- usr << " The destructive analyzer is busy at the moment. "
+ usr << "The destructive analyzer is busy at the moment. "
else if(linked_destroy.loaded_item)
linked_destroy.loaded_item.loc = linked_destroy.loc
@@ -248,7 +249,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
else if(href_list["deconstruct"]) //Deconstruct the item in the destructive analyzer and update the research holder.
if(linked_destroy)
if(linked_destroy.busy)
- usr << " The destructive analyzer is busy at the moment. "
+ usr << "The destructive analyzer is busy at the moment. "
else
var/choice = input("Proceeding will destroy loaded item.") in list("Proceed", "Cancel")
if(choice == "Cancel" || !linked_destroy) return
@@ -261,7 +262,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
linked_destroy.busy = 0
if(!linked_destroy.hacked)
if(!linked_destroy.loaded_item)
- usr <<" The destructive analyzer appears to be empty. "
+ usr <<"The destructive analyzer appears to be empty. "
screen = 1.0
return
if((linked_destroy.loaded_item.reliability >= 99 - (linked_destroy.decon_mod * 3)) || linked_destroy.loaded_item.crit_fail)
@@ -276,6 +277,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
if(linked_lathe) //Also sends salvaged materials to a linked protolathe, if any.
linked_lathe.m_amount += min((linked_lathe.max_material_storage - linked_lathe.TotalMaterials()), (linked_destroy.loaded_item.m_amt*(linked_destroy.decon_mod/10)))
linked_lathe.g_amount += min((linked_lathe.max_material_storage - linked_lathe.TotalMaterials()), (linked_destroy.loaded_item.g_amt*(linked_destroy.decon_mod/10)))
+ feedback_add_details("item_deconstructed","[linked_destroy.loaded_item.name]")
linked_destroy.loaded_item = null
else
screen = 1.0
@@ -306,7 +308,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
else if(href_list["sync"]) //Sync the research holder with all the R&D consoles in the game that aren't sync protected.
screen = 0.0
if(!sync)
- usr << " You must connect to the network first! "
+ usr << "You must connect to the network first! "
else
griefProtection() //Putting this here because I dont trust the sync process
spawn(30)
@@ -406,6 +408,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
var/R = being_built.reliability
spawn(32*amount/coeff)
if(g2g) //And if we only fail the material requirements, we still spend time and power
+ var/already_logged = 0
for(var/i = 0, iMain Menu"
- dat += "Settings Menu "
+ dat += "
Settings Menu "
dat += "
R&D Console Device Linkage Menu: "
dat += "
Re-sync with Nearby Devices "
dat += "
Linked Devices: "
@@ -803,12 +810,12 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "
Material Amount: [linked_lathe.TotalMaterials()] / [linked_lathe.max_material_storage]
"
dat += "
Chemical Volume: [linked_lathe.reagents.total_volume] / [linked_lathe.reagents.maximum_volume]
"
- dat += "
"
dat += list_categories(linked_lathe.categories, 3.15)
@@ -957,12 +964,12 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "Material Amount: [linked_imprinter.TotalMaterials()]
"
dat += "Chemical Volume: [linked_imprinter.reagents.total_volume]
"
- dat += "
"
dat += list_categories(linked_imprinter.categories, 4.15)
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index 62dd6e45bac..fb56e869fe8 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -177,7 +177,8 @@
/obj/machinery/computer/rdservercontrol
name = "R&D Server Controller"
desc = "Used to manage access to research and manufacturing databases."
- icon_state = "rdcomp"
+ icon_screen = "rdcomp"
+ icon_keyboard = "rd_key"
var/screen = 0
var/obj/machinery/r_n_d/server/temp_server
var/list/servers = list()
@@ -192,7 +193,7 @@
add_fingerprint(usr)
usr.set_machine(src)
if(!src.allowed(usr) && !emagged)
- usr << "
You do not have the required access level. "
+ usr << "
You do not have the required access level. "
return
if(href_list["main"])
@@ -269,7 +270,7 @@
if(istype(S, /obj/machinery/r_n_d/server/centcom) && !badmin)
continue
dat += "[S.name] || "
- dat += "
Access Rights | "
+ dat += "
Access Rights | "
dat += "
Data Management "
if(badmin) dat += " |
Server-to-Server Transfer "
dat += "
"
@@ -310,7 +311,7 @@
dat += "[temp_server.name] Server to Server Transfer
"
dat += "Send Data to what server?
"
for(var/obj/machinery/r_n_d/server/S in servers)
- dat += "[S.name]
(Transfer) "
+ dat += "[S.name]
(Transfer) "
dat += "
Main Menu "
user << browse("
R&D Server Control [dat]", "window=server_control;size=575x400")
onclose(user, "server_control")
@@ -325,7 +326,7 @@
if(!emagged)
playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1)
emagged = 1
- user << "
You you disable the security protocols. "
+ user << "
You you disable the security protocols. "
/obj/machinery/r_n_d/server/robotics
name = "Robotics R&D Server"
diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm
index e522d1fc166..4f67a8aa16d 100644
--- a/code/modules/research/stock_parts.dm
+++ b/code/modules/research/stock_parts.dm
@@ -14,10 +14,41 @@
display_contents_with_number = 1
max_w_class = 3
max_combined_w_class = 100
+ var/works_from_distance = 0
+ var/pshoom_or_beepboopblorpzingshadashwoosh = 'sound/items/rped.ogg'
+ var/alt_sound = null
+
+/obj/item/weapon/storage/part_replacer/afterattack(obj/machinery/T as obj, mob/living/carbon/human/user as mob, flag, params)
+ if(flag)
+ return
+ else
+ if(works_from_distance)
+ if(istype(T))
+ if(T.component_parts)
+ T.exchange_parts(user, src)
+ user.Beam(T,icon_state="rped_upgrade",icon='icons/effects/effects.dmi',time=5)
+ return
+
+/obj/item/weapon/storage/part_replacer/bluespace
+ name = "bluespace rapid part exchange device"
+ desc = "A version of the RPED that allows for replacement of parts and scanning from a distance, along with higher capacity for parts."
+ icon_state = "BS_RPED"
+ item_state = "BS_RPED"
+ w_class = 3
+ storage_slots = 400
+ max_w_class = 3
+ max_combined_w_class = 800
+ works_from_distance = 1
+ pshoom_or_beepboopblorpzingshadashwoosh = 'sound/items/PSHOOM.ogg'
+ alt_sound = 'sound/items/PSHOOM_2.ogg'
+
/obj/item/weapon/storage/part_replacer/proc/play_rped_sound()
//Plays the sound for RPED exhanging or installing parts.
- playsound(src, 'sound/items/rped.ogg', 40, 1)
+ if(alt_sound && prob(1))
+ playsound(src, alt_sound, 40, 1)
+ else
+ playsound(src, pshoom_or_beepboopblorpzingshadashwoosh, 40, 1)
//Sorts stock parts inside an RPED by their rating.
//Only use /obj/item/weapon/stock_parts/ with this sort proc!
@@ -172,6 +203,51 @@
rating = 3
m_amt = 80
+//Rating 4
+
+/obj/item/weapon/stock_parts/capacitor/quadratic
+ name = "quadratic capacitor"
+ desc = "An capacity capacitor used in the construction of a variety of devices."
+ icon_state = "quadratic_capacitor"
+ origin_tech = "powerstorage=6;materials=5"
+ rating = 4
+ m_amt = 50
+ g_amt = 50
+
+/obj/item/weapon/stock_parts/scanning_module/triphasic
+ name = "triphasic scanning module"
+ desc = "A compact, ultra resolution triphasic scanning module used in the construction of certain devices."
+ icon_state = "triphasic_scan_module"
+ origin_tech = "magnets=6"
+ rating = 4
+ m_amt = 50
+ g_amt = 20
+
+/obj/item/weapon/stock_parts/manipulator/femto
+ name = "femto-manipulator"
+ desc = "A tiny little manipulator used in the construction of certain devices."
+ icon_state = "femto_mani"
+ origin_tech = "materials=6;programming=3"
+ rating = 4
+ m_amt = 30
+
+/obj/item/weapon/stock_parts/micro_laser/quadultra
+ name = "quad-ultra micro-laser"
+ icon_state = "quadultra_micro_laser"
+ desc = "A tiny laser used in certain devices."
+ origin_tech = "magnets=6"
+ rating = 4
+ m_amt = 10
+ g_amt = 20
+
+/obj/item/weapon/stock_parts/matter_bin/bluespace
+ name = "bluespace matter bin"
+ desc = "A container for hold compressed matter awaiting re-construction."
+ icon_state = "bluespace_matter_bin"
+ origin_tech = "materials=6"
+ rating = 4
+ m_amt = 80
+
// Subspace stock parts
/obj/item/weapon/stock_parts/subspace/ansible
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index f6693492790..fd4c133308f 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -18,10 +18,10 @@
/obj/item/slime_extract/attackby(obj/item/O as obj, mob/user as mob)
if(istype(O, /obj/item/weapon/slimesteroid2))
if(enhanced == 1)
- user << "
This extract has already been enhanced! "
+ user << "
This extract has already been enhanced! "
return ..()
if(Uses == 0)
- user << "
You can't enhance a used extract! "
+ user << "
You can't enhance a used extract! "
return ..()
user <<"
You apply the enhancer. It now has triple the amount of uses. "
Uses = 3
@@ -138,8 +138,8 @@
M.docile = 1
M.nutrition = 700
- M <<"
You absorb the potion and feel your intense desire to feed melt away. "
- user <<"
You feed the slime the potion, removing it's hunger and calming it. "
+ M <<"
You absorb the potion and feel your intense desire to feed melt away. "
+ user <<"
You feed the slime the potion, removing it's hunger and calming it. "
var/newname = copytext(sanitize(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text),1,MAX_NAME_LEN)
if (!newname)
@@ -220,16 +220,16 @@
/obj/item/weapon/slimesteroid/attack(mob/living/simple_animal/slime/M as mob, mob/user as mob)
if(!isslime(M))//If target is not a slime.
- user << "
The steroid only works on baby slimes! "
+ user << "
The steroid only works on baby slimes! "
return ..()
if(M.is_adult) //Can't tame adults
- user << "
Only baby slimes can use the steroid! "
+ user << "
Only baby slimes can use the steroid! "
return..()
if(M.stat)
- user << "
The slime is dead! "
+ user << "
The slime is dead! "
return..()
if(M.cores == 3)
- user <<"
The slime already has the maximum amount of extract! "
+ user <<"
The slime already has the maximum amount of extract! "
return..()
user <<"
You feed the slime the steroid. It now has triple the amount of extract. "
@@ -252,10 +252,10 @@
/*afterattack(obj/target, mob/user , flag)
if(istype(target, /obj/item/slime_extract))
if(target.enhanced == 1)
- user << "
This extract has already been enhanced! "
+ user << "
This extract has already been enhanced! "
return ..()
if(target.Uses == 0)
- user << "
You can't enhance a used extract! "
+ user << "
You can't enhance a used extract! "
return ..()
user <<"You apply the enhancer. It now has triple the amount of uses."
target.Uses = 3
@@ -271,13 +271,13 @@
/obj/item/weapon/slimestabilizer/attack(mob/living/simple_animal/slime/M as mob, mob/user as mob)
if(!isslime(M))
- user << "
The stabilizer only works on slimes! "
+ user << "
The stabilizer only works on slimes! "
return ..()
if(M.stat)
- user << "
The slime is dead! "
+ user << "
The slime is dead! "
return..()
if(M.mutation_chance == 0)
- user <<"
The slime already has no chance of mutating! "
+ user <<"
The slime already has no chance of mutating! "
return..()
user <<"
You feed the slime the stabilizer. It is now less likely to mutate. "
@@ -292,16 +292,16 @@
/obj/item/weapon/slimemutator/attack(mob/living/simple_animal/slime/M as mob, mob/user as mob)
if(!isslime(M))
- user << "
The mutator only works on slimes! "
+ user << "
The mutator only works on slimes! "
return ..()
if(M.stat)
- user << "
The slime is dead! "
+ user << "
The slime is dead! "
return..()
if(M.mutator_used)
- user << "
This slime has already consumed a mutator, any more would be far too unstable! "
+ user << "
This slime has already consumed a mutator, any more would be far too unstable! "
return..()
if(M.mutation_chance == 100)
- user <<"
The slime is already guaranteed to mutate! "
+ user <<"
The slime is already guaranteed to mutate! "
return..()
user <<"
You feed the slime the mutator. It is now more likely to mutate. "
@@ -418,3 +418,57 @@
G.key = ghost.key
G << "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist them in completing their goals at any cost."
qdel(src)
+
+
+
+
+/obj/effect/timestop
+ anchored = 1
+ name = "chronofield"
+ desc = "ZA WARUDO"
+ icon = 'icons/effects/160x160.dmi'
+ icon_state = "time"
+ layer = FLY_LAYER
+ pixel_x = -64
+ pixel_y = -64
+ unacidable = 1
+ var/mob/living/immune = null // the one who creates the timestop is immune
+ var/freezerange = 2
+ var/duration = 140
+ alpha = 125
+
+/obj/effect/timestop/New()
+ ..()
+ timestop()
+
+
+/obj/effect/timestop/proc/timestop()
+ playsound(get_turf(src), 'sound/magic/TIMEPARADOX2.ogg', 100, 1, -1)
+ while(loc)
+ if(duration)
+ for(var/mob/living/M in orange (freezerange, src.loc))
+ if(M == immune)
+ continue
+ M.stunned = 10
+ M.anchored = 1
+ if(istype(M, /mob/living/simple_animal/hostile))
+ var/mob/living/simple_animal/hostile/H = M
+ H.AIStatus = AI_OFF
+ H.LoseTarget()
+ continue
+ for(var/obj/item/projectile/P in orange (freezerange, src.loc))
+ P.paused = TRUE
+ duration --
+ else
+ for(var/mob/living/M in orange (freezerange+2, src.loc)) //longer range incase they lag out of it or something
+ M.stunned = 0
+ M.anchored = 0
+ if(istype(M, /mob/living/simple_animal/hostile))
+ var/mob/living/simple_animal/hostile/H = M
+ H.AIStatus = initial(H.AIStatus)
+ continue
+ for(var/obj/item/projectile/P in orange(freezerange+2, src.loc))
+ P.paused = FALSE
+ qdel(src)
+ return
+ sleep(1)
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index 1d107132a08..db7b923c0f5 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -56,7 +56,7 @@
//returns turfs within our projected rectangle in a specific order.
//this ensures that turfs are copied over in the same order, regardless of any rotation
-/obj/docking_port/proc/return_ordered_turfs(_x, _y, _z, _dir)
+/obj/docking_port/proc/return_ordered_turfs(_x, _y, _z, _dir, area/A)
if(!_dir)
_dir = dir
if(!_x)
@@ -86,7 +86,14 @@
for(var/dy=0, dy
You fried the consoles ID checking system."
+ user << "You fried the consoles ID checking system. "
/obj/machinery/computer/shuttle/ferry
name = "transport ferry console"
diff --git a/code/modules/surgery/helpers.dm b/code/modules/surgery/helpers.dm
index 63327f69d70..662a4304d3e 100644
--- a/code/modules/surgery/helpers.dm
+++ b/code/modules/surgery/helpers.dm
@@ -48,6 +48,7 @@
user.visible_message("[user] drapes [I] over [M]'s [parse_zone(procedure.location)] to prepare for \an [procedure.name].", "You drape [I] over [M]'s [parse_zone(procedure.location)] to prepare for \an [procedure.name]. ")
add_logs(user, M, "operated", addition="Operation type: [procedure.name]")
+ feedback_add_details("surgery_initiated","[procedure.name]")
return 1
else
user << "You need to expose [M]'s [procedure.location] first! "
diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm
index df88239994d..2025f3c155b 100644
--- a/code/modules/surgery/organs/organ.dm
+++ b/code/modules/surgery/organs/organ.dm
@@ -188,4 +188,12 @@
for(var/obj/item/organ/limb/L in organs)
for(var/obj/item/I in L.embedded_objects)
L.embedded_objects -= I
- I.loc = T
\ No newline at end of file
+ I.loc = T
+
+ clear_alert("embeddedobject")
+
+/mob/living/carbon/human/proc/has_embedded_objects()
+ . = 0
+ for(var/obj/item/organ/limb/L in organs)
+ for(var/obj/item/I in L.embedded_objects)
+ return 1
\ No newline at end of file
diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm
index 33968dd8968..f8e7de333d9 100644
--- a/code/modules/surgery/remove_embedded_object.dm
+++ b/code/modules/surgery/remove_embedded_object.dm
@@ -33,6 +33,9 @@
I.loc = get_turf(H)
L.embedded_objects -= I
+ if(!H.has_embedded_objects())
+ H.clear_alert("embeddedobject")
+
if(objects > 0)
user.visible_message("[user] sucessfully removes [objects] objects from [H]'s [L.getDisplayName()]!", "You sucessfully remove [objects] objects from [H]'s [L.getDisplayName()]. ")
else
diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm
index 042832894d7..76365b0790c 100644
--- a/code/modules/surgery/surgery_step.dm
+++ b/code/modules/surgery/surgery_step.dm
@@ -73,6 +73,7 @@
/datum/surgery_step/proc/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
user.visible_message("[user] succeeds!", "You succeed. ")
+ feedback_add_details("surgery_step_success","[src.type]")
return 1
/datum/surgery_step/saw/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
@@ -80,10 +81,12 @@
var/mob/living/carbon/human/H = target
H.apply_damage(75,"brute","[target_zone]")
user.visible_message("[user] saws [target]'s [parse_zone(target_zone)] open!", "You saw [target]'s [parse_zone(target_zone)] open. ")
+ feedback_add_details("surgery_step_success","[src.type]")
return 1
/datum/surgery_step/proc/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
user.visible_message("[user] screws up! ", "You screw up! ")
+ feedback_add_details("surgery_step_failed","[src.type]")
return 0
/datum/surgery_step/close/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm
index 7949dcfba88..e1f4a37d288 100644
--- a/code/modules/telesci/telepad.dm
+++ b/code/modules/telesci/telepad.dm
@@ -35,7 +35,7 @@
if(istype(I, /obj/item/device/multitool))
var/obj/item/device/multitool/M = I
M.buffer = src
- user << "You save the data in the [I.name]'s buffer. "
+ user << "You save the data in the [I.name]'s buffer. "
if(exchange_parts(user, I))
return
@@ -60,22 +60,22 @@
playsound(src, 'sound/items/Ratchet.ogg', 50, 1)
if(anchored)
anchored = 0
- user << " \The [src] can now be moved. "
+ user << "\The [src] can now be moved. "
else if(!anchored)
anchored = 1
- user << " \The [src] is now secured. "
+ user << "\The [src] is now secured. "
if(istype(W, /obj/item/weapon/screwdriver))
if(stage == 0)
playsound(src, 'sound/items/Screwdriver.ogg', 50, 1)
- user << " You unscrew the telepad's tracking beacon. "
+ user << "You unscrew the telepad's tracking beacon. "
stage = 1
else if(stage == 1)
playsound(src, 'sound/items/Screwdriver.ogg', 50, 1)
- user << " You screw in the telepad's tracking beacon. "
+ user << "You screw in the telepad's tracking beacon. "
stage = 0
if(istype(W, /obj/item/weapon/weldingtool) && stage == 1)
playsound(src, 'sound/items/Welder.ogg', 50, 1)
- user << " You disassemble the telepad. "
+ user << "You disassemble the telepad. "
new /obj/item/stack/sheet/metal(get_turf(src))
new /obj/item/stack/sheet/glass(get_turf(src))
qdel(src)
@@ -91,7 +91,7 @@
/obj/item/device/telepad_beacon/attack_self(mob/user as mob)
if(user)
- user << " Locked In "
+ user << "Locked In "
new /obj/machinery/telepad_cargo(user.loc)
playsound(src, 'sound/effects/pop.ogg', 100, 1, 1)
qdel(src)
@@ -142,11 +142,11 @@
if(mode == 0)
mode = 1
playsound(src.loc, 'sound/effects/pop.ogg', 50, 0)
- user << " The telepad locator has become uncalibrated. "
+ user << "The telepad locator has become uncalibrated. "
else
mode = 0
playsound(src.loc, 'sound/effects/pop.ogg', 50, 0)
- user << " You calibrate the telepad locator. "
+ user << "You calibrate the telepad locator. "
/obj/item/weapon/rcs/emag_act(mob/user as mob)
if(!emagged)
@@ -154,4 +154,4 @@
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(5, 1, src)
s.start()
- user << " You emag the RCS. Click on it to toggle between modes. "
+ user << "You emag the RCS. Click on it to toggle between modes. "
diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm
index 6d602467fa1..aa0343a1641 100644
--- a/code/modules/telesci/telesci_computer.dm
+++ b/code/modules/telesci/telesci_computer.dm
@@ -74,7 +74,7 @@
if(M.buffer && istype(M.buffer, /obj/machinery/telepad))
telepad = M.buffer
M.buffer = null
- user << "You upload the data from the [W.name]'s buffer. "
+ user << "You upload the data from the [W.name]'s buffer. "
else
..()
diff --git a/code/orphaned procs/priority_announce.dm b/code/orphaned procs/priority_announce.dm
index e085fa783ca..3630b9d58df 100644
--- a/code/orphaned procs/priority_announce.dm
+++ b/code/orphaned procs/priority_announce.dm
@@ -6,7 +6,8 @@
if(type == "Priority")
announcement += "Priority Announcement "
-
+ if (title && length(title) > 0)
+ announcement += "[html_encode(title)] "
else if(type == "Captain")
announcement += "Captain Announces "
news_network.SubmitArticle(text, "Captain's Announcement", "Station Announcements", null)
diff --git a/config/game_options.txt b/config/game_options.txt
index cc2a9c13d1d..9c62544f085 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -276,3 +276,22 @@ MIDROUND_ANTAG_LIFE_CHECK 0.7
#NO_SUMMON_MAGIC
#NO_SUMMON_EVENTS
+//Comment for "normal" explosions, which ignore obstacles
+//Uncomment for explosions that react to doors and walls
+REACTIONARY_EXPLOSIONS
+
+### Configure the bomb cap
+## This caps all explosions to the specified range. Used for both balance reasons and to prevent overloading the server and lagging the game out.
+## This is given as the 3rd number(light damage) in the standard (1,2,3) explosion notation. The other numbers are derived by dividing by 2 and 4.
+## eg: If you give the number 20. The bomb cap will be 5,10,20.
+## Can be any number between 4 and 128, some examples are provided below.
+
+## Default (3,7,14)
+BOMBCAP 14
+## One 'step' up (4,8,16) (recommended if you enable REACTIONARY_EXPLOSIONS above)
+#BOMBCAP 16
+## LagHell (7,14,28)
+#BOMBCAP 28
+
+
+
diff --git a/config/tips.txt b/config/tips.txt
index dd6b2f23f85..04ea4ab50d0 100644
--- a/config/tips.txt
+++ b/config/tips.txt
@@ -85,3 +85,6 @@ You can use . or # instead of : for radio channels. Building this habit reduces
While pulling something, clicking on a tile with an empty hand will move it to that tile. No more getting stuck in maint while dragging something!
Things that override clicks like decks of cards or paper bins can still be picked up by dragging them to your character. Equipped things that override click can be unequipped by dragging it to an empty hand.
In the job selection menu, from the lobby, you can use right click on the "Low/Medium/High" priority button to make it cycle backwards.
+If you stay out of camera range for 10 seconds, the AI's track on you will break.
+You can shoot cameras with bullets to disable them remotely.
+Disabling a camera with wirecutters will not cause a camera alarm, but bludgeoning it will.
diff --git a/html/changelog.html b/html/changelog.html
index ba63933790f..6845a7e00f6 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,185 @@
-->
+
15 June 2015
+
Incoming5643 updated:
+
+ Lizards can now choose from a wide varity of physical appearances in character creation! Sprites made by WJohn. Hiss Responsibly.
+
+
Kor updated:
+
+ A terrible new creature stalks the halls of SS13.
+ The wizard has a new artefact related to said creature.
+ Added a new sepia slime plasma reaction. Try it out!
+
+
spasticVerbalizer updated:
+
+ Drones can now properly quick-equip.
+
+
+
14 June 2015
+
Ikarrus updated:
+
+ White suits added to gang outfits
+ Gang outfits are now free, but are now limited in stock (that replenishes over time)
+ While attempting a Hostile Takeover, gangs do not gain influence. Instead, the takeover timer will be reduced by how many territories they control.
+ Spraycan cost reduced to 5 influence.
+ Recruitment Pen cooldown increased to 2 minutes, but is reduced if the enemy gang has more members than yours.
+ Tommy guns no longer deal stamina damage.
+ Gangtools can no longer recall the shuttle if the game mode is not Gang War
+
+
+
12 June 2015
+
Ikarrus updated:
+
+ Gang Updates
+ New objective: To win, Gangs must now buy a Dominator machine (50 influence) and defend it for a varying time frame. * The location of the dominator is broadcasted to the entire station the moment it is activated * The more territories the gang controls, the less time it will take * Gangs no longer win by capturing territories
+ A choice of gang outfits are now purchasable for 1 influence each
+ Thompson SMGs aka "tommy guns" are now purchasable for 50 influence
+ Bulletproof armor vests are now purchasable for 10 influence
+ Gang messages are now free to send
+ Prices of pistols and pens reduced to 20 and 30, respectively
+ Gang spraycans have been made a lot less obvious. They look nearly identical to regular ones, now.
+ Gangs will no longer be notified how much territory the enemy controls
+
+
Incoming5643 updated:
+
+ Growing tired of reports of slain members, the Wizard Federation has cautiously sactioned the dark path of lichdom. Beware of the powerful lich who hides his phylactery well, for he is immortal!
+ The trick to defeating liches is to destroy either their body or their phylactery item before they can ressurect to it. The more a lich is slain the longer it will take him to make use of his phylactery and the more likely the crew is to catch him during a vunerable moment.
+ Due to the addition of proper liching, skeletons as a choosable race from magic mirrors has been discontinued. My apologies to the powergamers. A special admin version of the mirror that allows for skeletons has also been added to the code.
+
+
Miauw updated:
+
+ AIs have received several minor nerfs in order to increase antagonist counterplay:
+ AI tracking is no longer instant, it takes an amount of time that increases with distance from the AI eye, up to 4 seconds. The AI detector item will light up when an AI begins tracking.
+ A random camera failure event has been added, which will break one or two random cameras.
+ You can no longer keep tracking people that are outside of your camera vision.
+ Camera wires have been removed. Screwdriver a camera to open the panel, then use wirecutters to disable it or a multitool to change the focus.
+ You can now hit cameras with items to break them. To repair a camera, simply open the panel and use wirecutters on it.
+ Camera alerts now only happen after a camera is reactivated.
+
+
RemieRichards updated:
+
+ New optional explosion effect ported from /vg/'s DeityLink, Explosions that are affected by Walls and Doors
+
+
+
11 June 2015
+
Cheridan updated:
+
+ Removes the powerdrain for individiual active modules on cyborgs.
+
+
+
09 June 2015
+
Aranclanos updated:
+
+ Structures and machines can now be built on shuttles.
+
+
Iamgoofball updated:
+
+ Adds the Bluespace Rapid Part Exchange Device: holds up to 400 stock parts and can be used to upgrade machines at range without needing to open their maintenance panel.
+ A new tier of stock parts have been added, they're very expensive to produce but provide ample improvements.
+ Many machines can now also be upgraded.
+ Emitter: Lasers decrease firing delay and Capacitors decrease power consumption.
+ Gibber: Matter Bins increase yield of meat and Manipulators speed up operation time, at high level can gib creatures with clothes.
+ Seed Extractor: Matter Bins increase storage and Manipulators multiply seed production.
+ Monkey Recycler: Matter Bins increase the amount of monkey cubes produced and Manipulators reduce the monkey-to-cubes ratio to a minimum of 1-to-1.
+ Crusher: Matter Bins increase material yield and Manipulators increase chance to yield materials, at high level there is a chance for rarer materials.
+ Holopad: Capacitors increase an AI's traversal range from the holopad.
+ Smartfridge: Matter Bins increase storage.
+ Processor: Matter Bins increase yield and Manipulators speed up operation time.
+ Microwave: Matter Bins increase storage.
+ Ore Redemption Machine: Matter Bins increase yield per ore, Lasers increase points per ore and Manipulators speed up operation time.
+ Hydroponics Tray: Manipulators improve water and nutrients efficiency.
+ Biogenerator: Matter Bins increase storage.
+
+
bananacreampie updated:
+
+ Added several new options to the ghostform sprites
+
+
+
08 June 2015
+
AnturK updated:
+
+ Improved the interface of Spellbooks.
+
+
Cheridan updated:
+
+ Push-force from Atmospherics now depends on an entity's weight, heavier objects are less prone to being pushed.
+ Magboots and No-Slip shoes now prevent pushing from spacewind.
+
+
Firecage updated:
+
+ Protolathes can now build Experimental Welding Tools.
+
+
+
07 June 2015
+
Aranclanos updated:
+
+ Malfunctioning AIs can preview placement of a Robotic Factory.
+
+
Iamgoofball updated:
+
+ Bicardine, Dexalin, Kelotane, Anti-toxin, Inaprovaline and Tricordrazine have been re-added.
+
+
RemieRichards updated:
+
+ Lizards can now wag their tails, emote *wag to start and *stopwag to stop.
+
+
kingofkosmos updated:
+
+ Mops can now be wet from normal buckets and sinks.
+
+
+
06 June 2015
+
Incoming5643 updated:
+
+ Antagonists with escape alone can now escape with others on the shuttle, so long as they are also antagonists.
+ Antagonists with escape alone can also win if non-antagonists are on the shuttle provided they are locked in the brig.
+ Escaping to syndicate space on board the nuke op shuttle is now a valid way to escape the station.
+
+
Jordie0608 updated:
+
+ Admin-delaying the round now works once it has finished.
+
+
+
05 June 2015
+
CandyClown updated:
+
+ Ointments, bruise packs, and gauze are now stacked to 6 instead of 5.
+
+
CorruptComputer updated:
+
+ Security lockers no longer spawn in front of each other on Box.
+ Hooked up the scrubbers in QM's office on Box.
+ Fixed bar disposals on Box
+ Fixed the stacked heater+freezer in expirementor maint on Box
+ Made the turbine into Atmos and Engineering access only, and renamed the doors to Turbine on Box.
+
+
Ikarrus updated:
+
+ Gang Bosses will now be able to discreetly send messages to everyone in their gang for 5 influence a message.
+ Conversion pens now use a flat 60sec cooldown rate.
+
+
KorPhaeron updated:
+
+ You can now lay tiles on the asteroid. Go nuts building forts.
+
+
+
04 June 2015
+
Cuboos updated:
+
+ Added casting and firing sounds for wizard spells and staves.
+ A new title theme has been added.
+
+
Gun Hog updated:
+
+ Nanotrasen has approved the designs for destination taggers and hand labelers in the autolathe.
+
+
Palpatine213 updated:
+
+ Allows sechuds to have their id locks removed via emag as well as EMP
+
+
31 May 2015
duncathan updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index a030bf17dca..a366f49f229 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -2618,3 +2618,159 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
2015-05-31:
duncathan:
- tweak: Clarified the ability to retract changeling armblades.
+2015-06-04:
+ Cuboos:
+ - rscadd: Added casting and firing sounds for wizard spells and staves.
+ - rscadd: A new title theme has been added.
+ Gun Hog:
+ - rscadd: Nanotrasen has approved the designs for destination taggers and hand labelers
+ in the autolathe.
+ Palpatine213:
+ - tweak: Allows sechuds to have their id locks removed via emag as well as EMP
+2015-06-05:
+ CandyClown:
+ - tweak: Ointments, bruise packs, and gauze are now stacked to 6 instead of 5.
+ CorruptComputer:
+ - bugfix: Security lockers no longer spawn in front of each other on Box.
+ - bugfix: Hooked up the scrubbers in QM's office on Box.
+ - bugfix: Fixed bar disposals on Box
+ - bugfix: Fixed the stacked heater+freezer in expirementor maint on Box
+ - tweak: Made the turbine into Atmos and Engineering access only, and renamed the
+ doors to Turbine on Box.
+ Ikarrus:
+ - rscadd: Gang Bosses will now be able to discreetly send messages to everyone in
+ their gang for 5 influence a message.
+ - tweak: Conversion pens now use a flat 60sec cooldown rate.
+ KorPhaeron:
+ - rscadd: You can now lay tiles on the asteroid. Go nuts building forts.
+2015-06-06:
+ Incoming5643:
+ - rscadd: Antagonists with escape alone can now escape with others on the shuttle,
+ so long as they are also antagonists.
+ - rscadd: Antagonists with escape alone can also win if non-antagonists are on the
+ shuttle provided they are locked in the brig.
+ - rscadd: Escaping to syndicate space on board the nuke op shuttle is now a valid
+ way to escape the station.
+ Jordie0608:
+ - rscadd: Admin-delaying the round now works once it has finished.
+2015-06-07:
+ Aranclanos:
+ - rscadd: Malfunctioning AIs can preview placement of a Robotic Factory.
+ Iamgoofball:
+ - rscadd: Bicardine, Dexalin, Kelotane, Anti-toxin, Inaprovaline and Tricordrazine
+ have been re-added.
+ RemieRichards:
+ - rscadd: Lizards can now wag their tails, emote *wag to start and *stopwag to stop.
+ kingofkosmos:
+ - tweak: Mops can now be wet from normal buckets and sinks.
+2015-06-08:
+ AnturK:
+ - imageadd: Improved the interface of Spellbooks.
+ Cheridan:
+ - tweak: Push-force from Atmospherics now depends on an entity's weight, heavier
+ objects are less prone to being pushed.
+ - rscadd: Magboots and No-Slip shoes now prevent pushing from spacewind.
+ Firecage:
+ - rscadd: Protolathes can now build Experimental Welding Tools.
+2015-06-09:
+ Aranclanos:
+ - wip: Structures and machines can now be built on shuttles.
+ Iamgoofball:
+ - rscadd: 'Adds the Bluespace Rapid Part Exchange Device: holds up to 400 stock
+ parts and can be used to upgrade machines at range without needing to open their
+ maintenance panel.'
+ - rscadd: A new tier of stock parts have been added, they're very expensive to produce
+ but provide ample improvements.
+ - experiment: Many machines can now also be upgraded.
+ - tweak: 'Emitter: Lasers decrease firing delay and Capacitors decrease power consumption.'
+ - tweak: 'Gibber: Matter Bins increase yield of meat and Manipulators speed up operation
+ time, at high level can gib creatures with clothes.'
+ - tweak: 'Seed Extractor: Matter Bins increase storage and Manipulators multiply
+ seed production.'
+ - tweak: 'Monkey Recycler: Matter Bins increase the amount of monkey cubes produced
+ and Manipulators reduce the monkey-to-cubes ratio to a minimum of 1-to-1.'
+ - tweak: 'Crusher: Matter Bins increase material yield and Manipulators increase
+ chance to yield materials, at high level there is a chance for rarer materials.'
+ - tweak: 'Holopad: Capacitors increase an AI''s traversal range from the holopad.'
+ - tweak: 'Smartfridge: Matter Bins increase storage.'
+ - tweak: 'Processor: Matter Bins increase yield and Manipulators speed up operation
+ time.'
+ - tweak: 'Microwave: Matter Bins increase storage.'
+ - tweak: 'Ore Redemption Machine: Matter Bins increase yield per ore, Lasers increase
+ points per ore and Manipulators speed up operation time.'
+ - tweak: 'Hydroponics Tray: Manipulators improve water and nutrients efficiency.'
+ - tweak: 'Biogenerator: Matter Bins increase storage.'
+ bananacreampie:
+ - rscadd: Added several new options to the ghostform sprites
+2015-06-11:
+ Cheridan:
+ - rscdel: Removes the powerdrain for individiual active modules on cyborgs.
+2015-06-12:
+ Ikarrus:
+ - experiment: Gang Updates
+ - rscadd: 'New objective: To win, Gangs must now buy a Dominator machine (50 influence)
+ and defend it for a varying time frame. * The location of the dominator is
+ broadcasted to the entire station the moment it is activated * The more territories
+ the gang controls, the less time it will take * Gangs no longer win by capturing
+ territories'
+ - rscadd: A choice of gang outfits are now purchasable for 1 influence each
+ - rscadd: Thompson SMGs aka "tommy guns" are now purchasable for 50 influence
+ - rscadd: Bulletproof armor vests are now purchasable for 10 influence
+ - tweak: Gang messages are now free to send
+ - tweak: Prices of pistols and pens reduced to 20 and 30, respectively
+ - tweak: Gang spraycans have been made a lot less obvious. They look nearly identical
+ to regular ones, now.
+ - rscdel: Gangs will no longer be notified how much territory the enemy controls
+ Incoming5643:
+ - rscadd: Growing tired of reports of slain members, the Wizard Federation has cautiously
+ sactioned the dark path of lichdom. Beware of the powerful lich who hides his
+ phylactery well, for he is immortal!
+ - rscadd: The trick to defeating liches is to destroy either their body or their
+ phylactery item before they can ressurect to it. The more a lich is slain the
+ longer it will take him to make use of his phylactery and the more likely the
+ crew is to catch him during a vunerable moment.
+ - rscremove: Due to the addition of proper liching, skeletons as a choosable race
+ from magic mirrors has been discontinued. My apologies to the powergamers. A
+ special admin version of the mirror that allows for skeletons has also been
+ added to the code.
+ Miauw:
+ - tweak: 'AIs have received several minor nerfs in order to increase antagonist
+ counterplay:'
+ - tweak: AI tracking is no longer instant, it takes an amount of time that increases
+ with distance from the AI eye, up to 4 seconds. The AI detector item will light
+ up when an AI begins tracking.
+ - tweak: A random camera failure event has been added, which will break one or two
+ random cameras.
+ - tweak: You can no longer keep tracking people that are outside of your camera
+ vision.
+ - tweak: Camera wires have been removed. Screwdriver a camera to open the panel,
+ then use wirecutters to disable it or a multitool to change the focus.
+ - tweak: You can now hit cameras with items to break them. To repair a camera, simply
+ open the panel and use wirecutters on it.
+ - tweak: Camera alerts now only happen after a camera is reactivated.
+ RemieRichards:
+ - rscadd: New optional explosion effect ported from /vg/'s DeityLink, Explosions
+ that are affected by Walls and Doors
+2015-06-14:
+ Ikarrus:
+ - rscadd: White suits added to gang outfits
+ - tweak: Gang outfits are now free, but are now limited in stock (that replenishes
+ over time)
+ - tweak: While attempting a Hostile Takeover, gangs do not gain influence. Instead,
+ the takeover timer will be reduced by how many territories they control.
+ - tweak: Spraycan cost reduced to 5 influence.
+ - tweak: Recruitment Pen cooldown increased to 2 minutes, but is reduced if the
+ enemy gang has more members than yours.
+ - tweak: Tommy guns no longer deal stamina damage.
+ - rscdel: Gangtools can no longer recall the shuttle if the game mode is not Gang
+ War
+2015-06-15:
+ Incoming5643:
+ - rscadd: Lizards can now choose from a wide varity of physical appearances in character
+ creation! Sprites made by WJohn. Hiss Responsibly.
+ Kor:
+ - rscadd: A terrible new creature stalks the halls of SS13.
+ - rscadd: The wizard has a new artefact related to said creature.
+ - rscadd: Added a new sepia slime plasma reaction. Try it out!
+ spasticVerbalizer:
+ - rscfix: Drones can now properly quick-equip.
diff --git a/html/changelogs/KORPHAERON-TURF.yml b/html/changelogs/AnturK-pda.yml
similarity index 91%
rename from html/changelogs/KORPHAERON-TURF.yml
rename to html/changelogs/AnturK-pda.yml
index 01c08918078..ea5c073af7c 100644
--- a/html/changelogs/KORPHAERON-TURF.yml
+++ b/html/changelogs/AnturK-pda.yml
@@ -22,7 +22,7 @@
#################################
# Your name.
-author: KorPhaeron
+author: AnturK
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
@@ -33,4 +33,4 @@ delete-after: True
# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit.
# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog.
changes:
- - rscadd: "You can now lay tiles on the asteroid. Go nuts building forts."
+ - rscadd: "Added new photo-over-pda function. Apply the photo to PDA to send it with your next message!"
diff --git a/html/changelogs/CandyClownTG.yml b/html/changelogs/CandyClownTG.yml
deleted file mode 100644
index 212952b415d..00000000000
--- a/html/changelogs/CandyClownTG.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-################################
-# Example Changelog File
-#
-# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
-#
-# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
-# When it is, any changes listed below will disappear.
-#
-# Valid Prefixes:
-# bugfix
-# wip (For works in progress)
-# tweak
-# soundadd
-# sounddel
-# rscadd (general adding of nice things)
-# rscdel (general deleting of nice things)
-# imageadd
-# imagedel
-# spellcheck (typo fixes)
-# experiment
-# tgs (TG-ported fixes?)
-#################################
-
-# Your name.
-author: CandyClown
-
-# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
-delete-after: True
-
-# Any changes you've made. See valid prefix list above.
-# INDENT WITH TWO SPACES. NOT TABS. SPACES.
-# SCREW THIS UP AND IT WON'T WORK.
-# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit.
-# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog.
-changes:
- - tweak: "Ointments, bruise packs, and gauze are now stacked to 6 instead of 5."
diff --git a/html/changelogs/CorruptComputer-BoxFixes.yml b/html/changelogs/CorruptComputer-BoxFixes.yml
deleted file mode 100644
index 49474b0be95..00000000000
--- a/html/changelogs/CorruptComputer-BoxFixes.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-author: CorruptComputer
-
-delete-after: True
-
-changes:
- - bugfix: "Security lockers no longer spawn in front of each other on Box."
- - bugfix: "Hooked up the scrubbers in QM's office on Box."
- - bugfix: "Fixed bar disposals on Box"
- - bugfix: "Fixed the stacked heater+freezer in expirementor maint on Box"
- - tweak: "Made the turbine into Atmos and Engineering access only, and renamed the doors to Turbine on Box."
-
diff --git a/html/changelogs/Cuboos-WizardSounds.yml b/html/changelogs/Cuboos-WizardSounds.yml
deleted file mode 100644
index eccd5fade93..00000000000
--- a/html/changelogs/Cuboos-WizardSounds.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: Cuboos
-delete-after: True
-
-changes:
- - rscadd: "Added casting and firing sounds for wizard spells and staves."
- - rscadd: "A new title theme has been added."
\ No newline at end of file
diff --git a/html/changelogs/Gun-Hog-PR-9667.yml b/html/changelogs/Gun-Hog-PR-9667.yml
deleted file mode 100644
index a4cb8509a70..00000000000
--- a/html/changelogs/Gun-Hog-PR-9667.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-################################
-# Example Changelog File
-#
-# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
-#
-# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
-# When it is, any changes listed below will disappear.
-#
-# Valid Prefixes:
-# bugfix
-# wip (For works in progress)
-# tweak
-# soundadd
-# sounddel
-# rscadd (general adding of nice things)
-# rscdel (general deleting of nice things)
-# imageadd
-# imagedel
-# spellcheck (typo fixes)
-# experiment
-# tgs (TG-ported fixes?)
-#################################
-
-# Your name.
-author: Gun Hog
-
-# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
-delete-after: True
-
-# Any changes you've made. See valid prefix list above.
-# INDENT WITH TWO SPACES. NOT TABS. SPACES.
-# SCREW THIS UP AND IT WON'T WORK.
-# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit.
-# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog.
-changes:
- - rscadd: "Nanotrasen has approved the designs for destination taggers and hand labelers in the autolathe."
diff --git a/html/changelogs/Ikarrus-gangmessage.yml b/html/changelogs/Ikarrus-deptmanagement.yml
similarity index 87%
rename from html/changelogs/Ikarrus-gangmessage.yml
rename to html/changelogs/Ikarrus-deptmanagement.yml
index 9da3c5a3ffe..7cbd7300139 100644
--- a/html/changelogs/Ikarrus-gangmessage.yml
+++ b/html/changelogs/Ikarrus-deptmanagement.yml
@@ -33,5 +33,4 @@ delete-after: True
# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit.
# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog.
changes:
- - rscadd: "Gang Bosses will now be able to discreetly send messages to everyone in their gang for 5 influence a message."
- - tweak: "Conversion pens now use a flat 60sec cooldown rate."
\ No newline at end of file
+ - rscadd: "Department Management consoles have been added to Head of Staff offices. These will enable heads to modify ID's access to their department, as well as preform demotions."
\ No newline at end of file
diff --git a/html/changelogs/Incoming5643 - whycantwebefriend.yml b/html/changelogs/Incoming5643 - whycantwebefriend.yml
deleted file mode 100644
index d6cd2a65311..00000000000
--- a/html/changelogs/Incoming5643 - whycantwebefriend.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: Incoming5643
-
-delete-after: True
-
-changes:
- - rscadd: "Antagonists with escape alone can now escape with others on the shuttle, so long as they are also antagonists."
- - rscadd: "Antagonists with escape alone can also win if non-antagonists are on the shuttle provided they are locked in the brig."
- - rscadd: "Escaping to syndicate space on board the nuke op shuttle is now a valid way to escape the station."
diff --git a/html/changelogs/Miauw-AINerfTweaks.yml b/html/changelogs/Miauw-AINerfTweaks.yml
new file mode 100644
index 00000000000..02b290595d3
--- /dev/null
+++ b/html/changelogs/Miauw-AINerfTweaks.yml
@@ -0,0 +1,7 @@
+author: Miauw
+delete-after: True
+changes:
+ - tweak: "Bullets can now damage cameras."
+ - tweak: "Camera alarms now trigger 90 seconds after the first EMP pulse, instead of when all EMP pulses run out."
+ - tweak: "Makes the force required to damage cameras greater than or equal to ten instead of greater than ten."
+ - tweak: "Camera alarms now trigger when cameras are disabled with brute force or bullets."
\ No newline at end of file
diff --git a/html/changelogs/Xhuis-Superlarity.yml b/html/changelogs/Xhuis-Superlarity.yml
new file mode 100644
index 00000000000..79559c527c3
--- /dev/null
+++ b/html/changelogs/Xhuis-Superlarity.yml
@@ -0,0 +1,5 @@
+author: Xhuis
+delete-after: True
+
+changes:
+ - rscadd: "Nanotrasen scientists have determined that a delaminating supermatter shard combining with a gravitational singularity is an extremely bad idea. They advise keeping the two as far apart as possible."
diff --git a/html/changelogs/jordie restart.yml b/html/changelogs/jordie restart.yml
deleted file mode 100644
index 4c581575db8..00000000000
--- a/html/changelogs/jordie restart.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: Jordie0608
-
-delete-after: True
-
-changes:
- - rscadd: "Admin-delaying the round now works once it has finished."
\ No newline at end of file
diff --git a/html/changelogs/palpatine213-hudemag.yml b/html/changelogs/palpatine213-hudemag.yml
deleted file mode 100644
index cd2b300bb20..00000000000
--- a/html/changelogs/palpatine213-hudemag.yml
+++ /dev/null
@@ -1,37 +0,0 @@
-################################
-# Example Changelog File
-#
-# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
-#
-# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
-# When it is, any changes listed below will disappear.
-#
-# Valid Prefixes:
-# bugfix
-# wip (For works in progress)
-# tweak
-# soundadd
-# sounddel
-# rscadd (general adding of nice things)
-# rscdel (general deleting of nice things)
-# imageadd
-# imagedel
-# spellcheck (typo fixes)
-# experiment
-# tgs (TG-ported fixes?)
-#################################
-
-# Your name.
-author: Palpatine213
-
-# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
-delete-after: True
-
-# Any changes you've made. See valid prefix list above.
-# INDENT WITH TWO SPACES. NOT TABS. SPACES.
-# SCREW THIS UP AND IT WON'T WORK.
-# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit.
-# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog.
-changes:
- - tweak: "Allows sechuds to have their id locks removed via emag as well as EMP"
-
diff --git a/html/changelogs/phil235-XrayGunNerf.yml b/html/changelogs/phil235-XrayGunNerf.yml
new file mode 100644
index 00000000000..0cdfb5b9318
--- /dev/null
+++ b/html/changelogs/phil235-XrayGunNerf.yml
@@ -0,0 +1,6 @@
+author: phil235
+
+delete-after: True
+
+changes:
+ - rscdel: "Nerfed the xray gun. Its range is now 15 tiles."
diff --git a/icons/effects/160x160.dmi b/icons/effects/160x160.dmi
index 57e3a81edf1..8c733232f93 100644
Binary files a/icons/effects/160x160.dmi and b/icons/effects/160x160.dmi differ
diff --git a/icons/effects/352x352.dmi b/icons/effects/352x352.dmi
new file mode 100644
index 00000000000..86b40959d56
Binary files /dev/null and b/icons/effects/352x352.dmi differ
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 1fe7f1c5713..39df26748eb 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/misc/buildmode.dmi b/icons/misc/buildmode.dmi
index a885e76d549..089427111f2 100644
Binary files a/icons/misc/buildmode.dmi and b/icons/misc/buildmode.dmi differ
diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi
index bc98f542874..4ced7caebed 100644
Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 522826b5530..934435bd835 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/human.dmi b/icons/mob/human.dmi
index 7b47bec0962..8f924ee6632 100644
Binary files a/icons/mob/human.dmi and b/icons/mob/human.dmi differ
diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi
index ee03734f007..3bbd054bce7 100644
Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ
diff --git a/icons/mob/mutant_bodyparts.dmi b/icons/mob/mutant_bodyparts.dmi
index 6221fbad9e7..94acba1cbc5 100644
Binary files a/icons/mob/mutant_bodyparts.dmi and b/icons/mob/mutant_bodyparts.dmi differ
diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi
index 7a0c7a6599a..0ed43592376 100644
Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index dd1f96dcbfe..6572955ff2b 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi
index 9c5ddae42c1..42e1b95b2c0 100644
Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index f4d22e41ee2..59ac6436d18 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index b56aa44170d..deca94b24fa 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi
index 4a7846286da..6c8fd8bc903 100644
Binary files a/icons/obj/computer.dmi and b/icons/obj/computer.dmi differ
diff --git a/icons/obj/crayons.dmi b/icons/obj/crayons.dmi
index a3966103053..7d3489285c3 100644
Binary files a/icons/obj/crayons.dmi and b/icons/obj/crayons.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 473e51f6964..5a3e80c66f7 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/hydroponics/equipment.dmi b/icons/obj/hydroponics/equipment.dmi
index 25a4bee8e63..904eb38c53c 100644
Binary files a/icons/obj/hydroponics/equipment.dmi and b/icons/obj/hydroponics/equipment.dmi differ
diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi
index 4988bb5a4c6..d485b53a828 100644
Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ
diff --git a/icons/obj/machines/dominator.dmi b/icons/obj/machines/dominator.dmi
new file mode 100644
index 00000000000..7671dedff86
Binary files /dev/null and b/icons/obj/machines/dominator.dmi differ
diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi
index 4d6c9a00bbb..f51725357a4 100644
Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ
diff --git a/icons/obj/recycling.dmi b/icons/obj/recycling.dmi
index 8661194c0d9..297eaf76e2f 100644
Binary files a/icons/obj/recycling.dmi and b/icons/obj/recycling.dmi differ
diff --git a/icons/obj/singularity.dmi b/icons/obj/singularity.dmi
index cc0156de462..3a9a5514b64 100644
Binary files a/icons/obj/singularity.dmi and b/icons/obj/singularity.dmi differ
diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi
index a30ab24fcbe..1797ac7cee0 100644
Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ
diff --git a/icons/obj/stock_parts.dmi b/icons/obj/stock_parts.dmi
index 03e4bae5b5f..8b5b5b812e4 100644
Binary files a/icons/obj/stock_parts.dmi and b/icons/obj/stock_parts.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index 175cfab6122..aac16abbd38 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index 682103c7dcb..f7d418e6fcb 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ
diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi
index 91d53ce1dfd..41373c350c1 100644
Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ
diff --git a/icons/obj/wizard.dmi b/icons/obj/wizard.dmi
index e3eec0a88ac..3624a9b4bff 100644
Binary files a/icons/obj/wizard.dmi and b/icons/obj/wizard.dmi differ
diff --git a/sound/arcade/Boom.ogg b/sound/arcade/Boom.ogg
new file mode 100644
index 00000000000..8adfb2bc430
Binary files /dev/null and b/sound/arcade/Boom.ogg differ
diff --git a/sound/arcade/Heal.ogg b/sound/arcade/Heal.ogg
new file mode 100644
index 00000000000..26f47195c65
Binary files /dev/null and b/sound/arcade/Heal.ogg differ
diff --git a/sound/arcade/Hit.ogg b/sound/arcade/Hit.ogg
new file mode 100644
index 00000000000..0bf18679a65
Binary files /dev/null and b/sound/arcade/Hit.ogg differ
diff --git a/sound/arcade/Lose.ogg b/sound/arcade/Lose.ogg
new file mode 100644
index 00000000000..dd2145737cd
Binary files /dev/null and b/sound/arcade/Lose.ogg differ
diff --git a/sound/arcade/Mana.ogg b/sound/arcade/Mana.ogg
new file mode 100644
index 00000000000..7f26ae53fe7
Binary files /dev/null and b/sound/arcade/Mana.ogg differ
diff --git a/sound/arcade/Steal.ogg b/sound/arcade/Steal.ogg
new file mode 100644
index 00000000000..9c7b3be2a5a
Binary files /dev/null and b/sound/arcade/Steal.ogg differ
diff --git a/sound/arcade/Win.ogg b/sound/arcade/Win.ogg
new file mode 100644
index 00000000000..27fb9725f20
Binary files /dev/null and b/sound/arcade/Win.ogg differ
diff --git a/sound/effects/pray.ogg b/sound/effects/pray.ogg
new file mode 100644
index 00000000000..beadd3916f1
Binary files /dev/null and b/sound/effects/pray.ogg differ
diff --git a/sound/effects/pray_chaplain.ogg b/sound/effects/pray_chaplain.ogg
new file mode 100644
index 00000000000..1b543275311
Binary files /dev/null and b/sound/effects/pray_chaplain.ogg differ
diff --git a/sound/items/PSHOOM.ogg b/sound/items/PSHOOM.ogg
new file mode 100644
index 00000000000..5628842f534
Binary files /dev/null and b/sound/items/PSHOOM.ogg differ
diff --git a/sound/items/PSHOOM_2.ogg b/sound/items/PSHOOM_2.ogg
new file mode 100644
index 00000000000..480b302fad8
Binary files /dev/null and b/sound/items/PSHOOM_2.ogg differ
diff --git a/sound/magic/Demon_consume.ogg b/sound/magic/Demon_consume.ogg
new file mode 100644
index 00000000000..ef9276e74c0
Binary files /dev/null and b/sound/magic/Demon_consume.ogg differ
diff --git a/sound/magic/TIMEPARADOX2.ogg b/sound/magic/TIMEPARADOX2.ogg
new file mode 100644
index 00000000000..d35aeb389f6
Binary files /dev/null and b/sound/magic/TIMEPARADOX2.ogg differ
diff --git a/sound/magic/demon_attack1.ogg b/sound/magic/demon_attack1.ogg
new file mode 100644
index 00000000000..e3c765afd0c
Binary files /dev/null and b/sound/magic/demon_attack1.ogg differ
diff --git a/sound/magic/demon_dies.ogg b/sound/magic/demon_dies.ogg
new file mode 100644
index 00000000000..ad2a95f397d
Binary files /dev/null and b/sound/magic/demon_dies.ogg differ
diff --git a/sound/magic/enter_blood.ogg b/sound/magic/enter_blood.ogg
new file mode 100644
index 00000000000..4deba11b465
Binary files /dev/null and b/sound/magic/enter_blood.ogg differ
diff --git a/sound/magic/exit_blood.ogg b/sound/magic/exit_blood.ogg
new file mode 100644
index 00000000000..c4399a2ecc6
Binary files /dev/null and b/sound/magic/exit_blood.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 55616d11204..d9cf55015de 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -227,6 +227,7 @@
#include "code\datums\spells\genetic.dm"
#include "code\datums\spells\inflict_handler.dm"
#include "code\datums\spells\knock.dm"
+#include "code\datums\spells\lichdom.dm"
#include "code\datums\spells\lightning.dm"
#include "code\datums\spells\mime.dm"
#include "code\datums\spells\mind_transfer.dm"
@@ -240,7 +241,6 @@
#include "code\datums\wires\alarm.dm"
#include "code\datums\wires\apc.dm"
#include "code\datums\wires\autolathe.dm"
-#include "code\datums\wires\camera.dm"
#include "code\datums\wires\explosive.dm"
#include "code\datums\wires\mulebot.dm"
#include "code\datums\wires\particle_accelerator.dm"
@@ -326,7 +326,9 @@
#include "code\game\gamemodes\cult\runes.dm"
#include "code\game\gamemodes\cult\talisman.dm"
#include "code\game\gamemodes\extended\extended.dm"
+#include "code\game\gamemodes\gang\dominator.dm"
#include "code\game\gamemodes\gang\gang.dm"
+#include "code\game\gamemodes\gang\recaller.dm"
#include "code\game\gamemodes\malfunction\Malf_Modules.dm"
#include "code\game\gamemodes\malfunction\malfunction.dm"
#include "code\game\gamemodes\meteor\meteor.dm"
@@ -431,7 +433,6 @@
#include "code\game\machinery\camera\motion.dm"
#include "code\game\machinery\camera\presets.dm"
#include "code\game\machinery\camera\tracking.dm"
-#include "code\game\machinery\computer\ai_core.dm"
#include "code\game\machinery\computer\aifixer.dm"
#include "code\game\machinery\computer\arcade.dm"
#include "code\game\machinery\computer\atmos_alert.dm"
@@ -551,6 +552,7 @@
#include "code\game\objects\effects\spawners\bombspawner.dm"
#include "code\game\objects\effects\spawners\gibspawner.dm"
#include "code\game\objects\effects\spawners\lootdrop.dm"
+#include "code\game\objects\effects\spawners\structure.dm"
#include "code\game\objects\effects\spawners\vaultspawner.dm"
#include "code\game\objects\items\apc_frame.dm"
#include "code\game\objects\items\blueprints.dm"
@@ -579,7 +581,6 @@
#include "code\game\objects\items\devices\pipe_painter.dm"
#include "code\game\objects\items\devices\pizza_bomb.dm"
#include "code\game\objects\items\devices\powersink.dm"
-#include "code\game\objects\items\devices\recaller.dm"
#include "code\game\objects\items\devices\scanners.dm"
#include "code\game\objects\items\devices\sensor_device.dm"
#include "code\game\objects\items\devices\taperecorder.dm"
@@ -685,6 +686,7 @@
#include "code\game\objects\items\weapons\tanks\tank_types.dm"
#include "code\game\objects\items\weapons\tanks\tanks.dm"
#include "code\game\objects\items\weapons\tanks\watertank.dm"
+#include "code\game\objects\structures\ai_core.dm"
#include "code\game\objects\structures\artstuff.dm"
#include "code\game\objects\structures\barsigns.dm"
#include "code\game\objects\structures\bedsheet_bin.dm"
@@ -801,6 +803,7 @@
#include "code\modules\admin\newbanjob.dm"
#include "code\modules\admin\player_notes.dm"
#include "code\modules\admin\player_panel.dm"
+#include "code\modules\admin\secrets.dm"
#include "code\modules\admin\topic.dm"
#include "code\modules\admin\DB ban\functions.dm"
#include "code\modules\admin\permissionverbs\permissionedit.dm"
@@ -818,6 +821,7 @@
#include "code\modules\admin\verbs\diagnostics.dm"
#include "code\modules\admin\verbs\fps.dm"
#include "code\modules\admin\verbs\getlogs.dm"
+#include "code\modules\admin\verbs\machine_upgrade.dm"
#include "code\modules\admin\verbs\mapping.dm"
#include "code\modules\admin\verbs\massmodvar.dm"
#include "code\modules\admin\verbs\modifyvariables.dm"
@@ -930,6 +934,7 @@
#include "code\modules\events\anomaly_vortex.dm"
#include "code\modules\events\blob.dm"
#include "code\modules\events\brand_intelligence.dm"
+#include "code\modules\events\camerafailure.dm"
#include "code\modules\events\carp_migration.dm"
#include "code\modules\events\communications_blackout.dm"
#include "code\modules\events\disease_outbreak.dm"
@@ -1239,6 +1244,8 @@
#include "code\modules\mob\living\simple_animal\revenant\revenant.dm"
#include "code\modules\mob\living\simple_animal\revenant\revenant_abilities.dm"
#include "code\modules\mob\living\simple_animal\revenant\revenant_spawn_event.dm"
+#include "code\modules\mob\living\simple_animal\slaughter\slaughter.dm"
+#include "code\modules\mob\living\simple_animal\slaughter\slaughterevent.dm"
#include "code\modules\mob\living\simple_animal\slime\death.dm"
#include "code\modules\mob\living\simple_animal\slime\emote.dm"
#include "code\modules\mob\living\simple_animal\slime\life.dm"
@@ -1331,8 +1338,12 @@
#include "code\modules\procedural mapping\mapGenerator.dm"
#include "code\modules\procedural mapping\mapGeneratorModule.dm"
#include "code\modules\procedural mapping\mapGeneratorReadme.dm"
+#include "code\modules\procedural mapping\mapGeneratorModules\helpers.dm"
#include "code\modules\procedural mapping\mapGeneratorModules\nature.dm"
+#include "code\modules\procedural mapping\mapGenerators\asteroid.dm"
#include "code\modules\procedural mapping\mapGenerators\nature.dm"
+#include "code\modules\procedural mapping\mapGenerators\shuttle.dm"
+#include "code\modules\procedural mapping\mapGenerators\syndicate.dm"
#include "code\modules\projectiles\ammunition.dm"
#include "code\modules\projectiles\firing.dm"
#include "code\modules\projectiles\gun.dm"
diff --git a/tools/dmifonts/DmiFonts.exe b/tools/dmifonts/DmiFonts.exe
new file mode 100644
index 00000000000..ce1d694147a
Binary files /dev/null and b/tools/dmifonts/DmiFonts.exe differ
diff --git a/tools/dmifonts/DmiFonts.int b/tools/dmifonts/DmiFonts.int
new file mode 100644
index 00000000000..b82874fded5
--- /dev/null
+++ b/tools/dmifonts/DmiFonts.int
@@ -0,0 +1,6 @@
+// BEGIN_INTERNALS
+/*
+MAP_ICON_TYPE: 0
+AUTO_FILE_DIR: OFF
+*/
+// END_INTERNALS
diff --git a/tools/dmifonts/DmiFonts.lk b/tools/dmifonts/DmiFonts.lk
new file mode 100644
index 00000000000..e69de29bb2d