diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql
index 7cf71cdd074..f22f746fa48 100644
--- a/SQL/paradise_schema.sql
+++ b/SQL/paradise_schema.sql
@@ -75,6 +75,7 @@ CREATE TABLE `characters` (
`disabilities` mediumint(8) NOT NULL,
`player_alt_titles` mediumtext NOT NULL,
`organ_data` mediumtext NOT NULL,
+ `rlimb_data` mediumtext NOT NULL,
`nanotrasen_relation` varchar(45) NOT NULL,
`speciesprefs` int(1) NOT NULL,
`slime_color` mediumtext NOT NULL,
diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index 86b67afab09..cca97fd306f 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -162,7 +162,7 @@
"adf" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/security/hos)
"adg" = (/obj/machinery/door_control{id = "Prison Gate"; name = "Prison Wing Lockdown"; pixel_x = -28; pixel_y = 7; req_access_txt = "2"},/obj/machinery/door_control{id = "Secure Gate"; name = "Brig Lockdown"; pixel_x = -28; pixel_y = -3; req_access_txt = "2"},/turf/simulated/floor{icon_state = "dark"},/area/security/hos)
"adh" = (/obj/structure/table/woodentable,/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor{icon_state = "dark"},/area/security/hos)
-"adi" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 0; pixel_y = 10},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/effect/decal/warning_stripes/east,/turf/simulated/floor,/area/security/podbay)
+"adi" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 0; pixel_y = 10},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/effect/decal/warning_stripes/east,/obj/item/clothing/glasses/welding,/turf/simulated/floor,/area/security/podbay)
"adj" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/engine,/area/security/podbay)
"adk" = (/obj/machinery/light{dir = 1; on = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/engine,/area/security/podbay)
"adl" = (/obj/machinery/camera{c_tag = "Brig Podbay"; dir = 2; network = list("SS13")},/obj/machinery/door_control{desc = "A remote control-switch for the pod doors."; id = "secpodbay"; name = "Pod Door Control"; pixel_x = 0; pixel_y = 24; req_access_txt = "71"},/turf/simulated/floor/engine,/area/security/podbay)
@@ -512,7 +512,7 @@
"ajR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/closet/secure_closet/warden,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{icon_state = "dark"},/area/security/warden)
"ajS" = (/obj/structure/table,/obj/item/weapon/clipboard,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/weapon/paper/armory,/turf/simulated/floor{icon_state = "dark"},/area/security/warden)
"ajT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/warden)
-"ajU" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor{icon_state = "red"; dir = 9},/area/security/main)
+"ajU" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/closet/redcorp,/turf/simulated/floor{icon_state = "red"; dir = 9},/area/security/main)
"ajV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{icon_state = "redcorner"; dir = 1},/area/security/main)
"ajW" = (/obj/structure/table,/turf/simulated/floor,/area/security/main)
"ajX" = (/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/main)
@@ -6265,8 +6265,8 @@
"cqy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
"cqz" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/pump,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor{icon_state = "arrival"; dir = 8},/area/hallway/primary/aft)
"cqA" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 9; level = 2},/turf/simulated/wall/r_wall,/area/engine/controlroom)
-"cqB" = (/obj/machinery/camera{c_tag = "Atmospherics Access"; dir = 4; network = list("SS13")},/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6; level = 1},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -30},/turf/simulated/floor,/area/engine/controlroom)
-"cqC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/hologram/holopad,/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 0; pixel_y = -32; req_access_txt = "0"},/turf/simulated/floor,/area/engine/controlroom)
+"cqB" = (/obj/machinery/camera{c_tag = "Atmospherics Access"; dir = 4; network = list("SS13")},/obj/machinery/light{dir = 8},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -30},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor,/area/engine/controlroom)
+"cqC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/hologram/holopad,/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 0; pixel_y = -32; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor,/area/engine/controlroom)
"cqD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/drone_fabricator,/turf/simulated/floor,/area/engine/controlroom)
"cqE" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor,/area/engine/controlroom)
"cqF" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/computer/drone_control,/turf/simulated/floor,/area/engine/controlroom)
@@ -6330,8 +6330,8 @@
"crL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"crM" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor,/area/hallway/primary/aft)
"crN" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/scrubber,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{dir = 8; icon_state = "escape"},/area/hallway/primary/aft)
-"crO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/meter,/turf/simulated/wall/r_wall,/area/engine/controlroom)
-"crP" = (/obj/machinery/door/firedoor{dir = 1; name = "Firelock North"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "0"; req_one_access_txt = "11;24"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9; level = 1},/turf/simulated/floor,/area/engine/controlroom)
+"crO" = (/obj/machinery/door/firedoor{dir = 1; name = "Firelock North"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "0"; req_one_access_txt = "11;24"},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor,/area/engine/controlroom)
+"crP" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/hidden/yellow{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/turf/simulated/wall/r_wall,/area/engine/controlroom)
"crQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/engine/controlroom)
"crR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/wall/r_wall,/area/engine/controlroom)
"crS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/wall/r_wall,/area/engine/break_room)
@@ -6386,7 +6386,7 @@
"csP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/hallway/primary/aft)
"csQ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor,/area/hallway/primary/aft)
"csR" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/scrubber,/obj/machinery/camera{c_tag = "Aft Primary Hallway 2"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = -22},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "escape"},/area/hallway/primary/aft)
-"csS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/sign/securearea,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/engine/break_room)
+"csS" = (/obj/structure/sign/securearea,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/wall/r_wall,/area/engine/break_room)
"csT" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor,/area/engine/break_room)
"csU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/recharge_station,/turf/simulated/floor,/area/engine/break_room)
"csV" = (/turf/simulated/wall/r_wall,/area/engine/break_room)
@@ -6732,7 +6732,7 @@
"czx" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/wall/r_wall,/area/medical/virology)
"czy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "viro_airlock_interior"; locked = 1; name = "Virology Internal Airlock"; req_access_txt = "5"},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "viro_airlock_control"; name = "Virology Access Button"; pixel_x = -28; pixel_y = 8; req_access_txt = "5"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"czz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/medical/virology)
-"czA" = (/obj/structure/closet/secure_closet/personal/patient,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 8; name = "Virology APC"; pixel_x = -25; pixel_y = 3},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/virology)
+"czA" = (/obj/structure/closet/secure_closet/personal/patient,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 8; name = "Virology APC"; pixel_x = -25; pixel_y = 3},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/virology)
"czB" = (/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/virology)
"czC" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/virology)
"czD" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
@@ -8065,6 +8065,7 @@
"cZe" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/aisat/maintenance)
"cZf" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/aisat/maintenance)
"cZg" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/aisat/maintenance)
+"cZh" = (/turf/space,/area/shuttle/derelict/ship/station)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8086,27 +8087,27 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaaeaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhaaaaaaaaaaaaaaaaaaaaacZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaaaaaaaaaaacZhcZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaaaaacZhcZhcZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaaeaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaaaaacZhcZhcZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaaaaaaaaaaacZhcZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhaaaaaaaaaaaaaaaaaaaaacZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaaiaaiaaiaaiaaiaaiaaiaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8229,7 +8230,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaacmEcnZcoacobcocclwcodclwcoeclwcofcogcohcoicojaaacokciGcolciIcomciKciKconcoocopcoqcorcoscotcouceVcovcowcoxcoycozchLcoAckvckvckvcoBchMbHTbHTcoCcoCcoDcoEcoFcoGcoHcoCcoIcoJcoKcoLcoMcoDcoNcmfcdTcmgbEDcoOckNckOckPaaaaaacjvcoPcoQcoRcjvbHTbHTbHTcnzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacoScoTcoUcoVcoWcoXcoYcoYcoZcpacpbcpccpdcpecpfcpgcnQcphcpicpjcpjcpkcplcpjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUNcpmcpncpobUNbUNbWHbWHcppbWHbWHbUNbUNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacmEcpqcmGcprcmGcpscptcpucpvcmKcpwclzcpxcdbccZaaaaaaaaaaaachucpycpzcpAcpAchBcpBchBcpCceTbZUcpDcpEcpFcpGcpHcpHcpHcpIcpJckvcpKckvcpLchMbHTbHTcoCcpMcpNcpOcpPcpQcpRcoCcpQcpRcpPcpScpTcpUcoNcnrcpVcnsbEDcpWckNcpXckPcnzcnzcjvcjvcjvcjvcjvcpYbHTbHTcnzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacpZcqacqbcqccqdcqecqfcqgcqhcqicnNcqjcpdcpdcqkcqlcnQcqmcpicpjcqncqocqpcpjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqqcqrcqsbYdbUMbUNbUNbWHbWIbWHbUNbUNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUabCcqtcqtcqtcqtcqtcqtcqtcqtcqucqucqucqucquciCclzclzclzclzclzclzcqvcqwcqxcqxcqxcqxcqxchuchBchBchBchBchBchBchBcqyceTbZUcqzcqAcqBcqCcqDcqEcqFcqGcqHcqIcqJcqKcqLchMbHTbHTcoCcqMcqNcpOcpPcpPcqOcoCcqPcpPcpPcpScpOcqQcoNbEDbEDbEDcqRcqSckNcqTckPcqUbHTbHTbHTbHTcqVbHTbHTbHTbHTcnzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqWcqXcqYcqZcracrbcrccrdcrecrfcnOcpdcpdcpdcrgcrhcnQcnQcpicpjcricrjcrkcpjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrlbUKbUKbULbUMbUMbUNbUNbUNbUNbUOaabaabaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrmcrncrocrpcrqcrqcrrcrscrtcrucrvcrwcrxcrycrzcrzcrzcrAcrBcrCcrDcrDcrEcrFcrGcrHcrIcrHcrHcrHcrGcrHcrHcrJcrKcrLcrMceTbZUcrNcrOcrPcrQceVcrRclMcrScrTcrUcrVcrWcrXcrYbHTbHTcoCcrZcsacsbcsccsdcsecoCcsfcsdcsgcshcsbcsicoNbHTbHTbHTcsjcoOckNcoOcskbHTbHTbHTbHTbHTbHTbHTbHTbHTbHTcnzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcjIcsmcjLcslcsncsocspcsqcsrcsscstcsscsucsvcmzcnQcnQcswcpjcsxcsycszcpjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrmcrncrocrpcrqcrqcrrcrscrtcrucrvcrwcrxcrycrzcrzcrzcrAcrBcrCcrDcrDcrEcrFcrGcrHcrIcrHcrHcrHcrGcrHcrHcrJcrKcrLcrMceTbZUcrNcrPcrOcrQceVcrRclMcrScrTcrUcrVcrWcrXcrYbHTbHTcoCcrZcsacsbcsccsdcsecoCcsfcsdcsgcshcsbcsicoNbHTbHTbHTcsjcoOckNcoOcskbHTbHTbHTbHTbHTbHTbHTbHTbHTbHTcnzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcjIcsmcjLcslcsncsocspcsqcsrcsscstcsscsucsvcmzcnQcnQcswcpjcsxcsycszcpjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrmcrncsAcsBcsCcsBcsDcsEcsFcsGcsHcsIcsHcsJcsKcsKcsKcsKceTbZVbZVbZVcsKcsLcsKcsKcsKcsKcsKcsKcsKcsKcsKcsKcsMcsNcsOcsPcsQcsRcsScsTcsUcsVcsWcsXcsYcsZctactbctcctdctecmnctfctgcthctictjctkcpPctlcoCctmcpPctkctncpOctocoNctpcmscmsctqctrctscttckPctuctvctvctwcnzcnzcnzctxctvcnCcnzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacjIctyctzctAcjIctBctCctDctEctFctGctHctIctJctKcmzcnQcnQcpicpjctLctMctNctOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrmctPcsBctQctRctSctTctUctVctWctXctYctZcuacubcuccudcudcuecdqcufcdqcubcugcubcubcubcubcubcubcubcubcubcubcuhcsKcuicujcukculcumcuncuocupcuqcurcuscutcuucuvcuwcuxcrVcdzcuycuzcuAcpPcpOcpPcpPcuBcuCcuDcpPcpPcpScpOcuEcoNcuFcnzaaacuGckPcuHckPckPaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacjIcjIcjIcjIcjIcjIcjIcjIcjIcuIcuJcuKcjIcuLcuMcuNcuOcuPcuQcuRcnQcuScnQcuTcuUcuVcuWcpjcuXcuYcuXaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUabCcqtcqtcqtcqtcqtcqtcuZcvacvacvbcsHcvccqtcqxcvdcvecvecvfcvecvgcvecvecvhcvicvecvecvjcvkcvicvecvecvecvecvlcvmcvncvocvpcvqcvrcvscvtcvscvscvucvscvvcvwcvxcvycvzcrYbHTcuFcvAcvBcvCcvDcvEcvFcvGcoCcvHcvFcvIcpScvJcvKcoNcuFcnzaaacuGcvLcvMcvNckPaaaaaaaaaaaacvOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacjIcvPcvQcvRcvScvTcvUcvVcvWcvXcvYcvZcjIcwacwbcwccwdcwecwecwfcwgcwhcwicwjcwkcwlcwmcpjcwncwocwnaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8323,3 +8324,4 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"}
+
diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm
index b35a2e996e6..2181ff1179f 100644
--- a/_maps/map_files/cyberiad/z2.dmm
+++ b/_maps/map_files/cyberiad/z2.dmm
@@ -497,8 +497,8 @@
"jC" = (/obj/structure/stool/bed/chair{dir = 4},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
"jD" = (/obj/structure/table/woodentable,/obj/machinery/recharger{pixel_y = 0},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
"jE" = (/obj/structure/table/woodentable,/obj/item/weapon/dice/d20,/obj/item/weapon/dice,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
-"jF" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/marisa,/obj/item/clothing/shoes/sandal/marisa,/obj/item/clothing/head/wizard/marisa,/obj/item/weapon/staff/broom,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
-"jG" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/magusblue,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
+"jF" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/marisa,/obj/item/clothing/shoes/sandal/marisa,/obj/item/clothing/head/wizard/marisa,/obj/item/weapon/twohanded/staff/broom,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
+"jG" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/magusblue,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/gun/energy/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
"jH" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite/mothership)
"jI" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite/mothership)
"jJ" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite/mothership)
@@ -523,9 +523,9 @@
"kc" = (/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
"kd" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/mugwort,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
"ke" = (/obj/structure/table/woodentable,/obj/item/weapon/spacecash,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
-"kf" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/red,/obj/item/clothing/shoes/sandal,/obj/item/clothing/head/wizard/red,/obj/item/weapon/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
+"kf" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/red,/obj/item/clothing/shoes/sandal,/obj/item/clothing/head/wizard/red,/obj/item/weapon/gun/energy/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
"kg" = (/obj/machinery/light/spot,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
-"kh" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/magusred,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
+"kh" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/magusred,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/gun/energy/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
"ki" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite/mothership)
"kj" = (/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/space,/area/syndicate_mothership/elite_squad)
"kk" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/syndicate_mothership/elite_squad)
@@ -1841,6 +1841,14 @@
"Ju" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control switch for port-side blast doors."; icon_state = "doorctrl0"; id = "thunderdomehea"; name = "Ranged Gear"; pixel_x = 0; pixel_y = 5; req_access_txt = "104"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin)
"Jv" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control switch for port-side blast doors."; icon_state = "doorctrl0"; id = "thunderdomegen"; name = "General Equiptment"; pixel_x = 0; pixel_y = 5; req_access_txt = "104"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin)
"Jw" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control switch for port-side blast doors."; icon_state = "doorctrl0"; id = "thunderdomeaxe"; name = "Axe Supply"; pixel_x = 0; pixel_y = 5; req_access_txt = "104"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin)
+"Jx" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_rightnostop"; nostop = 1},/turf/space/transit/east/shuttlespace_ew4,/area)
+"Jy" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_rightnostop"; nostop = 1},/turf/space/transit/east/shuttlespace_ew3,/area)
+"Jz" = (/turf/space,/area/shuttle/derelict/ship/transit)
+"JA" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_rightnostop"; nostop = 1},/turf/space/transit/east/shuttlespace_ew15,/area)
+"JB" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_rightnostop"; nostop = 1},/turf/space/transit/east/shuttlespace_ew14,/area)
+"JC" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_rightnostop"; nostop = 1},/turf/space/transit/east/shuttlespace_ew2,/area)
+"JD" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_rightnostop"; nostop = 1},/turf/space/transit/east/shuttlespace_ew10,/area)
+"JE" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_rightnostop"; nostop = 1},/turf/space/transit/east/shuttlespace_ew6,/area)
(1,1,1) = {"
aaabacadaeafagahaaaiajakalamanaoagafajacadahakaeamaiaoapaqarasatauavawaxayazaAaBaCaDaEaFaGaHaIaJaKawaxayazaAaBaCaDaEaFaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaOaPaPaPaPaPaQaPaPaPaPaPaQaPaPaPaPaPaQaPaPaPaPaPaQaPaPaPaPaPaQaPaPaPaPaPaQaPaPaPaPaPaR
@@ -1919,37 +1927,37 @@ rBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
rBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnknzoWrCrDrEoYnznznznznznznzoWrCrDrEoYnznznkaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
rBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnknznznznznznznznznznznznznznznznznznznznznkaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
rBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnknknknknknknknknknknknknknknknknknknknknknkaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-rBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-rBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-rBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-rBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-rBrBrBrBrBrBrBrBrFrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-rBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-rBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-rBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-rBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-rBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-rBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-rBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-rGrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNbZbZbZbZbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNbZbZbZbZbZbZrHrIrJbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNbZrKrLrMrNrOrPrPrPbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNbZrPrPrPrPrPrPrQrRbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNbZrSrTrTrTrUrVrWrTbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNrXrYrYrYrYrZsasbscbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNbZrYsdsesfsgshsisjbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNbZbZbZbZbZbZbZbZbZbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+rBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+rBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaHasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+rBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaHasasasasasasasasasasasblblblblblblblblblblblblblblblblblblblblblblasasasasasasasasasasasasasasasasasasasasasaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+rBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaHasasasasasasasblblasasblasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+rBrBrBrBrBrBrBrBrFrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaHasasasasasblblblblblasasasJxJxJxJxJxJxJxJxJxasasasasasJyJyJyJyasasasasasasasasasasasasasasblblasasasasasasasaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+rBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaHasasasblblblasblblasasJxJxJxJzJzJzJzJzJzJzJyJyJyasasJyJyJzJzJyasasasasasblblblblblblblblblblblasasasasasasasaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+rBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaHasasblblasasblblasasJxJxJzJzJzJzJzJzJzJzJzJzJzJyJyJyJyJzJzJzJyasasasasasasblblblblblblasasasblasasasblasasasaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+rBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaHasasasblblblbkasasJxJxJzJzJzJzJzJzJzJzJzJzJzJzJzJyJyJzJzJzJzJyasasasasasblblasasasasblblblblblasasasblasasasaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+rBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaHasasasblblblblasJxJxJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJyasasasasasblasasasasasasasasblblasasblblasasasaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+rBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaHbjasblblblasblasJAJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJyasasasblblblasasasasasasasasasblblasblasasasasaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+rBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaHbjasblasasasbkasJAJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJyasasasasasasasasasasasasasasasasblblblasasasasaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+rBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNayasblaqasblasbkasJAJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJyJyJyasasasasasasasasasasasasasasasasblblasasasasaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+rGrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaybjblaqaqaqasasasJAJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJyJyJBJBJBJBJBJBJBJBJBJBJBJBatasasblblasasasasaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaHbjbjasaqaqblasasJAJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJyJzJzJzJzJzJzJzJzJzJzJzJBaqasasblblblasasasaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaHasbjboaqaqaqboasJAJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJBblblblblatblasasasaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaHasasboasaqblasasJAJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJCblblblblasasasatasaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaHblblasasaqbhasasJAJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJDatatblblasasasatasaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaHasblasboaqbhasasJAJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJBJzJzJzJzJzJzJzJzJzJzJzJEaqatasbibiatasasasaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaHasblblbobhbhasasJAJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJDJBJDJDJDJDJDJDJBJBJBJBJBJBbiatatatatblasasasaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNbZbZbZbZbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaHasasbkbobhbjasasJAJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJDJDJDblblblblblblblasasasasasasasatatatatblasasasaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNbZbZbZbZbZbZrHrIrJbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaHasblblboboauauasJAJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJCatblblasasasasasasasasasasasasasatatblblasasasaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNbZrKrLrMrNrOrPrPrPbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaHasbkbkaublasauauJAJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJCatasasasasasasasasasasasasasasasblblblasasasasaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNbZrPrPrPrPrPrPrQrRbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaHasbhbhauasasasauJyJyJyJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJCatasasasasasasasasasasblblblblblblasasasasasasaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNbZrSrTrTrTrUrVrWrTbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaHasasbhauasasasasasasJyJzJzJzJzJzJzJzJzJzJzJzJzJzJCJCJzJzJzJzJCatasasasasasasasasasblblasasasasasasasasasasasaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNrXrYrYrYrYrZsasbscbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaHasasasauauasasasasasJyJyJyJzJzJzJzJzJzJzJzJzJzJCJCJCJCJzJzJzJCatbmbmbmbmbmbmbmbmbmbmbmasasasasasasasasasasasaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNbZrYsdsesfsgshsisjbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaHasasasblaubhasasasasauauJyJyJzJzJzJzJzJzJzJCJCJCatatJCJCJzJzJCatasasasasasasasasblasbmbmbmbmbmbmbmbmasasasasaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNbZbZbZbZbZbZbZbZbZbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaHasatatatauaubhatasasasasauJyJyJyJyJyJyJyJyJyatatatatatJCJCJCJCatasblblblblblblblblblasblasasasasasbmbmasasasaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaHasasasasasaubhbhatatatatauauauauauauauauauauasasasasasatatatatasasasasasatatatasasblblblblasasasasasbmasasasaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaHasasasasasasasasasasasasasasasasasasasasasasasasasatatatatbmbmbmbmatatatatbmbmbmbmbmbmbmbmbmasbmasasbmasasasaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaHasasasasasasasasasasasasasasasasasasasasasasasasasasasasatatatatatatasasasasasasasasasasasbmbmbmasasbmasasasaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
@@ -2099,3 +2107,4 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
"}
+
diff --git a/_maps/map_files/cyberiad/z3.dmm b/_maps/map_files/cyberiad/z3.dmm
index 2d4cec2f0d7..b6461350077 100644
--- a/_maps/map_files/cyberiad/z3.dmm
+++ b/_maps/map_files/cyberiad/z3.dmm
@@ -1,103 +1,103 @@
"aa" = (/turf/space,/area)
"ab" = (/obj/item/trash/cheesie,/turf/space,/area)
-"ac" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/derelict/ship)
-"ad" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/derelict/ship)
-"ae" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"; dir = 2},/area/derelict/ship)
-"af" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area/derelict/ship)
-"ag" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/derelict/ship)
-"ah" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"ai" = (/obj/machinery/sleeper{dir = 8},/obj/machinery/light{dir = 1},/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"aj" = (/obj/machinery/sleep_console{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"ak" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/derelict/ship)
-"al" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"; dir = 2},/area/derelict/ship)
-"am" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_r (WEST)"; icon_state = "burst_r"; dir = 8},/turf/space,/area/derelict/ship)
-"an" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall11"; dir = 2},/area/derelict/ship)
-"ao" = (/obj/machinery/computer/med_data,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"ap" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 6; pixel_y = -5},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"aq" = (/turf/simulated/shuttle/wall{tag = "icon-swall15"; icon_state = "swall15"; dir = 2},/area/derelict/ship)
-"ar" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/derelict/ship)
-"as" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (EAST)"; icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/derelict/ship)
-"at" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (WEST)"; icon_state = "propulsion"; dir = 8},/turf/space,/area/derelict/ship)
-"au" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/derelict/ship)
-"av" = (/obj/item/weapon/scalpel,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"aw" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"; dir = 2},/area/derelict/ship)
-"ax" = (/turf/simulated/shuttle/plating,/area/derelict/ship)
-"ay" = (/obj/structure/computerframe{anchored = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"az" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/derelict/ship)
-"aA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/derelict/ship)
-"aB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/derelict/ship)
-"aC" = (/obj/machinery/door/airlock/glass{name = "Hibernation Pods"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"aD" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"aE" = (/obj/structure/table,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"aF" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/derelict/ship)
-"aG" = (/obj/item/device/multitool,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"aH" = (/obj/item/weapon/stock_parts/cell{charge = 100; maxcharge = 15000},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"aI" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor/plating,/area/derelict/ship)
-"aJ" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/derelict/ship)
-"aK" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_l (WEST)"; icon_state = "burst_l"; dir = 8},/turf/space,/area/derelict/ship)
-"aL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating,/area/derelict/ship)
-"aM" = (/obj/structure/table,/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"aN" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/derelict/ship)
-"aO" = (/obj/machinery/door/airlock/glass,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"aP" = (/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"aQ" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"aR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating,/area/derelict/ship)
-"aS" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"aT" = (/obj/machinery/door/window,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
+"ac" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/shuttle/derelict/ship/start)
+"ad" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/shuttle/derelict/ship/start)
+"ae" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area/shuttle/derelict/ship/start)
+"af" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"; dir = 2},/area/shuttle/derelict/ship/start)
+"ag" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/shuttle/derelict/ship/start)
+"ah" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"ai" = (/obj/machinery/sleep_console{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"aj" = (/obj/machinery/sleeper{dir = 8},/obj/machinery/light{dir = 1},/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"ak" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"; dir = 2},/area/shuttle/derelict/ship/start)
+"al" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/shuttle/derelict/ship/start)
+"am" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_r (WEST)"; icon_state = "burst_r"; dir = 8},/turf/space,/area/shuttle/derelict/ship/start)
+"an" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall11"; dir = 2},/area/shuttle/derelict/ship/start)
+"ao" = (/obj/machinery/computer/med_data,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"ap" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 6; pixel_y = -5},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"aq" = (/turf/simulated/shuttle/wall{tag = "icon-swall15"; icon_state = "swall15"; dir = 2},/area/shuttle/derelict/ship/start)
+"ar" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (EAST)"; icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/shuttle/derelict/ship/start)
+"as" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/shuttle/derelict/ship/start)
+"at" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (WEST)"; icon_state = "propulsion"; dir = 8},/turf/space,/area/shuttle/derelict/ship/start)
+"au" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/derelict/ship/start)
+"av" = (/obj/item/weapon/scalpel,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"aw" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"; dir = 2},/area/shuttle/derelict/ship/start)
+"ax" = (/turf/simulated/shuttle/plating,/area/shuttle/derelict/ship/start)
+"ay" = (/obj/structure/computerframe{anchored = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"az" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/shuttle/derelict/ship/start)
+"aA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/shuttle/derelict/ship/start)
+"aB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/shuttle/derelict/ship/start)
+"aC" = (/obj/machinery/door/airlock/glass{name = "Hibernation Pods"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"aD" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"aE" = (/obj/structure/table,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"aF" = (/obj/item/device/multitool,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"aG" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/shuttle/derelict/ship/start)
+"aH" = (/obj/item/weapon/stock_parts/cell{charge = 100; maxcharge = 15000},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"aI" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor/plating,/area/shuttle/derelict/ship/start)
+"aJ" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/shuttle/derelict/ship/start)
+"aK" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_l (WEST)"; icon_state = "burst_l"; dir = 8},/turf/space,/area/shuttle/derelict/ship/start)
+"aL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating,/area/shuttle/derelict/ship/start)
+"aM" = (/obj/structure/table,/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"aN" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/shuttle/derelict/ship/start)
+"aO" = (/obj/machinery/door/airlock/glass,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"aP" = (/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"aQ" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"aR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating,/area/shuttle/derelict/ship/start)
+"aS" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"aT" = (/obj/machinery/door/window,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
"aU" = (/obj/structure/lattice,/turf/space,/area)
-"aV" = (/obj/structure/table,/obj/item/weapon/gun/energy/laser/retro,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"aW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/derelict/ship)
-"aX" = (/obj/machinery/light/small{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"aY" = (/obj/structure/table,/obj/item/weapon/tank/oxygen,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"aZ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/derelict/ship)
-"ba" = (/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
+"aV" = (/obj/structure/table,/obj/item/weapon/gun/energy/laser/retro,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"aW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/shuttle/derelict/ship/start)
+"aX" = (/obj/structure/table,/obj/item/weapon/tank/oxygen,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"aY" = (/obj/machinery/light/small{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"aZ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/shuttle/derelict/ship/start)
+"ba" = (/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
"bb" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area)
"bc" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"; dir = 2},/area)
"bd" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area)
"be" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area)
-"bf" = (/obj/structure/table,/obj/item/device/analyzer,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"bg" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"bh" = (/obj/machinery/door/airlock/glass{name = "Living Module"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"bi" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
+"bf" = (/obj/structure/table,/obj/item/device/analyzer,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"bg" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"bh" = (/obj/machinery/door/airlock/glass{name = "Living Module"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"bi" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
"bj" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"; dir = 2},/area)
"bk" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area)
"bl" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area)
"bm" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area)
"bn" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall11"; dir = 2},/area)
-"bo" = (/obj/machinery/door/window/northright,/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"bp" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"bq" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
+"bo" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"bp" = (/obj/machinery/door/window/northright,/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"bq" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
"br" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area)
-"bs" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"; dir = 2},/area/derelict/ship)
-"bt" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area/derelict/ship)
+"bs" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"; dir = 2},/area/shuttle/derelict/ship/start)
+"bt" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area/shuttle/derelict/ship/start)
"bu" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area)
"bv" = (/obj/item/weapon/table_parts,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area)
"bw" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area)
-"bx" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating,/area/derelict/ship)
-"by" = (/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
+"bx" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating,/area/shuttle/derelict/ship/start)
+"by" = (/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
"bz" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area)
"bA" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"; dir = 2},/area)
"bB" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"; dir = 2},/area)
-"bC" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"bD" = (/obj/item/weapon/shard,/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"bE" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"bF" = (/obj/structure/cable,/obj/structure/computerframe{anchored = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"bG" = (/obj/structure/cable,/obj/structure/computerframe{anchored = 1},/obj/item/stack/cable_coil/cut,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"bH" = (/obj/structure/rack,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"bI" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig/medical,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/medical,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"bJ" = (/obj/structure/rack,/obj/item/clothing/suit/space/syndicate/black/med,/obj/item/clothing/head/helmet/space/syndicate/black/med,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"bK" = (/obj/machinery/power/apc{cell_type = 5000; dir = 8; environ = 0; equipment = 0; lighting = 0; locked = 0; name = "Worn-out APC"; pixel_x = -24; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"bL" = (/obj/machinery/light/small,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"bM" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/derelict/ship)
-"bN" = (/obj/machinery/door/poddoor{id = "oldship_gun"; name = "Pod Bay Door"},/turf/simulated/shuttle/plating,/area/derelict/ship)
-"bO" = (/obj/machinery/mass_driver{dir = 8; icon_state = "mass_driver"; id = "oldship_gun"},/turf/simulated/shuttle/plating,/area/derelict/ship)
-"bP" = (/obj/machinery/door/airlock/glass,/turf/simulated/shuttle/plating,/area/derelict/ship)
-"bQ" = (/obj/machinery/door/airlock/glass{name = "Pod Bay"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"bR" = (/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"bS" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/derelict/ship)
-"bT" = (/obj/machinery/computer/pod{id = "oldship_gun"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"bU" = (/obj/structure/table,/obj/item/weapon/screwdriver,/obj/machinery/light,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"bV" = (/obj/structure/table,/obj/item/device/radio,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
+"bC" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"bD" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"bE" = (/obj/item/weapon/shard,/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"bF" = (/obj/structure/cable,/obj/structure/computerframe{anchored = 1},/obj/item/stack/cable_coil/cut,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"bG" = (/obj/structure/cable,/obj/structure/computerframe{anchored = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"bH" = (/obj/structure/rack,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"bI" = (/obj/structure/rack,/obj/item/clothing/suit/space/syndicate/black/med,/obj/item/clothing/head/helmet/space/syndicate/black/med,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"bJ" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig/medical,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/medical,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"bK" = (/obj/machinery/power/apc{cell_type = 5000; dir = 8; environ = 0; equipment = 0; lighting = 0; locked = 0; name = "Worn-out APC"; pixel_x = -24; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"bL" = (/obj/machinery/light/small,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"bM" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/shuttle/derelict/ship/start)
+"bN" = (/obj/effect/decal/cleanable/blood{amount = 0},/turf/simulated/shuttle/plating,/area/shuttle/derelict/ship/start)
+"bO" = (/obj/machinery/mass_driver{dir = 8; icon_state = "mass_driver"; id = "oldship_gun"},/turf/simulated/shuttle/plating,/area/shuttle/derelict/ship/start)
+"bP" = (/obj/machinery/door/poddoor{id = "oldship_gun"; name = "Pod Bay Door"},/turf/simulated/shuttle/plating,/area/shuttle/derelict/ship/start)
+"bQ" = (/obj/machinery/door/airlock/glass,/turf/simulated/shuttle/plating,/area/shuttle/derelict/ship/start)
+"bR" = (/obj/machinery/door/airlock/glass{name = "Pod Bay"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"bS" = (/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"bT" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/derelict/ship/start)
+"bU" = (/obj/effect/decal/remains/human,/turf/simulated/shuttle/plating,/area/shuttle/derelict/ship/start)
+"bV" = (/obj/machinery/computer/pod{id = "oldship_gun"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
"bW" = (/obj/structure/lattice,/obj/structure/grille,/turf/space,/area)
"bX" = (/obj/machinery/power/solar/fake,/turf/simulated/floor{icon_state = "solarpanel"},/area)
"bY" = (/turf/simulated/floor/plating/airless,/area)
@@ -411,6 +411,8 @@
"hU" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating/airless,/area/AIsattele)
"hV" = (/obj/structure/lattice,/turf/space,/area/AIsattele)
"hW" = (/obj/structure/girder,/turf/simulated/floor/plating/airless,/area/AIsattele)
+"hX" = (/obj/structure/table,/obj/item/device/radio,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
+"hY" = (/obj/structure/table,/obj/item/weapon/screwdriver,/obj/machinery/light,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -465,27 +467,27 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadadaeafaaaaaaaaaaaaaaacafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadagahahaiajakalaeafaaaaaaaaacalamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacanaoahahahahahahapakaqafaaaaacarasataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaqalauahahahahavahahahawaqafacaraxasataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaqagayakadaeazaAaBadadaCalalalanaxaxasataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawagahaDahaEaFaGahaHahahahahahahaIaxaJadaKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFahahahahaEaFahahahahahahahahahawadaqafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLahahahahaMaFahahaNaOadadauahaPaFaQakalaeafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRahahahahahaFahahaFahaSaTaFahahaFahahahakaqafaaacaeadadadadadadadaeafaaaaaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRaVaEahahahaWahahaFaXaYaPaFahahaZahahahahakaqadaqagahahahbaahahahakanaUaaaabbbcbdbdbdbdbdbdbdbcbeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRbfbgahahahaOahahaFahahahaFahahbhahahahahahbiahbiahahahahahahahahahbiaUaaaUbjbkblblblblblblblbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRaEaEahahahaWahahaFbobpahaFahahaZahahahahaNaqadaqauahahahahahahbqaNanaUaUaUbrblblblblblblblblblbraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRahahahahahaFahahakadadaOagahahaFahahahaNaqbsaabtaladadadadadadadalbsaaaaaUbjbublblblblbvblblbwbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabxahahahahbyawauahahahahahahahahaFahahaealbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaabzbAbdbdbdbdbdbdbdbAbBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFbCbDbEahaNaqaladadaeauahahahahawadaqbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawaubFbGaNaqagbHbIbJakanbKahaHbLaIaxbMadamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtalaeadaqagahahahahahaFahahaNaeanaxaxasataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNbObPahahahahahahbQbRaNaqbsbtbSaxasataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtadanbTahahahahahawaeaqbsaaaabtbSasataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtaeauahbUbVaNaqalbsaaaaaaaabtaeaKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtaladadadalbsaaaaaaaaaaaaaabtbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadadafaeaaaaaaaaaaaaaaacaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadagahahajaialakafaeaaaaaaaaacakamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacanaoahahahahahahapalaqaeaaaaacasarataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaqakauahahahahavahahahawaqaeacasaxarataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaqagayaladafazaBaAadadaCakakakanaxaxarataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawagahaDahaEaGaFahaHahahahahahahaIaxaJadaKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGahahahahaEaGahahahahahahahahahawadaqaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLahahahahaMaGahahaNaOadadauahaPaGaQalakafaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRahahahahahaGahahaGahaSaTaGahahaGahahahalaqaeaaacafadadadadadadadafaeaaaaaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRaVayahahahaWahahaGaYaXaPaGahahaZahahahahalaqadaqagahahahbaahahahalanaUaaaabbbcbdbdbdbdbdbdbdbcbeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRbfbgahahahaOahahaGahahahaGahahbhahahahahahbiahbiahahahahahahahahahbiaUaaaUbjbkblblblblblblblbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRaEaEahahahaWahahaGbpboahaGahahaZahahahahaNaqadaqauahahahahahahbqaNanaUaUaUbrblblblblblblblblblbraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRahahahahahaGahahaladadaOagahahaGahahahaNaqbsaabtakadadadadadadadakbsaaaaaUbjbublblblblbvblblbwbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabxahahahahbyawauahahahahahahahahaGahahafakbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaabzbAbdbdbdbdbdbdbdbAbBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGbCbEbDahaNaqakadadafauahahahahawadaqbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawaubGbFaNaqagbHbJbIalanbKahaHbLaIaxbMadamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtakafadaqagahahahahahaGahahaNafanaxbNarataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPbObQahahahahahahbRbSaNaqbsbtbTbUarataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtadanbVahahahahahawafaqbsaaaabtbTarataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtafauahhYhXaNaqakbsaaaaaaaabtafaKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtakadadadakbsaaaaaaaaaaaaaabtbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -669,3 +671,4 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"}
+
diff --git a/_maps/map_files/cyberiad/z4.dmm b/_maps/map_files/cyberiad/z4.dmm
index 1b2ef6d17e0..1a8313f7337 100644
--- a/_maps/map_files/cyberiad/z4.dmm
+++ b/_maps/map_files/cyberiad/z4.dmm
@@ -224,7 +224,7 @@
"ep" = (/obj/machinery/light,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = -28},/turf/simulated/floor{icon_state = "wood"},/area/engiestation)
"eq" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk5"; icon_state = "catwalk5"},/area)
"er" = (/turf/simulated/floor/plating/airless,/obj/item/weapon/lighter/zippo,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk8"; icon_state = "catwalk8"},/area)
-"es" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; tag = "icon-shower (EAST)"},/obj/structure/curtain/open/shower,/turf/simulated/floor{dir = 2; icon_state = "cmo"},/area/engiestation)
+"es" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; tag = "icon-shower (EAST)"},/obj/structure/curtain/open/shower/engineering,/turf/simulated/floor{dir = 2; icon_state = "cmo"},/area/engiestation)
"et" = (/turf/simulated/floor{dir = 2; icon_state = "cmo"},/area/engiestation)
"eu" = (/obj/machinery/light,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = -28},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/engiestation)
"ev" = (/obj/structure/table/reinforced,/obj/item/weapon/lipstick/random,/obj/item/weapon/lipstick/random,/obj/item/weapon/storage/fancy/cigarettes/cigpack_carp,/obj/machinery/media/receiver/boombox,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/engiestation)
@@ -349,6 +349,7 @@
"gK" = (/obj/machinery/power/terminal{dir = 8},/turf/simulated/floor/plating/airless,/area/constructionsite/engineering)
"gL" = (/obj/machinery/power/terminal{dir = 4},/turf/simulated/floor/plating/airless,/area/constructionsite/engineering)
"gM" = (/obj/machinery/field_generator,/turf/simulated/floor/plating/airless,/area)
+"gN" = (/turf/space,/area/shuttle/derelict/ship/engipost)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -464,27 +465,27 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaveqaJaJer
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavavababavaSaSaSaSaSaSewboexeyboezeAeBaSeCaJaJaJbhavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaababaccwdgdhdidFabaaabaaabababdgefdgdidhdhdhdhdhdhdhdhdhdhdhdhdgefdgabababaaabaaabdFdhdidgaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaabdsdsdsaSaSboeDeEcQbybyeFaSaaaaaaabavavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaccwdgdhdhdFabaaabaaabaaabacaedgdgdgdgdhdhdhdhdhdhdhdgdgdgdgaeacabaaabaaabaaabdFdhdhdgaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababbobyeGboeHeIeJaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaababaccwdgdhdidFabababababababacaeaeaeaedgdgdgdhdhdhdgdgdgaeaeaeaeacabababababababdFdhdidgaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababboeKeLaSaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaababaccwdgdididFabaaabaaabaaabacaeaeaeaeaeaedgdhdhdhdgaeaeaeaeaeaeacabaaabaaabaaabdFdhdidgaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababboeMeNaSdsdsdsdsabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaccwdgdididFabaaabaaabaaabacacacacacacaedgdhdhdhdgaeacacacacacacabaaabaaabaaabdFdididgaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabboeOePbodsabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdgdgdididgdgabababababababababababacaeefdhdhdhefaeacabababababababababababdgdgdididgdgacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabboeQeRboabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdididididgdFdFdFdFdFdFdFdFdFdFdFdgdgdgdhdhdhdgdgdgdFdFdFdFdFdFdFdFdFdFdFdgdhdhdhdhdFababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababboeSeTboeUabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdididhdidididididididididhdhdhdidhdhdidhdhdhdidididhdhdhdhdidhdididhdhdhdidhdhdhdhdFababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeVeWeWeXeWeWeYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdidididididhdhdhdhdhdhdidhdhdhdhdididhdhdhdhdididhdhdidididhdhdhdhdhdhdhdhdhdhdhdhdFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZfafbfcfdfeffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdididididgdFdFdFdFdFdFdFdFdFdFdFdFdgdhdhdididhdgdFdFdFdFdFdFdFdFdFdFdFdFdgdhdhdhdhdFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZfafbfcfcfgfhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdgdgdgdgdgfififififjfifkfifkfifkfidgdhdhdhdhdidgflflfmfmfmfmfmfmfmfmflfldgdgdhdhdgdgabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZfafbfnfbfofpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababdgdtdtdgfqfqfqfififjfififififififidgdidididididgfmfmflflflfmfmfmfmfmflflfldgdhdhdFababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafreWeWeWeWeWfsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababdgdtdtdgfqfqfifqfqfjfjfjfjfjfjftftdgdgdgdgdgdgdgfmfmflflflfmfmfmfmfmflfmfldgdhdhdFababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababdgdtdtdgfqfqfqfqfqfjfififqfqfqfififidFdidididFflflfmfmfmfmfmfmfmflflflfmfldgdhdhdFababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdtdtdgfqfqfqfqfqfqfifqfqfqfqfifqfqdFdidididFflflfmfmfmfmfmfmfmflflflfmfldgdhdhdFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdtdtdgfufufufqfqfqfqfqfqfqfqfqfqfqdFdidididFflflfmfmfmfmfmfmfmfmfmfmfmfldgdididFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdtdtdgfufufufufufqfqfqfqfqfqfqfqfqdFdidididFflflflfmfmflflflflfmfmfmfmfldgdididFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdtdtdgfvfufvfufufqfufqfufqfufqfufqfwdididifxflfmfmfmfmfmfmfmfmfmfmfmfmfldgdididFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdtdtdgfufufqfufufufqfufqfqfqfqfqfqdFdidididFflfmfmfmfmfmfmfmfmfmfmfmfmfldgdtdtdFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdtdtdgfvfufvfufufqfufqfufqfufqfufqdFdidididFflfmfmfmfmfmfmfmflfmfmfmfmfldgdididFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdtdtdgfufufufufqfufqfufqfqfqfqfqfqdFdidididFflfmflflfmfmfmfmfmflfmflflfldgdtdtdFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdtdtdgfvfufvfufvfufufqfufqfufqfufqdFdhdhdhdFflflflflfmfmfmfmflflflflflfldgdididgabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdtdtdgfufufufufufufufufqfqfqfqdgdgdgdhdhdhdgdgdgflflfmfmfmfmflflflflflfldgdididFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadtdtdtfyfvfufvfufvfufvfvfvfufudgdgdhdhdhdhdhdhdhdgdgfmfmfmfmfmflflflfzfzfzdgdididFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababboeKeLaSaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNaaaaaaaaaaaaaagNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaababaccwdgdididFabaaabaaabaaabacaeaeaeaeaeaedgdhdhdhdgaeaeaeaeaeaeacabaaabaaabaaabdFdhdidgaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababboeMeNaSdsdsdsdsabaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNgNgNgNgNaaaaaaaagNgNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaccwdgdididFabaaabaaabaaabacacacacacacaedgdhdhdhdgaeacacacacacacabaaabaaabaaabdFdididgaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabboeOePbodsabababaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNgNgNgNgNgNgNaaaagNgNgNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdgdgdididgdgabababababababababababacaeefdhdhdhefaeacabababababababababababdgdgdididgdgacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabboeQeRboabaaaaaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdididididgdFdFdFdFdFdFdFdFdFdFdFdgdgdgdhdhdhdgdgdgdFdFdFdFdFdFdFdFdFdFdFdgdhdhdhdhdFababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababboeSeTboeUabaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdididhdidididididididididhdhdhdidhdhdidhdhdhdidididhdhdhdhdidhdididhdhdhdidhdhdhdhdFababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeVeWeWeXeWeWeYaaaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdidididididhdhdhdhdhdhdidhdhdhdhdididhdhdhdhdididhdhdidididhdhdhdhdhdhdhdhdhdhdhdhdFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZfafbfcfdfeffaaaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdididididgdFdFdFdFdFdFdFdFdFdFdFdFdgdhdhdididhdgdFdFdFdFdFdFdFdFdFdFdFdFdgdhdhdhdhdFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZfafbfcfcfgfhaaaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdgdgdgdgdgfififififjfifkfifkfifkfidgdhdhdhdhdidgflflfmfmfmfmfmfmfmfmflfldgdgdhdhdgdgabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZfafbfnfbfofpaaaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNaagNgNgNgNgNgNgNgNgNgNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababdgdtdtdgfqfqfqfififjfififififififidgdidididididgfmfmflflflfmfmfmfmfmflflfldgdhdhdFababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafreWeWeWeWeWfsaaaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababdgdtdtdgfqfqfifqfqfjfjfjfjfjfjftftdgdgdgdgdgdgdgfmfmflflflfmfmfmfmfmflfmfldgdhdhdFababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababdgdtdtdgfqfqfqfqfqfjfififqfqfqfififidFdidididFflflfmfmfmfmfmfmfmflflflfmfldgdhdhdFababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdtdtdgfqfqfqfqfqfqfifqfqfqfqfifqfqdFdidididFflflfmfmfmfmfmfmfmflflflfmfldgdhdhdFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNaagNgNgNgNgNgNgNgNgNgNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdtdtdgfufufufqfqfqfqfqfqfqfqfqfqfqdFdidididFflflfmfmfmfmfmfmfmfmfmfmfmfldgdididFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdtdtdgfufufufufufqfqfqfqfqfqfqfqfqdFdidididFflflflfmfmflflflflfmfmfmfmfldgdididFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdtdtdgfvfufvfufufqfufqfufqfufqfufqfwdididifxflfmfmfmfmfmfmfmfmfmfmfmfmfldgdididFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdtdtdgfufufqfufufufqfufqfqfqfqfqfqdFdidididFflfmfmfmfmfmfmfmfmfmfmfmfmfldgdtdtdFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdtdtdgfvfufvfufufqfufqfufqfufqfufqdFdidididFflfmfmfmfmfmfmfmflfmfmfmfmfldgdididFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdtdtdgfufufufufqfufqfufqfqfqfqfqfqdFdidididFflfmflflfmfmfmfmfmflfmflflfldgdtdtdFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNgNgNgNgNgNgNaaaagNgNgNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdtdtdgfvfufvfufvfufufqfufqfufqfufqdFdhdhdhdFflflflflfmfmfmfmflflflflflfldgdididgabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNgNgNgNaaaaaaaagNgNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdtdtdgfufufufufufufufufqfqfqfqdgdgdgdhdhdhdgdgdgflflfmfmfmfmflflflflflfldgdididFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNaaaaaaaaaaaaaagNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadtdtdtfyfvfufvfufvfufvfvfvfufudgdgdhdhdhdhdhdhdhdgdgfmfmfmfmfmflflflfzfzfzdgdididFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafydtdtdtfufufufufufufufufufufudgdhdhdhdhdhdhdhdhdhdgfmfmfmfmfmfmfAfBfCfDfEdgdididFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafydtdtfyfvfvfvfvfvfvfvfvfvfufudgdhdhdhdhdhdhdhdhdhdgfmfmfmflflflfFfAfGfHfIdgdididFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafyfyfyfyfvfvfqfvfvfqfqfqfqfqfqfJdhdhdhdhdhdhdhdhdhfxfmfmfmflflflflflfzfzfzdgdididFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -607,3 +608,4 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"}
+
diff --git a/_maps/map_files/cyberiad/z6.dmm b/_maps/map_files/cyberiad/z6.dmm
index e735047cb5a..bc8f4eb6e66 100644
--- a/_maps/map_files/cyberiad/z6.dmm
+++ b/_maps/map_files/cyberiad/z6.dmm
@@ -693,6 +693,7 @@
"nq" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_l (WEST)"; icon_state = "propulsion_l"; dir = 8},/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_l (WEST)"; icon_state = "propulsion_l"; dir = 8},/turf/space,/area)
"nr" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area)
"ns" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"; dir = 2},/area)
+"nt" = (/obj/item/weapon/circuitboard/white_ship,/turf/space,/area)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -788,7 +789,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaecYcYcYcYcYdSdSeJdvdvdreVeVeVeVeVdvdvdvfTdsdscYcYcYcYfEfFfwfwfwfUfwfwfwfwfwfwfwaeaeaaaaaaaaayaybLayayfSayfVaCaDbLaCeUayaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaecYcYcYdrfWfXdvdrdtdvdvdvdsdrdvdvfYfTdtdScYcYcYaeaefFfwfyfZfZfwfzgagbgbfwfwaeayaeaeaeayayfRbLayaDaCfRfSgcaDbLaCbLayaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaecYcYdtdsgddvdvdrgedrdsdtdDdFdDgegfdsdscYcYaaaafLggfwfyfZfyfyfzfzfzfwfwaaaaaaaeaaaaayaCaCbLayghghghghghghgigigiayaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadwdvdwaeaefXeteMdSdSdSgjdOdOdPdrdrdScYcYaafLggfGfwfzfzfzfygkfzfwfwfwaaaeaeayaaglgigigigigigigmgngogpgogqgrgiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaantaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadwdvdwaeaefXeteMdSdSdSgjdOdOdPdrdrdScYcYaafLggfGfwfzfzfzfygkfzfwfwfwaaaeaeayaaglgigigigigigigmgngogpgogqgrgiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagsgsgsgsgsgsgsgsgsgsgsgsgsgsgsgsaaaaaaaaaaaaaagtaadvdvguaeaedvgvdSdrdrftdSdSdrdsdtdSdScYcYaafFfZfGfwfwfwfzfwfwfwfwfwfwgwgwbLbLbLglgxgxgygygzgigmgmgmgogogrgrgiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagsgAgAgAgAgAgAgAgAgAgBgAgCgAgCgsgDgEgEgEgDgFgGgHgIgDgJaebtaedSdSdrdsdsdsdrdSdSdrdscYcYcYcYaafFfGfyfwfzfOfyfOfwfOfOgKfOayfRfRfRayfRgygxgzgzgygLgogogogogogrgrgiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagsgAgAgAgAgAgAgAgAgAgAgAgAgAgAgsgMgMgMgNgMgOgPgHgHgQaeaeaeaecYcYdSgRdtdrdScYcYcYcYcYcYaeaefZgSfGfyfzfzfyfZfOfOgKfOfZgTbLbLgUgUgVgUghghghghghghgogogWgogogogogiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -951,3 +952,4 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"}
+
diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm
index bded06b1947..e13a5627236 100644
--- a/code/ATMOSPHERICS/pipes.dm
+++ b/code/ATMOSPHERICS/pipes.dm
@@ -1092,7 +1092,7 @@
alpha = 255
overlays.Cut()
- overlays += icon_manager.get_atmos_icon("pipe", , pipe_color, "cap")
+ overlays += icon_manager.get_atmos_icon("pipe", , pipe_color, "cap" + icon_connect_type)
/obj/machinery/atmospherics/pipe/cap/initialize()
for(var/obj/machinery/atmospherics/target in get_step(src, dir))
@@ -1138,7 +1138,7 @@
/obj/machinery/atmospherics/pipe/cap/hidden/scrubbers
name = "scrubbers pipe endcap"
desc = "An endcap for scrubbers pipes"
- icon_state = "cap-f-scrubbers"
+ icon_state = "cap-scrubbers"
connect_types = list(3)
layer = 2.38
icon_connect_type = "-scrubbers"
@@ -1147,7 +1147,7 @@
/obj/machinery/atmospherics/pipe/cap/hidden/supply
name = "supply pipe endcap"
desc = "An endcap for supply pipes"
- icon_state = "cap-f-supply"
+ icon_state = "cap-supply"
connect_types = list(2)
layer = 2.39
icon_connect_type = "-supply"
diff --git a/code/__DEFINES/_readme.dm b/code/__DEFINES/_readme.dm
new file mode 100644
index 00000000000..42ad52286fe
--- /dev/null
+++ b/code/__DEFINES/_readme.dm
@@ -0,0 +1,14 @@
+/*
+ This folder is full of #define statements. They are similar to constants,
+ but must come before any code that references them, and they do not take up
+ memory the way constants do.
+
+ The values in this folder are NOT options. They are not for hosts to play with.
+ Some of the values are arbitrary and only need to be different from similar constants;
+ for example, the genetic mutation numbers in genetics.dm mean nothing, but MUST be distinct.
+
+ It is wise not to touch them unless you understand what they do, where they're used,
+ and most importantly,
+ how to undo your changes if you screw it up.
+ - Sayu
+*/
\ No newline at end of file
diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm
new file mode 100644
index 00000000000..1bcd5f5a3f4
--- /dev/null
+++ b/code/__DEFINES/admin.dm
@@ -0,0 +1,43 @@
+//A set of constants used to determine which type of mute an admin wishes to apply:
+//Please read and understand the muting/automuting stuff before changing these. MUTE_IC_AUTO etc = (MUTE_IC << 1)
+//Therefore there needs to be a gap between the flags for the automute flags
+#define MUTE_IC 1
+#define MUTE_OOC 2
+#define MUTE_PRAY 4
+#define MUTE_ADMINHELP 8
+#define MUTE_DEADCHAT 16
+#define MUTE_ALL 31
+
+//Number of identical messages required to get the spam-prevention automute thing to trigger warnings and automutes
+#define SPAM_TRIGGER_WARNING 5
+#define SPAM_TRIGGER_AUTOMUTE 10
+
+//Some constants for DB_Ban
+#define BANTYPE_PERMA 1
+#define BANTYPE_TEMP 2
+#define BANTYPE_JOB_PERMA 3
+#define BANTYPE_JOB_TEMP 4
+#define BANTYPE_ANY_FULLBAN 5 //used to locate stuff to unban.
+#define BANTYPE_APPEARANCE 6
+
+//Please don't edit these values without speaking to Errorage first ~Carn
+//Admin Permissions
+#define R_BUILDMODE 1
+#define R_ADMIN 2
+#define R_BAN 4
+#define R_EVENT 8
+#define R_SERVER 16
+#define R_DEBUG 32
+#define R_POSSESS 64
+#define R_PERMISSIONS 128
+#define R_STEALTH 256
+#define R_REJUVINATE 512
+#define R_VAREDIT 1024
+#define R_SOUNDS 2048
+#define R_SPAWN 4096
+#define R_MOD 8192
+#define R_MENTOR 16384
+
+#define R_MAXPERMISSION 16384 //This holds the maximum value for a permission. It is used in iteration, so keep it updated.
+
+#define R_HOST 65535
\ No newline at end of file
diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm
new file mode 100644
index 00000000000..6ed953516c2
--- /dev/null
+++ b/code/__DEFINES/atmospherics.dm
@@ -0,0 +1,137 @@
+#define FIRE_DAMAGE_MODIFIER 0.0215 //Higher values result in more external fire damage to the skin (default 0.0215)
+#define AIR_DAMAGE_MODIFIER 4.050 //More means less damage from hot air scalding lungs, less = more damage. (default 2.025)
+
+#define CELL_VOLUME 2500 //liters in a cell
+#define MOLES_CELLSTANDARD (ONE_ATMOSPHERE*CELL_VOLUME/(T20C*R_IDEAL_GAS_EQUATION)) //moles in a 2.5 m^3 cell at 101.325 Pa and 20 degC
+#define M_CELL_WITH_RATIO (MOLES_CELLSTANDARD * 0.005)
+#define O2STANDARD 0.21
+#define N2STANDARD 0.79
+#define MOLES_O2STANDARD MOLES_CELLSTANDARD*O2STANDARD // O2 standard value (21%)
+#define MOLES_N2STANDARD MOLES_CELLSTANDARD*N2STANDARD // N2 standard value (79%)
+
+#define GAS_O2 (1 << 0)
+#define GAS_N2 (1 << 1)
+#define GAS_PL (1 << 2)
+#define GAS_CO2 (1 << 3)
+#define GAS_N2O (1 << 4)
+
+#define MOLES_PLASMA_VISIBLE 0.7 //Moles in a standard cell after which plasma is visible
+#define MIN_PLASMA_DAMAGE 1
+#define MAX_PLASMA_DAMAGE 10
+
+#define BREATH_VOLUME 0.5 //liters in a normal breath
+#define BREATH_MOLES (ONE_ATMOSPHERE * BREATH_VOLUME /(T20C*R_IDEAL_GAS_EQUATION))
+#define BREATH_PERCENTAGE BREATH_VOLUME/CELL_VOLUME
+ //Amount of air to take a from a tile
+#define HUMAN_NEEDED_OXYGEN MOLES_CELLSTANDARD*BREATH_PERCENTAGE*0.16
+ //Amount of air needed before pass out/suffocation commences
+
+#define SOUND_MINIMUM_PRESSURE 10
+
+// Pressure limits.
+#define HAZARD_HIGH_PRESSURE 550 //This determins at what pressure the ultra-high pressure red icon is displayed. (This one is set as a constant)
+#define WARNING_HIGH_PRESSURE 325 //This determins when the orange pressure icon is displayed (it is 0.7 * HAZARD_HIGH_PRESSURE)
+#define WARNING_LOW_PRESSURE 50 //This is when the gray low pressure icon is displayed. (it is 2.5 * HAZARD_LOW_PRESSURE)
+#define HAZARD_LOW_PRESSURE 20 //This is when the black ultra-low pressure icon is displayed. (This one is set as a constant)
+
+#define TEMPERATURE_DAMAGE_COEFFICIENT 1.5 //This is used in handle_temperature_damage() for humans, and in reagents that affect body temperature. Temperature damage is multiplied by this amount.
+#define BODYTEMP_AUTORECOVERY_DIVISOR 12 //This is the divisor which handles how much of the temperature difference between the current body temperature and 310.15K (optimal temperature) humans auto-regenerate each tick. The higher the number, the slower the recovery. This is applied each tick, so long as the mob is alive.
+#define BODYTEMP_AUTORECOVERY_MINIMUM 10 //Minimum amount of kelvin moved toward 310.15K per tick. So long as abs(310.15 - bodytemp) is more than 50.
+#define BODYTEMP_COLD_DIVISOR 6 //Similar to the BODYTEMP_AUTORECOVERY_DIVISOR, but this is the divisor which is applied at the stage that follows autorecovery. This is the divisor which comes into play when the human's loc temperature is lower than their body temperature. Make it lower to lose bodytemp faster.
+#define BODYTEMP_HEAT_DIVISOR 6 //Similar to the BODYTEMP_AUTORECOVERY_DIVISOR, but this is the divisor which is applied at the stage that follows autorecovery. This is the divisor which comes into play when the human's loc temperature is higher than their body temperature. Make it lower to gain bodytemp faster.
+#define BODYTEMP_COOLING_MAX 30 //The maximum number of degrees that your body can cool in 1 tick, when in a cold area.
+#define BODYTEMP_HEATING_MAX 30 //The maximum number of degrees that your body can heat up in 1 tick, when in a hot area.
+
+#define BODYTEMP_HEAT_DAMAGE_LIMIT 360.15 // The limit the human body can take before it starts taking damage from heat.
+#define BODYTEMP_COLD_DAMAGE_LIMIT 260.15 // The limit the human body can take before it starts taking damage from coldness.
+
+#define SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE 2.0 //what min_cold_protection_temperature is set to for space-helmet quality headwear. MUST NOT BE 0.
+#define SPACE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE 1500
+#define SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE 2.0 //what min_cold_protection_temperature is set to for space-suit quality jumpsuits or suits. MUST NOT BE 0.
+#define SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE 1500 //These need better heat protect
+
+#define FIRESUIT_MIN_COLD_PROTECTION_TEMPERATURE 60
+#define FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE 30000 //what max_heat_protection_temperature is set to for firesuit quality headwear. MUST NOT BE 0.
+#define FIRE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE 60
+#define FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE 30000 //for fire helmet quality items (red and white hardhats)
+
+#define FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT 35000 //what max_heat_protection_temperature is set to for firesuit quality suits. MUST NOT BE 0.
+#define FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT 35000 //for fire helmet quality items (red and white hardhats)
+
+#define HELMET_MIN_COLD_PROTECTION_TEMPERATURE 160 //For normal helmets
+#define HELMET_MAX_HEAT_PROTECTION_TEMPERATURE 600 //For normal helmets
+#define ARMOR_MIN_COLD_PROTECTION_TEMPERATURE 160 //For armor
+#define ARMOR_MAX_HEAT_PROTECTION_TEMPERATURE 600 //For armor
+
+#define GLOVES_MIN_COLD_PROTECTION_TEMPERATURE 2.0 //For some gloves (black and)
+#define GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE 1500 //For some gloves
+#define SHOE_MIN_COLD_PROTECTION_TEMPERATURE 2.0 //For gloves
+#define SHOE_MAX_HEAT_PROTECTION_TEMPERATURE 1500 //For gloves
+
+
+#define PRESSURE_DAMAGE_COEFFICIENT 4 //The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, with the maximum of MAX_PRESSURE_DAMAGE
+#define MAX_HIGH_PRESSURE_DAMAGE 4 //This used to be 20... I got this much random rage for some retarded decision by polymorph?! Polymorph now lies in a pool of blood with a katana jammed in his spleen. ~Errorage --PS: The katana did less than 20 damage to him :(
+#define LOW_PRESSURE_DAMAGE 2 //The amounb of damage someone takes when in a low pressure area (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value).
+
+#define PRESSURE_SUIT_REDUCTION_COEFFICIENT 0.8 //This is how much (percentual) a suit with the flag STOPSPRESSUREDMAGE reduces pressure.
+#define PRESSURE_HEAD_REDUCTION_COEFFICIENT 0.4 //This is how much (percentual) a helmet/hat with the flag STOPSPRESSUREDMAGE reduces pressure.
+
+
+#define MINIMUM_AIR_RATIO_TO_SUSPEND 0.05
+ //Minimum ratio of air that must move to/from a tile to suspend group processing
+#define MINIMUM_AIR_TO_SUSPEND MOLES_CELLSTANDARD*MINIMUM_AIR_RATIO_TO_SUSPEND
+ //Minimum amount of air that has to move before a group processing can be suspended
+
+#define MINIMUM_MOLES_DELTA_TO_MOVE MOLES_CELLSTANDARD*MINIMUM_AIR_RATIO_TO_SUSPEND //Either this must be active
+#define MINIMUM_TEMPERATURE_TO_MOVE T20C+100 //or this (or both, obviously)
+
+#define MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND 0.012
+#define MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND 4
+ //Minimum temperature difference before group processing is suspended
+#define MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER 0.5
+ //Minimum temperature difference before the gas temperatures are just set to be equal
+
+#define MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION T20C+10
+#define MINIMUM_TEMPERATURE_START_SUPERCONDUCTION T20C+200
+
+#define FLOOR_HEAT_TRANSFER_COEFFICIENT 0.4
+#define WALL_HEAT_TRANSFER_COEFFICIENT 0.0
+#define DOOR_HEAT_TRANSFER_COEFFICIENT 0.0
+#define SPACE_HEAT_TRANSFER_COEFFICIENT 0.2 //a hack to partly simulate radiative heat
+#define OPEN_HEAT_TRANSFER_COEFFICIENT 0.4
+#define WINDOW_HEAT_TRANSFER_COEFFICIENT 0.1 //a hack for now
+ //Must be between 0 and 1. Values closer to 1 equalize temperature faster
+ //Should not exceed 0.4 else strange heat flow occur
+
+#define FIRE_MINIMUM_TEMPERATURE_TO_SPREAD 150+T0C
+#define FIRE_MINIMUM_TEMPERATURE_TO_EXIST 100+T0C
+#define FIRE_SPREAD_RADIOSITY_SCALE 0.85
+#define FIRE_CARBON_ENERGY_RELEASED 500000 //Amount of heat released per mole of burnt carbon into the tile
+#define FIRE_PLASMA_ENERGY_RELEASED 3000000 //Amount of heat released per mole of burnt plasma into the tile
+#define FIRE_GROWTH_RATE 40000 //For small fires
+
+//#define WATER_BOIL_TEMP 393
+
+// Fire Damage
+#define CARBON_LIFEFORM_FIRE_RESISTANCE 200+T0C
+#define CARBON_LIFEFORM_FIRE_DAMAGE 4
+
+//Plasma fire properties
+#define PLASMA_MINIMUM_BURN_TEMPERATURE 100+T0C
+#define PLASMA_FLASHPOINT 246+T0C
+#define PLASMA_UPPER_TEMPERATURE 1370+T0C
+#define PLASMA_MINIMUM_OXYGEN_NEEDED 2
+#define PLASMA_MINIMUM_OXYGEN_PLASMA_RATIO 20
+#define PLASMA_OXYGEN_FULLBURN 10
+
+#define NORMPIPERATE 30 //pipe-insulation rate divisor
+#define HEATPIPERATE 8 //heat-exch pipe insulation
+
+#define FLOWFRAC 0.99 // fraction of gas transfered per process
+
+#define TANK_LEAK_PRESSURE (30.*ONE_ATMOSPHERE) // Tank starts leaking
+#define TANK_RUPTURE_PRESSURE (40.*ONE_ATMOSPHERE) // Tank spills all contents into atmosphere
+
+#define TANK_FRAGMENT_PRESSURE (50.*ONE_ATMOSPHERE) // Boom 3x3 base explosion
+#define TANK_FRAGMENT_SCALE (10.*ONE_ATMOSPHERE) // +1 for each SCALE kPa aboe threshold
+ // was 2 atm
\ No newline at end of file
diff --git a/code/__DEFINES/clothing.dm b/code/__DEFINES/clothing.dm
new file mode 100644
index 00000000000..a9474044978
--- /dev/null
+++ b/code/__DEFINES/clothing.dm
@@ -0,0 +1,79 @@
+//Bit flags for the flags_inv variable, which determine when a piece of clothing hides another. IE a helmet hiding glasses.
+#define HIDEGLOVES 1 //APPLIES ONLY TO THE EXTERIOR SUIT!!
+#define HIDESUITSTORAGE 2 //APPLIES ONLY TO THE EXTERIOR SUIT!!
+#define HIDEJUMPSUIT 4 //APPLIES ONLY TO THE EXTERIOR SUIT!!
+#define HIDESHOES 8 //APPLIES ONLY TO THE EXTERIOR SUIT!!
+#define HIDETAIL 16 //APPLIES ONLY TO THE EXTERIOR SUIT!!
+#define HIDEMASK 1 //APPLIES ONLY TO HELMETS/MASKS!!
+#define HIDEEARS 2 //APPLIES ONLY TO HELMETS/MASKS!! (ears means headsets and such)
+#define HIDEEYES 4 //APPLIES ONLY TO HELMETS/MASKS!! (eyes means glasses)
+#define HIDEFACE 8 //APPLIES ONLY TO HELMETS/MASKS!! Dictates whether we appear as unknown.
+
+//slots
+#define slot_back 1
+#define slot_wear_mask 2
+#define slot_handcuffed 3
+#define slot_l_hand 4
+#define slot_r_hand 5
+#define slot_belt 6
+#define slot_wear_id 7
+#define slot_l_ear 8
+#define slot_glasses 9
+#define slot_gloves 10
+#define slot_head 11
+#define slot_shoes 12
+#define slot_wear_suit 13
+#define slot_w_uniform 14
+#define slot_l_store 15
+#define slot_r_store 16
+#define slot_s_store 17
+#define slot_in_backpack 18
+#define slot_legcuffed 19
+#define slot_r_ear 20
+#define slot_wear_pda 21
+#define slot_tie 22
+
+//Cant seem to find a mob bitflags area other than the powers one
+
+// bitflags for clothing parts
+#define HEAD 1
+#define UPPER_TORSO 2
+#define LOWER_TORSO 4
+#define LEG_LEFT 8
+#define LEG_RIGHT 16
+#define LEGS 24
+#define FOOT_LEFT 32
+#define FOOT_RIGHT 64
+#define FEET 96
+#define ARM_LEFT 128
+#define ARM_RIGHT 256
+#define ARMS 384
+#define HAND_LEFT 512
+#define HAND_RIGHT 1024
+#define HANDS 1536
+#define FULL_BODY 2047
+
+// bitflags for the percentual amount of protection a piece of clothing which covers the body part offers.
+// Used with human/proc/get_heat_protection() and human/proc/get_cold_protection()
+// The values here should add up to 1.
+// Hands and feet have 2.5%, arms and legs 7.5%, each of the torso parts has 15% and the head has 30%
+#define THERMAL_PROTECTION_HEAD 0.3
+#define THERMAL_PROTECTION_UPPER_TORSO 0.15
+#define THERMAL_PROTECTION_LOWER_TORSO 0.15
+#define THERMAL_PROTECTION_LEG_LEFT 0.075
+#define THERMAL_PROTECTION_LEG_RIGHT 0.075
+#define THERMAL_PROTECTION_FOOT_LEFT 0.025
+#define THERMAL_PROTECTION_FOOT_RIGHT 0.025
+#define THERMAL_PROTECTION_ARM_LEFT 0.075
+#define THERMAL_PROTECTION_ARM_RIGHT 0.075
+#define THERMAL_PROTECTION_HAND_LEFT 0.025
+#define THERMAL_PROTECTION_HAND_RIGHT 0.025
+
+// Suit sensor levels
+#define SUIT_SENSOR_OFF 0
+#define SUIT_SENSOR_BINARY 1
+#define SUIT_SENSOR_VITAL 2
+#define SUIT_SENSOR_TRACKING 3
+
+#define BLOCKHEADHAIR 4 // temporarily removes the user's hair overlay. Leaves facial hair.
+#define BLOCKHAIR 32768 // temporarily removes the user's hair, facial and otherwise.
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
new file mode 100644
index 00000000000..34e1f4279b8
--- /dev/null
+++ b/code/__DEFINES/combat.dm
@@ -0,0 +1,57 @@
+//Damage things //TODO: merge these down to reduce on defines
+//Way to waste perfectly good damagetype names (BRUTE) on this... If you were really worried about case sensitivity, you could have just used lowertext(damagetype) in the proc...
+#define CUT "cut"
+#define BRUISE "bruise"
+#define BRUTE "brute"
+#define BURN "fire"
+#define TOX "tox"
+#define OXY "oxy"
+#define CLONE "clone"
+#define HALLOSS "halloss"
+#define STAMINA "stamina"
+
+#define STUN "stun"
+#define WEAKEN "weaken"
+#define PARALYZE "paralize"
+#define IRRADIATE "irradiate"
+#define AGONY "agony" // Added in PAIN!
+#define STUTTER "stutter"
+#define SLUR "slur"
+#define EYE_BLUR "eye_blur"
+#define DROWSY "drowsy"
+#define JITTER "jitter"
+
+//I hate adding defines like this but I'd much rather deal with bitflags than lists and string searches
+#define BRUTELOSS 1
+#define FIRELOSS 2
+#define TOXLOSS 4
+#define OXYLOSS 8
+
+//Bitflags defining which status effects could be or are inflicted on a mob
+#define CANSTUN 1
+#define CANWEAKEN 2
+#define CANPARALYSE 4
+#define CANPUSH 8
+#define LEAPING 16
+#define PASSEMOTES 32 //Mob has a cortical borer or holders inside of it that need to see emotes.
+#define GOTTAGOFAST 64
+#define GOTTAGOREALLYFAST 128
+#define IGNORESLOWDOWN 256
+#define GODMODE 4096
+#define FAKEDEATH 8192 //Replaces stuff like changeling.changeling_fakedeath
+#define DISFIGURED 16384 //I'll probably move this elsewhere if I ever get wround to writing a bitflag mob-damage system
+#define XENO_HOST 32768 //Tracks whether we're gonna be a baby alien's mummy.
+
+
+//Grab levels
+#define GRAB_PASSIVE 1
+#define GRAB_AGGRESSIVE 2
+#define GRAB_NECK 3
+#define GRAB_UPGRADING 4
+#define GRAB_KILL 5
+
+#define HOSTILE_STANCE_IDLE 1
+#define HOSTILE_STANCE_ALERT 2
+#define HOSTILE_STANCE_ATTACK 3
+#define HOSTILE_STANCE_ATTACKING 4
+#define HOSTILE_STANCE_TIRED 5
\ No newline at end of file
diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
new file mode 100644
index 00000000000..a54cef72f86
--- /dev/null
+++ b/code/__DEFINES/flags.dm
@@ -0,0 +1,97 @@
+//FLAGS BITMASK
+#define STOPSPRESSUREDMAGE 1 //This flag is used on the flags variable for SUIT and HEAD items which stop pressure damage. Note that the flag 1 was previous used as ONBACK, so it is possible for some code to use (flags & 1) when checking if something can be put on your back. Replace this code with (inv_flags & SLOT_BACK) if you see it anywhere To successfully stop you taking all pressure damage you must have both a suit and head item with this flag.
+#define NODROP 2 // This flag makes it so that an item literally cannot be removed at all, or at least that's how it should be. Only deleted.
+#define NOBLUDGEON 4 // when an item has this it produces no "X has been hit by Y with Z" message with the default handler
+#define MASKINTERNALS 8 // mask allows internals
+//#define USEDELAY 16 // 1 second extra delay on use (Can be used once every 2s)
+#define NOSHIELD 32 // weapon not affected by shield
+#define CONDUCT 64 // conducts electricity (metal etc.)
+#define ABSTRACT 128 // for all things that are technically items but used for various different stuff, made it 128 because it could conflict with other flags other way
+#define ON_BORDER 512 // item has priority to check when entering or leaving
+#define NODELAY 32768 // 1 second attackby delay skipped (Can be used once every 0.2s). Most objects have a 1s attackby delay, which doesn't require a flag.
+
+#define NOBLOODY 2048 // used to items if they don't want to get a blood overlay
+
+#define GLASSESCOVERSEYES 1024
+#define MASKCOVERSEYES 1024 // get rid of some of the other retardation in these flags
+#define HEADCOVERSEYES 1024 // feel free to realloc these numbers for other purposes
+#define MASKCOVERSMOUTH 2048 // on other items, these are just for mask/head
+#define HEADCOVERSMOUTH 2048
+
+#define HEADBANGPROTECT 4096
+#define EARBANGPROTECT 1024
+
+#define THICKMATERIAL 1024 //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. (NOTE: flag shared with NOSLIP)
+#define NOSLIP 1024 //prevents from slipping on wet floors, in space etc
+
+#define OPENCONTAINER 4096 // is an open container for chemistry purposes
+
+#define BLOCK_GAS_SMOKE_EFFECT 8192 // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY! (NOTE: flag shared with ONESIZEFITSALL)
+#define ONESIZEFITSALL 8192
+#define PLASMAGUARD 16384 //Does not get contaminated by plasma.
+
+#define NOREACT 16384 //Reagents dont' react inside this container.
+
+//Species flags.
+
+#define NO_BLOOD 1
+#define NO_BREATHE 2
+#define RAD_ABSORB 8
+#define NO_SCAN 16
+#define NO_PAIN 32
+#define REQUIRE_LIGHT 64
+#define IS_WHITELISTED 128
+#define HAS_LIPS 512
+#define HAS_UNDERWEAR 1024
+#define IS_SYNTHETIC 2048
+#define IS_PLANT 4096
+#define CAN_BE_FAT 8192
+#define IS_RESTRICTED 16384
+#define NO_INTORGANS 32768
+
+//Species Blood Flags
+#define BLOOD_SLIME 1
+//Species Body Flags
+#define FEET_CLAWS 1
+#define FEET_PADDED 2
+#define FEET_NOSLIP 4
+#define HAS_TAIL 8
+#define HAS_SKIN_TONE 16
+#define HAS_SKIN_COLOR 32
+#define TAIL_WAGGING 64
+
+
+//bitflags for door switches.
+#define OPEN 1
+#define IDSCAN 2
+#define BOLTS 4
+#define SHOCK 8
+#define SAFE 16
+
+//flags for pass_flags
+#define PASSTABLE 1
+#define PASSGLASS 2
+#define PASSGRILLE 4
+#define PASSBLOB 8
+#define PASSMOB 16
+
+//turf-only flags
+#define NOJAUNT 1
+
+//ITEM INVENTORY SLOT BITMASKS
+#define SLOT_OCLOTHING 1
+#define SLOT_ICLOTHING 2
+#define SLOT_GLOVES 4
+#define SLOT_EYES 8
+#define SLOT_EARS 16
+#define SLOT_MASK 32
+#define SLOT_HEAD 64
+#define SLOT_FEET 128
+#define SLOT_ID 256
+#define SLOT_BELT 512
+#define SLOT_BACK 1024
+#define SLOT_POCKET 2048 //this is to allow items with a w_class of 3 or 4 to fit in pockets.
+#define SLOT_DENYPOCKET 4096 //this is to deny items with a w_class of 2 or 1 to fit in pockets.
+#define SLOT_TWOEARS 8192
+#define SLOT_PDA 16384
+#define SLOT_TIE 32768
\ No newline at end of file
diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm
new file mode 100644
index 00000000000..4b8f65601af
--- /dev/null
+++ b/code/__DEFINES/genetics.dm
@@ -0,0 +1,96 @@
+// String identifiers for associative list lookup
+
+// mob/var/list/mutations
+
+// Used in preferences.
+#define DISABILITY_FLAG_NEARSIGHTED 1
+#define DISABILITY_FLAG_FAT 2
+#define DISABILITY_FLAG_EPILEPTIC 4
+#define DISABILITY_FLAG_DEAF 8
+
+///////////////////////////////////////
+// MUTATIONS
+///////////////////////////////////////
+
+// Generic mutations:
+#define TK 1
+#define RESIST_COLD 2
+#define XRAY 3
+#define HULK 4
+#define CLUMSY 5
+#define FAT 6
+#define HUSK 7
+#define NOCLONE 8
+
+
+// Extra powers:
+#define LASER 9 // harm intent - click anywhere to shoot lasers from eyes
+//#define HEAL 10 // (Not implemented) healing people with hands
+//#define SHADOW 11 // (Not implemented) shadow teleportation (create in/out portals anywhere) (25%)
+//#define SCREAM 12 // (Not implemented) supersonic screaming (25%)
+//#define EXPLOSIVE 13 // (Not implemented) exploding on-demand (15%)
+//#define REGENERATION 14 // (Not implemented) superhuman regeneration (30%)
+//#define REPROCESSOR 15 // (Not implemented) eat anything (50%)
+//#define SHAPESHIFTING 16 // (Not implemented) take on the appearance of anything (40%)
+//#define PHASING 17 // (Not implemented) ability to phase through walls (40%)
+//#define SHIELD 18 // (Not implemented) shielding from all projectile attacks (30%)
+//#define SHOCKWAVE 19 // (Not implemented) attack a nearby tile and cause a massive shockwave, knocking most people on their asses (25%)
+//#define ELECTRICITY 20 // (Not implemented) ability to shoot electric attacks (15%)
+
+//bitflags for mutations
+ // Extra powers:
+#define SHADOW (1<<10) // shadow teleportation (create in/out portals anywhere) (25%)
+#define SCREAM (1<<11) // supersonic screaming (25%)
+#define EXPLOSIVE (1<<12) // exploding on-demand (15%)
+#define REGENERATION (1<<13) // superhuman regeneration (30%)
+#define REPROCESSOR (1<<14) // eat anything (50%)
+#define SHAPESHIFTING (1<<15) // take on the appearance of anything (40%)
+#define PHASING (1<<16) // ability to phase through walls (40%)
+#define SHIELD (1<<17) // shielding from all projectile attacks (30%)
+#define SHOCKWAVE (1<<18) // attack a nearby tile and cause a massive shockwave, knocking most people on their asses (25%)
+#define ELECTRICITY (1<<19) // ability to shoot electric attacks (15%)
+
+
+ //2spooky
+#define SKELETON 29
+#define PLANT 30
+
+// Other Mutations:
+#define NO_BREATH 100 // no need to breathe
+#define REMOTE_VIEW 101 // remote viewing
+#define REGEN 102 // health regen
+#define RUN 103 // no slowdown
+#define REMOTE_TALK 104 // remote talking
+#define MORPH 105 // changing appearance
+#define RESIST_HEAT 106 // heat resistance
+#define HALLUCINATE 107 // hallucinations
+#define FINGERPRINTS 108 // no fingerprints
+#define NO_SHOCK 109 // insulated hands
+#define DWARF 110 // table climbing
+
+// Goon muts
+#define OBESITY 200 // Decreased metabolism
+#define TOXIC_FARTS 201 // Duh
+#define STRONG 202 // (Nothing)
+#define SOBER 203 // Increased alcohol metabolism
+#define PSY_RESIST 204 // Block remoteview
+#define SUPER_FART 205 // Duh
+#define EMPATH 206 //Read minds
+#define COMIC 207 //Comic Sans
+
+// /vg/ muts
+#define LOUD 208 // CAUSES INTENSE YELLING
+//#define WHISPER 209 // causes quiet whispering
+#define DIZZY 210 // Trippy.
+
+//disabilities
+#define NEARSIGHTED 1
+#define EPILEPSY 2
+#define COUGHING 4
+#define TOURETTES 8
+#define NERVOUS 16
+
+//sdisabilities
+#define BLIND 1
+#define MUTE 2
+#define DEAF 4
\ No newline at end of file
diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm
new file mode 100644
index 00000000000..3e3e219792b
--- /dev/null
+++ b/code/__DEFINES/hud.dm
@@ -0,0 +1,11 @@
+// for secHUDs and medHUDs and variants. The number is the location of the image on the list hud_list of humans.
+#define HEALTH_HUD 1 // a simple line rounding the mob's number health
+#define STATUS_HUD 2 // alive, dead, diseased, etc.
+#define ID_HUD 3 // the job asigned to your ID
+#define WANTED_HUD 4 // wanted, released, parroled, security status
+#define IMPLOYAL_HUD 5 // loyality implant
+#define IMPCHEM_HUD 6 // chemical implant
+#define IMPTRACK_HUD 7 // tracking implant
+#define SPECIALROLE_HUD 8 // AntagHUD image
+#define STATUS_HUD_OOC 9 // STATUS_HUD without virus db check for someone being ill.
+#define NATIONS_HUD 10 //Show nations icons during nations gamemode
diff --git a/code/__DEFINES/language.dm b/code/__DEFINES/language.dm
new file mode 100644
index 00000000000..fd467e7a054
--- /dev/null
+++ b/code/__DEFINES/language.dm
@@ -0,0 +1,19 @@
+//Languages!
+#define LANGUAGE_HUMAN 1
+#define LANGUAGE_ALIEN 2
+#define LANGUAGE_DOG 4
+#define LANGUAGE_CAT 8
+#define LANGUAGE_BINARY 16
+#define LANGUAGE_OTHER 32768
+
+#define LANGUAGE_UNIVERSAL 65535
+
+//Language flags.
+#define WHITELISTED 1 // Language is available if the speaker is whitelisted.
+#define RESTRICTED 2 // Language can only be accquired by spawning or an admin.
+#define NONVERBAL 4 // Language has a significant non-verbal component. Speech is garbled without line-of-sight
+#define SIGNLANG 8 // Language is completely non-verbal. Speech is displayed through emotes for those who can understand.
+#define HIVEMIND 16 // Broadcast to all mobs with this language.
+#define NONGLOBAL 32 // Do not add to general languages list
+#define INNATE 64 // All mobs can be assumed to speak and understand this language (audible emotes)
+#define NO_TALK_MSG 128 // Do not show the "\The [speaker] talks into \the [radio]" message
diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm
new file mode 100644
index 00000000000..5282720932b
--- /dev/null
+++ b/code/__DEFINES/machines.dm
@@ -0,0 +1,27 @@
+// channel numbers for power
+#define EQUIP 1
+#define LIGHT 2
+#define ENVIRON 3
+#define TOTAL 4 //for total power used only
+
+//computer3 error codes, move lower in the file when it passes dev -Sayu
+ #define PROG_CRASH 1 // Generic crash
+ #define MISSING_PERIPHERAL 2 // Missing hardware
+ #define BUSTED_ASS_COMPUTER 4 // Self-perpetuating error. BAC will continue to crash forever.
+ #define MISSING_PROGRAM 8 // Some files try to automatically launch a program. This is that failing.
+ #define FILE_DRM 16 // Some files want to not be copied/moved. This is them complaining that you tried.
+ #define NETWORK_FAILURE 32
+
+#define MINERAL_MATERIAL_AMOUNT 2000 //The amount of materials you get from a sheet of mineral like iron/diamond/glass etc
+
+#define IMPRINTER 1 //For circuits. Uses glass/chemicals.
+#define PROTOLATHE 2 //New stuff. Uses glass/metal/chemicals
+#define AUTOLATHE 4 //Uses glass/metal only.
+#define CRAFTLATHE 8 //Uses fuck if I know. For use eventually.
+#define MECHFAB 16 //Remember, objects utilising this flag should have construction_time and construction_cost vars.
+#define PODFAB 32 //Used by the spacepod part fabricator. Same idea as the mechfab
+//Note: More then one of these can be added to a design but imprinter and lathe designs are incompatable.
+
+#define HYDRO_SPEED_MULTIPLIER 1
+
+#define NANO_IGNORE_DISTANCE 1
\ No newline at end of file
diff --git a/code/__DEFINES/math.dm b/code/__DEFINES/math.dm
new file mode 100644
index 00000000000..dc361b61c97
--- /dev/null
+++ b/code/__DEFINES/math.dm
@@ -0,0 +1,13 @@
+#define PI 3.1415
+#define SPEED_OF_LIGHT 3e8 //not exact but hey!
+#define SPEED_OF_LIGHT_SQ 9e+16
+#define INFINITY 1e31 //closer then enough
+
+//atmos
+#define R_IDEAL_GAS_EQUATION 8.31 //kPa*L/(K*mol)
+#define ONE_ATMOSPHERE 101.325 //kPa
+#define T0C 273.15 // 0degC
+#define T20C 293.15 // 20degC
+#define TCMB 2.7 // -270.3degC
+
+#define CLAMP01(x) max(0, min(1, x))
\ No newline at end of file
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
new file mode 100644
index 00000000000..bb6a0aad684
--- /dev/null
+++ b/code/__DEFINES/misc.dm
@@ -0,0 +1,84 @@
+
+
+
+//zlevel defines, can be overriden for different maps in the appropriate _maps file.
+#define ZLEVEL_STATION 1
+#define ZLEVEL_CENTCOMM 2
+#define ZLEVEL_TELECOMMS 3
+#define ZLEVEL_ENGI 4
+#define ZLEVEL_ASTEROID 5
+#define ZLEVEL_DERELICT 6
+#define ZLEVEL_SYNDIE 7
+#define ZLEVEL_EMPTY 8
+#define MAX_Z 8 // Used in space.dm to defince which Z-levels cannot be exited via space.
+#define TRANSITIONEDGE 7 //Distance from edge to move to another z-level
+
+///
+#define ENGINE_EJECT_Z 3
+
+//Object specific defines
+#define CANDLE_LUM 3 //For how bright candles are
+
+//Security levels
+#define SEC_LEVEL_GREEN 0
+#define SEC_LEVEL_BLUE 1
+#define SEC_LEVEL_RED 2
+#define SEC_LEVEL_GAMMA 3
+#define SEC_LEVEL_EPSILON 4
+#define SEC_LEVEL_DELTA 5
+
+//Click cooldowns, in tenths of a second
+#define CLICK_CD_MELEE 8
+#define CLICK_CD_RANGE 4
+#define CLICK_CD_BREAKOUT 100
+#define CLICK_CD_HANDCUFFED 10
+#define CLICK_CD_TKSTRANGLE 10
+#define CLICK_CD_POINT 10
+#define CLICK_CD_RESIST 20
+
+///
+#define ROUNDSTART_LOGOUT_REPORT_TIME 6000 //Amount of time (in deciseconds) after the rounds starts, that the player disconnect report is issued.
+
+// DOOR CRUSHING DAMAGE!
+#define DOOR_CRUSH_DAMAGE 10
+
+////////////GERMS AND INFECTIONS////////////
+#define GERM_LEVEL_AMBIENT 110 //maximum germ level you can reach by standing still
+#define GERM_LEVEL_MOVE_CAP 200 //maximum germ level you can reach by running around
+
+#define INFECTION_LEVEL_ONE 100
+#define INFECTION_LEVEL_TWO 500
+#define INFECTION_LEVEL_THREE 1000
+
+//metal, glass, rod stacks
+#define MAX_STACK_AMOUNT_METAL 50
+#define MAX_STACK_AMOUNT_GLASS 50
+#define MAX_STACK_AMOUNT_RODS 60
+
+#define CC_PER_SHEET_METAL 3750
+#define CC_PER_SHEET_GLASS 3750
+#define CC_PER_SHEET_MISC 2000
+
+//some colors
+#define COLOR_RED "#FF0000"
+#define COLOR_GREEN "#00FF00"
+#define COLOR_BLUE "#0000FF"
+#define COLOR_CYAN "#00FFFF"
+#define COLOR_PINK "#FF00FF"
+#define COLOR_YELLOW "#FFFF00"
+#define COLOR_ORANGE "#FF9900"
+#define COLOR_WHITE "#FFFFFF"
+
+//some arbitrary defines to be used by self-pruning global lists. (see master_controller)
+#define PROCESS_KILL 26 //Used to trigger removal from a processing list
+
+//Flags for zone sleeping
+#define ZONE_ACTIVE 1
+#define ZONE_SLEEPING 0
+
+#define shuttle_time_in_station 1800 // 3 minutes in the station
+#define shuttle_time_to_arrive 6000 // 10 minutes to arrive
+
+#define EVENT_LEVEL_MUNDANE 1
+#define EVENT_LEVEL_MODERATE 2
+#define EVENT_LEVEL_MAJOR 3
\ No newline at end of file
diff --git a/code/__DEFINES/mob.dm b/code/__DEFINES/mob.dm
new file mode 100644
index 00000000000..75a11f33acc
--- /dev/null
+++ b/code/__DEFINES/mob.dm
@@ -0,0 +1,77 @@
+// Vampire power defines
+#define VAMP_REJUV 1
+#define VAMP_GLARE 2
+#define VAMP_HYPNO 3
+#define VAMP_SHAPE 4
+#define VAMP_VISION 5
+#define VAMP_DISEASE 6
+#define VAMP_CLOAK 7
+#define VAMP_BATS 8
+#define VAMP_SCREAM 9
+#define VAMP_JAUNT 10
+#define VAMP_SLAVE 11
+#define VAMP_BLINK 12
+#define VAMP_FULL 13
+///////////////////ORGAN DEFINES///////////////////
+
+// Organ defines.
+#define ORGAN_CUT_AWAY 1
+#define ORGAN_GAUZED 2
+#define ORGAN_ATTACHABLE 4
+#define ORGAN_BLEEDING 8
+#define ORGAN_BROKEN 32
+#define ORGAN_DESTROYED 64
+#define ORGAN_ROBOT 128
+#define ORGAN_SPLINTED 256
+#define SALVED 512
+#define ORGAN_DEAD 1024
+#define ORGAN_MUTATED 2048
+#define ORGAN_ASSISTED 4096
+
+#define DROPLIMB_EDGE 0
+#define DROPLIMB_BLUNT 1
+#define DROPLIMB_BURN 2
+
+#define AGE_MIN 17 //youngest a character can be
+#define AGE_MAX 85 //oldest a character can be
+
+
+#define LEFT 1
+#define RIGHT 2
+
+
+//Pulse levels, very simplified
+#define PULSE_NONE 0 //so !M.pulse checks would be possible
+#define PULSE_SLOW 1 //<60 bpm
+#define PULSE_NORM 2 //60-90 bpm
+#define PULSE_FAST 3 //90-120 bpm
+#define PULSE_2FAST 4 //>120 bpm
+#define PULSE_THREADY 5 //occurs during hypovolemic shock
+//feel free to add shit to lists below
+
+
+//proc/get_pulse methods
+#define GETPULSE_HAND 0 //less accurate (hand)
+#define GETPULSE_TOOL 1 //more accurate (med scanner, sleeper, etc)
+
+//Some on_mob_life() procs check for alien races.
+#define IS_DIONA 1
+#define IS_VOX 2
+#define IS_SKRELL 3
+#define IS_UNATHI 4
+
+#define HUMAN_STRIP_DELAY 40 //takes 40ds = 4s to strip someone.
+#define ALIEN_SELECT_AFK_BUFFER 1 // How many minutes that a person can be AFK before not being allowed to be an alien.
+#define SHOES_SLOWDOWN -1.0 // How much shoes slow you down by default. Negative values speed you up
+
+
+////////REAGENT STUFF////////
+// How many units of reagent are consumed per tick, by default.
+#define REAGENTS_METABOLISM 0.4
+
+// By defining the effect multiplier this way, it'll exactly adjust
+// all effects according to how they originally were with the 0.4 metabolism
+#define REAGENTS_EFFECT_MULTIPLIER REAGENTS_METABOLISM / 0.4
+
+// Factor of how fast mob nutrition decreases
+#define HUNGER_FACTOR 0.1
\ No newline at end of file
diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm
new file mode 100644
index 00000000000..affe84a0156
--- /dev/null
+++ b/code/__DEFINES/preferences.dm
@@ -0,0 +1,40 @@
+//Preference toggles
+#define SOUND_ADMINHELP 1
+#define SOUND_MIDI 2
+#define SOUND_AMBIENCE 4
+#define SOUND_LOBBY 8
+#define SOUND_STREAMING 16
+#define SOUND_HEARTBEAT 32
+#define SOUND_BUZZ 64
+
+#define SOUND_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|SOUND_STREAMING|SOUND_HEARTBEAT|SOUND_BUZZ)
+
+#define CHAT_OOC 1
+#define CHAT_DEAD 2
+#define CHAT_GHOSTEARS 4
+#define CHAT_GHOSTSIGHT 8
+#define CHAT_PRAYER 16
+#define CHAT_RADIO 32
+#define CHAT_ATTACKLOGS 64
+#define CHAT_DEBUGLOGS 128
+#define CHAT_LOOC 256
+#define CHAT_GHOSTRADIO 512
+#define SHOW_TYPING 1024
+
+#define TOGGLES_DEFAULT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_ATTACKLOGS|CHAT_LOOC)
+
+#define BE_TRAITOR 1
+#define BE_OPERATIVE 2
+#define BE_CHANGELING 4
+#define BE_WIZARD 8
+#define BE_MALF 16
+#define BE_REV 32
+#define BE_ALIEN 64
+#define BE_PAI 128
+#define BE_CULTIST 256
+#define BE_NINJA 512
+#define BE_RAIDER 1024
+#define BE_VAMPIRE 2048
+#define BE_MUTINEER 4096
+#define BE_BLOB 8192
+#define BE_SHADOWLING 16384
\ No newline at end of file
diff --git a/code/__DEFINES/sight.dm b/code/__DEFINES/sight.dm
new file mode 100644
index 00000000000..677d33ecddc
--- /dev/null
+++ b/code/__DEFINES/sight.dm
@@ -0,0 +1,31 @@
+#define SEE_INVISIBLE_MINIMUM 5
+
+#define SEE_INVISIBLE_OBSERVER_NOLIGHTING 15
+
+#define INVISIBILITY_LIGHTING 20
+
+#define SEE_INVISIBLE_LIVING 25
+
+#define SEE_INVISIBLE_LEVEL_ONE 35 //Used by some stuff in code. It's really poorly organized.
+#define INVISIBILITY_LEVEL_ONE 35 //Used by some stuff in code. It's really poorly organized.
+
+#define SEE_INVISIBLE_LEVEL_TWO 45 //Used by some other stuff in code. It's really poorly organized.
+#define INVISIBILITY_LEVEL_TWO 45 //Used by some other stuff in code. It's really poorly organized.
+
+#define INVISIBILITY_SPIRIT 50
+#define SEE_SPIRITS 50
+
+#define SEE_INVISIBLE_OBSERVER_NOOBSERVERS 59
+#define INVISIBILITY_OBSERVER 60
+#define SEE_INVISIBLE_OBSERVER 60
+#define INVISIBILITY_AI_EYE 61
+#define SEE_INVISIBLE_OBSERVER_AI_EYE 61
+
+#define INVISIBILITY_MAXIMUM 100
+
+//Some mob defines below
+#define AI_CAMERA_LUMINOSITY 6
+
+#define BORGMESON 1
+#define BORGTHERM 2
+#define BORGXRAY 4
diff --git a/code/__DEFINES/stat.dm b/code/__DEFINES/stat.dm
new file mode 100644
index 00000000000..28013d1473f
--- /dev/null
+++ b/code/__DEFINES/stat.dm
@@ -0,0 +1,40 @@
+//mob/var/stat things
+#define CONSCIOUS 0
+#define UNCONSCIOUS 1
+#define DEAD 2
+
+// NanoUI flags
+#define STATUS_INTERACTIVE 2 // GREEN Visability
+#define STATUS_UPDATE 1 // ORANGE Visability
+#define STATUS_DISABLED 0 // RED Visability
+#define STATUS_CLOSE -1 // Close the interface
+
+// bitflags for machine stat variable
+#define BROKEN 1
+#define NOPOWER 2
+#define POWEROFF 4 // tbd
+#define MAINT 8 // under maintaince
+#define EMPED 16 // temporary broken by EMP pulse
+
+/*
+ Shuttles
+*/
+
+// these define the time taken for the shuttle to get to SS13
+// and the time before it leaves again
+#define SHUTTLE_PREPTIME 300 // 5 minutes = 300 seconds - after this time, the shuttle departs centcom and cannot be recalled
+#define SHUTTLE_LEAVETIME 180 // 3 minutes = 180 seconds - the duration for which the shuttle will wait at the station after arriving
+#define SHUTTLE_TRANSIT_DURATION 300 // 5 minutes = 300 seconds - how long it takes for the shuttle to get to the station
+#define SHUTTLE_TRANSIT_DURATION_RETURN 120 // 2 minutes = 120 seconds - for some reason it takes less time to come back, go figure.
+
+//Shuttle moving status
+#define SHUTTLE_IDLE 0
+#define SHUTTLE_WARMUP 1
+#define SHUTTLE_INTRANSIT 2
+#define SHUTTLE_STRANDED 3
+
+//Ferry shuttle processing status
+#define IDLE_STATE 0
+#define WAIT_LAUNCH 1
+#define WAIT_ARRIVE 2
+#define WAIT_FINISH 3
\ No newline at end of file
diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index 99a61c1ac64..58f0cf96daa 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -405,22 +405,6 @@ proc/isInSight(var/atom/A, var/atom/B)
GetBluePart(hexa)
)
-/proc/MixColors(const/list/colors)
- var/list/reds = list()
- var/list/blues = list()
- var/list/greens = list()
- var/list/weights = list()
-
- for (var/i = 0, ++i <= colors.len)
- reds.Add(GetRedPart(colors[i]))
- blues.Add(GetBluePart(colors[i]))
- greens.Add(GetGreenPart(colors[i]))
- weights.Add(1)
-
- var/r = mixOneColor(weights, reds)
- var/g = mixOneColor(weights, greens)
- var/b = mixOneColor(weights, blues)
- return rgb(r,g,b)
/proc/alone_in_area(var/area/the_area, var/mob/must_be_alone, var/check_type = /mob/living/carbon)
var/area/our_area = get_area_master(the_area)
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 8fa1726ba52..26380218d1e 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -1,91 +1,3 @@
-var/list/clients = list() //list of all clients
-var/list/admins = list() //list of all clients whom are admins
-var/list/directory = list() //list of all ckeys with associated client
-
-//Since it didn't really belong in any other category, I'm putting this here
-//This is for procs to replace all the goddamn 'in world's that are chilling around the code
-
-var/global/list/player_list = list() //List of all mobs **with clients attached**. Excludes /mob/new_player
-var/global/list/mob_list = list() //List of all mobs, including clientless
-var/global/list/spirits = list() //List of all the spirits, including Masks
-var/global/list/living_mob_list = list() //List of all alive mobs, including clientless. Excludes /mob/new_player
-var/global/list/dead_mob_list = list() //List of all dead mobs, including clientless. Excludes /mob/new_player
-var/global/list/respawnable_list = list() //List of all mobs, dead or in mindless creatures that still be respawned.
-
-var/global/list/portals = list() //for use by portals
-var/global/list/cable_list = list() //Index for all cables, so that powernets don't have to look through the entire world all the time
-var/global/list/chemical_reactions_list //list of all /datum/chemical_reaction datums. Used during chemical reactions
-var/global/list/chemical_reagents_list //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff
-var/global/list/landmarks_list = list() //list of all landmarks created
-var/global/list/surgery_steps = list() //list of all surgery steps |BS12
-var/global/list/side_effects = list() //list of all medical sideeffects types by thier names |BS12
-var/global/list/mechas_list = list() //list of all mechs. Used by hostile mobs target tracking.
-var/global/list/spacepods_list = list() //list of all space pods. Used by hostile mobs target tracking.
-var/global/list/joblist = list() //list of all jobstypes, minus borg and AI
-var/global/list/flag_list = list() //list of flags during Nations gamemode
-var/global/list/airlocks = list() //list of all airlocks
-
-
-var/global/list/alphabet_uppercase = list("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z") //added for Xenoarchaeology, might be useful for other stuff
-
-var/global/list/aibots = list() // AI controlled bots
-var/global/list/table_recipes = list() //list of all table craft recipes
-
-//Languages/species/whitelist.
-var/global/list/all_species[0]
-var/global/list/all_languages[0]
-var/global/list/language_keys[0] // Table of say codes for all languages
-var/global/list/all_nations[0]
-var/global/list/all_superheroes[0]
-var/global/list/whitelisted_species = list()
-
-//global var of unsafe-to-spawn-on-reaction mobs
-var/global/list/blocked_mobs = list(/mob/living/simple_animal/hostile,
- /mob/living/simple_animal/hostile/pirate,
- /mob/living/simple_animal/hostile/pirate/ranged,
- /mob/living/simple_animal/hostile/russian,
- /mob/living/simple_animal/hostile/russian/ranged,
- /mob/living/simple_animal/hostile/syndicate,
- /mob/living/simple_animal/hostile/syndicate/melee,
- /mob/living/simple_animal/hostile/syndicate/melee/space,
- /mob/living/simple_animal/hostile/syndicate/ranged,
- /mob/living/simple_animal/hostile/syndicate/ranged/space,
- /mob/living/simple_animal/hostile/alien/queen/large,
- /mob/living/simple_animal/hostile/retaliate,
- /mob/living/simple_animal/hostile/retaliate/clown,
- /mob/living/simple_animal/hostile/mushroom,
- /mob/living/simple_animal/hostile/asteroid,
- /mob/living/simple_animal/hostile/asteroid/basilisk,
- /mob/living/simple_animal/hostile/asteroid/goldgrub,
- /mob/living/simple_animal/hostile/asteroid/goliath,
- /mob/living/simple_animal/hostile/asteroid/hivelord,
- /mob/living/simple_animal/hostile/asteroid/hivelordbrood,
- /mob/living/simple_animal/hostile/carp/holocarp,
- /mob/living/simple_animal/hostile/mining_drone,
- /mob/living/simple_animal/hostile/spaceWorm,
- /mob/living/simple_animal/hostile/spaceWorm/wormHead,
- /mob/living/simple_animal/ascendant_shadowling
- )
-
-//Preferences stuff
- //Hairstyles
-var/global/list/hair_styles_list = list() //stores /datum/sprite_accessory/hair indexed by name
-var/global/list/hair_styles_male_list = list()
-var/global/list/hair_styles_female_list = list()
-var/global/list/facial_hair_styles_list = list() //stores /datum/sprite_accessory/facial_hair indexed by name
-var/global/list/facial_hair_styles_male_list = list()
-var/global/list/facial_hair_styles_female_list = list()
-var/global/list/skin_styles_female_list = list() //unused
- //Underwear
-var/global/list/underwear_m = list("White", "Grey", "Green", "Blue", "Black", "Mankini", "None")
-var/global/list/underwear_f = list("Red", "White", "Yellow", "Blue", "Black", "Thong", "None")
-var/global/list/underwear_list = underwear_m + underwear_f
- //undershirt
-var/global/list/undershirt_t = list("White Shirt", "White Tank top", "Black shirt", "Black Tank top", "Grey Shirt", "Grey tank top", "Lover Shirt", "Blue Ian Shirt", "UK Shirt","I Love NT Shirt", "Peace Shirt", "Band Shirt", "PogoMan Shirt", "Matroska Shirt", "White Short-sleeved shirt", "Purple Short-sleeved shirt", "Blue Short-sleeved shirt", "Green Short-sleeved shirt", "Black Short-Sleeved shirt", "Blue T-Shirt", "Red T-Shirt", "Yellow T-Shirt", "Green T-Shirt", "Blue Polo Shirt", "Red Polo Shirt", "White Polo Shirt", "Gray-Yellow Polo Shirt", "Green Sports Shirt", "Red Sports Shirt", "Blue Sports Shirt", "SS13 Shirt", "Fire Tank Top", "Question Shirt", "Skull Shirt", "Commie Shirt", "Nanotrasen Shirt", "Striped Shirt", "Blue Shirt", "Red Shirt", "Green Shirt", "Meat Shirt", "Tie-Dye Shirt", "Red Jersey", "Blue Jersey", "None")
-var/global/list/undershirt_list = undershirt_t
- //Backpacks
-var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt")
-
//////////////////////////
/////Initial Building/////
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 77489174db4..4658e6691ea 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -128,9 +128,10 @@ Proc for attack log creation, because really why not
3 is the description of action(like punched, throwed, or any other verb)
4 is the tool with which the action was made(usually item)
5 is additional information, anything that needs to be added
+6 is whether the attack should be logged to the log file and shown to admins
*/
-proc/add_logs(mob/target, mob/user, what_done, var/object=null, var/addition=null) //Victim : Attacker : what they did : what they did it with : extra notes
+proc/add_logs(mob/target, mob/user, what_done, var/object=null, var/addition=null, var/admin=1) //Victim : Attacker : what they did : what they did it with : extra notes
var/list/ignore=list("shaked","CPRed","grabbed","punched")
if(!user)
return
@@ -138,9 +139,11 @@ proc/add_logs(mob/target, mob/user, what_done, var/object=null, var/addition=nul
user.attack_log += text("\[[time_stamp()]\] Has [what_done] [target.name][ismob(target) ? "([target.ckey])" : ""][object ? " with [object]" : " "][addition]")
if(ismob(target))
target.attack_log += text("\[[time_stamp()]\] Has been [what_done] by [user.name][ismob(user) ? "([user.ckey])" : ""][object ? " with [object]" : " "][addition]")
- log_attack("[user.name][ismob(user) ? "([user.ckey])" : ""] [what_done] [target.name][ismob(target) ? "([target.ckey])" : ""][object ? " with [object]" : " "][addition]")
+ if(admin)
+ log_attack("[user.name][ismob(user) ? "([user.ckey])" : ""] [what_done] [target.name][ismob(target) ? "([target.ckey])" : ""][object ? " with [object]" : " "][addition]")
if(target.client)
if(what_done in ignore) return
if(target == user)return
+ if(!admin) return
msg_admin_attack("[user.name][ismob(user) ? "([user.ckey])" : ""][isAntag(user) ? "(ANTAG)" : ""] [what_done] [target.name][ismob(target) ? "([target.ckey])" : ""][object ? " with [object]" : " "][addition](JMP)")
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 8186b13e4f7..ce9341eff58 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -1683,3 +1683,21 @@ atom/proc/GetTypeInAllContents(typepath)
temp_col = "0[temp_col]"
colour += temp_col
return colour
+
+/proc/get_distant_turf(var/turf/T,var/direction,var/distance)
+ if(!T || !direction || !distance) return
+
+ var/dest_x = T.x
+ var/dest_y = T.y
+ var/dest_z = T.z
+
+ if(direction & NORTH)
+ dest_y = min(world.maxy, dest_y+distance)
+ if(direction & SOUTH)
+ dest_y = max(0, dest_y-distance)
+ if(direction & EAST)
+ dest_x = min(world.maxy, dest_x+distance)
+ if(direction & WEST)
+ dest_x = max(0, dest_x-distance)
+
+ return locate(dest_x,dest_y,dest_z)
\ No newline at end of file
diff --git a/code/_compile_options.dm b/code/_compile_options.dm
new file mode 100644
index 00000000000..4d9f7f48a3d
--- /dev/null
+++ b/code/_compile_options.dm
@@ -0,0 +1,13 @@
+#define DEBUG
+
+#define IS_MODE_COMPILED(MODE) (ispath(text2path("/datum/game_mode/"+(MODE))))
+
+#define BACKGROUND_ENABLED 0 // The default value for all uses of set background. Set background can cause gradual lag and is recommended you only turn this on if necessary.
+
+ //Don't set this very much higher then 1024 unless you like inviting people in to dos your server with message spam
+#define MAX_MESSAGE_LEN 1024
+#define MAX_PAPER_MESSAGE_LEN 3072
+#define MAX_BOOK_MESSAGE_LEN 9216
+#define MAX_NAME_LEN 26
+
+var/global/list/processing_objects = list() //This has to be initialized BEFORE world
\ No newline at end of file
diff --git a/code/_globalvars/configuration.dm b/code/_globalvars/configuration.dm
new file mode 100644
index 00000000000..30974675e07
--- /dev/null
+++ b/code/_globalvars/configuration.dm
@@ -0,0 +1,59 @@
+var/datum/configuration/config = null
+
+var/host = null
+var/join_motd = null
+var/station_name = "NSS Cyberiad"
+var/game_version = "Custom ParaCode"
+var/changelog_hash = ""
+var/game_year = (text2num(time2text(world.realtime, "YYYY")) + 544)
+
+var/aliens_allowed = 1
+var/ooc_allowed = 1
+var/dsay_allowed = 1
+var/dooc_allowed = 1
+var/traitor_scaling = 1
+//var/goonsay_allowed = 0
+var/dna_ident = 1
+var/abandon_allowed = 0
+var/enter_allowed = 1
+var/guests_allowed = 1
+var/shuttle_frozen = 0
+var/shuttle_left = 0
+var/tinted_weldhelh = 1
+var/mouse_respawn_time = 5 //Amount of time that must pass between a player dying as a mouse and repawning as a mouse. In minutes.
+
+// Debug is used exactly once (in living.dm) but is commented out in a lot of places. It is not set anywhere and only checked.
+// Debug2 is used in conjunction with a lot of admin verbs and therefore is actually legit.
+var/Debug = 0 // global debug switch
+var/Debug2 = 1 // enables detailed job debug file in secrets
+
+//This was a define, but I changed it to a variable so it can be changed in-game.(kept the all-caps definition because... code...) -Errorage
+var/MAX_EXPLOSION_RANGE = 14
+var/MAX_EX_DEVESTATION_RANGE = 3
+var/MAX_EX_HEAVY_RANGE = 7
+var/MAX_EX_LIGHT_RANGE = 14
+var/MAX_EX_FLASH_RANGE = 14
+//#define MAX_EXPLOSION_RANGE 14 // Defaults to 12 (was 8) -- TLE
+
+var/list/be_special_flags = list(
+ "traitor" = BE_TRAITOR,
+ "operative" = BE_OPERATIVE,
+ "changeling" = BE_CHANGELING,
+ "wizard" = BE_WIZARD,
+ "malf AI" = BE_MALF,
+ "revolutionary" = BE_REV,
+ "alien" = BE_ALIEN,
+ "pAI" = BE_PAI,
+ "cultist" = BE_CULTIST,
+ "ninja" = BE_NINJA,
+ "raider" = BE_RAIDER,
+ "vampire" = BE_VAMPIRE,
+ "mutineer" = BE_MUTINEER,
+ "blob" = BE_BLOB
+)
+
+//Random event stuff, apparently used
+var/eventchance = 10 //% per 5 mins
+var/event = 0
+var/hadevent = 0
+var/blobevent = 0
\ No newline at end of file
diff --git a/code/_globalvars/database.dm b/code/_globalvars/database.dm
new file mode 100644
index 00000000000..437f479f99c
--- /dev/null
+++ b/code/_globalvars/database.dm
@@ -0,0 +1,35 @@
+ // MySQL configuration
+var/sqladdress = "localhost"
+var/sqlport = "3306"
+var/sqldb = "paradise"
+var/sqllogin = "root"
+var/sqlpass = "example"
+
+ // Feedback gathering sql connection
+var/sqlfdbkdb = "paradise"
+var/sqlfdbklogin = "root"
+var/sqlfdbkpass = "example"
+
+var/sqllogging = 0 // Should we log deaths, population stats, etc?
+
+ // Forum MySQL configuration (for use with forum account/key authentication)
+ // These are all default values that will load should the forumdbconfig.txt
+ // file fail to read for whatever reason.
+
+var/forumsqladdress = "localhost"
+var/forumsqlport = "3306"
+var/forumsqldb = "tgstation"
+var/forumsqllogin = "root"
+var/forumsqlpass = "bleh"
+var/forum_activated_group = "2"
+var/forum_authenticated_group = "10"
+
+ // For FTP requests. (i.e. downloading runtime logs.)
+ // However it'd be ok to use for accessing attack logs and such too, which are even laggier.
+var/fileaccess_timer = 0
+var/custom_event_msg = null
+
+//Database connections
+//A connection is established on world creation. Ideally, the connection dies when the server restarts (After feedback logging.).
+var/DBConnection/dbcon = new() //Feedback database (New database)
+var/DBConnection/dbcon_old = new() //Tgstation database (Old database) - See the files in the SQL folder for information what goes where.
\ No newline at end of file
diff --git a/code/_globalvars/game_modes.dm b/code/_globalvars/game_modes.dm
new file mode 100644
index 00000000000..6051d6c8e16
--- /dev/null
+++ b/code/_globalvars/game_modes.dm
@@ -0,0 +1,5 @@
+var/master_mode = "extended"//"extended"
+var/secret_force_mode = "secret" // if this is anything but "secret", the secret rotation will forceably choose this mode
+
+var/wavesecret = 0 // meteor mode, delays wave progression, terrible name
+var/datum/station_state/start_state = null // Used in round-end report
\ No newline at end of file
diff --git a/code/_globalvars/genetics.dm b/code/_globalvars/genetics.dm
new file mode 100644
index 00000000000..b642b034921
--- /dev/null
+++ b/code/_globalvars/genetics.dm
@@ -0,0 +1,70 @@
+ ///////////
+var/BLINDBLOCK = 0
+var/DEAFBLOCK = 0
+var/HULKBLOCK = 0
+var/TELEBLOCK = 0
+var/FIREBLOCK = 0
+var/XRAYBLOCK = 0
+var/CLUMSYBLOCK = 0
+var/FAKEBLOCK = 0
+var/COUGHBLOCK = 0
+var/GLASSESBLOCK = 0
+var/EPILEPSYBLOCK = 0
+var/TWITCHBLOCK = 0
+var/NERVOUSBLOCK = 0
+var/MONKEYBLOCK = 50 // Monkey block will always be the DNA_SE_LENGTH
+
+var/BLOCKADD = 0
+var/DIFFMUT = 0
+
+var/NOBREATHBLOCK = 0
+var/REMOTEVIEWBLOCK = 0
+var/REGENERATEBLOCK = 0
+var/INCREASERUNBLOCK = 0
+var/REMOTETALKBLOCK = 0
+var/MORPHBLOCK = 0
+var/COLDBLOCK = 0
+var/HALLUCINATIONBLOCK = 0
+var/NOPRINTSBLOCK = 0
+var/SHOCKIMMUNITYBLOCK = 0
+var/SMALLSIZEBLOCK = 0
+
+///////////////////////////////
+// Goon Stuff
+///////////////////////////////
+// Disabilities
+var/LISPBLOCK = 0
+var/MUTEBLOCK = 0
+var/RADBLOCK = 0
+var/FATBLOCK = 0
+var/CHAVBLOCK = 0
+var/SWEDEBLOCK = 0
+var/SCRAMBLEBLOCK = 0
+var/TOXICFARTBLOCK = 0
+var/STRONGBLOCK = 0
+var/HORNSBLOCK = 0
+var/COMICBLOCK = 0
+
+// Powers
+var/SOBERBLOCK = 0
+var/PSYRESISTBLOCK = 0
+var/SHADOWBLOCK = 0
+var/CHAMELEONBLOCK = 0
+var/CRYOBLOCK = 0
+var/EATBLOCK = 0
+var/JUMPBLOCK = 0
+//var/MELTBLOCK = 0
+var/EMPATHBLOCK = 0
+var/SUPERFARTBLOCK = 0
+var/IMMOLATEBLOCK = 0
+var/POLYMORPHBLOCK = 0
+
+///////////////////////////////
+// /vg/ Mutations
+///////////////////////////////
+var/LOUDBLOCK = 0
+//var/WHISPERBLOCK = 0
+var/DIZZYBLOCK = 0
+
+var/list/reg_dna = list( ) //this appears to be a list of UE == real_name correlations
+var/list/global_mutations = list() // list of hidden mutation things
\ No newline at end of file
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
new file mode 100644
index 00000000000..8ec230cc13b
--- /dev/null
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -0,0 +1,38 @@
+//Preferences stuff
+ //Hairstyles
+var/global/list/hair_styles_list = list() //stores /datum/sprite_accessory/hair indexed by name
+var/global/list/hair_styles_male_list = list()
+var/global/list/hair_styles_female_list = list()
+var/global/list/facial_hair_styles_list = list() //stores /datum/sprite_accessory/facial_hair indexed by name
+var/global/list/facial_hair_styles_male_list = list()
+var/global/list/facial_hair_styles_female_list = list()
+var/global/list/skin_styles_female_list = list() //unused
+ //Underwear
+var/global/list/underwear_m = list("White", "Grey", "Green", "Blue", "Black", "Mankini", "None")
+var/global/list/underwear_f = list("Red", "White", "Yellow", "Blue", "Black", "Thong", "None")
+var/global/list/underwear_list = underwear_m + underwear_f
+ //undershirt
+var/global/list/undershirt_t = list("White Shirt", "White Tank top", "Black shirt", "Black Tank top", "Grey Shirt", "Grey tank top", "Lover Shirt", "Blue Ian Shirt", "UK Shirt","I Love NT Shirt", "Peace Shirt", "Band Shirt", "PogoMan Shirt", "Matroska Shirt", "White Short-sleeved shirt", "Purple Short-sleeved shirt", "Blue Short-sleeved shirt", "Green Short-sleeved shirt", "Black Short-Sleeved shirt", "Blue T-Shirt", "Red T-Shirt", "Yellow T-Shirt", "Green T-Shirt", "Blue Polo Shirt", "Red Polo Shirt", "White Polo Shirt", "Gray-Yellow Polo Shirt", "Green Sports Shirt", "Red Sports Shirt", "Blue Sports Shirt", "SS13 Shirt", "Fire Tank Top", "Question Shirt", "Skull Shirt", "Commie Shirt", "Nanotrasen Shirt", "Striped Shirt", "Blue Shirt", "Red Shirt", "Green Shirt", "Meat Shirt", "Tie-Dye Shirt", "Red Jersey", "Blue Jersey", "None")
+var/global/list/undershirt_list = undershirt_t
+ //Backpacks
+var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt")
+
+var/static/list/scarySounds = list('sound/weapons/thudswoosh.ogg','sound/weapons/Taser.ogg','sound/weapons/armbomb.ogg','sound/voice/hiss1.ogg','sound/voice/hiss2.ogg', \
+'sound/voice/hiss3.ogg','sound/voice/hiss4.ogg','sound/voice/hiss5.ogg','sound/voice/hiss6.ogg','sound/effects/Glassbr1.ogg','sound/effects/Glassbr2.ogg','sound/effects/Glassbr3.ogg', \
+'sound/items/Welder.ogg','sound/items/Welder2.ogg','sound/machines/airlock.ogg','sound/effects/clownstep1.ogg','sound/effects/clownstep2.ogg')
+
+// Reference list for disposal sort junctions. Set the sortType variable on disposal sort junctions to
+// the index of the sort department that you want. For example, sortType set to 2 will reroute all packages
+// tagged for the Cargo Bay.
+
+//If you don't want to fuck up disposals, add to this list, and don't change the order.
+//If you insist on changing the order, you'll have to change every sort junction to reflect the new order. --Pete
+
+var/list/TAGGERLOCATIONS = list("Disposals",
+ "Cargo Bay", "QM Office", "Engineering", "CE Office",
+ "Atmospherics", "HoS Office", "Security", "Medbay",
+ "CMO Office", "Chemistry", "Research", "RD Office",
+ "Robotics", "HoP Office", "Library", "Chapel", "Captain's Office",
+ "Bar", "Kitchen", "Hydroponics", "Janitor Closet","Genetics")
+
+var/list/hit_appends = list("-OOF", "-ACK", "-UGH", "-HRNK", "-HURGH", "-GLORF")
\ No newline at end of file
diff --git a/code/_globalvars/lists/misc.dm b/code/_globalvars/lists/misc.dm
new file mode 100644
index 00000000000..780f17a1b90
--- /dev/null
+++ b/code/_globalvars/lists/misc.dm
@@ -0,0 +1,17 @@
+var/global/list/alphabet_uppercase = list("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z") //added for Xenoarchaeology, might be useful for other stuff
+
+//Reagent stuff
+var/list/tachycardics = list("coffee", "methamphetamine", "nitroglycerin", "thirteenloko", "nicotine") //increase heart rate
+var/list/bradycardics = list("neurotoxin", "cryoxadone", "space_drugs") //decrease heart rate
+var/list/heartstopper = list("capulettium", "capulettium_plus") //this stops the heart
+var/list/cheartstopper = list() //this stops the heart when overdose is met -- c = conditional
+
+var/list/restricted_camera_networks = list( //Those networks can only be accessed by preexisting terminals. AIs and new terminals can't use them.
+ "CentCom",
+ "ERT",
+ "NukeOps",
+ "Thunderdome",
+ "UO45",
+ "UO45R",
+ "Xeno"
+ )
\ No newline at end of file
diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm
new file mode 100644
index 00000000000..153a81c4aa0
--- /dev/null
+++ b/code/_globalvars/lists/mobs.dm
@@ -0,0 +1,55 @@
+//Languages/species/whitelist. //Languages and species fit with mobs right
+var/global/list/all_species[0]
+var/global/list/all_languages[0]
+var/global/list/language_keys[0] // Table of say codes for all languages
+var/global/list/all_nations[0]
+var/global/list/all_superheroes[0]
+var/global/list/whitelisted_species = list()
+
+var/list/clients = list() //list of all clients
+var/list/admins = list() //list of all clients whom are admins
+var/list/directory = list() //list of all ckeys with associated client
+
+//Since it didn't really belong in any other category, I'm putting this here
+//This is for procs to replace all the goddamn 'in world's that are chilling around the code
+
+var/global/list/player_list = list() //List of all mobs **with clients attached**. Excludes /mob/new_player
+var/global/list/mob_list = list() //List of all mobs, including clientless
+var/global/list/spirits = list() //List of all the spirits, including Masks
+var/global/list/living_mob_list = list() //List of all alive mobs, including clientless. Excludes /mob/new_player
+var/global/list/dead_mob_list = list() //List of all dead mobs, including clientless. Excludes /mob/new_player
+var/global/list/respawnable_list = list() //List of all mobs, dead or in mindless creatures that still be respawned.
+
+//global var of unsafe-to-spawn-on-reaction mobs
+var/global/list/blocked_mobs = list(/mob/living/simple_animal/hostile,
+ /mob/living/simple_animal/hostile/pirate,
+ /mob/living/simple_animal/hostile/pirate/ranged,
+ /mob/living/simple_animal/hostile/russian,
+ /mob/living/simple_animal/hostile/russian/ranged,
+ /mob/living/simple_animal/hostile/syndicate,
+ /mob/living/simple_animal/hostile/syndicate/melee,
+ /mob/living/simple_animal/hostile/syndicate/melee/space,
+ /mob/living/simple_animal/hostile/syndicate/ranged,
+ /mob/living/simple_animal/hostile/syndicate/ranged/space,
+ /mob/living/simple_animal/hostile/alien/queen/large,
+ /mob/living/simple_animal/hostile/retaliate,
+ /mob/living/simple_animal/hostile/retaliate/clown,
+ /mob/living/simple_animal/hostile/mushroom,
+ /mob/living/simple_animal/hostile/asteroid,
+ /mob/living/simple_animal/hostile/asteroid/basilisk,
+ /mob/living/simple_animal/hostile/asteroid/goldgrub,
+ /mob/living/simple_animal/hostile/asteroid/goliath,
+ /mob/living/simple_animal/hostile/asteroid/hivelord,
+ /mob/living/simple_animal/hostile/asteroid/hivelordbrood,
+ /mob/living/simple_animal/hostile/carp/holocarp,
+ /mob/living/simple_animal/hostile/mining_drone,
+ /mob/living/simple_animal/hostile/spaceWorm,
+ /mob/living/simple_animal/hostile/spaceWorm/wormHead,
+ /mob/living/simple_animal/ascendant_shadowling
+ )
+
+var/global/list/med_hud_users = list()
+var/global/list/sec_hud_users = list()
+ //items that ask to be called every cycle
+
+var/global/list/active_diseases = list() //Diseases are mob-based, so they get to go here
\ No newline at end of file
diff --git a/code/names.dm b/code/_globalvars/lists/names.dm
similarity index 95%
rename from code/names.dm
rename to code/_globalvars/lists/names.dm
index 0b93759a9e4..e85ba6a12cf 100644
--- a/code/names.dm
+++ b/code/_globalvars/lists/names.dm
@@ -1,18 +1,18 @@
-var/list/ai_names = file2list("config/names/ai.txt")
-var/list/wizard_first = file2list("config/names/wizardfirst.txt")
-var/list/wizard_second = file2list("config/names/wizardsecond.txt")
-var/list/ninja_titles = file2list("config/names/ninjatitle.txt")
-var/list/ninja_names = file2list("config/names/ninjaname.txt")
-var/list/commando_names = file2list("config/names/death_commando.txt")
-var/list/first_names_male = file2list("config/names/first_male.txt")
-var/list/first_names_female = file2list("config/names/first_female.txt")
-var/list/last_names = file2list("config/names/last.txt")
-var/list/clown_names = file2list("config/names/clown.txt")
-var/list/diona_names = file2list ("config/names/diona.txt")
-
-var/list/verbs = file2list("config/names/verbs.txt")
-var/list/adjectives = file2list("config/names/adjectives.txt")
-//loaded on startup because of "
-//would include in rsc if ' was used
-
-var/list/vox_name_syllables = list("ti","hi","ki","ya","ta","ha","ka","ya","chi","cha","kah")
+var/list/ai_names = file2list("config/names/ai.txt")
+var/list/wizard_first = file2list("config/names/wizardfirst.txt")
+var/list/wizard_second = file2list("config/names/wizardsecond.txt")
+var/list/ninja_titles = file2list("config/names/ninjatitle.txt")
+var/list/ninja_names = file2list("config/names/ninjaname.txt")
+var/list/commando_names = file2list("config/names/death_commando.txt")
+var/list/first_names_male = file2list("config/names/first_male.txt")
+var/list/first_names_female = file2list("config/names/first_female.txt")
+var/list/last_names = file2list("config/names/last.txt")
+var/list/clown_names = file2list("config/names/clown.txt")
+var/list/diona_names = file2list ("config/names/diona.txt")
+
+var/list/verbs = file2list("config/names/verbs.txt")
+var/list/adjectives = file2list("config/names/adjectives.txt")
+//loaded on startup because of "
+//would include in rsc if ' was used
+
+var/list/vox_name_syllables = list("ti","hi","ki","ya","ta","ha","ka","ya","chi","cha","kah")
\ No newline at end of file
diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm
new file mode 100644
index 00000000000..03b16f38efe
--- /dev/null
+++ b/code/_globalvars/lists/objects.dm
@@ -0,0 +1,21 @@
+var/global/list/portals = list() //for use by portals
+var/global/list/cable_list = list() //Index for all cables, so that powernets don't have to look through the entire world all the time
+var/global/list/chemical_reactions_list //list of all /datum/chemical_reaction datums. Used during chemical reactions
+var/global/list/chemical_reagents_list //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff
+var/global/list/landmarks_list = list() //list of all landmarks created
+var/global/list/surgery_steps = list() //list of all surgery steps |BS12
+var/global/list/side_effects = list() //list of all medical sideeffects types by thier names |BS12
+var/global/list/mechas_list = list() //list of all mechs. Used by hostile mobs target tracking.
+var/global/list/spacepods_list = list() //list of all space pods. Used by hostile mobs target tracking.
+var/global/list/joblist = list() //list of all jobstypes, minus borg and AI
+var/global/list/flag_list = list() //list of flags during Nations gamemode
+var/global/list/airlocks = list() //list of all airlocks
+
+var/global/list/aibots = list() // AI controlled bots
+var/global/list/table_recipes = list() //list of all table craft recipes
+
+var/global/list/active_areas = list()
+var/global/list/all_areas = list()
+var/global/list/machines = list()
+ //items that ask to be called every cycle
+
diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm
new file mode 100644
index 00000000000..d975491a15c
--- /dev/null
+++ b/code/_globalvars/logging.dm
@@ -0,0 +1,14 @@
+var/diary = null
+var/diaryofmeanpeople = null
+var/href_logfile = null
+
+var/list/jobMax = list()
+var/list/bombers = list( )
+var/list/admin_log = list ( )
+var/list/lastsignalers = list( ) //keeps last 100 signals here in format: "[src] used \ref[src] @ location [src.loc]: [freq]/[code]"
+var/list/lawchanges = list( ) //Stores who uploaded laws to which silicon-based lifeform, and what the law was
+
+var/list/combatlog = list()
+var/list/IClog = list()
+var/list/OOClog = list()
+var/list/adminlog = list()
diff --git a/code/_globalvars/mapping.dm b/code/_globalvars/mapping.dm
index cb5c07a351f..1c8564e0ec9 100644
--- a/code/_globalvars/mapping.dm
+++ b/code/_globalvars/mapping.dm
@@ -48,6 +48,7 @@ var/list/prisonsecuritywarp = list() //prison security goes to these
var/list/prisonwarped = list() //list of players already warped
var/list/blobstart = list()
var/list/ninjastart = list()
+var/list/carplist = list() //list of all carp-spawn landmarks
//away missions
var/list/awaydestinations = list() //a list of landmarks that the warpgate can take you to
\ No newline at end of file
diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm
new file mode 100644
index 00000000000..2a936dde7b4
--- /dev/null
+++ b/code/_globalvars/misc.dm
@@ -0,0 +1,65 @@
+var/global/obj/effect/overlay/plmaster = null
+var/global/obj/effect/overlay/slmaster = null
+
+// nanomanager, the manager for Nano UIs
+var/datum/nanomanager/nanomanager = new()
+// event manager, the manager for events
+var/datum/event_manager/event_manager = new()
+// Announcer intercom, because too much stuff creates an intercom for one message then hard del()s it.
+var/global/obj/item/device/radio/intercom/global_announcer = create_global_announcer()
+// Load order issues means this can't be new'd until other code runs
+// This is probably not the way I should be doing this, but I don't know how to do it right!
+proc/create_global_announcer()
+ spawn(0)
+ global_announcer = new(null)
+ return
+
+var/list/paper_tag_whitelist = list("center","p","div","span","h1","h2","h3","h4","h5","h6","hr","pre", \
+ "big","small","font","i","u","b","s","sub","sup","tt","br","hr","ol","ul","li","caption","col", \
+ "table","td","th","tr")
+var/list/paper_blacklist = list("java","onblur","onchange","onclick","ondblclick","onfocus","onkeydown", \
+ "onkeypress","onkeyup","onload","onmousedown","onmousemove","onmouseout","onmouseover", \
+ "onmouseup","onreset","onselect","onsubmit","onunload")
+
+//Reverse of dir
+var/list/reverse_dir = list(2, 1, 3, 8, 10, 9, 11, 4, 6, 5, 7, 12, 14, 13, 15, 32, 34, 33, 35, 40, 42, 41, 43, 36, 38, 37, 39, 44, 46, 45, 47, 16, 18, 17, 19, 24, 26, 25, 27, 20, 22, 21, 23, 28, 30, 29, 31, 48, 50, 49, 51, 56, 58, 57, 59, 52, 54, 53, 55, 60, 62, 61, 63)
+var/gravity_is_on = 1 //basically unused, just one admin verb..
+// Recall time limit: 2 hours
+var/recall_time_limit=72000 //apparently used for the comm console
+
+//////SCORE STUFF
+//Goonstyle scoreboard
+var/score_crewscore = 0 // this is the overall var/score for the whole round
+var/score_stuffshipped = 0 // how many useful items have cargo shipped out?
+var/score_stuffharvested = 0 // how many harvests have hydroponics done?
+var/score_oremined = 0 // obvious
+var/score_researchdone = 0
+var/score_eventsendured = 0 // how many random events did the station survive?
+var/score_powerloss = 0 // how many APCs have poor charge?
+var/score_escapees = 0 // how many people got out alive?
+var/score_deadcrew = 0 // dead bodies on the station, oh no
+var/score_mess = 0 // how much poo, puke, gibs, etc went uncleaned
+var/score_meals = 0
+var/score_disease = 0 // how many rampant, uncured diseases are on board the station
+var/score_deadcommand = 0 // used during rev, how many command staff perished
+var/score_arrested = 0 // how many traitors/revs/whatever are alive in the brig
+var/score_traitorswon = 0 // how many traitors were successful?
+var/score_allarrested = 0 // did the crew catch all the enemies alive?
+var/score_opkilled = 0 // used during nuke mode, how many operatives died?
+var/score_disc = 0 // is the disc safe and secure?
+var/score_nuked = 0 // was the station blown into little bits?
+
+ // these ones are mainly for the stat panel
+var/score_powerbonus = 0 // if all APCs on the station are running optimally, big bonus
+var/score_messbonus = 0 // if there are no messes on the station anywhere, huge bonus
+var/score_deadaipenalty = 0 // is the AI dead? if so, big penalty
+var/score_foodeaten = 0 // nom nom nom
+var/score_clownabuse = 0 // how many times a clown was punched, struck or otherwise maligned
+var/score_richestname = null // this is all stuff to show who was the richest alive on the shuttle
+var/score_richestjob = null // kinda pointless if you dont have a money system i guess
+var/score_richestcash = 0
+var/score_richestkey = null
+var/score_dmgestname = null // who had the most damage on the shuttle (but was still alive)
+var/score_dmgestjob = null
+var/score_dmgestdamage = 0
+var/score_dmgestkey = null
\ No newline at end of file
diff --git a/code/_globalvars/station.dm b/code/_globalvars/station.dm
index d25cfa053d5..3a077a48948 100644
--- a/code/_globalvars/station.dm
+++ b/code/_globalvars/station.dm
@@ -1 +1,14 @@
+var/global/obj/effect/datacore/data_core = null
+
+var/global/defer_powernet_rebuild = 0 // true if net rebuild will be called manually after an event
+
+var/CELLRATE = 0.002 // multiplier for watts per tick <> cell storage (eg: .002 means if there is a load of 1000 watts, 20 units will be taken from a cell per second)
+var/CHARGELEVEL = 0.0005 // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second)
+
+var/list/powernets = list()
+
+// this is not strictly unused although the whole modules datum thing is unused
+// To remove this you need to remove that
+var/datum/moduletypes/mods = new()
+
var/map_name = "Unknown" //The name of the map that is loaded. Assigned in world/New()
\ No newline at end of file
diff --git a/code/_globalvars/unused.dm b/code/_globalvars/unused.dm
new file mode 100644
index 00000000000..81fb2c6d4bd
--- /dev/null
+++ b/code/_globalvars/unused.dm
@@ -0,0 +1,40 @@
+var/skipupdate = 0
+
+var/shuttlecoming = 0
+var/forceblob = 0
+var/datum/debug/debugobj
+
+var/list/liftable_structures = list(\
+ /obj/machinery/autolathe, \
+ /obj/machinery/constructable_frame, \
+ /obj/machinery/portable_atmospherics/hydroponics, \
+ /obj/machinery/computer, \
+ /obj/machinery/optable, \
+ /obj/structure/dispenser, \
+ /obj/machinery/gibber, \
+ /obj/machinery/microwave, \
+ /obj/machinery/vending, \
+ /obj/machinery/seed_extractor, \
+ /obj/machinery/space_heater, \
+ /obj/machinery/recharge_station, \
+ /obj/machinery/flasher, \
+ /obj/structure/stool, \
+ /obj/structure/closet, \
+ /obj/machinery/photocopier, \
+ /obj/structure/filingcabinet, \
+ /obj/structure/reagent_dispensers, \
+ /obj/machinery/portable_atmospherics/canister)
+
+var/starticon = null
+var/midicon = null
+var/endicon = null
+var/datum/air_tunnel/air_tunnel1/SS13_airtunnel = null
+var/going = 1.0
+var/datum/engine_eject/engine_eject_control = null
+// list/traitors = list() //traitor list
+// list/traitobj = list( )
+var/airtunnel_start = 68 // default
+var/airtunnel_stop = 68 // default
+var/airtunnel_bottom = 72 // default
+// reverse_dir[dir] = reverse of dir
+
diff --git a/code/_onclick/adjacent.dm b/code/_onclick/adjacent.dm
index b39df751896..5a84463c8f1 100644
--- a/code/_onclick/adjacent.dm
+++ b/code/_onclick/adjacent.dm
@@ -79,23 +79,6 @@
return loc.Adjacent(neighbor,recurse - 1)
return 0
return ..()
-/*
- Special case: This allows you to reach a door when it is visally on top of,
- but technically behind, a fire door
-
- You could try to rewrite this to be faster, but I'm not sure anything would be.
- This can be safely removed if border firedoors are ever moved to be on top of doors
- so they can be interacted with without opening the door.
-*/
-/obj/machinery/door/Adjacent(var/atom/neighbor)
- var/obj/machinery/door/firedoor/border_only/BOD = locate() in loc
- if(BOD)
- BOD.throwpass = 1 // allow click to pass
- . = ..()
- BOD.throwpass = 0
- return .
- return ..()
-
/*
This checks if you there is uninterrupted airspace between that turf and this one.
diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index 1dd064219a5..3edd0ba0bde 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -119,3 +119,7 @@
*/
/mob/new_player/ClickOn()
return
+
+// pAIs are not intended to interact with anything in the world
+/mob/living/silicon/pai/UnarmedAttack(var/atom/A)
+ return
diff --git a/code/controllers/Processes/mob.dm b/code/controllers/Processes/mob.dm
index 9eff6b9c007..4be567c4ef2 100644
--- a/code/controllers/Processes/mob.dm
+++ b/code/controllers/Processes/mob.dm
@@ -30,7 +30,7 @@ var/global/datum/controller/mob_system/mob_master
var/starttime
/datum/controller/mob_system/proc/Setup()
- world << "\red Mob ticker starting up."
+ world << "\red \b Mob ticker starting up."
starttime = world.timeofday
/datum/controller/mob_system/proc/process()
diff --git a/code/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm
index ac24812f285..27b77a681d6 100644
--- a/code/controllers/shuttle_controller.dm
+++ b/code/controllers/shuttle_controller.dm
@@ -247,6 +247,25 @@ var/global/datum/shuttle_controller/shuttle_controller
MS.warmup_time = 0
shuttles["Syndicate"] = MS
+ //Vox Shuttle.
+ var/datum/shuttle/multi_shuttle/WS = new/datum/shuttle/multi_shuttle()
+ WS.origin = locate(/area/shuttle/derelict/ship/start)
+
+ WS.destinations = list(
+ "NCS Cyberiad" = locate(/area/shuttle/derelict/ship/station),
+ "Engineering Outpost" = locate(/area/shuttle/derelict/ship/engipost),
+ )
+
+ WS.announcer = "NSV Icarus"
+ WS.arrival_message = "Attention, [station_name()], we just tracked a large medical vessel approaching the station from the telecommunications satellite. Can't fire on them without hitting the station - prepare for visitors."
+ WS.departure_message = "Your guests are pulling away, [station_name()] - moving too fast for us to draw a bead on them. Looks like they're heading back to the telecommunications satellite."
+ WS.interim = locate(/area/shuttle/derelict/ship/transit)
+
+ WS.cloaked = 0
+ WS.move_time = 180
+ WS.warmup_time = 0
+ shuttles["White Ship"] = WS
+
//This is called by gameticker after all the machines and radio frequencies have been properly initialized
/datum/shuttle_controller/proc/setup_shuttle_docks()
diff --git a/code/datums/martial.dm b/code/datums/martial.dm
index 6fbe984e6ad..1388e088f8c 100644
--- a/code/datums/martial.dm
+++ b/code/datums/martial.dm
@@ -25,7 +25,7 @@
return
/datum/martial_art/proc/basic_hit(var/mob/living/carbon/human/A,var/mob/living/carbon/human/D)
- add_logs(A, D, "punched")
+ add_logs(D, A, "punched")
A.do_attack_animation(D)
var/damage = rand(0,9)
@@ -85,7 +85,7 @@
return 1
/datum/martial_art/boxing/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
- add_logs(A, D, "punched")
+ add_logs(D, A, "punched")
A.do_attack_animation(D)
var/atk_verb = pick("left hook","right hook","straight punch")
@@ -136,7 +136,7 @@
return 1
/datum/martial_art/drunk_brawling/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
- add_logs(A, D, "punched")
+ add_logs(D, A, "punched")
A.do_attack_animation(D)
var/atk_verb = pick("jab","uppercut","overhand punch","drunken right hook","drunken left hook")
@@ -197,7 +197,7 @@
/datum/martial_art/wrestling/proc/Suplex(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
- add_logs(A, D, "suplexed")
+ add_logs(D, A, "suplexed")
D.visible_message("[A] suplexes [D]!", \
"[A] suplexes [D]!")
D.forceMove(A.loc)
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 08a735648a7..a31a4173f1d 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -40,6 +40,7 @@ datum/mind
var/assigned_role
var/special_role
+ var/list/restricted_roles = list()
var/list/spell_list = list() // Wizard mode & "Give Spell" badmin button.
diff --git a/code/datums/spell.dm b/code/datums/spell.dm
index dbe98647575..2c27947ddbf 100644
--- a/code/datums/spell.dm
+++ b/code/datums/spell.dm
@@ -343,9 +343,9 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
if(((!user.mind) || !(src in user.mind.spell_list)) && !(src in user.spell_list))
return 0
- if(user.z == 2 && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel
+ if(user.z == ZLEVEL_CENTCOMM && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel
return 0
- if(user.z == 2 && ticker.mode.name == "ragin' mages")
+ if(user.z == ZLEVEL_CENTCOMM && ticker.mode.name == "ragin' mages")
return 0
switch(charge_type)
diff --git a/code/datums/spells/summonitem.dm b/code/datums/spells/summonitem.dm
index 259f51a0930..ede77be29cc 100644
--- a/code/datums/spells/summonitem.dm
+++ b/code/datums/spells/summonitem.dm
@@ -71,7 +71,7 @@
var/obj/item/brain/B = new /obj/item/brain(user.loc)
B.transfer_identity(C)
C.death()
- add_logs(user, C, "magically debrained", addition="INTENT: [uppertext(user.a_intent)]")*/
+ add_logs(C, user, "magically debrained", addition="INTENT: [uppertext(user.a_intent)]")*/
if(C.stomach_contents && item_to_retrive in C.stomach_contents)
C.stomach_contents -= item_to_retrive
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 484f3e2af24..e4557e12f48 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -1217,7 +1217,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/misc/wizard
name = "Wizard Costume Crate"
- contains = list(/obj/item/weapon/staff,
+ contains = list(/obj/item/weapon/twohanded/staff,
/obj/item/clothing/suit/wizrobe/fake,
/obj/item/clothing/shoes/sandal,
/obj/item/clothing/head/wizard/fake)
@@ -1312,3 +1312,37 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/weapon/lipstick/random)
cost = 30 //Lots of very expensive items. You gotta pay up to look good!
containername = "formal-wear crate"
+
+/datum/supply_packs/misc/teamcolors //For team sports like space polo
+ name = "Team Jerseys Crate"
+ // 4 red jerseys, 4 blue jerseys, and 1 beach ball
+ contains = list(/obj/item/clothing/under/color/red/jersey,
+ /obj/item/clothing/under/color/red/jersey,
+ /obj/item/clothing/under/color/red/jersey,
+ /obj/item/clothing/under/color/red/jersey,
+ /obj/item/clothing/under/color/blue/jersey,
+ /obj/item/clothing/under/color/blue/jersey,
+ /obj/item/clothing/under/color/blue/jersey,
+ /obj/item/clothing/under/color/blue/jersey,
+ /obj/item/weapon/beach_ball)
+ cost = 15
+ containername = "team jerseys crate"
+
+/datum/supply_packs/misc/polo //For space polo! Or horsehead Quiditch
+ name = "Polo Supply Crate"
+ // 6 brooms, 6 horse masks for the brooms, and 1 beach ball
+ contains = list(/obj/item/weapon/twohanded/staff/broom,
+ /obj/item/weapon/twohanded/staff/broom,
+ /obj/item/weapon/twohanded/staff/broom,
+ /obj/item/weapon/twohanded/staff/broom,
+ /obj/item/weapon/twohanded/staff/broom,
+ /obj/item/weapon/twohanded/staff/broom,
+ /obj/item/clothing/mask/horsehead,
+ /obj/item/clothing/mask/horsehead,
+ /obj/item/clothing/mask/horsehead,
+ /obj/item/clothing/mask/horsehead,
+ /obj/item/clothing/mask/horsehead,
+ /obj/item/clothing/mask/horsehead,
+ /obj/item/weapon/beach_ball)
+ cost = 20
+ containername = "polo supply crate"
\ No newline at end of file
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 8ba5f8677d5..24bbaa3b2d8 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -265,6 +265,14 @@ var/list/uplink_items = list()
excludefrom = list("nuclear emergency")
surplus = 50
+/datum/uplink_item/dangerous/flamethrower
+ name = "Flamethrower"
+ desc = "A flamethrower, fueled by a portion of highly flammable biotoxins stolen previously from Nanotrasen stations. Make a statement by roasting the filth in their own greed. Use with caution."
+ item = /obj/item/weapon/flamethrower/full/tank
+ cost = 11
+ gamemodes = list("nuclear emergency")
+ surplus = 40
+
/datum/uplink_item/dangerous/sword
name = "Energy Sword"
desc = "The esword is an edged weapon with a blade of pure energy. The sword is small enough to be pocketed when inactive. Activating it produces a loud, distinctive noise."
@@ -587,6 +595,14 @@ var/list/uplink_items = list()
item = /obj/item/weapon/aiModule/syndicate
cost = 14
+/datum/uplink_item/device_tools/magboots
+ name = "Blood-Red Magboots"
+ desc = "A pair of magnetic boots with a Syndicate paintjob that assist with freer movement in space or on-station during gravitational generator failures. \
+ These reverse-engineered knockoffs of Nanotrasen's 'Advanced Magboots' slow you down in simulated-gravity environments much like the standard issue variety."
+ item = /obj/item/clothing/shoes/magboots/syndie
+ cost = 5
+ gamemodes = list("nuclear emergency")
+
/datum/uplink_item/device_tools/plastic_explosives
name = "Composition C-4"
desc = "C-4 is plastic explosive of the common variety Composition C. You can use it to breach walls or connect a signaler to its wiring to make it remotely detonable. It has a modifiable timer with a minimum setting of 10 seconds."
@@ -755,7 +771,7 @@ var/list/uplink_items = list()
desc = "A crate containing 50 telecrystals worth of random syndicate leftovers."
cost = 20
item = /obj/item/weapon/storage/box/syndicate
- excludefrom = list(/datum/game_mode/nuclear)
+ excludefrom = list("nuclear emergency")
/datum/uplink_item/badass/surplus_crate/spawn_item(turf/loc, obj/item/device/uplink/U)
var/obj/structure/closet/crate/C = new(loc)
diff --git a/code/defines/procs/statistics.dm b/code/defines/procs/statistics.dm
index 810bfb79aac..91d065e5279 100644
--- a/code/defines/procs/statistics.dm
+++ b/code/defines/procs/statistics.dm
@@ -47,9 +47,11 @@ proc/sql_report_death(var/mob/living/carbon/human/H)
if(!H.key || !H.mind)
return
- var/turf/T = H.loc
- var/area/placeofdeath = get_area(T.loc)
- var/podname = placeofdeath.name
+ var/turf/T = get_turf(H)
+ var/area/placeofdeath = get_area(T)
+ var/podname = sanitizeSQL("Unknown Area")
+ if(placeofdeath)
+ podname = sanitizeSQL(placeofdeath.name)
var/sqlname = sanitizeSQL(H.real_name)
var/sqlkey = sanitizeSQL(H.key)
@@ -82,9 +84,11 @@ proc/sql_report_cyborg_death(var/mob/living/silicon/robot/H)
if(!H.key || !H.mind)
return
- var/turf/T = H.loc
- var/area/placeofdeath = get_area(T.loc)
- var/podname = placeofdeath.name
+ var/turf/T = get_turf(H)
+ var/area/placeofdeath = get_area(T)
+ var/podname = sanitizeSQL("Unknown Area")
+ if(placeofdeath)
+ podname = sanitizeSQL(placeofdeath.name)
var/sqlname = sanitizeSQL(H.real_name)
var/sqlkey = sanitizeSQL(H.key)
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index 21c1a4c03d0..5b498fe64cd 100644
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -1859,7 +1859,19 @@ area/security/podbay
name = "Derelict EVA Storage"
icon_state = "eva"
-/area/derelict/ship
+/area/shuttle/derelict/ship/start
+ name = "\improper Abandoned Ship"
+ icon_state = "yellow"
+
+/area/shuttle/derelict/ship/transit
+ name = "\improper Abandoned Ship"
+ icon_state = "yellow"
+
+/area/shuttle/derelict/ship/engipost
+ name = "\improper Abandoned Ship"
+ icon_state = "yellow"
+
+/area/shuttle/derelict/ship/station
name = "\improper Abandoned Ship"
icon_state = "yellow"
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 656a38928b3..71c8f732d48 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -14,6 +14,7 @@ var/global/list/ghdel_profiling = list()
var/pass_flags = 0
var/throwpass = 0
var/germ_level = GERM_LEVEL_AMBIENT // The higher the germ level, the more germ on the atom.
+ var/simulated = 1 //filter for actions - used by lighting overlays
///Chemistry.
var/datum/reagents/reagents = null
@@ -244,8 +245,8 @@ its easier to just keep the beam vertical.
/atom/proc/relaymove()
return
-
-//called to set the atom's dir and used to add behaviour to dir-changes - Not fully used (yet)
+
+//called to set the atom's dir and used to add behaviour to dir-changes - Not fully used (yet)
/atom/proc/set_dir(new_dir)
. = new_dir != dir
dir = new_dir
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 3edec6687eb..0cc4606419b 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -14,7 +14,6 @@
var/no_spin = 0
var/moved_recently = 0
var/mob/pulledby = null
- var/simulated //filter for actions - used by lighting overlays
var/area/areaMaster
var/hard_deleted = 0
@@ -269,4 +268,4 @@
return 1
/atom/movable/proc/water_act(var/volume, var/temperature, var/source) //amount of water acting : temperature of water in kelvin : object that called it (for shennagins)
- return 1
+ return 1
diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm
index febbc302eaa..6007d233512 100644
--- a/code/game/dna/genes/goon_powers.dm
+++ b/code/game/dna/genes/goon_powers.dm
@@ -59,13 +59,13 @@
var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T
var/light_available
if(L)
- light_available = max(0,min(10,L.lum_r + L.lum_g + L.lum_b)-5)
+ light_available = L.get_clamped_lum()*10
else
light_available = 5
if(light_available <= 2)
- M.alpha = round(255 * 1.15)
+ M.alpha = round(M.alpha * 0.8)
else
- M.alpha = round(255 * 0.80)
+ M.alpha = 255
//WAS: /datum/bioEffect/chameleon
/datum/dna/gene/basic/stealth/chameleon
diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm
index 1f668d64a81..46eba7bd3c8 100644
--- a/code/game/gamemodes/autotraitor/autotraitor.dm
+++ b/code/game/gamemodes/autotraitor/autotraitor.dm
@@ -20,12 +20,6 @@
possible_traitors = get_players_for_role(BE_TRAITOR)
- for(var/datum/mind/player in possible_traitors)
- for(var/job in restricted_jobs)
- if(player.assigned_role == job)
- possible_traitors -= player
-
-
for(var/mob/new_player/P in world)
if(P.client && P.ready)
num_players++
@@ -60,6 +54,7 @@
continue
if(istype(traitor))
traitor.special_role = "traitor"
+ traitor.restricted_roles = restricted_jobs
// if(!traitors.len)
// return 0
diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm
index 886ab3b5863..5e84aa1cfe9 100644
--- a/code/game/gamemodes/blob/blob.dm
+++ b/code/game/gamemodes/blob/blob.dm
@@ -47,6 +47,7 @@ var/list/blob_nodes = list()
var/datum/mind/blob = pick(possible_blobs)
infected_crew += blob
blob.special_role = "Blob"
+ blob.restricted_roles = restricted_jobs
log_game("[blob.key] (ckey) has been selected as a Blob")
possible_blobs -= blob
diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm
index c5be700afd4..5a9e5af05d7 100644
--- a/code/game/gamemodes/blob/overmind.dm
+++ b/code/game/gamemodes/blob/overmind.dm
@@ -118,4 +118,5 @@
else
return 0
-
+/mob/camera/experience_pressure_difference()
+ return 0
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index 8edd5e0c664..f9f5f309e03 100644
--- a/code/game/gamemodes/changeling/changeling.dm
+++ b/code/game/gamemodes/changeling/changeling.dm
@@ -51,11 +51,6 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
var/list/datum/mind/possible_changelings = get_players_for_role(BE_CHANGELING)
- for(var/datum/mind/player in possible_changelings)
- for(var/job in restricted_jobs)//Removing robots from the list
- if(player.assigned_role == job)
- possible_changelings -= player
-
changeling_amount = 1 + round(num_players() / 10)
if(possible_changelings.len>0)
@@ -64,6 +59,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
var/datum/mind/changeling = pick(possible_changelings)
possible_changelings -= changeling
changelings += changeling
+ changeling.restricted_roles = restricted_jobs
modePlayer += changelings
return 1
else
@@ -125,7 +121,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
var/mob/living/carbon/human/H = identity_theft.target.current
if(H.species && H.species.flags && H.species.flags & NO_SCAN) // For species that can't be absorbed - should default to an escape objective instead
return
- else
+ else
identity_theft.explanation_text = "Escape on the shuttle or an escape pod with the identity of [identity_theft.target_real_name], the [identity_theft.target.assigned_role] while wearing their identification card."
changeling.objectives += identity_theft
@@ -312,4 +308,4 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
user << "We already have this DNA in storage!"
return 1
-
+
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index c856fbd4b18..d909d394b76 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -65,10 +65,6 @@
restricted_jobs += protected_jobs
var/list/cultists_possible = get_players_for_role(BE_CULTIST)
- for(var/datum/mind/player in cultists_possible)
- for(var/job in restricted_jobs)//Removing heads and such from the list
- if(player.assigned_role == job)
- cultists_possible -= player
for(var/cultists_number = 1 to max_cultists_to_start)
if(!cultists_possible.len)
@@ -76,6 +72,7 @@
var/datum/mind/cultist = pick(cultists_possible)
cultists_possible -= cultist
cult += cultist
+ cultist.restricted_roles = restricted_jobs
return (cult.len>0)
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index 3636acdb2e1..98f1f81aafc 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -104,8 +104,9 @@ var/global/datum/controller/gameticker/ticker
//Configure mode and assign player to special mode stuff
src.mode.pre_pre_setup()
+ var/can_continue
+ can_continue = src.mode.pre_setup()//Setup special modes
job_master.DivideOccupations() //Distribute jobs
- var/can_continue = src.mode.pre_setup()//Setup special modes
if(!can_continue)
del(mode)
current_state = GAME_STATE_PREGAME
diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm
index 8d3a4fe1c17..9b7a5eabf9f 100644
--- a/code/game/gamemodes/nuclear/pinpointer.dm
+++ b/code/game/gamemodes/nuclear/pinpointer.dm
@@ -366,12 +366,16 @@
for(var/mob/living/carbon/M in mob_list)
if(M.mind in ticker.mode.syndicates)
nearest_op = M
+ if(!nearest_op) // There are simply no operatives left to point to
+ active = 0
+ icon_state = "pinoff"
/obj/item/weapon/pinpointer/operative/proc/workop()
scan_for_ops()
point_at(nearest_op, 0)
- spawn(5)
- .()
+ if(active && nearest_op)
+ spawn(5)
+ .()
/obj/item/weapon/pinpointer/operative/examine(mob/user)
..()
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index cb04e55949a..d41161b3e8f 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -55,17 +55,13 @@
head_check = 1
break
- for(var/datum/mind/player in possible_headrevs)
- for(var/job in restricted_jobs)//Removing heads and such from the list
- if(player.assigned_role == job)
- possible_headrevs -= player
-
for (var/i=1 to max_headrevs)
if (possible_headrevs.len==0)
break
var/datum/mind/lenin = pick(possible_headrevs)
possible_headrevs -= lenin
head_revolutionaries += lenin
+ lenin.restricted_roles = restricted_jobs
if((head_revolutionaries.len==0)||(!head_check))
return 0
diff --git a/code/game/gamemodes/revolution/rp_revolution.dm b/code/game/gamemodes/revolution/rp_revolution.dm
index 110ff5769d1..2bd8e2100d1 100644
--- a/code/game/gamemodes/revolution/rp_revolution.dm
+++ b/code/game/gamemodes/revolution/rp_revolution.dm
@@ -37,17 +37,13 @@
head_check = 1
break
- for(var/datum/mind/player in possible_headrevs)
- for(var/job in restricted_jobs)//Removing heads and such from the list
- if(player.assigned_role == job)
- possible_headrevs -= player
-
for (var/i=1 to max_headrevs)
if (possible_headrevs.len==0)
break
var/datum/mind/lenin = pick(possible_headrevs)
possible_headrevs -= lenin
head_revolutionaries += lenin
+ lenin.restricted_roles = restricted_jobs
if((head_revolutionaries.len==0)||(!head_check))
return 0
diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm
index bf7a19b5bbf..9915608946d 100644
--- a/code/game/gamemodes/shadowling/shadowling.dm
+++ b/code/game/gamemodes/shadowling/shadowling.dm
@@ -85,11 +85,6 @@ Made by Xhuis
if(!possible_shadowlings.len)
return 0
- for(var/datum/mind/player in possible_shadowlings)
- for(var/job in restricted_jobs)
- if(player.assigned_role == job)
- possible_shadowlings -= player
-
var/shadowlings = 2 //How many shadowlings there are; hardcoded to 2
while(shadowlings)
@@ -98,6 +93,7 @@ Made by Xhuis
possible_shadowlings -= shadow
modePlayer += shadow
shadow.special_role = "Shadowling"
+ shadow.restricted_roles = restricted_jobs
shadowlings--
return 1
diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm
index 926627a4a01..204f89a80ce 100644
--- a/code/game/gamemodes/traitor/traitor.dm
+++ b/code/game/gamemodes/traitor/traitor.dm
@@ -50,17 +50,13 @@
else
num_traitors = max(1, min(num_players(), traitors_possible))
- for(var/datum/mind/player in possible_traitors)
- for(var/job in restricted_jobs)
- if(player.assigned_role == job)
- possible_traitors -= player
-
for(var/j = 0, j < num_traitors, j++)
if (!possible_traitors.len)
break
var/datum/mind/traitor = pick(possible_traitors)
traitors += traitor
traitor.special_role = "traitor"
+ traitor.restricted_roles = restricted_jobs
possible_traitors.Remove(traitor)
if(!traitors.len)
diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm
index ec971e84e59..87d862e1aa4 100644
--- a/code/game/gamemodes/vampire/vampire.dm
+++ b/code/game/gamemodes/vampire/vampire.dm
@@ -52,11 +52,6 @@
var/list/datum/mind/possible_vampires = get_players_for_role(BE_VAMPIRE)
- for(var/datum/mind/player in possible_vampires)
- for(var/job in restricted_jobs)//Removing robots from the list
- if(player.assigned_role == job)
- possible_vampires -= player
-
vampire_amount = 1 + round(num_players() / 10)
if(possible_vampires.len>0)
@@ -65,6 +60,7 @@
var/datum/mind/vampire = pick(possible_vampires)
possible_vampires -= vampire
vampires += vampire
+ vampire.restricted_roles = restricted_jobs
modePlayer += vampires
return 1
else
diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm
index 8a59cb6d147..a3285863d0e 100644
--- a/code/game/gamemodes/vampire/vampire_powers.dm
+++ b/code/game/gamemodes/vampire/vampire_powers.dm
@@ -273,9 +273,9 @@
var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T
var/light_available
if(L)
- light_available = max(0,min(10,L.lum_r + L.lum_g + L.lum_b)-5)
+ light_available = L.get_clamped_lum(0.5)*10
else
- light_available = 5
+ light_available = 10
if(!istype(T))
return 0
@@ -446,7 +446,7 @@
if(T.y>world.maxy-outer_tele_radius || T.y max_lum) continue
diff --git a/code/game/gamemodes/xenos/xenos.dm b/code/game/gamemodes/xenos/xenos.dm
index b8f57122a7c..74b4bea15cd 100644
--- a/code/game/gamemodes/xenos/xenos.dm
+++ b/code/game/gamemodes/xenos/xenos.dm
@@ -153,7 +153,7 @@
/datum/game_mode/xenos/proc/get_nuke_code()
var/nukecode = "ERROR"
for(var/obj/machinery/nuclearbomb/bomb in world)
- if(bomb && bomb.r_code && bomb.z == 1)
+ if(bomb && bomb.r_code && bomb.z == ZLEVEL_STATION)
nukecode = bomb.r_code
return nukecode
diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm
index 4a6a299f318..90365fd0a3d 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -64,7 +64,7 @@
H.equip_or_collect(new /obj/item/clothing/under/rank/medical/mortician(H), slot_w_uniform)
H.equip_or_collect(new /obj/item/clothing/suit/storage/labcoat/mortician(H), slot_wear_suit)
if(H.backbag != 1)
- H.equip_or_collect(new /obj/item/clothing/head/surgery/black(H.back), slot_in_backpack)
+ H.equip_or_collect(new /obj/item/clothing/head/surgery/black(H.back), slot_in_backpack)
H.equip_or_collect(new /obj/item/weapon/autopsy_scanner(H.back), slot_in_backpack)
H.equip_or_collect(new /obj/item/device/mass_spectrometer(H.back), slot_in_backpack)
H.equip_or_collect(new /obj/item/weapon/storage/box/bodybags(H.back), slot_in_backpack)
@@ -222,7 +222,7 @@
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_wear_pda)
H.equip_or_collect(new /obj/item/device/flashlight/pen(H), slot_s_store)
if(H.backbag == 1)
H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm
index e6ae1d5d560..1f2e7ea2aa2 100644
--- a/code/game/jobs/job/science.dm
+++ b/code/game/jobs/job/science.dm
@@ -98,9 +98,11 @@
equip(var/mob/living/carbon/human/H)
if(!H) return 0
+ switch(H.backbag)
+ if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
+ if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
+ if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_or_collect(new /obj/item/device/radio/headset/headset_sci(H), slot_l_ear)
- if(H.backbag == 2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(H.backbag == 3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
H.equip_or_collect(new /obj/item/clothing/under/rank/roboticist(H), slot_w_uniform)
H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_or_collect(new /obj/item/device/pda/roboticist(H), slot_wear_pda)
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index 311d17383ba..906610f32af 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -110,6 +110,9 @@ var/global/datum/controller/occupations/job_master
if(flag && (!player.client.prefs.be_special & flag))
Debug("FOC flag failed, Player: [player], Flag: [flag], ")
continue
+ if(player.mind && job.title in player.mind.restricted_roles)
+ Debug("FOC incompatbile with antagonist role, Player: [player]")
+ continue
if(player.client.prefs.GetJobDepartment(job, level) & job.flag)
Debug("FOC pass, Player: [player], Level:[level]")
candidates += player
@@ -138,6 +141,10 @@ var/global/datum/controller/occupations/job_master
Debug("GRJ player not old enough, Player: [player]")
continue
+ if(player.mind && job.title in player.mind.restricted_roles)
+ Debug("GRJ incompatible with antagonist role, Player: [player], Job: [job.title]")
+ continue
+
if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1)
Debug("GRJ Random job given, Player: [player], Job: [job]")
AssignRole(player, job.title)
@@ -322,6 +329,10 @@ var/global/datum/controller/occupations/job_master
Debug("DO player not old enough, Player: [player], Job:[job.title]")
continue
+ if(player.mind && job.title in player.mind.restricted_roles)
+ Debug("DO incompatible with antagonist role, Player: [player], Job:[job.title]")
+ continue
+
if(!is_job_whitelisted(player, job.title))
Debug("DO player not whitelisted, Player: [player], Job:[job.title]")
continue
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index 88ec385db88..d7e56d66f5e 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -1323,7 +1323,7 @@ FIRE ALARM
pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24)
pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0
- if(z == 1 || z == 5)
+ if(z == ZLEVEL_STATION || ZLEVEL_ASTEROID == 5)
if(security_level)
src.overlays += image('icons/obj/monitors.dmi', "overlay_[get_security_level()]")
else
diff --git a/code/game/machinery/atmoalter/area_atmos_computer.dm b/code/game/machinery/atmoalter/area_atmos_computer.dm
index c055f7b70b4..f8e00b06950 100644
--- a/code/game/machinery/atmoalter/area_atmos_computer.dm
+++ b/code/game/machinery/atmoalter/area_atmos_computer.dm
@@ -10,12 +10,6 @@
var/range = 25
light_color = "#7BF9FF"
- power_change()
- ..()
- if(!(stat & (BROKEN|NOPOWER)))
- set_light(2)
- else
- set_light(0)
//Simple variable to prevent me from doing attack_hand in both this and the child computer
var/zone = "This computer is working on a wireless range, the range is currently limited to 25 meters."
diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm
index b627cca6e63..ab9a848d2ac 100644
--- a/code/game/machinery/bots/secbot.dm
+++ b/code/game/machinery/bots/secbot.dm
@@ -3,6 +3,7 @@
desc = "A little security robot. He looks less than thrilled."
icon = 'icons/obj/aibots.dmi'
icon_state = "secbot0"
+ light_color = "#FF0000"
layer = 5.0
density = 0
anchored = 0
@@ -217,14 +218,14 @@ Auto Patrol: []"},
switch(mode)
if(BOT_IDLE) // idle
-
+ flashing_lights() //make sure they disengage properly
walk_to(src,0)
look_for_perp() // see if any criminals are in range
if(!mode && auto_patrol) // still idle, and set to patrol
mode = BOT_START_PATROL // switch to patrol mode
if(BOT_HUNT) // hunting for perp
-
+ flashing_lights()
// if can't reach perp for long enough, go idle
if(frustration >= 8)
walk_to(src,0)
@@ -274,7 +275,7 @@ Auto Patrol: []"},
back_to_idle()
if(BOT_PREP_ARREST) // preparing to arrest target
-
+ flashing_lights() //make sure they disengage properly
// see if he got away. If he's no no longer adjacent or inside a closet or about to get up, we hunt again.
if( !Adjacent(target) || !isturf(target.loc) || target.weakened < 2 )
back_to_hunt()
@@ -410,6 +411,16 @@ Auto Patrol: []"},
target = user
mode = BOT_HUNT
+/obj/machinery/bot/secbot/proc/flashing_lights()
+ if(mode == BOT_HUNT)
+ switch(light_color)
+ if("#FF0000")
+ light_color = "#0000FF"
+ if("#0000FF")
+ light_color = "#FF0000"
+ else
+ light_color = "#FF0000"
+
//Secbot Construction
/obj/item/clothing/head/helmet/attackby(var/obj/item/device/assembly/signaler/S, mob/user as mob, params)
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index fdb6bfb0d00..7c24df85ba8 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -46,7 +46,7 @@
..()
/obj/machinery/camera/initialize()
- if(z == 1 && prob(3) && !start_active)
+ if(z == ZLEVEL_STATION && prob(3) && !start_active)
deactivate()
/obj/machinery/camera/Destroy()
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index 9794583f59e..37d9c46773a 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -198,6 +198,11 @@
name = "Circuit board (Mining Shuttle)"
build_path = "/obj/machinery/computer/shuttle_control/mining"
origin_tech = "programming=2"
+/obj/item/weapon/circuitboard/white_ship
+ name = "circuit Board (White Ship)"
+ desc = {"A dusty circuitboard, marked "property of the NGV Venal"."}
+ build_path = "/obj/machinery/computer/shuttle_control/multi/whiteship"
+ origin_tech = "programming=2"
/obj/item/weapon/circuitboard/engineering_shuttle
name = "Circuit board (Engineering Shuttle)"
build_path = "/obj/machinery/computer/shuttle_control/engineering"
diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index 5f1c0117048..7c8abadd7e9 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -280,6 +280,8 @@ var/camera_cache_id = 1
desc = "Damn, they better have Paradise TV on these things."
icon = 'icons/obj/status_display.dmi'
icon_state = "entertainment"
+ light_color = "#FFEEDB"
+ light_range_on = 2
network = list("news")
luminosity = 0
@@ -287,16 +289,20 @@ var/camera_cache_id = 1
name = "Security Camera Monitor"
desc = "An old TV hooked into the stations camera network."
icon_state = "security_det"
+ light_color = "#3848B3"
+ light_power_on = 0.5
network = list("SS13")
/obj/machinery/computer/security/mining
name = "Outpost Camera Monitor"
desc = "Used to access the various cameras on the outpost."
icon_state = "miningcameras"
+ light_color = "#F9BBFC"
network = list("Mining Outpost")
/obj/machinery/computer/security/engineering
name = "Engineering Camera Monitor"
desc = "Used to monitor fires and breaches."
icon_state = "engineeringcameras"
+ light_color = "#FAC54B"
network = list("Power Alarms","Atmosphere Alarms","Fire Alarms")
\ No newline at end of file
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index a44aa104e62..70e95c39a88 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -11,7 +11,7 @@
var/mode = 0.0
var/printing = null
- light_color = "#0000FF"
+ light_color = "#0099FF"
proc/is_centcom()
return istype(src, /obj/machinery/computer/card/centcom)
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 81aec1aed6c..f97aa4f3389 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -16,7 +16,7 @@
var/autoprocess = 0
var/data[0]
- light_color = "#0000FF"
+ light_color = "#315AB4"
/obj/machinery/computer/cloning/New()
..()
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index ecd428fca1e..fc082b5a0aa 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -58,7 +58,7 @@ var/shuttle_call/shuttle_calls[0]
var/datum/announcement/priority/crew_announcement = new
- light_color = "#0000FF"
+ light_color = "#0099FF"
/obj/machinery/computer/communications/New()
..()
@@ -264,7 +264,7 @@ var/shuttle_call/shuttle_calls[0]
if(..(user))
return
- if (!(src.z in list(STATION_Z, CENTCOMM_Z)))
+ if (!(src.z in list(ZLEVEL_STATION, ZLEVEL_CENTCOMM)))
user << "\red Unable to establish a connection: \black You're too far away from the station!"
return
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index fb995b4b487..03eb5db3dab 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -8,7 +8,9 @@
active_power_usage = 300
var/obj/item/weapon/circuitboard/circuit = null //if circuit==null, computer can't disassembly
var/processing = 0
- luminosity = 2
+
+ var/light_range_on = 3
+ var/light_power_on = 2
/obj/machinery/computer/New()
..()
@@ -92,10 +94,10 @@
/obj/machinery/computer/power_change()
..()
update_icon()
- if(!(stat & (BROKEN|NOPOWER)))
- set_light(2)
- else
+ if((stat & (BROKEN|NOPOWER)))
set_light(0)
+ else
+ set_light(light_range_on, light_power_on)
/obj/machinery/computer/proc/set_broken()
diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm
index 084eb974688..786c7dedaac 100644
--- a/code/game/machinery/computer/crew.dm
+++ b/code/game/machinery/computer/crew.dm
@@ -5,6 +5,7 @@
use_power = 1
idle_power_usage = 250
active_power_usage = 500
+ light_color = "#315AB4"
circuit = "/obj/item/weapon/circuitboard/crew"
var/obj/nano_module/crew_monitor/crew_monitor
diff --git a/code/game/machinery/computer/hologram.dm b/code/game/machinery/computer/hologram.dm
index ecb3ba58b3d..36e8cb54456 100644
--- a/code/game/machinery/computer/hologram.dm
+++ b/code/game/machinery/computer/hologram.dm
@@ -20,7 +20,7 @@
return
return
-/obj/machinery/computer/hologram_comp/DblClick()
+/obj/machinery/computer/hologram_comp/attack_hand()
if (!in_range(src, usr))
return 0
src.show_console(usr)
diff --git a/code/game/machinery/computer/honkputer.dm b/code/game/machinery/computer/honkputer.dm
index bd9d0344a2c..e5dde186881 100644
--- a/code/game/machinery/computer/honkputer.dm
+++ b/code/game/machinery/computer/honkputer.dm
@@ -3,6 +3,7 @@
desc = "A yellow computer used in case of critically low levels of HONK."
icon = 'icons/obj/machines/HONKputer.dmi'
icon_state = "honk"
+ light_color = "#FF33CC"
req_access = list(access_clown)
circuit = "/obj/item/weapon/circuitboard/HONKputer"
var/authenticated = 0
diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm
index 9cd5ca6a143..ebd7f37e195 100644
--- a/code/game/machinery/computer/law.dm
+++ b/code/game/machinery/computer/law.dm
@@ -9,6 +9,7 @@
var/opened = 0
light_color = "#FFFFFF"
+ light_range_on = 2
verb/AccessInternals()
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index c665214ed33..ec3460f2463 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -16,7 +16,7 @@
var/temp = null
var/printing = null
- light_color = "#0000FF"
+ light_color = "#315AB4"
/obj/machinery/computer/med_data/attack_ai(user as mob)
return src.attack_hand(user)
diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm
index 9cc273c1716..eca2511611c 100644
--- a/code/game/machinery/computer/message.dm
+++ b/code/game/machinery/computer/message.dm
@@ -8,6 +8,7 @@
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"
+ light_color = "#00b000"
var/hack_icon = "comm_logsc"
var/normal_icon = "comm_logs"
circuit = "/obj/item/weapon/circuitboard/message_monitor"
diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm
index 69c68ecf8aa..2311203b0d4 100644
--- a/code/game/machinery/computer/pod.dm
+++ b/code/game/machinery/computer/pod.dm
@@ -4,6 +4,7 @@
name = "Pod Launch Control"
desc = "A controll for launching pods. Some people prefer firing Mechas."
icon_state = "computer_generic"
+ light_color = "#00B000"
circuit = /obj/item/weapon/circuitboard/pod
var/id = 1.0
var/obj/machinery/mass_driver/connected = null
diff --git a/code/game/machinery/computer/pod_tracking_console.dm b/code/game/machinery/computer/pod_tracking_console.dm
index 5707e0d791f..f80026b2b41 100644
--- a/code/game/machinery/computer/pod_tracking_console.dm
+++ b/code/game/machinery/computer/pod_tracking_console.dm
@@ -2,6 +2,7 @@
name = "Pod Tracking Console"
icon = 'icons/obj/computer.dmi'
icon_state = "podtracking"
+ light_color = "#C860C8"
req_access = list(access_robotics)
circuit = "/obj/item/weapon/circuitboard/pod_locater"
diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm
index 3fa4f812240..e2347cce9eb 100644
--- a/code/game/machinery/computer/prisoner.dm
+++ b/code/game/machinery/computer/prisoner.dm
@@ -14,7 +14,7 @@
var/screen = 0 // 0 - No Access Denied, 1 - Access allowed
var/obj/item/weapon/card/id/prisoner/inserted_id
- light_color = "#B40000"
+ light_color = "#A91515"
attack_ai(var/mob/user as mob)
diff --git a/code/game/machinery/computer/prisonshuttle.dm b/code/game/machinery/computer/prisonshuttle.dm
index a5837969741..2e163a037cf 100644
--- a/code/game/machinery/computer/prisonshuttle.dm
+++ b/code/game/machinery/computer/prisonshuttle.dm
@@ -14,6 +14,7 @@ var/prison_shuttle_timeleft = 0
name = "Prison Shuttle Console"
icon = 'icons/obj/computer.dmi'
icon_state = "shuttle"
+ light_color = "#00ffff"
req_access = list(access_security)
circuit = "/obj/item/weapon/circuitboard/prison_shuttle"
var/temp = null
diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm
index 9f1781519ae..7430442ba5b 100644
--- a/code/game/machinery/computer/skills.dm
+++ b/code/game/machinery/computer/skills.dm
@@ -4,6 +4,7 @@
name = "Employment Records"
desc = "Used to view personnel's employment records"
icon_state = "medlaptop"
+ light_color = "#00b000"
req_one_access = list(access_heads)
circuit = "/obj/item/weapon/circuitboard/skills"
var/obj/item/weapon/card/id/scan = null
@@ -286,7 +287,7 @@ What a mess.*/
temp += "No"
//RECORD CREATE
if ("New Record (General)")
-
+
if(PDA_Manifest.len)
PDA_Manifest.Cut()
var/datum/data/record/G = new /datum/data/record()
diff --git a/code/game/machinery/computer/specops_shuttle.dm b/code/game/machinery/computer/specops_shuttle.dm
index 68ded19320d..3171da666c1 100644
--- a/code/game/machinery/computer/specops_shuttle.dm
+++ b/code/game/machinery/computer/specops_shuttle.dm
@@ -15,6 +15,7 @@ var/specops_shuttle_timeleft = 0
name = "Spec. Ops. Shuttle Console"
icon = 'icons/obj/computer.dmi'
icon_state = "shuttle"
+ light_color = "#00ffff"
req_access = list(access_cent_specops)
// req_access = list(ACCESS_CENT_SPECOPS)
var/temp = null
@@ -93,14 +94,14 @@ var/specops_shuttle_timeleft = 0
for(var/obj/machinery/computer/specops_shuttle/S in world)
S.specops_shuttle_timereset = world.time + SPECOPS_RETURN_DELAY
-
+
del(announcer)
/proc/specops_process()
var/area/centcom/specops/special_ops = locate()//Where is the specops area located?
var/obj/item/device/radio/intercom/announcer = new /obj/item/device/radio/intercom(null)//We need a fake AI to announce some stuff below. Otherwise it will be wonky.
announcer.config(list("Response Team" = 0))
-
+
var/message_tracker[] = list(0,1,2,3,5,10,30,45)//Create a a list with potential time values.
var/message = "\"THE SPECIAL OPERATIONS SHUTTLE IS PREPARING FOR LAUNCH\""//Initial message shown.
if(announcer)
@@ -234,7 +235,7 @@ var/specops_shuttle_timeleft = 0
for(var/obj/machinery/computer/specops_shuttle/S in world)
S.specops_shuttle_timereset = world.time + SPECOPS_RETURN_DELAY
-
+
del(announcer)
/proc/specops_can_move()
diff --git a/code/game/machinery/computer/store.dm b/code/game/machinery/computer/store.dm
index 4ac0a7e315a..f110ca0dfd1 100644
--- a/code/game/machinery/computer/store.dm
+++ b/code/game/machinery/computer/store.dm
@@ -4,7 +4,7 @@
icon_state = "comm_logs"
circuit = "/obj/item/weapon/circuitboard/merch"
- light_color = "#50AB00"
+ light_color = "#00CC00"
/obj/item/weapon/circuitboard/merch
name = "\improper Merchandise Computer Circuitboard"
diff --git a/code/game/machinery/computer/syndicate_specops_shuttle.dm b/code/game/machinery/computer/syndicate_specops_shuttle.dm
index 969f3373729..7c2f3c3987d 100644
--- a/code/game/machinery/computer/syndicate_specops_shuttle.dm
+++ b/code/game/machinery/computer/syndicate_specops_shuttle.dm
@@ -14,6 +14,7 @@ var/syndicate_elite_shuttle_timeleft = 0
name = "Elite Syndicate Squad Shuttle Console"
icon = 'icons/obj/computer.dmi'
icon_state = "syndishuttle"
+ light_color = "#00ffff"
req_access = list(access_syndicate)
var/temp = null
var/hacked = 0
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 04d83139453..30db6a7d225 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -307,6 +307,13 @@
W.loc = src
if(W.contents.len) //Make sure we catch anything not handled by del() on the items.
+ var/preserve = null
+ for(var/T in preserve_items)
+ if(istype(W,T))
+ preserve = 1
+ break
+ if(preserve) // Don't remove the contents of things that need preservation
+ continue
for(var/obj/item/O in W.contents)
if(istype(O,/obj/item/weapon/tank)) //Stop eating pockets, you fuck!
continue
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 2c0bd7a6ae9..7fbc689bbbb 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -239,7 +239,7 @@
sleep(5)
src.density = 0
sleep(5)
- src.layer = 2.7
+ src.layer = open_layer
update_icon()
set_opacity(0)
operating = 0
@@ -263,7 +263,7 @@
operating = 1
do_animate("closing")
- src.layer = 3.1
+ src.layer = closed_layer
sleep(5)
src.density = 1
sleep(5)
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index afe8fe92580..da899d48626 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -18,6 +18,7 @@
var/nextstate = null
var/logged_users
+ closed_layer = 3.11
/obj/machinery/door/firedoor/New()
. = ..()
diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm
index 9c3b04f36d6..37a892f940b 100644
--- a/code/game/machinery/floodlight.dm
+++ b/code/game/machinery/floodlight.dm
@@ -11,7 +11,9 @@
var/use = 5
var/unlocked = 0
var/open = 0
- var/brightness_on = 999 //can't remember what the maxed out value is
+ var/brightness_on = 14
+ light_power = 20
+ //var/brightness_on = 999 //can't remember what the maxed out value is //Lighting overhaul: No max, stop TRYING TO ILLUMINATE MORE TILES THAN THE MAP CONSISTS OF.
/obj/machinery/floodlight/New()
src.cell = new(src)
diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm
index b9ab86027ce..e815ffc3257 100644
--- a/code/game/machinery/kitchen/gibber.dm
+++ b/code/game/machinery/kitchen/gibber.dm
@@ -233,11 +233,11 @@
user << "Subject may not have abiotic items on."
return
- user.visible_message("\red [user] starts to put [victim] into the gibber!")
+ user.visible_message("[user] starts to put [victim] into the gibber!")
src.add_fingerprint(user)
if(do_after(user, 30) && user.Adjacent(src) && victim.Adjacent(user) && !occupant)
- user.visible_message("\red [user] stuffs [victim] into the gibber!")
+ user.visible_message("[user] stuffs [victim] into the gibber!")
if(victim.client)
victim.client.perspective = EYE_PERSPECTIVE
diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm
index 17b260747dd..1fba31f1da9 100644
--- a/code/game/machinery/kitchen/microwave.dm
+++ b/code/game/machinery/kitchen/microwave.dm
@@ -33,7 +33,11 @@
if (!available_recipes)
available_recipes = new
for (var/type in (typesof(/datum/recipe/microwave)-/datum/recipe/microwave))
- available_recipes+= new type
+ var/datum/recipe/recipe = new type
+ if(recipe.result) // Ignore recipe subtypes that lack a result
+ available_recipes += recipe
+ else
+ del(recipe)
acceptable_items = new
acceptable_reagents = new
for (var/datum/recipe/microwave/recipe in available_recipes)
diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm
index acf9f023c91..f553034eb19 100644
--- a/code/game/machinery/pipe/construction.dm
+++ b/code/game/machinery/pipe/construction.dm
@@ -422,7 +422,7 @@ Buildable meters
var/turf/T = P.loc
P.level = T.intact ? 2 : 1
P.initialize()
- if (!P)
+ if (!P || (!P.node1 && !P.node2) )
usr << pipefailtext
return 1
P.build_network()
@@ -434,7 +434,6 @@ Buildable meters
P.node2.build_network()
machineReference = P
-
if(PIPE_SUPPLY_STRAIGHT, PIPE_SUPPLY_BENT)
var/obj/machinery/atmospherics/pipe/simple/hidden/supply/P = new( src.loc )
P.color = color
@@ -443,7 +442,7 @@ Buildable meters
var/turf/T = P.loc
P.level = T.intact ? 2 : 1
P.initialize()
- if (!P)
+ if (!P || (!P.node1 && !P.node2) )
usr << pipefailtext
return 1
P.build_network()
@@ -463,7 +462,7 @@ Buildable meters
var/turf/T = P.loc
P.level = T.intact ? 2 : 1
P.initialize()
- if (!P)
+ if (!P || (!P.node1 && !P.node2) )
usr << pipefailtext
return 1
P.build_network()
@@ -483,7 +482,7 @@ Buildable meters
var/turf/T = P.loc
P.level = T.intact ? 2 : 1
P.initialize()
- if (!P)
+ if (!P || (!P.node1 && !P.node2) )
usr << pipefailtext
return 1
P.build_network()
@@ -694,7 +693,7 @@ Buildable meters
//var/turf/T = P.loc
//P.level = T.intact ? 2 : 1
P.initialize()
- if (!P)
+ if (!P || (!P.node1 && !P.node2) )
usr << pipefailtext //"There's nothing to connect this pipe to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)"
return 1
P.build_network()
@@ -887,7 +886,7 @@ Buildable meters
var/turf/T = P.loc
P.level = T.intact ? 2 : 1
P.initialize()
- if (!P)
+ if (!P || (!P.node1 && !P.node2) )
usr << pipefailtext
return 1
P.build_network()
diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm
index 55a4e604e0f..98d7835bdb6 100644
--- a/code/game/machinery/telecomms/machine_interactions.dm
+++ b/code/game/machinery/telecomms/machine_interactions.dm
@@ -188,11 +188,11 @@
var/turf/position = get_turf(src)
// Toggle on/off getting signals from the station or the current Z level
- if(src.listening_level == STATION_Z) // equals the station
+ if(src.listening_level == ZLEVEL_STATION) // equals the station
src.listening_level = position.z
return 1
- else if(position.z == TELECOMM_Z)
- src.listening_level = STATION_Z
+ else if(position.z == ZLEVEL_TELECOMMS)
+ src.listening_level = ZLEVEL_STATION
return 1
return 0
@@ -241,8 +241,8 @@
/obj/machinery/telecomms/relay/Options_Menu()
var/dat = ""
- if(src.z == TELECOMM_Z)
- dat += "
Signal Locked to Station: [listening_level == STATION_Z ? "TRUE" : "FALSE"]"
+ if(src.z == ZLEVEL_TELECOMMS)
+ dat += "
Signal Locked to Station: [listening_level == ZLEVEL_STATION ? "TRUE" : "FALSE"]"
dat += "
Broadcasting: [broadcasting ? "YES" : "NO"]"
dat += "
Receiving: [receiving ? "YES" : "NO"]"
return dat
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index e6bf09f19af..7b69d8fdee2 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -168,9 +168,7 @@
/obj/machinery/vending/RefreshParts() //Better would be to make constructable child
if(component_parts)
- build_inventory(products, start_empty = 1)
- build_inventory(contraband, 1, 1)
- build_inventory(premium, 0, 1, 1)
+ build_inventory()
for(var/obj/item/weapon/vending_refill/VR in component_parts)
refill_inventory(VR, product_records)
@@ -1017,7 +1015,7 @@
vend_delay = 15
vend_reply = "Have an enchanted evening!"
product_ads = "FJKLFJSD;AJKFLBJAKL;1234 LOONIES LOL!;>MFW;Kill them fuckers!;GET DAT FUKKEN DISK;HONK!;EI NATH;Destroy the station!;Admin conspiracies since forever!;Space-time bending hardware!"
- products = list(/obj/item/clothing/head/wizard = 1,/obj/item/clothing/suit/wizrobe = 1,/obj/item/clothing/head/wizard/red = 1,/obj/item/clothing/suit/wizrobe/red = 1,/obj/item/clothing/shoes/sandal = 1,/obj/item/weapon/staff = 2)
+ products = list(/obj/item/clothing/head/wizard = 1,/obj/item/clothing/suit/wizrobe = 1,/obj/item/clothing/head/wizard/red = 1,/obj/item/clothing/suit/wizrobe/red = 1,/obj/item/clothing/shoes/sandal = 1,/obj/item/weapon/twohanded/staff = 2)
/obj/machinery/vending/autodrobe
name = "\improper AutoDrobe"
@@ -1038,13 +1036,13 @@
/obj/item/clothing/under/pirate = 1,/obj/item/clothing/suit/pirate_brown = 1,/obj/item/clothing/suit/pirate_black =1,/obj/item/clothing/under/pirate_rags =1,/obj/item/clothing/head/pirate = 1,/obj/item/clothing/head/bandana = 1,
/obj/item/clothing/head/bandana = 1,/obj/item/clothing/under/soviet = 1,/obj/item/clothing/head/ushanka = 1,/obj/item/clothing/suit/imperium_monk = 1,
/obj/item/clothing/mask/gas/cyborg = 1,/obj/item/clothing/suit/holidaypriest = 1,/obj/item/clothing/head/wizard/marisa/fake = 1,
- /obj/item/clothing/suit/wizrobe/marisa/fake = 1,/obj/item/clothing/under/sundress = 1,/obj/item/clothing/head/witchwig = 1,/obj/item/weapon/staff/broom = 1,
- /obj/item/clothing/suit/wizrobe/fake = 1,/obj/item/clothing/head/wizard/fake = 1,/obj/item/weapon/staff = 3,/obj/item/clothing/mask/gas/sexyclown = 1,
+ /obj/item/clothing/suit/wizrobe/marisa/fake = 1,/obj/item/clothing/under/sundress = 1,/obj/item/clothing/head/witchwig = 1,/obj/item/weapon/twohanded/staff/broom = 1,
+ /obj/item/clothing/suit/wizrobe/fake = 1,/obj/item/clothing/head/wizard/fake = 1,/obj/item/weapon/twohanded/staff = 3,/obj/item/clothing/mask/gas/sexyclown = 1,
/obj/item/clothing/under/sexyclown = 1,/obj/item/clothing/mask/gas/sexymime = 1,/obj/item/clothing/under/sexymime = 1,/obj/item/clothing/suit/apron/overalls = 1,
/obj/item/clothing/head/rabbitears =1, /obj/item/clothing/head/sombrero = 1, /obj/item/clothing/suit/poncho = 1,
/obj/item/clothing/suit/poncho/green = 1, /obj/item/clothing/suit/poncho/red = 1, /obj/item/clothing/accessory/blue = 1, /obj/item/clothing/accessory/red = 1, /obj/item/clothing/accessory/black = 1, /obj/item/clothing/accessory/horrible = 1,
/obj/item/clothing/under/maid = 1, /obj/item/clothing/under/janimaid = 1, /obj/item/clothing/under/pants/camo = 1, /obj/item/clothing/mask/bandana = 1, /obj/item/clothing/mask/bandana/black = 1)
- contraband = list(/obj/item/clothing/suit/judgerobe = 1,/obj/item/clothing/head/powdered_wig = 1,/obj/item/weapon/gun/magic/wand = 1, /obj/item/clothing/mask/balaclava=1)
+ contraband = list(/obj/item/clothing/suit/judgerobe = 1,/obj/item/clothing/head/powdered_wig = 1,/obj/item/weapon/gun/magic/wand = 1, /obj/item/clothing/mask/balaclava=1, /obj/item/clothing/mask/horsehead = 2)
premium = list(/obj/item/clothing/suit/hgpirate = 1, /obj/item/clothing/head/hgpiratecap = 1, /obj/item/clothing/head/helmet/roman = 1, /obj/item/clothing/head/helmet/roman/legionaire = 1, /obj/item/clothing/under/roman = 1, /obj/item/clothing/shoes/roman = 1)
refill_canister = /obj/item/weapon/vending_refill/autodrobe
diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm
index 8de93482907..5925d46fc61 100644
--- a/code/game/mecha/mech_bay.dm
+++ b/code/game/mecha/mech_bay.dm
@@ -38,7 +38,7 @@
component_parts += new /obj/item/stack/cable_coil(src, 1)
RefreshParts()
locate_recharge_turf()
-
+
/obj/machinery/mech_bay_recharge_port/upgraded/New()
..()
component_parts = list()
@@ -99,6 +99,7 @@
anchored = 1
icon = 'icons/obj/computer.dmi'
icon_state = "recharge_comp"
+ light_color = "#a97faa"
circuit = /obj/item/weapon/circuitboard/mech_bay_power_console
var/obj/machinery/mech_bay_recharge_port/recharge_port
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index faf33ba5682..356936dbe81 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -69,6 +69,7 @@
var/obj/item/mecha_parts/mecha_equipment/selected
var/max_equip = 3
var/datum/events/events
+ var/turf/crashing = null
var/stepsound = 'sound/mecha/mechturn.ogg'
@@ -365,6 +366,61 @@
/obj/mecha/Bump(var/atom/obstacle)
// src.inertia_dir = null
+ if(src.throwing)//high velocity mechas in your face!
+ var/breakthrough = 0
+ if(istype(obstacle, /obj/structure/window/))
+ obstacle.Destroy(brokenup = 1)
+ breakthrough = 1
+
+ else if(istype(obstacle, /obj/structure/grille/))
+ var/obj/structure/grille/G = obstacle
+ G.health = (0.25*initial(G.health))
+ G.destroyed = 1
+ G.icon_state = "[initial(G.icon_state)]-b"
+ G.density = 0
+ getFromPool(/obj/item/stack/rods, get_turf(G.loc))
+ breakthrough = 1
+
+ else if(istype(obstacle, /obj/structure/table))
+ var/obj/structure/table/T = obstacle
+ T.destroy()
+ breakthrough = 1
+
+ else if(istype(obstacle, /obj/structure/rack))
+ new /obj/item/weapon/rack_parts(obstacle.loc)
+ qdel(obstacle)
+ breakthrough = 1
+
+ else if(istype(obstacle, /obj/structure/reagent_dispensers/fueltank))
+ obstacle.ex_act(1)
+
+ else if(istype(obstacle, /mob/living))
+ var/mob/living/L = obstacle
+ var/hit_sound = list('sound/weapons/genhit1.ogg','sound/weapons/genhit2.ogg','sound/weapons/genhit3.ogg')
+ if(L.flags & GODMODE)
+ return
+ L.take_overall_damage(5,0)
+ if(L.buckled)
+ L.buckled = 0
+ L.Stun(5)
+ L.Weaken(5)
+ L.apply_effect(STUTTER, 5)
+ playsound(src, pick(hit_sound), 50, 0, 0)
+ breakthrough = 1
+
+ else
+ src.throwing = 0//so mechas don't get stuck when landing after being sent by a Mass Driver
+ src.crashing = null
+
+ if(breakthrough)
+ if(crashing)
+ spawn(1)
+ src.throw_at(crashing, 50, src.throw_speed)
+ else
+ spawn(1)
+ crashing = get_distant_turf(get_turf(src), dir, 3)//don't use get_dir(src, obstacle) or the mech will stop if he bumps into a one-direction window on his tile.
+ src.throw_at(crashing, 50, src.throw_speed)
+
if(istype(obstacle, /obj))
var/obj/O = obstacle
if(istype(O, /obj/effect/portal)) //derpfix
diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm
index da461662f8f..a56dc0db575 100644
--- a/code/game/mecha/mecha_control_console.dm
+++ b/code/game/mecha/mecha_control_console.dm
@@ -2,6 +2,7 @@
name = "Exosuit Control"
icon = 'icons/obj/computer.dmi'
icon_state = "mecha"
+ light_color = "#a97faa"
req_access = list(access_robotics)
circuit = "/obj/item/weapon/circuitboard/mecha_control"
var/list/located = list()
diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm
index 2e00c5d99d8..5b13f3258dc 100644
--- a/code/game/objects/effects/landmarks.dm
+++ b/code/game/objects/effects/landmarks.dm
@@ -39,7 +39,7 @@
if("JoinLate")
latejoin += loc
del(src)
-
+
if("JoinLateGateway")
latejoin_gateway += loc
del(src)
@@ -47,7 +47,7 @@
if("JoinLateCryo")
latejoin_cryo += loc
del(src)
-
+
if("JoinLateCyborg")
latejoin_cyborg += loc
del(src)
@@ -90,7 +90,7 @@
if("carpspawn")
carplist += loc
-
+
if("voxstart")
raider_spawn += loc
@@ -252,13 +252,13 @@
/obj/effect/landmark/costume/cutewitch/New()
new /obj/item/clothing/under/sundress(src.loc)
new /obj/item/clothing/head/witchwig(src.loc)
- new /obj/item/weapon/staff/broom(src.loc)
+ new /obj/item/weapon/twohanded/staff/broom(src.loc)
del(src)
/obj/effect/landmark/costume/fakewizard/New()
new /obj/item/clothing/suit/wizrobe/fake(src.loc)
new /obj/item/clothing/head/wizard/fake(src.loc)
- new /obj/item/weapon/staff/(src.loc)
+ new /obj/item/weapon/twohanded/staff/(src.loc)
del(src)
/obj/effect/landmark/costume/sexyclown/New()
diff --git a/code/game/objects/effects/sm_crystals.dm b/code/game/objects/effects/sm_crystals.dm
new file mode 100644
index 00000000000..d725b23d0bc
--- /dev/null
+++ b/code/game/objects/effects/sm_crystals.dm
@@ -0,0 +1,179 @@
+//separate dm since hydro is getting bloated already
+
+/obj/effect/supermatter_crystal
+ name = "supermatter growth"
+ anchored = 1
+ opacity = 0
+ density = 0
+ icon = 'icons/obj/lighting.dmi'
+ icon_state = "supermatter_crystalf"
+ layer = 2.1
+ light_color = "#8A8A00"
+
+ var/endurance = 100
+ var/delay = 1200
+ var/floor = 0
+ var/spreadChance = 10
+ var/spreadIntoAdjacentChance = 10
+ var/lastTick = 0
+ var/spreaded = 1
+ var/deleted = 0
+
+/obj/effect/supermatter_crystal/single
+ spreadChance = 0
+
+/obj/effect/supermatter_crystal/New()
+ ..()
+ light_color = "#8A8A00"
+
+ dir = CalcDir()
+
+ if(!floor)
+ switch(dir) //offset to make it be on the wall rather than on the floor
+ if(NORTH)
+ pixel_y = 32
+ if(SOUTH)
+ pixel_y = -32
+ if(EAST)
+ pixel_x = 32
+ if(WEST)
+ pixel_x = -32
+ icon_state = "supermatter_crystal"
+ else
+ if( prob( 10 )) // Only 10% of all floor crystals survive, so there's not a forest of 'em
+ icon_state = "supermatter_crystalf"
+ name = "supermatter crystal"
+ density = 1
+ else
+ deleted = 1
+ del( src )
+
+ processing_objects += src
+
+ set_light(3)
+ lastTick = world.timeofday
+
+/obj/effect/supermatter_crystal/Del()
+ if( !deleted )
+ visible_message("\red \The [src] shatters!")
+ new /obj/item/weapon/shard/supermatter( src.loc )
+
+ processing_objects -= src
+ ..()
+
+/obj/effect/supermatter_crystal/process()
+ if(!spreaded)
+ return
+
+ if(((world.timeofday - lastTick) > delay) || ((world.timeofday - lastTick) < 0))
+ lastTick = world.timeofday
+ spreaded = 0
+
+ for(var/mob/living/l in range( src, 2 ))
+ var/rads = 5
+ l.apply_effect(rads, IRRADIATE)
+
+ for(var/i=1,i<=3,i++)
+ if(prob(spreadChance))
+ var/list/possibleLocs = list()
+ var/spreadsIntoAdjacent = 0
+
+ if(prob(spreadIntoAdjacentChance))
+ spreadsIntoAdjacent = 1
+
+ for(var/turf/simulated/floor/floor in view(3,src))
+ if(spreadsIntoAdjacent || !locate(/obj/effect/supermatter_crystal) in view(1,floor))
+ possibleLocs += floor
+
+ if(!possibleLocs.len)
+ break
+
+ var/turf/newLoc = pick(possibleLocs)
+
+ var/crystalCount = 0 //hacky
+ var/placeCount = 1
+ for(var/obj/effect/supermatter_crystal/shroom in newLoc)
+ crystalCount++
+ for(var/wallDir in cardinal)
+ var/turf/isWall = get_step(newLoc,wallDir)
+ if(isWall.density)
+ placeCount++
+ if(crystalCount >= placeCount)
+ continue
+
+ var/obj/effect/supermatter_crystal/child = new /obj/effect/supermatter_crystal(newLoc)
+ if( child )
+ child.delay = delay
+ child.endurance = endurance
+
+ spreaded++
+
+/obj/effect/supermatter_crystal/proc/CalcDir(turf/location = loc)
+ for(var/wallDir in cardinal)
+ var/turf/newTurf = get_step(location,wallDir)
+ if(newTurf.density)
+ return wallDir
+
+/*
+ var/direction = 16
+
+ for(var/wallDir in cardinal)
+ var/turf/newTurf = get_step(location,wallDir)
+ if(newTurf.density)
+ direction |= wallDir
+
+ for(var/obj/effect/supermatter_crystal/crystal in location)
+ if(crystal == src)
+ continue
+ if(crystal.floor) //special
+ direction &= ~16
+ else
+ direction &= ~crystal.dir
+
+ var/list/dirList = list()
+
+ for(var/i=1,i<=16,i <<= 1)
+ if(direction & i)
+ dirList += i
+
+ if(dirList.len)
+ var/newDir = pick(dirList)
+ if(newDir == 16)
+ floor = 1
+ newDir = 1
+ return newDir
+*/
+ floor = 1
+ return 1
+
+/obj/effect/supermatter_crystal/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ ..()
+
+ endurance -= W.force
+
+ CheckEndurance()
+
+/obj/effect/supermatter_crystal/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ del(src)
+ return
+ if(2.0)
+ if (prob(50))
+ del(src)
+ return
+ if(3.0)
+ if (prob(5))
+ del(src)
+ return
+ else
+ return
+
+/obj/effect/supermatter_crystal/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ if(exposed_temperature > 300)
+ endurance -= 5
+ CheckEndurance()
+
+/obj/effect/supermatter_crystal/proc/CheckEndurance()
+ if(endurance <= 0)
+ del(src)
\ No newline at end of file
diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm
index 59a7e666623..89203c7f193 100644
--- a/code/game/objects/explosion.dm
+++ b/code/game/objects/explosion.dm
@@ -143,7 +143,7 @@ proc/secondaryexplosion(turf/epicenter, range)
var/newmode = alert("Use reactionary explosions?","Check Bomb Impact", "Yes", "No")
- var/turf/epicenter = get_turf(src)
+ var/turf/epicenter = get_turf(usr)
var/dev = 0
var/heavy = 0
var/light = 0
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index a6879546e11..f73a366ea94 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -634,7 +634,7 @@
eyes.take_damage(rand(3,4), 1)
if(eyes.damage >= eyes.min_bruised_damage)
if(M.stat != 2)
- if(!(eyes & ORGAN_ROBOT) || !(eyes & ORGAN_ASSISTED)) //robot eyes bleeding might be a bit silly
+ if(!(eyes.status & ORGAN_ROBOT) || !(eyes.status & ORGAN_ASSISTED)) //robot eyes bleeding might be a bit silly
M << "\red Your eyes start to bleed profusely!"
if(prob(50))
if(M.stat != 2)
diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm
index c37b6269274..8ae98e7db1f 100644
--- a/code/game/objects/items/candle.dm
+++ b/code/game/objects/items/candle.dm
@@ -6,6 +6,8 @@
item_state = "candle1"
w_class = 1
+ light_color = "#E09D37"
+
var/wax = 200
var/lit = 0
proc
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index b84f41f1fde..91e264715b0 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -116,7 +116,8 @@
name = "flare"
desc = "A red Nanotrasen issued flare. There are instructions on the side, it reads 'pull cord, make light'."
w_class = 2.0
- brightness_on = 7 // Pretty bright.
+ brightness_on = 8 // Made it brighter (from 7 to 8).
+ light_color = "#ff0000" // changed colour to a more brighter red.
icon_state = "flare"
item_state = "flare"
var/fuel = 0
@@ -174,6 +175,7 @@
item_state = "slime"
w_class = 1
brightness_on = 6
+ light_color = "#FFBF00"
on = 1 //Bio-luminesence has one setting, on.
/obj/item/device/flashlight/slime/New()
@@ -221,7 +223,7 @@
"[user] blinks \the [src] at \the [A].")
if(ismob(A))
var/mob/M = A
- add_logs(user, M, "attacked", object="EMP-light")
+ add_logs(M, user, "attacked", object="EMP-light")
user << "\The [src] now has [emp_cur_charges] charge\s."
A.emp_act(1)
else
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index de473470896..019e5f02896 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -227,6 +227,8 @@ REAGENT SCANNER
for(var/name in H.organs_by_name)
var/obj/item/organ/external/e = H.organs_by_name[name]
+ if(!e)
+ continue
if(e.status & ORGAN_BROKEN)
user.show_message(text("\red Bone fractures detected. Advanced scanner required for location."), 1)
break
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index 884bf6ebb8a..834dcd33d02 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -28,6 +28,10 @@
if(!M.can_inject(user, 1))
return 1
+ if(!affecting)
+ user << "That limb is missing!"
+ return 1
+
if(affecting.status & ORGAN_ROBOT)
user << "This can't be used on a robotic limb."
return 1
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 6386a2f1292..6dea213ac13 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -460,7 +460,7 @@
/obj/item/toy/crayon/New()
..()
name = "[colourName] crayon" //Makes crayons identifiable in things like grinders
- drawtype = pick(pick(graffiti), pick(letters), "rune[rand(1,6)]")
+ drawtype = pick(pick(graffiti), pick(letters), "rune[rand(1,10)]")
/obj/item/toy/crayon/attack_self(mob/living/user as mob)
update_window(user)
@@ -471,7 +471,7 @@
dat += "
"
dat += "Runes:
"
dat += "Random rune"
- for(var/i = 1; i <= 6; i++)
+ for(var/i = 1; i <= 10; i++)
dat += "Rune[i]"
if(!((i + 1) % 3)) //3 buttons in a row
dat += "
"
@@ -500,7 +500,7 @@
if("letter")
temp = input("Choose the letter.", "Scribbles") in letters
if("random_rune")
- temp = "rune[rand(1,6)]"
+ temp = "rune[rand(1,10)]"
if("random_graffiti")
temp = pick(graffiti)
else
diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm
index f0035bb8933..e6ca596f519 100644
--- a/code/game/objects/items/weapons/cigs_lighters.dm
+++ b/code/game/objects/items/weapons/cigs_lighters.dm
@@ -119,6 +119,7 @@ LIGHTERS ARE IN LIGHTERS.DM
item_state = icon_on
var/turf/T = get_turf(src)
T.visible_message(flavor_text)
+ set_light(2, 0.25, "#E38F46")
processing_objects.Add(src)
@@ -165,6 +166,7 @@ LIGHTERS ARE IN LIGHTERS.DM
/obj/item/clothing/mask/cigarette/proc/die()
var/turf/T = get_turf(src)
+ set_light(0)
var/obj/item/butt = new type_butt(T)
transfer_fingerprints_to(butt)
if(ismob(loc))
diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm
index 84dc2d0c8b7..0b27c34c607 100644
--- a/code/game/objects/items/weapons/clown_items.dm
+++ b/code/game/objects/items/weapons/clown_items.dm
@@ -27,6 +27,8 @@
return
if(istype(M, /mob/living/carbon/human) && M:species.bodyflags & FEET_NOSLIP)
return
+ if(M.flying)
+ return
M.stop_pulling()
M << "\blue You slipped on the [name]!"
@@ -42,6 +44,8 @@
var/mob/M = AM
if (istype(M, /mob/living/carbon/human) && (isobj(M:shoes) && M:shoes.flags&NOSLIP) || M.buckled)
return
+ if(M.flying)
+ return
M.stop_pulling()
M << "\blue You slipped on the [name]!"
@@ -57,7 +61,7 @@
user << "You need to take that [target.name] off before cleaning it."
else if(istype(target,/obj/effect/decal/cleanable))
user.visible_message("[user] begins to scrub \the [target.name] out with [src].")
- if(do_after(user, src.cleanspeed))
+ if(do_after(user, src.cleanspeed) && target)
user << "You scrub \the [target.name] out."
del(target)
else
diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index b0ef2bb03db..58ebf621f7d 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -325,7 +325,7 @@
H.updatehealth() //forces health update before next life tick
playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
H.emote("gasp")
- add_logs(user, M, "stunned", object="defibrillator")
+ add_logs(M, user, "stunned", object="defibrillator")
defib.deductcharge(revivecost)
cooldown = 1
busy = 0
@@ -379,7 +379,7 @@
if(tplus > tloss)
H.setBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100))))
defib.deductcharge(revivecost)
- add_logs(user, M, "revived", object="defibrillator")
+ add_logs(M, user, "revived", object="defibrillator")
else
if(tplus > tlimit)
user.visible_message("[defib] buzzes: Resuscitation failed - Heart tissue damage beyond point of no return for defibrillation.")
@@ -440,7 +440,7 @@
H.updatehealth() //forces health update before next life tick
playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
H.emote("gasp")
- add_logs(user, M, "stunned", object="defibrillator")
+ add_logs(M, user, "stunned", object="defibrillator")
if(isrobot(user))
var/mob/living/silicon/robot/R = user
R.cell.use(revivecost)
@@ -490,7 +490,7 @@
if(isrobot(user))
var/mob/living/silicon/robot/R = user
R.cell.use(revivecost)
- add_logs(user, M, "revived", object="defibrillator")
+ add_logs(M, user, "revived", object="defibrillator")
else
if(tplus > tlimit)
user.visible_message("[user] buzzes: Resuscitation failed - Heart tissue damage beyond point of no return for defibrillation.")
diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm
index 1965473e717..c8d2c4c20da 100644
--- a/code/game/objects/items/weapons/explosives.dm
+++ b/code/game/objects/items/weapons/explosives.dm
@@ -76,7 +76,7 @@
loc = null
if (ismob(target))
- add_logs(user, target, "planted [name] on")
+ add_logs(target, user, "planted [name] on")
user.visible_message("\red [user.name] finished planting an explosive on [target.name]!")
message_admins("[key_name(user, user.client)](?) planted C4 on [key_name(target)](?) with [timer] second fuse",0,1)
log_game("[key_name(user)] planted C4 on [key_name(target)] with [timer] second fuse")
diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index af8b8e2fe5f..70b2b5fe03e 100644
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -24,13 +24,12 @@
/obj/item/weapon/flamethrower/Destroy()
if(weldtool)
- del(weldtool)
+ qdel(weldtool)
if(igniter)
- del(igniter)
+ qdel(igniter)
if(ptank)
- del(ptank)
+ qdel(ptank)
..()
- return
/obj/item/weapon/flamethrower/process()
@@ -60,8 +59,8 @@
item_state = "flamethrower_0"
return
-/obj/item/weapon/flamethrower/afterattack(atom/target, mob/user, proximity)
- if(!proximity) return
+/obj/item/weapon/flamethrower/afterattack(atom/target, mob/user, flag)
+ if(flag) return // too close
// Make sure our user is still holding us
if(user && user.get_active_hand() == src)
var/turf/target_turf = get_turf(target)
@@ -83,7 +82,7 @@
ptank.loc = T
ptank = null
new /obj/item/stack/rods(T)
- del(src)
+ qdel(src)
return
if(isscrewdriver(W) && igniter && !lit)
@@ -163,7 +162,6 @@
usr.set_machine(src)
if(href_list["light"])
if(!ptank) return
- if(ptank.air_contents.toxins < 1) return
if(!status) return
lit = !lit
if(lit)
@@ -184,22 +182,26 @@
update_icon()
return
+/obj/item/weapon/flamethrower/CheckParts()
+ weldtool = locate(/obj/item/weapon/weldingtool) in contents
+ igniter = locate(/obj/item/device/assembly/igniter) in contents
+ update_icon()
//Called from turf.dm turf/dblclick
/obj/item/weapon/flamethrower/proc/flame_turf(turflist)
if(!lit || operating) return
operating = 1
+ var/turf/previousturf = get_turf(src)
for(var/turf/simulated/T in turflist)
if(!T.air)
break
- if(!previousturf && length(turflist)>1)
- previousturf = get_turf(src)
+ if(T == previousturf)
continue //so we don't burn the tile we be standin on
- if(previousturf && LinkBlocked(previousturf, T))
+ if(!T.CanAtmosPass(previousturf))
break
ignite_turf(T)
sleep(1)
- previousturf = null
+ previousturf = T
operating = 0
for(var/mob/M in viewers(1, loc))
if((M.client && M.machine == src))
@@ -222,10 +224,16 @@
/obj/item/weapon/flamethrower/full/New(var/loc)
..()
- weldtool = new /obj/item/weapon/weldingtool(src)
+ if(!weldtool)
+ weldtool = new /obj/item/weapon/weldingtool(src)
weldtool.status = 0
- igniter = new /obj/item/device/assembly/igniter(src)
+ if(!igniter)
+ igniter = new /obj/item/device/assembly/igniter(src)
igniter.secured = 0
status = 1
update_icon()
- return
\ No newline at end of file
+
+/obj/item/weapon/flamethrower/full/tank/New(var/loc)
+ ..()
+ ptank = new /obj/item/weapon/tank/plasma/full(src)
+ update_icon()
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index 6a7e86dfea0..329edef72f6 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -34,7 +34,7 @@
else
feedback_add_details("handcuffs","H")
- add_logs(user, C, "handcuffed")
+ add_logs(C, user, "handcuffed", src)
else
user << "You fail to handcuff [C]."
diff --git a/code/game/objects/items/weapons/sm_shard.dm b/code/game/objects/items/weapons/sm_shard.dm
new file mode 100644
index 00000000000..a4367cba413
--- /dev/null
+++ b/code/game/objects/items/weapons/sm_shard.dm
@@ -0,0 +1,103 @@
+
+/obj/item/weapon/shard/supermatter
+ name = "supermatter shard"
+ desc = "A shard of supermatter. Incredibly dangerous, though not large enough to go critical."
+ force = 10.0
+ throwforce = 20.0
+ icon_state = "supermatter"
+ sharp = 1
+ edge = 1
+ w_class = 2
+ flags = CONDUCT
+ light_color = "#8A8A00"
+ var/brightness = 2
+
+/obj/item/weapon/shard/supermatter/New()
+ src.icon_state = pick("supermatter")
+ switch(src.icon_state)
+ if("supermattersmall")
+ src.pixel_x = rand(-12, 12)
+ src.pixel_y = rand(-12, 12)
+ if("supermattermedium")
+ src.pixel_x = rand(-8, 8)
+ src.pixel_y = rand(-8, 8)
+ if("supermatterlarge")
+ src.pixel_x = rand(-5, 5)
+ src.pixel_y = rand(-5, 5)
+ else
+
+ set_light(brightness)
+
+/obj/item/weapon/shard/supermatter/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if( istype( W, /obj/item/weapon/tongs ))
+ var/obj/item/weapon/tongs/T = W
+ T.pick_up( src )
+ T.icon_state = "tongs_supermatter"
+ return
+
+ ..()
+
+/obj/item/weapon/shard/supermatter/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
+ playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
+ return ..()
+
+/obj/item/weapon/shard/supermatter/Crossed(AM as mob|obj)
+ if(ismob(AM))
+ var/mob/M = AM
+ M << "\red You step on \the [src]!"
+ playsound(src.loc, 'sound/effects/glass_step_sm.ogg', 70, 1) // not sure how to handle metal shards with sounds
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+
+ if(H.species.flags & IS_SYNTHETIC) //Thick skin.
+ return
+
+ if( !H.shoes && ( !H.wear_suit || !(H.wear_suit.body_parts_covered & FEET) ) )
+ var/obj/item/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot"))
+ if(affecting.status & ORGAN_ROBOT)
+ return
+ if(affecting.take_damage(5, 20))
+ H.UpdateDamageIcon()
+ H.updatehealth()
+ if(!(H.species && (H.species.flags & NO_PAIN)))
+ H.Weaken(3)
+ ..()
+
+
+/obj/item/weapon/shard/supermatter/attack_hand(var/mob/user)
+ if(!istype(user,/mob/living/carbon/human/nucleation))
+ user << pick( "\red You think twice before touching that without protection.",
+ "\red You don't want to touch that without some protection.",
+ "\red You probably should get something else to pick that up.",
+ "\red You aren't sure that's a good idea.",
+ "\red You aren't in the mood to get vaporized today.",
+ "\red You really don't feel like frying your hand off.",
+ "\red You assume that's a bad idea." )
+ return
+
+ ..()
+
+/obj/item/weapon/tongs
+ name = "tongs"
+ desc = "Tungsten-alloy tongs used for handling dangerous materials."
+ force = 7.0
+ throwforce = 12.0
+ icon = 'icons/obj/weapons.dmi'
+ icon_state = "tongs"
+ edge = 1
+ w_class = 2
+ flags = CONDUCT
+ var/obj/item/held = null // The item currently being held
+
+/obj/item/weapon/tongs/proc/pick_up( var/obj/item/I )
+ held = I
+ I.loc = src
+ playsound(loc, 'sound/effects/tong_pickup.ogg', 50, 1, -1)
+
+/obj/item/weapon/tongs/attack_self(var/mob/user as mob)
+ if( held )
+ var/turf/T = get_turf(user.loc)
+ held.loc = T
+ held = null
+ icon_state = initial(icon_state)
+ ..()
diff --git a/code/game/objects/items/weapons/staff.dm b/code/game/objects/items/weapons/staff.dm
index a97ae394244..021c3a7618f 100644
--- a/code/game/objects/items/weapons/staff.dm
+++ b/code/game/objects/items/weapons/staff.dm
@@ -1,4 +1,4 @@
-/obj/item/weapon/staff
+/obj/item/weapon/twohanded/staff
name = "wizards staff"
desc = "Apparently a staff used by the wizard."
icon = 'icons/obj/wizard.dmi'
@@ -11,13 +11,60 @@
flags = NOSHIELD
attack_verb = list("bludgeoned", "whacked", "disciplined")
-/obj/item/weapon/staff/broom
+/obj/item/weapon/twohanded/staff/broom
name = "broom"
desc = "Used for sweeping, and flying into the night while cackling. Black cat not included."
icon = 'icons/obj/wizard.dmi'
icon_state = "broom"
+ item_state = "broom0"
+ icon_override = 'icons/mob/in-hand/staff.dmi'
-/obj/item/weapon/staff/stick
+/obj/item/weapon/twohanded/staff/broom/attack_self(mob/user as mob)
+ ..()
+ item_state = "broom[wielded ? 1 : 0]"
+ force = wielded ? 5 : 3
+ attack_verb = wielded ? list("rammed into", "charged at") : list("bludgeoned", "whacked", "cleaned")
+ if(user)
+ user.update_inv_l_hand()
+ user.update_inv_r_hand()
+ if(user.mind in ticker.mode.wizards)
+ user.flying = wielded ? 1 : 0
+ if(wielded)
+ user << "You hold \the [src] between your legs."
+ user.say("QUID 'ITCH")
+ animate(user, pixel_y = pixel_y + 10 , time = 10, loop = 1, easing = SINE_EASING)
+ else
+ animate(user, pixel_y = pixel_y + 10 , time = 1, loop = 1)
+ animate(user, pixel_y = pixel_y, time = 10, loop = 1, easing = SINE_EASING)
+ animate(user)
+ if(user.lying)//aka. if they have just been stunned
+ user.pixel_y -= 6
+ else
+ if(wielded)
+ user << "You hold \the [src] between your legs."
+
+/obj/item/weapon/twohanded/staff/broom/attackby(var/obj/O, mob/user)
+ if(istype(O, /obj/item/clothing/mask/horsehead))
+ new/obj/item/weapon/twohanded/staff/broom/horsebroom(get_turf(src))
+ user.unEquip(O)
+ qdel(O)
+ qdel(src)
+ return
+ ..()
+
+/obj/item/weapon/twohanded/staff/broom/horsebroom
+ name = "broomstick horse"
+ desc = "Saddle up!"
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "horsebroom"
+ item_state = "horsebroom0"
+ icon_override = 'icons/mob/in-hand/staff.dmi'
+
+/obj/item/weapon/twohanded/staff/broom/horsebroom/attack_self(mob/user as mob)
+ ..()
+ item_state = "horsebroom[wielded ? 1 : 0]"
+
+/obj/item/weapon/twohanded/staff/stick
name = "stick"
desc = "A great tool to drag someone else's drinks across the bar."
icon = 'icons/obj/weapons.dmi'
diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm
deleted file mode 100644
index edb18ae8d58..00000000000
--- a/code/game/objects/items/weapons/surgery_tools.dm
+++ /dev/null
@@ -1,827 +0,0 @@
-/* Surgery Tools
- * Contains:
- * Retractor
- * Hemostat
- * Cautery
- * Surgical Drill
- * Scalpel
- * Circular Saw
- */
-
-/*
- * Retractor
- */
-/obj/item/weapon/retractor
- name = "retractor"
- desc = "Retracts stuff."
- icon = 'icons/obj/surgery.dmi'
- icon_state = "retractor"
- m_amt = 6000
- g_amt = 3000
- flags = CONDUCT
- w_class = 2.0
- origin_tech = "materials=1;biotech=1"
-
-/*HAHA, SUCK IT, 2000 LINES OF SPAGHETTI CODE!
-
-NOW YOUR JOB IOS DONE BY ONLY 500 LINES OF SPAGHETTI CODE!
-
-LOOK FOR SURGERY.DM*/
-
-/*
-/obj/item/weapon/retractor/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- if(!istype(M))
- return
-
- var/mob/living/carbon/human/H = M
- if(istype(H) && ( \
- (H.head && H.head.flags & HEADCOVERSEYES) || \
- (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
- (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
- ))
- user << "\red You're going to need to remove that mask/helmet/glasses first."
- return
-
- var/mob/living/carbon/monkey/Mo = M
- if(istype(Mo) && ( \
- (Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
- ))
- user << "\red You're going to need to remove that mask/helmet/glasses first."
- return
-
- if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/slime))//Aliens don't have eyes./N
- user << "\red You cannot locate any eyes on this creature!"
- return
-
- switch(M.eye_op_stage)
- if(1.0)
- if(M != user)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] is having his eyes retracted by [user].", 1)
- M << "\red [user] begins to seperate your eyes with [src]!"
- user << "\red You seperate [M]'s eyes with [src]!"
- else
- user.visible_message( \
- "\red [user] begins to have his eyes retracted.", \
- "\red You begin to pry open your eyes with [src]!" \
- )
- if(M == user && prob(25))
- user << "\red You mess up!"
- if(istype(M, /mob/living/carbon/human))
- var/obj/item/organ/external/affecting = M:get_organ("head")
- if(affecting.take_damage(15))
- M:UpdateDamageIcon()
- M.updatehealth()
- else
- M.take_organ_damage(15)
-
- M:eye_op_stage = 2.0
-
- else if(user.zone_sel.selecting == "chest")
- switch(M:alien_op_stage)
- if(3.0)
- var/mob/living/carbon/human/H = M
- if(!istype(H))
- return ..()
-
- if(H.wear_suit || H.w_uniform)
- user << "\red You're going to need to remove that suit/jumpsuit first."
- return
-
- var/obj/item/alien_embryo/A = locate() in M.contents
- if(!A)
- return ..()
- user.visible_message("\red [user] begins to pull something out of [M]'s chest.", "\red You begin to pull the alien organism out of [M]'s chest.")
-
- spawn(20 + rand(0,50))
- if(!A || A.loc != M)
- return
-
- if(M == user && prob(25))
- user << "\red You mess up!"
- if(istype(M, /mob/living/carbon/human))
- var/obj/item/organ/external/affecting = M:get_organ("chest")
- if(affecting.take_damage(30))
- M:UpdateDamageIcon()
- else
- M.take_organ_damage(30)
-
- if(A.stage > 3)
- var/chance = 15 + max(0, A.stage - 3) * 10
- if(prob(chance))
- A.AttemptGrow(0)
- M:alien_op_stage = 4.0
-
- if(M)
- user.visible_message("\red [user] pulls an alien organism out of [M]'s chest.", "\red You pull the alien organism out of [M]'s chest.")
- A.loc = M.loc //alien embryo handles cleanup
-
- else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human))))
- return ..()
-
- return
-*/
-
-/*
- * Hemostat
- */
-/obj/item/weapon/hemostat
- name = "hemostat"
- desc = "You think you have seen this before."
- icon = 'icons/obj/surgery.dmi'
- icon_state = "hemostat"
- m_amt = 5000
- g_amt = 2500
- flags = CONDUCT
- w_class = 2.0
- origin_tech = "materials=1;biotech=1"
- attack_verb = list("attacked", "pinched")
-
-/*
-/obj/item/weapon/hemostat/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- if(!istype(M))
- return
-
- if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/table/, M.loc) && M.lying && prob(50))))
- return ..()
-
- if(user.zone_sel.selecting == "groin")
- if(istype(M, /mob/living/carbon/human))
- switch(M:appendix_op_stage)
- if(1.0)
- if(M != user)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [user] is beginning to clamp bleeders in [M]'s abdomen cut open with [src].", 1)
- M << "\red [user] begins to clamp bleeders in your abdomen with [src]!"
- user << "\red You clamp bleeders in [M]'s abdomen with [src]!"
- M:appendix_op_stage = 2.0
- if(4.0)
- if(M != user)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [user] is removing [M]'s appendix with [src].", 1)
- M << "\red [user] begins to remove your appendix with [src]!"
- user << "\red You remove [M]'s appendix with [src]!"
- for(var/datum/disease/D in M.viruses)
- if(istype(D, /datum/disease/appendicitis))
- new /obj/item/weapon/reagent_containers/food/snacks/appendix/inflamed(get_turf(M))
- M:appendix_op_stage = 5.0
- return
- new /obj/item/weapon/reagent_containers/food/snacks/appendix(get_turf(M))
- M:appendix_op_stage = 5.0
- return
-
- if (user.zone_sel.selecting == "eyes")
-
- var/mob/living/carbon/human/H = M
- if(istype(H) && ( \
- (H.head && H.head.flags & HEADCOVERSEYES) || \
- (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
- (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
- ))
- user << "\red You're going to need to remove that mask/helmet/glasses first."
- return
-
- var/mob/living/carbon/monkey/Mo = M
- if(istype(Mo) && ( \
- (Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
- ))
- user << "\red You're going to need to remove that mask/helmet/glasses first."
- return
-
- if(istype(M, /mob/living/carbon/alien))//Aliens don't have eyes./N
- user << "\red You cannot locate any eyes on this creature!"
- return
-
- switch(M.eye_op_stage)
- if(2.0)
- if(M != user)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] is having his eyes mended by [user].", 1)
- M << "\red [user] begins to mend your eyes with [src]!"
- user << "\red You mend [M]'s eyes with [src]!"
- else
- user.visible_message( \
- "\red [user] begins to have his eyes mended.", \
- "\red You begin to mend your eyes with [src]!" \
- )
- if(M == user && prob(25))
- user << "\red You mess up!"
- if(istype(M, /mob/living/carbon/human))
- var/obj/item/organ/external/affecting = M:get_organ("head")
- if(affecting.take_damage(15))
- M:UpdateDamageIcon()
- M.updatehealth()
- else
- M.take_organ_damage(15)
- M:eye_op_stage = 3.0
-
- else if(user.zone_sel.selecting == "chest")
- if(M:alien_op_stage == 2.0 || M:alien_op_stage == 3.0)
- var/mob/living/carbon/human/H = M
- if(!istype(H))
- return ..()
-
- if(H.wear_suit || H.w_uniform)
- user << "\red You're going to need to remove that suit/jumpsuit first."
- return
-
- user.visible_message("\red [user] begins to dig around in [M]'s chest.", "\red You begin to dig around in [M]'s chest.")
-
- spawn(20 + (M:alien_op_stage == 3 ? 0 : rand(0,50)))
- if(M == user && prob(25))
- user << "\red You mess up!"
- if(istype(M, /mob/living/carbon/human))
- var/obj/item/organ/external/affecting = M:get_organ("chest")
- if(affecting.take_damage(30))
- M:UpdateDamageIcon()
- else
- M.take_organ_damage(30)
-
- var/obj/item/alien_embryo/A = locate() in M.contents
- if(A)
- var/dat = "\blue You found an unknown alien organism in [M]'s chest!"
- if(A.stage < 4)
- dat += " It's small and weak, barely the size of a foetus."
- if(A.stage > 3)
- dat += " It's grown quite large, and writhes slightly as you look at it."
- if(prob(10))
- A.AttemptGrow()
- user << dat
- M:alien_op_stage = 3.0
- else
- user << "\blue You find nothing of interest."
-
- else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human))))
- return ..()
-
- return
-*/
-
-/*
- * Cautery
- */
-/obj/item/weapon/cautery
- name = "cautery"
- desc = "This stops bleeding."
- icon = 'icons/obj/surgery.dmi'
- icon_state = "cautery"
- m_amt = 2500
- g_amt = 750
- flags = CONDUCT
- w_class = 2.0
- origin_tech = "materials=1;biotech=1"
- attack_verb = list("burnt")
-
-/*
-/obj/item/weapon/cautery/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- if(!istype(M))
- return
-
- if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/table/, M.loc) && M.lying && prob(50))))
- return ..()
-
- if(user.zone_sel.selecting == "groin")
- if(istype(M, /mob/living/carbon/human))
- switch(M:appendix_op_stage)
- if(5.0)
- if(M != user)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [user] is beginning to cauterize the incision in [M]'s abdomen with [src].", 1)
- M << "\red [user] begins to cauterize the incision in your abdomen with [src]!"
- user << "\red You cauterize the incision in [M]'s abdomen with [src]!"
- M:appendix_op_stage = 6.0
- for(var/datum/disease/appendicitis in M.viruses)
- appendicitis.cure()
- return
-
- if (user.zone_sel.selecting == "eyes")
-
- var/mob/living/carbon/human/H = M
- if(istype(H) && ( \
- (H.head && H.head.flags & HEADCOVERSEYES) || \
- (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
- (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
- ))
- user << "\red You're going to need to remove that mask/helmet/glasses first."
- return
-
- var/mob/living/carbon/monkey/Mo = M
- if(istype(Mo) && ( \
- (Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
- ))
- user << "\red You're going to need to remove that mask/helmet/glasses first."
- return
-
- if(istype(M, /mob/living/carbon/alien))//Aliens don't have eyes./N
- user << "\red You cannot locate any eyes on this creature!"
- return
-
- switch(M.eye_op_stage)
- if(3.0)
- if(M != user)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] is having his eyes cauterized by [user].", 1)
- M << "\red [user] begins to cauterize your eyes!"
- user << "\red You cauterize [M]'s eyes with [src]!"
- else
- user.visible_message( \
- "\red [user] begins to have his eyes cauterized.", \
- "\red You begin to cauterize your eyes!" \
- )
- if(M == user && prob(25))
- user << "\red You mess up!"
- if(istype(M, /mob/living/carbon/human))
- var/obj/item/organ/external/affecting = M:get_organ("head")
- if(affecting.take_damage(15))
- M:UpdateDamageIcon()
- M.updatehealth()
- else
- M.take_organ_damage(15)
- M.sdisabilities &= ~BLIND
- M.eye_stat = 0
- M:eye_op_stage = 0.0
-
- else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human))))
- return ..()
-
- return
-*/
-
-/*
- * Surgical Drill
- */
-/obj/item/weapon/surgicaldrill
- name = "surgical drill"
- desc = "You can drill using this item. You dig?"
- icon = 'icons/obj/surgery.dmi'
- icon_state = "drill"
- hitsound = 'sound/weapons/circsawhit.ogg'
- m_amt = 10000
- g_amt = 6000
- flags = CONDUCT
- force = 15.0
- w_class = 2.0
- origin_tech = "materials=1;biotech=1"
- attack_verb = list("drilled")
-
- suicide_act(mob/user)
- viewers(user) << pick("\red [user] is pressing the [src.name] to \his temple and activating it! It looks like \he's trying to commit suicide.", \
- "\red [user] is pressing [src.name] to \his chest and activating it! It looks like \he's trying to commit suicide.")
- return (BRUTELOSS)
-
-/*
- * Scalpel
- */
-/obj/item/weapon/scalpel
- name = "scalpel"
- desc = "Cut, cut, and once more cut."
- icon = 'icons/obj/surgery.dmi'
- icon_state = "scalpel"
- flags = CONDUCT
- force = 10.0
- sharp = 1
- edge = 1
- w_class = 2.0
- throwforce = 5.0
- throw_speed = 3
- throw_range = 5
- m_amt = 4000
- g_amt = 1000
- origin_tech = "materials=1;biotech=1"
- attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
-
- suicide_act(mob/user)
- viewers(user) << pick("\red [user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.", \
- "\red [user] is slitting \his throat with the [src.name]! It looks like \he's trying to commit suicide.", \
- "\red [user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.")
- return (BRUTELOSS)
-
-/*
-/obj/item/weapon/scalpel/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- if(!istype(M))
- return ..()
-
- //if(M.mutations & HUSK) return ..()
-
- if((CLUMSY in user.mutations) && prob(50))
- M = user
- return eyestab(M,user)
-
- if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/table/, M.loc) && M.lying && prob(50))))
- return ..()
-
- src.add_fingerprint(user)
-
- if(user.zone_sel.selecting == "groin")
- if(istype(M, /mob/living/carbon/human))
- switch(M:appendix_op_stage)
- if(0.0)
- if(M != user)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] is beginning to have his abdomen cut open with [src] by [user].", 1)
- M << "\red [user] begins to cut open your abdomen with [src]!"
- user << "\red You cut [M]'s abdomen open with [src]!"
- M:appendix_op_stage = 1.0
- if(3.0)
- if(M != user)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] is beginning to have his appendix seperated with [src] by [user].", 1)
- M << "\red [user] begins to seperate your appendix with [src]!"
- user << "\red You seperate [M]'s appendix with [src]!"
- M:appendix_op_stage = 4.0
- return
-
- if(user.zone_sel.selecting == "head" || istype(M, /mob/living/carbon/slime))
-
- var/mob/living/carbon/human/H = M
- if(istype(H) && ( \
- (H.head && H.head.flags & HEADCOVERSEYES) || \
- (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
- (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
- ))
- user << "\red You're going to need to remove that mask/helmet/glasses first."
- return
-
- var/mob/living/carbon/monkey/Mo = M
- if(istype(Mo) && ( \
- (Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
- ))
- user << "\red You're going to need to remove that mask/helmet/glasses first."
- return
-
- switch(M:brain_op_stage)
- if(0.0)
- if(istype(M, /mob/living/carbon/slime))
- if(M.stat == 2)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M.name] is beginning to have its flesh cut open with [src] by [user].", 1)
- M << "\red [user] begins to cut open your flesh with [src]!"
- user << "\red You cut [M]'s flesh open with [src]!"
- M:brain_op_stage = 1.0
-
- return
-
- if(M != user)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] is beginning to have his head cut open with [src] by [user].", 1)
- M << "\red [user] begins to cut open your head with [src]!"
- user << "\red You cut [M]'s head open with [src]!"
- else
- user.visible_message( \
- "\red [user] begins to cut open his skull with [src]!", \
- "\red You begin to cut open your head with [src]!" \
- )
-
- if(M == user && prob(25))
- user << "\red You mess up!"
- if(istype(M, /mob/living/carbon/human))
- var/obj/item/organ/external/affecting = M:get_organ("head")
- if(affecting.take_damage(15))
- M:UpdateDamageIcon()
- else
- M.take_organ_damage(15)
-
- if(istype(M, /mob/living/carbon/human))
- var/obj/item/organ/external/affecting = M:get_organ("head")
- affecting.take_damage(7)
- else
- M.take_organ_damage(7)
-
- M.updatehealth()
- M:brain_op_stage = 1.0
-
- if(1)
- if(istype(M, /mob/living/carbon/slime))
- if(M.stat == 2)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M.name] is having its silky innards cut apart with [src] by [user].", 1)
- M << "\red [user] begins to cut apart your innards with [src]!"
- user << "\red You cut [M]'s silky innards apart with [src]!"
- M:brain_op_stage = 2.0
- return
- if(2.0)
- if(istype(M, /mob/living/carbon/slime))
- if(M.stat == 2)
- var/mob/living/carbon/slime/slime = M
- if(slime.cores > 0)
- if(istype(M, /mob/living/carbon/slime))
- user << "\red You attempt to remove [M]'s core, but [src] is ineffective!"
- return
-
- if(M != user)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] is having his connections to the brain delicately severed with [src] by [user].", 1)
- M << "\red [user] begins to cut open your head with [src]!"
- user << "\red You cut [M]'s head open with [src]!"
- else
- user.visible_message( \
- "\red [user] begin to delicately remove the connections to his brain with [src]!", \
- "\red You begin to cut open your head with [src]!" \
- )
- if(M == user && prob(25))
- user << "\red You nick an artery!"
- if(istype(M, /mob/living/carbon/human))
- var/obj/item/organ/external/affecting = M:get_organ("head")
- if(affecting.take_damage(75))
- M:UpdateDamageIcon()
- else
- M.take_organ_damage(75)
-
- if(istype(M, /mob/living/carbon/human))
- var/obj/item/organ/external/affecting = M:get_organ("head")
- affecting.take_damage(7)
- else
- M.take_organ_damage(7)
-
- M.updatehealth()
- M:brain_op_stage = 3.0
- else
- ..()
- return
-
- else if(user.zone_sel.selecting == "eyes")
- user << "\blue So far so good."
-
- var/mob/living/carbon/human/H = M
- if(istype(H) && ( \
- (H.head && H.head.flags & HEADCOVERSEYES) || \
- (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
- (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
- ))
- user << "\red You're going to need to remove that mask/helmet/glasses first."
- return
-
- var/mob/living/carbon/monkey/Mo = M
- if(istype(Mo) && ( \
- (Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
- ))
- user << "\red You're going to need to remove that mask/helmet/glasses first."
- return
-
- if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/slime))//Aliens don't have eyes./N
- user << "\red You cannot locate any eyes on this creature!"
- return
-
- switch(M:eye_op_stage)
- if(0.0)
- if(M != user)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] is beginning to have his eyes incised with [src] by [user].", 1)
- M << "\red [user] begins to cut open your eyes with [src]!"
- user << "\red You make an incision around [M]'s eyes with [src]!"
- else
- user.visible_message( \
- "\red [user] begins to cut around his eyes with [src]!", \
- "\red You begin to cut open your eyes with [src]!" \
- )
- if(M == user && prob(25))
- user << "\red You mess up!"
- if(istype(M, /mob/living/carbon/human))
- var/obj/item/organ/external/affecting = M:get_organ("head")
- if(affecting.take_damage(15))
- M:UpdateDamageIcon()
- else
- M.take_organ_damage(15)
-
- user << "\blue So far so good before."
- M.updatehealth()
- M:eye_op_stage = 1.0
- user << "\blue So far so good after."
-
- else if(user.zone_sel.selecting == "chest")
- switch(M:alien_op_stage)
- if(0.0)
- var/mob/living/carbon/human/H = M
- if(!istype(H))
- return ..()
-
- if(H.wear_suit || H.w_uniform)
- user << "\red You're going to need to remove that suit/jumpsuit first."
- return
-
- user.visible_message("\red [user] begins to slice open [M]'s chest.", "\red You begin to slice open [M]'s chest.")
-
- spawn(rand(20,50))
- if(M == user && prob(25))
- user << "\red You mess up!"
- if(istype(M, /mob/living/carbon/human))
- var/obj/item/organ/external/affecting = M:get_organ("chest")
- if(affecting.take_damage(15))
- M:UpdateDamageIcon()
- else
- M.take_organ_damage(15)
-
- M:alien_op_stage = 1.0
- user << "\blue So far so good."
-
- else
- return ..()
-/* wat
- else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human))))
- return ..()*/
- return
-*/
-
-/*
- * Circular Saw
- */
-/obj/item/weapon/circular_saw
- name = "circular saw"
- desc = "For heavy duty cutting."
- icon = 'icons/obj/surgery.dmi'
- icon_state = "saw3"
- hitsound = 'sound/weapons/circsawhit.ogg'
- flags = CONDUCT
- force = 15.0
- w_class = 2.0
- throwforce = 9.0
- throw_speed = 3
- throw_range = 5
- m_amt = 10000
- g_amt = 6000
- origin_tech = "materials=1;biotech=1"
- attack_verb = list("attacked", "slashed", "sawed", "cut")
- sharp = 1
- edge = 1
-
-/*
-/obj/item/weapon/circular_saw/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- if(!istype(M))
- return ..()
-
- if((CLUMSY in user.mutations) && prob(50))
- M = user
- return eyestab(M,user)
-
- if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/table/, M.loc) && M.lying && prob(50))))
- return ..()
-
- src.add_fingerprint(user)
-
- if(user.zone_sel.selecting == "head" || istype(M, /mob/living/carbon/slime))
-
- var/mob/living/carbon/human/H = M
- if(istype(H) && ( \
- (H.head && H.head.flags & HEADCOVERSEYES) || \
- (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
- (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
- ))
- user << "\red You're going to need to remove that mask/helmet/glasses first."
- return
-
- var/mob/living/carbon/monkey/Mo = M
- if(istype(Mo) && ( \
- (Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
- ))
- user << "\red You're going to need to remove that mask/helmet/glasses first."
- return
-
- switch(M:brain_op_stage)
- if(1.0)
- if(istype(M, /mob/living/carbon/slime))
- return
- if(M != user)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] has his skull sawed open with [src] by [user].", 1)
- M << "\red [user] begins to saw open your head with [src]!"
- user << "\red You saw [M]'s head open with [src]!"
- else
- user.visible_message( \
- "\red [user] saws open his skull with [src]!", \
- "\red You begin to saw open your head with [src]!" \
- )
- if(M == user && prob(25))
- user << "\red You mess up!"
- if(istype(M, /mob/living/carbon/human))
- var/obj/item/organ/external/affecting = M:get_organ("head")
- if(affecting.take_damage(40))
- M:UpdateDamageIcon()
- M.updatehealth()
- else
- M.take_organ_damage(40)
-
- if(istype(M, /mob/living/carbon/human))
- var/obj/item/organ/external/affecting = M:get_organ("head")
- affecting.take_damage(7)
- else
- M.take_organ_damage(7)
-
- M.updatehealth()
- M:brain_op_stage = 2.0
-
- if(2.0)
- if(istype(M, /mob/living/carbon/slime))
- if(M.stat == 2)
- var/mob/living/carbon/slime/slime = M
- if(slime.cores > 0)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M.name] is having one of its cores sawed out with [src] by [user].", 1)
-
- slime.cores--
- M << "\red [user] begins to remove one of your cores with [src]! ([slime.cores] cores remaining)"
- user << "\red You cut one of [M]'s cores out with [src]! ([slime.cores] cores remaining)"
-
- new slime.coretype(M.loc)
-
- if(slime.cores <= 0)
- M.icon_state = "[slime.colour] baby slime dead-nocore"
-
- return
-
- if(3.0)
- /*if(M.mind && M.mind.changeling)
- user << "\red The neural tissue regrows before your eyes as you cut it."
- return*/
-
- if(M != user)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] has his spine's connection to the brain severed with [src] by [user].", 1)
- M << "\red [user] severs your brain's connection to the spine with [src]!"
- user << "\red You sever [M]'s brain's connection to the spine with [src]!"
- else
- user.visible_message( \
- "\red [user] severs his brain's connection to the spine with [src]!", \
- "\red You sever your brain's connection to the spine with [src]!" \
- )
-
- user.attack_log += "\[[time_stamp()]\] Debrained [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])"
- M.attack_log += "\[[time_stamp()]\] Debrained by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])"
-
- log_attack("[user.name] ([user.ckey]) debrained [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])")
-
-
- var/obj/item/brain/B = new()
- M.put_in_hands(B)
- B.transfer_identity(M)
-
- M:brain_op_stage = 4.0
- M.death()//You want them to die after the brain was transferred, so not to trigger client death() twice.
-
- else
- ..()
- return
-
- else if(user.zone_sel.selecting == "chest")
- switch(M:alien_op_stage)
- if(1.0)
- var/mob/living/carbon/human/H = M
- if(!istype(H))
- return ..()
-
- if(H.wear_suit || H.w_uniform)
- user << "\red You're going to need to remove that suit/jumpsuit first."
- return
-
- user.visible_message("\red [user] begins to slice through the bone of [M]'s chest.", "\red You begin to slice through the bone of [M]'s chest.")
-
- spawn(20 + rand(0,50))
- if(M == user && prob(25))
- user << "\red You mess up!"
- if(istype(M, /mob/living/carbon/human))
- var/obj/item/organ/external/affecting = M:get_organ("chest")
- if(affecting.take_damage(15))
- M:UpdateDamageIcon()
- else
- M.take_organ_damage(15)
-
- M:alien_op_stage = 2.0
- user << "\blue So far so good."
-
- else
- return ..()
-/*
- else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human))))
- return ..()
-*/
- return
-*/
-
-//misc, formerly from code/defines/weapons.dm
-/obj/item/weapon/bonegel
- name = "bone gel"
- icon = 'icons/obj/surgery.dmi'
- icon_state = "bone-gel"
- force = 0
- w_class = 2.0
- throwforce = 1.0
-
-/obj/item/weapon/FixOVein
- name = "FixOVein"
- icon = 'icons/obj/surgery.dmi'
- icon_state = "fixovein"
- force = 0
- throwforce = 1.0
- origin_tech = "materials=1;biotech=3"
- w_class = 2.0
- var/usage_amount = 10
-
-/obj/item/weapon/bonesetter
- name = "bone setter"
- icon = 'icons/obj/surgery.dmi'
- icon_state = "bone setter"
- force = 8.0
- throwforce = 9.0
- throw_speed = 3
- throw_range = 5
- w_class = 2.0
- attack_verb = list("attacked", "hit", "bludgeoned")
diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm
index 70f7a8235a4..6ed37dac59f 100644
--- a/code/game/objects/items/weapons/tanks/tank_types.dm
+++ b/code/game/objects/items/weapons/tanks/tank_types.dm
@@ -95,7 +95,6 @@
/obj/item/weapon/tank/plasma/New()
..()
-
src.air_contents.toxins = (3*ONE_ATMOSPHERE)*70/(R_IDEAL_GAS_EQUATION*T20C)
return
@@ -110,6 +109,12 @@
F.ptank = src
user.unEquip(src)
src.loc = F
+ F.update_icon()
+ return
+
+/obj/item/weapon/tank/plasma/full/New()
+ ..()
+ src.air_contents.toxins = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
return
/obj/item/weapon/tank/plasma/plasmaman
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 5f4cfbe49c9..6cb621d8cce 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -117,14 +117,15 @@
icon_state = "cutters-y"
item_state = "cutters_yellow"
-/obj/item/weapon/wirecutters/attack(mob/living/carbon/C as mob, mob/user as mob)
- if((C.handcuffed) && (istype(C.handcuffed, /obj/item/weapon/restraints/handcuffs/cable)))
- usr.visible_message("\The [usr] cuts \the [C]'s restraints with \the [src]!",\
- "You cut \the [C]'s restraints with \the [src]!",\
- "You hear cable being cut.")
- C.handcuffed = null
- C.update_inv_handcuffed()
- return
+/obj/item/weapon/wirecutters/attack(mob/living/carbon/human/C as mob, mob/user as mob)
+ if(C.handcuffed)
+ if(istype(C.handcuffed, /obj/item/weapon/restraints/handcuffs/cable))
+ usr.visible_message("\The [usr] cuts \the [C]'s restraints with \the [src]!",\
+ "You cut \the [C]'s restraints with \the [src]!",\
+ "You hear cable being cut.")
+ C.handcuffed = null
+ C.update_inv_handcuffed()
+ return
else
..()
diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
index 09dcc02bafd..2755ddafed5 100644
--- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm
+++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
@@ -29,7 +29,6 @@
new /obj/item/clothing/mask/gas/syndicate(src)
new /obj/item/clothing/suit/space/rig/syndi(src)
new /obj/item/weapon/tank/jetpack/oxygen/harness(src)
- new /obj/item/clothing/shoes/magboots/syndie(src)
/obj/structure/closet/syndicate/nuclear
desc = "It's a storage unit for a Syndicate boarding party.."
diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
index 549bee20fcd..cf08c1f9954 100644
--- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
@@ -49,6 +49,18 @@
return
+/obj/structure/closet/redcorp
+ name = "corporate security wardrobe"
+ icon_state = "red"
+ icon_closed = "red"
+
+/obj/structure/closet/redcorp/New()
+ new /obj/item/clothing/under/rank/security/corp(src)
+ new /obj/item/clothing/under/rank/security/corp(src)
+ new /obj/item/clothing/under/rank/security/corp(src)
+ new /obj/item/clothing/head/soft/sec/corp(src)
+ new /obj/item/clothing/head/soft/sec/corp(src)
+ new /obj/item/clothing/head/soft/sec/corp(src)
/obj/structure/closet/wardrobe/pink
name = "pink wardrobe"
diff --git a/code/game/objects/structures/spirit_board.dm b/code/game/objects/structures/spirit_board.dm
index 8ddfa279ea1..664bbaf1c18 100644
--- a/code/game/objects/structures/spirit_board.dm
+++ b/code/game/objects/structures/spirit_board.dm
@@ -64,9 +64,9 @@
var/turf/T = get_turf(src)
var/atom/movable/lighting_overlay/LO = locate(/atom/movable/lighting_overlay) in T
if(LO)
- light_amount = max(0,min(10,LO.lum_r + LO.lum_g + LO.lum_b)-5)
+ light_amount = LO.get_clamped_lum(0.5)*10
else
- light_amount = 5
+ light_amount = 10
if(light_amount > 2)
M << "It's too bright here to use [src.name]!"
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 9d50bbd9c4e..523aa5a8e7a 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -334,6 +334,10 @@
if(air_group || (height==0)) return 1
if(istype(mover,/obj/item/projectile))
return (check_cover(mover,target))
+ if(ismob(mover))
+ var/mob/M = mover
+ if(M.flying)
+ return 1
if(istype(mover) && mover.checkpass(PASSTABLE))
return 1
if(locate(/obj/structure/table) in get_turf(mover))
diff --git a/code/game/response_team.dm b/code/game/response_team.dm
index 9be2b5815bc..7fa7ebe40e0 100644
--- a/code/game/response_team.dm
+++ b/code/game/response_team.dm
@@ -17,39 +17,39 @@ var/can_call_ert
if(!check_rights(R_EVENT))
return
-
+
if(!ticker)
usr << "\red The game hasn't started yet!"
return
-
+
if(ticker.current_state == 1)
usr << "\red The round hasn't started yet!"
return
-
+
if(send_emergency_team)
usr << "\red Central Command has already dispatched an emergency response team!"
return
-
+
if(alert("Do you want to dispatch an Emergency Response Team?",,"Yes","No") != "Yes")
return
-
-
+
+
if(get_security_level() != "red") // Allow admins to reconsider if the alert level isn't Red
switch(alert("The station is not in red alert. Do you still want to dispatch a response team?",,"Yes","No"))
if("No")
return
-
+
if(send_emergency_team)
usr << "\red Central Command has already dispatched an emergency response team!"
return
-
+
if(pick_ert_type())
return
message_admins("[key_name_admin(usr)] is dispatching an Emergency Response Team.", 1)
log_admin("[key_name(usr)] used Dispatch Response Team.")
trigger_armed_response_team(1)
-
+
/client/proc/pick_ert_type()
var/erttype = input("Which type of Emergency Response Team would you like to dispatch?","Emergency Response Team Type", "") as null|anything in response_team_types
if(!erttype)
@@ -68,15 +68,15 @@ var/can_call_ert
if(!istype(usr,/mob/dead/observer) && !istype(usr,/mob/new_player))
usr << "You need to be an observer or new player to use this."
return
-
+
if(!send_emergency_team)
usr << "No emergency response team is currently being sent."
return
-
+
if(jobban_isbanned(usr, "Emergency Response Team"))
usr << "You are jobbanned from the emergency reponse team!"
return
-
+
var/player_age_check = check_client_age(usr.client, responseteam_age)
if(player_age_check && config.use_age_restriction_for_antags)
usr << "This role is not yet available to you. You need to wait another [player_age_check] days."
@@ -86,11 +86,11 @@ var/can_call_ert
usr << "\blue Upon using the antagHUD you forfeited the ability to join the round."
return
- if(response_team_members.len > 6)
+ if(response_team_members.len > 6)
usr << "The emergency response team is already full!"
return
- for (var/obj/effect/landmark/L in landmarks_list)
+ for (var/obj/effect/landmark/L in landmarks_list)
if (L.name == "Response Team")
L.name = null
@@ -122,13 +122,13 @@ var/can_call_ert
var/deadcount = 0
for(var/mob/living/carbon/human/H in mob_list)
if(H.client) // Monkeys and mice don't have a client, amirite?
- if(H.stat == 2)
+ if(H.stat == 2)
deadcount++
total++
- if(total == 0)
+ if(total == 0)
return 0
- else
+ else
return round(100 * deadcount / total)
// counts the number of antagonists in %
@@ -140,9 +140,9 @@ var/can_call_ert
antagonists++
total++
- if(total == 0)
+ if(total == 0)
return 0
- else
+ else
return round(100 * antagonists / total)
// Increments the ERT chance automatically, so that the later it is in the round,
@@ -174,7 +174,7 @@ var/can_call_ert
send_team_chance += percentage_antagonists() // the more antagonists, the higher the chance
send_team_chance = min(send_team_chance, 100)
- if(force)
+ if(force)
send_team_chance = 100
// there's only a certain chance a team will be sent
@@ -190,7 +190,7 @@ var/can_call_ert
sleep(600 * 5)
send_emergency_team = 0 // Can no longer join the ERT.
-/*
+/*
var/area/security/nuke_storage/nukeloc = locate() //To find the nuke in the vault
var/obj/machinery/nuclearbomb/nuke = locate() in nukeloc
if(!nuke)
@@ -289,9 +289,9 @@ var/can_call_ert
else
del(H)
- //M.rebuild_appearance()
+ //M.rebuild_appearance()
*/
-
+
var/new_gender = alert(usr, "Please select your gender.", "Character Generation", "Male", "Female")
if (new_gender)
if(new_gender == "Male")
@@ -347,7 +347,7 @@ var/can_call_ert
equip_emergencyresponsesquad(M, "Commander", class)
else
equip_emergencyresponsesquad(M, class)
-
+
return M
/proc/equip_emergencyresponsesquad(var/mob/living/carbon/human/M, var/role, var/role2)
@@ -364,13 +364,13 @@ var/can_call_ert
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/galoshes(M), slot_shoes)
else
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/advance(M), slot_shoes)
-
+
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/commander(M), slot_wear_suit)
var/obj/item/clothing/suit/space/rig/R = M.wear_suit
R.helmet = new /obj/item/clothing/head/helmet/space/rig/ert/commander(M)
M.equip_to_slot_or_del(R.helmet, slot_head)
R.helmet.flags |= NODROP
-
+
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/swat(M), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert/commander(M), slot_back)
@@ -389,8 +389,8 @@ var/can_call_ert
M.equip_to_slot_or_del(pda, slot_wear_pda)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_s_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_r_store)
-
+ M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_r_store)
+
M.equip_to_slot_or_del(new /obj/item/weapon/pinpointer/advpinpointer(M), slot_in_backpack)
switch(role2)
@@ -398,62 +398,62 @@ var/can_call_ert
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/security/response_team(M), slot_belt)
-
+
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/night(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/handcuffs(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/nuclear(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/shield/riot/tele(M), slot_in_backpack)
-
+
if("Medical")
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex/nitrile(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health/night(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/defibrillator/compact/combat/loaded(M), slot_belt)
-
+
M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/fire(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/o2(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/toxin(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/CMO(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(M), slot_r_hand)
-
+
if("Engineering")
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/meson/night(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
-
+
M.equip_to_slot_or_del(new /obj/item/weapon/rcd/combat(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/rcd_ammo/large(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/rcd_ammo/large(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/full(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/sheet/glass/full(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/stack/sheet/plasteel/full(M), slot_in_backpack)
-
+ M.equip_to_slot_or_del(new /obj/item/stack/sheet/plasteel/full(M), slot_in_backpack)
+
M.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase/inflatable(M), slot_r_hand)
-
+
if("Janitorial")
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/purple(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/janitor, slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/janitor/full, slot_belt)
-
+
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/night(src), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/lights/mixed(src), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/spray/plantbgone(src), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/scythe/tele(src), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/glass/bucket(src), slot_in_backpack)
-
- M.equip_to_slot_or_del(new /obj/item/weapon/mop/advanced(M), slot_r_hand)
-
+
+ M.equip_to_slot_or_del(new /obj/item/weapon/mop/advanced(M), slot_r_hand)
+
new /obj/structure/mopbucket/full(get_turf(M))
if("Security")
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/security(M), slot_wear_suit)
-
+
var/obj/item/clothing/suit/space/rig/R = M.wear_suit
R.helmet = new /obj/item/clothing/head/helmet/space/rig/ert/security(M)
M.equip_to_slot_or_del(R.helmet, slot_head)
R.helmet.flags |= NODROP
-
+
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/swat(M), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert/security(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud(M), slot_glasses)
@@ -472,11 +472,11 @@ var/can_call_ert
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
pda.icon_state = "pda-security"
M.equip_to_slot_or_del(pda, slot_wear_pda)
-
+
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_s_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/restraints/handcuffs, slot_l_store)
-
+ M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_r_store)
+ M.equip_to_slot_or_del(new /obj/item/weapon/restraints/handcuffs, slot_l_store)
+
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/night(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/handcuffs(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/nuclear(M), slot_in_backpack)
@@ -488,18 +488,18 @@ var/can_call_ert
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex/nitrile(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/medical(M), slot_wear_suit)
-
+
var/obj/item/clothing/suit/space/rig/R = M.wear_suit
- R.helmet = new /obj/item/clothing/head/helmet/space/rig/ert/medical(M)
+ R.helmet = new /obj/item/clothing/head/helmet/space/rig/ert/medical(M)
M.equip_to_slot_or_del(R.helmet, slot_head)
R.helmet.flags |= NODROP
-
+
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/swat(M), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert/medical(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health/night(M), slot_glasses)
var/obj/item/weapon/card/id/W = new(src)
- W.assignment = "Emergency Response Team Member"
+ W.assignment = "Emergency Response Team Member"
W.registered_name = M.real_name
W.name = "[M.real_name]'s ID Card (Emergency Response Team - Medic)"
W.icon_state = "centcom"
@@ -512,29 +512,29 @@ var/can_call_ert
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
pda.icon_state = "pda-medical"
M.equip_to_slot_or_del(pda, slot_wear_pda)
-
+
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_s_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_r_store)
-
+ M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_r_store)
+
M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/fire(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/o2(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/toxin(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/CMO(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/defibrillator/compact/combat/loaded(M), slot_belt)
-
+
M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(M), slot_r_hand)
if("Engineering")
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/advance(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert/engineer(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/engineer(M), slot_wear_suit)
-
+
var/obj/item/clothing/suit/space/rig/R = M.wear_suit
- R.helmet = new /obj/item/clothing/head/helmet/space/rig/ert/engineer(M)
+ R.helmet = new /obj/item/clothing/head/helmet/space/rig/ert/engineer(M)
M.equip_to_slot_or_del(R.helmet, slot_head)
R.helmet.flags |= NODROP
-
+
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/swat(M), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/meson/night(M), slot_glasses)
@@ -553,29 +553,29 @@ var/can_call_ert
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
pda.icon_state = "pda-engineer"
M.equip_to_slot_or_del(pda, slot_wear_pda)
-
+
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_s_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_r_store)
+ M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/rcd/combat(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/rcd_ammo/large(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/rcd_ammo/large(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/full(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/sheet/glass/full(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/stack/sheet/plasteel/full(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/stack/sheet/plasteel/full(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
-
+
if("Janitorial")
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/galoshes(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/purple(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/janitor(M), slot_wear_suit)
-
+
var/obj/item/clothing/suit/space/rig/R = M.wear_suit
- R.helmet = new /obj/item/clothing/head/helmet/space/rig/ert/janitor(M)
+ R.helmet = new /obj/item/clothing/head/helmet/space/rig/ert/janitor(M)
M.equip_to_slot_or_del(R.helmet, slot_head)
R.helmet.flags |= NODROP
-
+
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/swat(M), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert/janitor(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/janitor(M), slot_glasses)
@@ -594,19 +594,19 @@ var/can_call_ert
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
pda.icon_state = "pda-janitor"
M.equip_to_slot_or_del(pda, slot_wear_pda)
-
+
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_s_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_r_store)
+ M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/night(src), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/lights/mixed(src), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/spray/plantbgone(src), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/scythe/tele(src), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/glass/bucket(src), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/janitor/full, slot_belt)
- M.equip_to_slot_or_del(new /obj/item/weapon/mop/advanced(M), slot_r_hand)
-
+ M.equip_to_slot_or_del(new /obj/item/weapon/mop/advanced(M), slot_r_hand)
+
new /obj/structure/mopbucket/full(get_turf(M))
/*/mob/living/carbon/human/proc/equip_strike_team(leader_selected = 0) Old ERT equip verb.
diff --git a/code/game/smoothwall.dm b/code/game/smoothwall.dm
index e98c839150a..65ada91e40d 100644
--- a/code/game/smoothwall.dm
+++ b/code/game/smoothwall.dm
@@ -114,6 +114,12 @@
shroom.icon_state = "glowshroomf"
shroom.pixel_x = 0
shroom.pixel_y = 0
+ for(var/obj/effect/supermatter_crystal/crystal in get_step(src,direction))
+ if(!crystal.floor) //crystals drop to the floor
+ crystal.floor = 1
+ crystal.icon_state = "supermatter_crystalf"
+ crystal.pixel_x = 0
+ crystal.pixel_y = 0
..()
/turf/simulated/wall/relativewall()
diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm
index fecdf392d51..d7ec46b7416 100644
--- a/code/game/turfs/simulated.dm
+++ b/code/game/turfs/simulated.dm
@@ -45,64 +45,64 @@
/turf/simulated/Entered(atom/A, atom/OL)
- if (istype(A,/mob/living/carbon/human))
+ if(ishuman(A))
var/mob/living/carbon/human/M = A
if(M.lying) return
if(prob(80))
dirt++
- var/obj/effect/decal/cleanable/dirt/dirtoverlay = locate(/obj/effect/decal/cleanable/dirt, src)
+ var/obj/effect/decal/cleanable/dirt/dirtoverlay = locate(/obj/effect/decal/cleanable/dirt) in src
if(dirt >= 100)
if(!dirtoverlay)
dirtoverlay = new/obj/effect/decal/cleanable/dirt(src)
dirtoverlay.alpha = 10
else if(dirt > 100)
dirtoverlay.alpha = min(dirtoverlay.alpha+10, 200)
- if(istype(M, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = M
- if(istype(H.shoes, /obj/item/clothing/shoes/clown_shoes))
- var/obj/item/clothing/shoes/clown_shoes/O = H.shoes
- if(H.m_intent == "run")
- if(O.footstep >= 2)
- O.footstep = 0
- playsound(src, "clownstep", 50, 1) // this will get annoying very fast.
- else
- O.footstep++
+ if(istype(M.shoes, /obj/item/clothing/shoes/clown_shoes))
+ var/obj/item/clothing/shoes/clown_shoes/O = M.shoes
+ if(M.m_intent == "run")
+ if(O.footstep >= 2)
+ O.footstep = 0
+ playsound(src, "clownstep", 50, 1) // this will get annoying very fast.
else
- playsound(src, "clownstep", 20, 1)
- if(istype(H.shoes, /obj/item/clothing/shoes/jackboots))
- var/obj/item/clothing/shoes/jackboots/O = H.shoes
- if(H.m_intent == "run")
- if(O.footstep >= 2)
- O.footstep = 0
- playsound(src, "jackboot", 50, 1) // this will get annoying very fast.
- else
- O.footstep++
- else
- playsound(src, "jackboot", 20, 1)
-
-
- // Tracking blood
- var/list/bloodDNA = null
- var/bloodcolor=""
- if(H.shoes)
- var/obj/item/clothing/shoes/S = H.shoes
- if(S.track_blood && S.blood_DNA)
- bloodDNA = S.blood_DNA
- bloodcolor=S.blood_color
- S.track_blood--
+ O.footstep++
else
- if(H.track_blood && H.feet_blood_DNA)
- bloodDNA = H.feet_blood_DNA
- bloodcolor=H.feet_blood_color
- H.track_blood--
+ playsound(src, "clownstep", 20, 1)
+ if(istype(M.shoes, /obj/item/clothing/shoes/jackboots))
+ var/obj/item/clothing/shoes/jackboots/O = M.shoes
+ if(M.m_intent == "run")
+ if(O.footstep >= 2)
+ O.footstep = 0
+ playsound(src, "jackboot", 50, 1) // this will get annoying very fast.
+ else
+ O.footstep++
+ else
+ playsound(src, "jackboot", 20, 1)
- if (bloodDNA)
- src.AddTracks(/obj/effect/decal/cleanable/blood/tracks/footprints,bloodDNA,H.dir,0,bloodcolor) // Coming
- var/turf/simulated/from = get_step(H,reverse_direction(H.dir))
- if(istype(from) && from)
- from.AddTracks(/obj/effect/decal/cleanable/blood/tracks/footprints,bloodDNA,0,H.dir,bloodcolor) // Going
+ if(M.flying)
+ return ..()
- bloodDNA = null
+ // Tracking blood
+ var/list/bloodDNA = null
+ var/bloodcolor=""
+ if(M.shoes)
+ var/obj/item/clothing/shoes/S = M.shoes
+ if(S.track_blood && S.blood_DNA)
+ bloodDNA = S.blood_DNA
+ bloodcolor=S.blood_color
+ S.track_blood--
+ else
+ if(M.track_blood && M.feet_blood_DNA)
+ bloodDNA = M.feet_blood_DNA
+ bloodcolor=M.feet_blood_color
+ M.track_blood--
+
+ if (bloodDNA)
+ src.AddTracks(/obj/effect/decal/cleanable/blood/tracks/footprints,bloodDNA,M.dir,0,bloodcolor) // Coming
+ var/turf/simulated/from = get_step(M,reverse_direction(M.dir))
+ if(istype(from) && from)
+ from.AddTracks(/obj/effect/decal/cleanable/blood/tracks/footprints,bloodDNA,0,M.dir,bloodcolor) // Going
+
+ bloodDNA = null
var/noslip = 0
for (var/obj/structure/stool/bed/chair/C in loc)
@@ -112,31 +112,20 @@
return // no slipping while sitting in a chair, plz
switch (src.wet)
if(1)
- if(istype(M, /mob/living/carbon/human)) // Added check since monkeys don't have shoes
- if ((M.m_intent == "run") && !(istype(M:shoes, /obj/item/clothing/shoes) && M.shoes.flags&NOSLIP))
- M.stop_pulling()
- step(M, M.dir)
- M << "\blue You slipped on the wet floor!"
- playsound(src, 'sound/misc/slip.ogg', 50, 1, -3)
- M.Stun(5)
- M.Weaken(3)
- else
- M.inertia_dir = 0
- return
- else if(!istype(M, (/mob/living/carbon/human/slime)) || (M.species.bodyflags & FEET_NOSLIP))
- if (M.m_intent == "run")
- M.stop_pulling()
- step(M, M.dir)
- M << "\blue You slipped on the wet floor!"
- playsound(src, 'sound/misc/slip.ogg', 50, 1, -3)
- M.Stun(5)
- M.Weaken(3)
- else
- M.inertia_dir = 0
- return
+ if ((M.m_intent == "run") && !(istype(M:shoes, /obj/item/clothing/shoes) && M.shoes.flags&NOSLIP))
+ M.stop_pulling()
+ step(M, M.dir)
+ M << "\blue You slipped on the wet floor!"
+ playsound(src, 'sound/misc/slip.ogg', 50, 1, -3)
+ M.Stun(5)
+ M.Weaken(3)
+ else
+ M.inertia_dir = 0
+ return
+
if(2) //lube //can cause infinite loops - needs work
- if(!istype(M, /mob/living/carbon/slime) && !M.buckled)
+ if(!M.buckled)
M.stop_pulling()
step(M, M.dir)
spawn(1) step(M, M.dir)
@@ -149,28 +138,16 @@
M.Weaken(10)
if(3) // Ice
- if(istype(M, /mob/living/carbon/human)) // Added check since monkeys don't have shoes
- if ((M.m_intent == "run") && !(istype(M:shoes, /obj/item/clothing/shoes) && M:shoes.flags&NOSLIP) && prob(30))
- M.stop_pulling()
- step(M, M.dir)
- M << "\blue You slipped on the icy floor!"
- playsound(src, 'sound/misc/slip.ogg', 50, 1, -3)
- M.Stun(4)
- M.Weaken(5)
- else
- M.inertia_dir = 0
- return
- else if(!istype(M, /mob/living/carbon/slime) || (M:species.bodyflags & FEET_NOSLIP))
- if (M.m_intent == "run" && prob(30))
- M.stop_pulling()
- step(M, M.dir)
- M << "\blue You slipped on the icy floor!"
- playsound(src, 'sound/misc/slip.ogg', 50, 1, -3)
- M.Stun(4)
- M.Weaken(5)
- else
- M.inertia_dir = 0
- return
+ if ((M.m_intent == "run") && !(istype(M:shoes, /obj/item/clothing/shoes) && M:shoes.flags&NOSLIP) && prob(30))
+ M.stop_pulling()
+ step(M, M.dir)
+ M << "\blue You slipped on the icy floor!"
+ playsound(src, 'sound/misc/slip.ogg', 50, 1, -3)
+ M.Stun(4)
+ M.Weaken(5)
+ else
+ M.inertia_dir = 0
+ return
..()
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 49be5134edf..c7e6aed197c 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -117,7 +117,7 @@
return
var/atom/movable/M = atom
-
+ if(!M.simulated) return
var/loopsanity = 100
if(ismob(M))
if(!M:lastarea)
@@ -137,6 +137,7 @@
..()
var/objects = 0
for(var/atom/A as mob|obj|turf|area in range(1))
+ if(!A.simulated) return
if(objects > loopsanity) break
objects++
spawn( 0 )
diff --git a/code/game/vehicles/spacepods/spacepod.dm b/code/game/vehicles/spacepods/spacepod.dm
index 2f2d3a657e2..bd3b7e05cc7 100644
--- a/code/game/vehicles/spacepods/spacepod.dm
+++ b/code/game/vehicles/spacepods/spacepod.dm
@@ -788,6 +788,9 @@
set desc = "Fire the weapons."
set category = "Spacepod"
set src = usr.loc
+ if(!equipment_system.weapon_system)
+ usr << "\The [src] has no weapons!"
+ return
equipment_system.weapon_system.fire_weapons()
obj/spacepod/verb/toggleLights()
diff --git a/code/global.dm b/code/global.dm
deleted file mode 100644
index d75d5977ac2..00000000000
--- a/code/global.dm
+++ /dev/null
@@ -1,293 +0,0 @@
-//#define TESTING
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
-
-var/global/obj/effect/datacore/data_core = null
-var/global/obj/effect/overlay/plmaster = null
-var/global/obj/effect/overlay/slmaster = null
-
-
-var/global/list/active_areas = list()
-var/global/list/all_areas = list()
-var/global/list/machines = list()
-var/global/list/processing_objects = list()
-var/global/list/active_diseases = list()
-var/global/list/med_hud_users = list()
-var/global/list/sec_hud_users = list()
- //items that ask to be called every cycle
-
-var/global/defer_powernet_rebuild = 0 // true if net rebuild will be called manually after an event
-
- //////////////
-var/list/paper_tag_whitelist = list("center","p","div","span","h1","h2","h3","h4","h5","h6","hr","pre", \
- "big","small","font","i","u","b","s","sub","sup","tt","br","hr","ol","ul","li","caption","col", \
- "table","td","th","tr")
-var/list/paper_blacklist = list("java","onblur","onchange","onclick","ondblclick","onfocus","onkeydown", \
- "onkeypress","onkeyup","onload","onmousedown","onmousemove","onmouseout","onmouseover", \
- "onmouseup","onreset","onselect","onsubmit","onunload")
-
-var/BLINDBLOCK = 0
-var/DEAFBLOCK = 0
-var/HULKBLOCK = 0
-var/TELEBLOCK = 0
-var/FIREBLOCK = 0
-var/XRAYBLOCK = 0
-var/CLUMSYBLOCK = 0
-var/FAKEBLOCK = 0
-var/COUGHBLOCK = 0
-var/GLASSESBLOCK = 0
-var/EPILEPSYBLOCK = 0
-var/TWITCHBLOCK = 0
-var/NERVOUSBLOCK = 0
-var/MONKEYBLOCK = 50 // Monkey block will always be the DNA_SE_LENGTH
-
-var/BLOCKADD = 0
-var/DIFFMUT = 0
-
-var/NOBREATHBLOCK = 0
-var/REMOTEVIEWBLOCK = 0
-var/REGENERATEBLOCK = 0
-var/INCREASERUNBLOCK = 0
-var/REMOTETALKBLOCK = 0
-var/MORPHBLOCK = 0
-var/COLDBLOCK = 0
-var/HALLUCINATIONBLOCK = 0
-var/NOPRINTSBLOCK = 0
-var/SHOCKIMMUNITYBLOCK = 0
-var/SMALLSIZEBLOCK = 0
-
-///////////////////////////////
-// Goon Stuff
-///////////////////////////////
-// Disabilities
-var/LISPBLOCK = 0
-var/MUTEBLOCK = 0
-var/RADBLOCK = 0
-var/FATBLOCK = 0
-var/CHAVBLOCK = 0
-var/SWEDEBLOCK = 0
-var/SCRAMBLEBLOCK = 0
-var/TOXICFARTBLOCK = 0
-var/STRONGBLOCK = 0
-var/HORNSBLOCK = 0
-var/COMICBLOCK = 0
-
-// Powers
-var/SOBERBLOCK = 0
-var/PSYRESISTBLOCK = 0
-var/SHADOWBLOCK = 0
-var/CHAMELEONBLOCK = 0
-var/CRYOBLOCK = 0
-var/EATBLOCK = 0
-var/JUMPBLOCK = 0
-//var/MELTBLOCK = 0
-var/EMPATHBLOCK = 0
-var/SUPERFARTBLOCK = 0
-var/IMMOLATEBLOCK = 0
-var/POLYMORPHBLOCK = 0
-
-///////////////////////////////
-// /vg/ Mutations
-///////////////////////////////
-var/LOUDBLOCK = 0
-//var/WHISPERBLOCK = 0
-var/DIZZYBLOCK = 0
-
-
-
-
-var/skipupdate = 0
- ///////////////
-var/eventchance = 10 //% per 5 mins
-var/event = 0
-var/hadevent = 0
-var/blobevent = 0
- ///////////////
-var/starticon = null
-var/midicon = null
-var/endicon = null
-var/diary = null
-var/diaryofmeanpeople = null
-var/href_logfile = null
-var/station_name = "NSS Cyberiad"
-var/game_version = "Custom ParaCode"
-var/changelog_hash = ""
-var/game_year = (text2num(time2text(world.realtime, "YYYY")) + 544)
-
-var/datum/air_tunnel/air_tunnel1/SS13_airtunnel = null
-var/going = 1.0
-var/master_mode = "extended"//"extended"
-var/secret_force_mode = "secret" // if this is anything but "secret", the secret rotation will forceably choose this mode
-
-var/datum/engine_eject/engine_eject_control = null
-var/list/carplist = list()
-// list/traitors = list() //traitor list
-var/host = null
-var/aliens_allowed = 1
-var/ooc_allowed = 1
-var/dsay_allowed = 1
-var/dooc_allowed = 1
-var/traitor_scaling = 1
-//var/goonsay_allowed = 0
-var/dna_ident = 1
-var/abandon_allowed = 0
-var/enter_allowed = 1
-var/guests_allowed = 1
-var/shuttle_frozen = 0
-var/shuttle_left = 0
-var/tinted_weldhelh = 1
-
-var/list/jobMax = list()
-var/list/bombers = list( )
-var/list/admin_log = list ( )
-var/list/lastsignalers = list( ) //keeps last 100 signals here in format: "[src] used \ref[src] @ location [src.loc]: [freq]/[code]"
-var/list/lawchanges = list( ) //Stores who uploaded laws to which silicon-based lifeform, and what the law was
-var/list/reg_dna = list( )
-// list/traitobj = list( )
-
-var/mouse_respawn_time = 5 //Amount of time that must pass between a player dying as a mouse and repawning as a mouse. In minutes.
-
-var/CELLRATE = 0.002 // multiplier for watts per tick <> cell storage (eg: .002 means if there is a load of 1000 watts, 20 units will be taken from a cell per second)
-var/CHARGELEVEL = 0.0005 // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second)
-
-var/airtunnel_start = 68 // default
-var/airtunnel_stop = 68 // default
-var/airtunnel_bottom = 72 // default
-// reverse_dir[dir] = reverse of dir
-var/list/reverse_dir = list(2, 1, 3, 8, 10, 9, 11, 4, 6, 5, 7, 12, 14, 13, 15, 32, 34, 33, 35, 40, 42, 41, 43, 36, 38, 37, 39, 44, 46, 45, 47, 16, 18, 17, 19, 24, 26, 25, 27, 20, 22, 21, 23, 28, 30, 29, 31, 48, 50, 49, 51, 56, 58, 57, 59, 52, 54, 53, 55, 60, 62, 61, 63)
-
-var/datum/station_state/start_state = null
-var/datum/configuration/config = null
-
-var/list/combatlog = list()
-var/list/IClog = list()
-var/list/OOClog = list()
-var/list/adminlog = list()
-
-
-var/list/powernets = list()
-
-var/Debug = 0 // global debug switch
-var/Debug2 = 1 // enables detailed job debug file in secrets
-
-var/datum/debug/debugobj
-
-var/datum/moduletypes/mods = new()
-
-var/wavesecret = 0
-var/gravity_is_on = 1
-
-var/shuttlecoming = 0
-
-var/join_motd = null
-var/forceblob = 0
-
-// nanomanager, the manager for Nano UIs
-var/datum/nanomanager/nanomanager = new()
-
-// event manager, the manager for events
-var/datum/event_manager/event_manager = new()
-
-#define SPEED_OF_LIGHT 3e8 //not exact but hey!
-#define SPEED_OF_LIGHT_SQ 9e+16
-#define FIRE_DAMAGE_MODIFIER 0.0215 //Higher values result in more external fire damage to the skin (default 0.0215)
-#define AIR_DAMAGE_MODIFIER 4.050 //More means less damage from hot air scalding lungs, less = more damage. (default 2.025)
-#define INFINITY 1e31 //closer then enough
-
- //Don't set this very much higher then 1024 unless you like inviting people in to dos your server with message spam
-#define MAX_MESSAGE_LEN 1024
-#define MAX_PAPER_MESSAGE_LEN 3072
-#define MAX_BOOK_MESSAGE_LEN 9216
-#define MAX_NAME_LEN 26
-
-#define shuttle_time_in_station 1800 // 3 minutes in the station
-#define shuttle_time_to_arrive 6000 // 10 minutes to arrive
-
-#define EVENT_LEVEL_MUNDANE 1
-#define EVENT_LEVEL_MODERATE 2
-#define EVENT_LEVEL_MAJOR 3
-
-
-
- // MySQL configuration
-
-var/sqladdress = "localhost"
-var/sqlport = "3306"
-var/sqldb = "paradise"
-var/sqllogin = "root"
-var/sqlpass = "example"
-
- // Feedback gathering sql connection
-
-var/sqlfdbkdb = "paradise"
-var/sqlfdbklogin = "root"
-var/sqlfdbkpass = "example"
-
-var/sqllogging = 0 // Should we log deaths, population stats, etc?
-
-
-
- // Forum MySQL configuration (for use with forum account/key authentication)
- // These are all default values that will load should the forumdbconfig.txt
- // file fail to read for whatever reason.
-
-var/forumsqladdress = "localhost"
-var/forumsqlport = "3306"
-var/forumsqldb = "tgstation"
-var/forumsqllogin = "root"
-var/forumsqlpass = "bleh"
-var/forum_activated_group = "2"
-var/forum_authenticated_group = "10"
-
- // For FTP requests. (i.e. downloading runtime logs.)
- // However it'd be ok to use for accessing attack logs and such too, which are even laggier.
-var/fileaccess_timer = 0
-var/custom_event_msg = null
-
-//Database connections
-//A connection is established on world creation. Ideally, the connection dies when the server restarts (After feedback logging.).
-var/DBConnection/dbcon = new() //Feedback database (New database)
-var/DBConnection/dbcon_old = new() //Tgstation database (Old database) - See the files in the SQL folder for information what goes where.
-
-
-//Goonstyle scoreboard
-var/score_crewscore = 0 // this is the overall var/score for the whole round
-var/score_stuffshipped = 0 // how many useful items have cargo shipped out?
-var/score_stuffharvested = 0 // how many harvests have hydroponics done?
-var/score_oremined = 0 // obvious
-var/score_researchdone = 0
-var/score_eventsendured = 0 // how many random events did the station survive?
-var/score_powerloss = 0 // how many APCs have poor charge?
-var/score_escapees = 0 // how many people got out alive?
-var/score_deadcrew = 0 // dead bodies on the station, oh no
-var/score_mess = 0 // how much poo, puke, gibs, etc went uncleaned
-var/score_meals = 0
-var/score_disease = 0 // how many rampant, uncured diseases are on board the station
-var/score_deadcommand = 0 // used during rev, how many command staff perished
-var/score_arrested = 0 // how many traitors/revs/whatever are alive in the brig
-var/score_traitorswon = 0 // how many traitors were successful?
-var/score_allarrested = 0 // did the crew catch all the enemies alive?
-var/score_opkilled = 0 // used during nuke mode, how many operatives died?
-var/score_disc = 0 // is the disc safe and secure?
-var/score_nuked = 0 // was the station blown into little bits?
-
- // these ones are mainly for the stat panel
-var/score_powerbonus = 0 // if all APCs on the station are running optimally, big bonus
-var/score_messbonus = 0 // if there are no messes on the station anywhere, huge bonus
-var/score_deadaipenalty = 0 // is the AI dead? if so, big penalty
-var/score_foodeaten = 0 // nom nom nom
-var/score_clownabuse = 0 // how many times a clown was punched, struck or otherwise maligned
-var/score_richestname = null // this is all stuff to show who was the richest alive on the shuttle
-var/score_richestjob = null // kinda pointless if you dont have a money system i guess
-var/score_richestcash = 0
-var/score_richestkey = null
-var/score_dmgestname = null // who had the most damage on the shuttle (but was still alive)
-var/score_dmgestjob = null
-var/score_dmgestdamage = 0
-var/score_dmgestkey = null
-
-
-// Recall time limit: 2 hours
-var/recall_time_limit=72000
-
-// Announcer intercom, because too much stuff creates an intercom for one message then hard del()s it.
-var/global/obj/item/device/radio/intercom/global_announcer = new(null)
diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm
index 28f8c297c36..932f54f0689 100644
--- a/code/modules/admin/verbs/adminjump.dm
+++ b/code/modules/admin/verbs/adminjump.dm
@@ -6,7 +6,12 @@
src << "Only administrators may use this command."
return
- usr.loc = pick(get_area_turfs(A))
+ var/list/area_turfs = get_area_turfs(A)
+ if(area_turfs && area_turfs.len)
+ usr.loc = pick(area_turfs)
+ else
+ src << "That area has no turfs to jump to!"
+ return
log_admin("[key_name(usr)] jumped to [A]")
message_admins("[key_name_admin(usr)] jumped to [A]", 1)
feedback_add_details("admin_verb","JA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 76240d2f627..4f8b13a36e2 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -1037,7 +1037,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/staff(M), slot_l_hand)
+ M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack)
@@ -1049,7 +1049,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/red(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/staff(M), slot_l_hand)
+ M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack)
@@ -1061,7 +1061,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/marisa(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/staff(M), slot_l_hand)
+ M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 77e005c0422..93c4a366bf6 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -970,7 +970,7 @@ datum/preferences
if("age")
age = rand(AGE_MIN, AGE_MAX)
if("hair")
- if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Machine")
+ if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Machine" || species == "Wryn")
r_hair = rand(0,255)
g_hair = rand(0,255)
b_hair = rand(0,255)
@@ -996,7 +996,7 @@ datum/preferences
if(species == "Human")
s_tone = random_skin_tone()
if("s_color")
- if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Slime People")
+ if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Slime People" || species == "Wryn")
r_skin = rand(0,255)
g_skin = rand(0,255)
b_skin = rand(0,255)
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 05519f99a7e..9c2f0beb67a 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -45,7 +45,7 @@
//Set species_restricted list
switch(target_species)
if("Human", "Skrell") //humanoid bodytypes
- species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox")
+ species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox","Wryn")
else
species_restricted = list(target_species)
@@ -161,7 +161,7 @@ BLIND // can't see anything
var/transfer_prints = FALSE
var/pickpocket = 0 //Master pickpocket?
var/clipped = 0
- species_restricted = list("exclude","Unathi","Tajaran")
+ species_restricted = list("exclude","Unathi","Tajaran","Wryn")
/obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/wirecutters))
@@ -295,7 +295,7 @@ BLIND // can't see anything
permeability_coefficient = 0.50
slowdown = SHOES_SLOWDOWN
- species_restricted = list("exclude","Unathi","Tajaran")
+ species_restricted = list("exclude","Unathi","Tajaran","Wryn")
/obj/item/proc/negates_gravity()
return 0
@@ -328,7 +328,7 @@ BLIND // can't see anything
heat_protection = HEAD
max_heat_protection_temperature = SPACE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE
siemens_coefficient = 0.9
- species_restricted = list("exclude","Diona","Vox")
+ species_restricted = list("exclude","Diona","Vox","Wryn")
loose = 0 // What kind of idiot designs a pressurized suit where the helmet can fall off?
flash_protect = 2
@@ -351,7 +351,7 @@ BLIND // can't see anything
heat_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
siemens_coefficient = 0.9
- species_restricted = list("exclude","Diona","Vox")
+ species_restricted = list("exclude","Diona","Vox","Wryn")
//Under clothing
/obj/item/clothing/under
diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm
index 0bdb722f213..f92c7fcde21 100644
--- a/code/modules/clothing/spacesuits/rig.dm
+++ b/code/modules/clothing/spacesuits/rig.dm
@@ -13,7 +13,7 @@
action_button_name = "Toggle Helmet Light"
//Species-specific stuff.
- species_restricted = list("exclude","Unathi","Tajaran","Skrell","Diona","Vox")
+ species_restricted = list("exclude","Unathi","Tajaran","Skrell","Diona","Vox","Wryn")
sprite_sheets = list(
"Unathi" = 'icons/mob/species/unathi/helmet.dmi',
"Tajaran" = 'icons/mob/species/tajaran/helmet.dmi',
@@ -51,7 +51,7 @@
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/t_scanner, /obj/item/weapon/rcd)
- species_restricted = list("exclude","Unathi","Tajaran","Skrell","Diona","Vox")
+ species_restricted = list("exclude","Unathi","Tajaran","Skrell","Diona","Vox","Wryn")
sprite_sheets = list(
"Unathi" = 'icons/mob/species/unathi/suit.dmi',
"Tajaran" = 'icons/mob/species/tajaran/suit.dmi',
diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm
index 54fbe20c87b..f3da90cfe17 100644
--- a/code/modules/clothing/under/color.dm
+++ b/code/modules/clothing/under/color.dm
@@ -3,7 +3,7 @@
/obj/item/clothing/under/color/random/New()
..()
- var/list/excluded = list(/obj/item/clothing/under/color/random, /obj/item/clothing/under/color, /obj/item/clothing/under/color/blackf, /obj/item/clothing/under/color/blue/dodgeball, /obj/item/clothing/under/color/orange/prison, /obj/item/clothing/under/color/red/dodgeball)
+ var/list/excluded = list(/obj/item/clothing/under/color/random, /obj/item/clothing/under/color, /obj/item/clothing/under/color/blackf, /obj/item/clothing/under/color/blue/dodgeball, /obj/item/clothing/under/color/orange/prison, /obj/item/clothing/under/color/red/dodgeball, /obj/item/clothing/under/color/red/jersey, /obj/item/clothing/under/color/blue/jersey)
var/obj/item/clothing/under/color/C = pick(typesof(/obj/item/clothing/under/color) - excluded)
name = initial(C.name)
icon_state = initial(C.icon_state)
@@ -173,3 +173,19 @@
icon_state = "darkred"
_color = "darkred"
flags = ONESIZEFITSALL
+
+/obj/item/clothing/under/color/red/jersey
+ name = "red team jersey"
+ desc = "The jersey of the Nanotrasen Phi-ghters!"
+ icon_state = "redjersey"
+ item_state = "r_suit"
+ _color = "redjersey"
+ flags = ONESIZEFITSALL
+
+/obj/item/clothing/under/color/blue/jersey
+ name = "blue team jersey"
+ desc = "The jersey of the Nanotrasen Pi-rates!"
+ icon_state = "bluejersey"
+ item_state = "b_suit"
+ _color = "bluejersey"
+ flags = ONESIZEFITSALL
diff --git a/code/modules/computer3/computers/prisoner.dm b/code/modules/computer3/computers/prisoner.dm
index 4bb238852fc..e3cfba6e673 100644
--- a/code/modules/computer3/computers/prisoner.dm
+++ b/code/modules/computer3/computers/prisoner.dm
@@ -43,7 +43,7 @@
if(!T.implanted) continue
var/loc_display = "Unknown"
var/mob/living/carbon/M = T.imp_in
- if(M.z == 1 && !istype(M.loc, /turf/space))
+ if(M.z == ZLEVEL_STATION && !istype(M.loc, /turf/space))
var/turf/mob_loc = get_turf(M)
loc_display = mob_loc.loc
if(T.malfunction)
diff --git a/code/modules/food/candy_maker.dm b/code/modules/food/candy_maker.dm
index 269c2fcc33b..7e12fc327bf 100644
--- a/code/modules/food/candy_maker.dm
+++ b/code/modules/food/candy_maker.dm
@@ -33,7 +33,11 @@
if (!available_recipes)
available_recipes = new
for (var/type in (typesof(/datum/recipe/candy)-/datum/recipe/candy))
- available_recipes+= new type
+ var/datum/recipe/recipe = new type
+ if(recipe.result) // Ignore recipe subtypes that lack a result
+ available_recipes += recipe
+ else
+ del(recipe)
acceptable_items = new
acceptable_reagents = new
for (var/datum/recipe/candy/recipe in available_recipes)
diff --git a/code/modules/food/grill_new.dm b/code/modules/food/grill_new.dm
index 6fcd5e3a31a..ee8bd4bf460 100644
--- a/code/modules/food/grill_new.dm
+++ b/code/modules/food/grill_new.dm
@@ -34,7 +34,11 @@
if (!available_recipes)
available_recipes = new
for (var/type in (typesof(/datum/recipe/grill)-/datum/recipe/grill))
- available_recipes+= new type
+ var/datum/recipe/recipe = new type
+ if(recipe.result) // Ignore recipe subtypes that lack a result
+ available_recipes += recipe
+ else
+ del(recipe)
acceptable_items = new
acceptable_reagents = new
for (var/datum/recipe/grill/recipe in available_recipes)
diff --git a/code/modules/food/oven_new.dm b/code/modules/food/oven_new.dm
index 1b0c3559cf0..7d6022ae9ae 100644
--- a/code/modules/food/oven_new.dm
+++ b/code/modules/food/oven_new.dm
@@ -34,7 +34,11 @@
if (!available_recipes)
available_recipes = new
for (var/type in (typesof(/datum/recipe/oven)-/datum/recipe/oven))
- available_recipes+= new type
+ var/datum/recipe/recipe = new type
+ if(recipe.result) // Ignore recipe subtypes that lack a result
+ available_recipes += recipe
+ else
+ del(recipe)
acceptable_items = new
acceptable_reagents = new
for (var/datum/recipe/oven/recipe in available_recipes)
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 3bff511538b..6e326718ca6 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -54,9 +54,24 @@
rtotal += round(potency/reagent_data[2])
reagents.add_reagent(rid,max(1,rtotal))
update_desc()
+ update_trash()
if(reagents.total_volume > 0)
bitesize = 1+round(reagents.total_volume / 2, 1)
+/obj/item/weapon/reagent_containers/food/snacks/grown/proc/update_trash()
+ if(!seed)
+ return
+ trash = seed.trash_type
+ if(seed.kitchen_tag)
+ if(seed.kitchen_tag == "watermelon") // 15% chance to leave behind a pack of watermelon seeds
+ if(prob(15))
+ var/obj/item/seeds/seeds = new()
+ seeds.seed = seed
+ seeds.update_seed()
+ trash = seeds
+ else
+ trash = null
+
/obj/item/weapon/reagent_containers/food/snacks/grown/proc/update_desc()
if(!seed)
@@ -186,6 +201,8 @@
del(src)
return
else if(W.sharp)
+ var/reagents_per_slice
+ var/obj/slice
if(seed.kitchen_tag == "pumpkin") // Ugggh these checks are awful.
user.show_message("You carve a face into [src]!", 1)
new /obj/item/clothing/head/hardhat/pumpkinhead (user.loc)
@@ -193,23 +210,31 @@
return
else if(seed.kitchen_tag == "potato")
user << "You slice \the [src] into sticks."
- new /obj/item/weapon/reagent_containers/food/snacks/rawsticks(get_turf(src))
+ reagents_per_slice = reagents.total_volume
+ slice = new /obj/item/weapon/reagent_containers/food/snacks/rawsticks(get_turf(src))
+ reagents.trans_to(slice, reagents_per_slice)
del(src)
return
else if(seed.kitchen_tag == "carrot")
user << "You slice \the [src] into sticks."
- new /obj/item/weapon/reagent_containers/food/snacks/carrotfries(get_turf(src))
+ reagents_per_slice = reagents.total_volume
+ slice = new /obj/item/weapon/reagent_containers/food/snacks/carrotfries(get_turf(src))
+ reagents.trans_to(slice, reagents_per_slice)
del(src)
return
else if(seed.kitchen_tag == "watermelon")
user << "You slice \the [src] into large slices."
+ reagents_per_slice = reagents.total_volume/5
for(var/i=0,i<5,i++)
- new /obj/item/weapon/reagent_containers/food/snacks/watermelonslice(get_turf(src))
+ slice = new /obj/item/weapon/reagent_containers/food/snacks/watermelonslice(get_turf(src))
+ reagents.trans_to(slice, reagents_per_slice)
del(src)
return
else if(seed.kitchen_tag == "soybeans")
user << "You roughly chop up \the [src]."
- new /obj/item/weapon/reagent_containers/food/snacks/soydope(get_turf(src))
+ reagents_per_slice = reagents.total_volume
+ slice = new /obj/item/weapon/reagent_containers/food/snacks/soydope(get_turf(src))
+ reagents.trans_to(slice, reagents_per_slice)
del(src)
return
else if(seed.chems)
diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm
index 28486a254d4..c11d46154f2 100644
--- a/code/modules/hydroponics/seed.dm
+++ b/code/modules/hydroponics/seed.dm
@@ -281,7 +281,7 @@
if(!light_supplied)
var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in current_turf
if(L)
- light_supplied = max(0,min(10,L.lum_r + L.lum_g + L.lum_b)-5)
+ light_supplied = L.get_clamped_lum()*10
else
light_supplied = 5
@@ -689,7 +689,8 @@
else
product = new /obj/item/weapon/reagent_containers/food/snacks/grown(get_turf(user),name)
if(get_trait(TRAIT_PRODUCT_COLOUR))
- product.color = get_trait(TRAIT_PRODUCT_COLOUR)
+ if(!has_mob_product || (has_mob_product && has_mob_product != /mob/living/carbon/monkey/diona))
+ product.color = get_trait(TRAIT_PRODUCT_COLOUR)
if(istype(product,/obj/item/weapon/reagent_containers/food))
var/obj/item/weapon/reagent_containers/food/food = product
food.filling_color = get_trait(TRAIT_PRODUCT_COLOUR)
diff --git a/code/modules/hydroponics/seed_mobs.dm b/code/modules/hydroponics/seed_mobs.dm
index 8b240124550..8d5d26df12b 100644
--- a/code/modules/hydroponics/seed_mobs.dm
+++ b/code/modules/hydroponics/seed_mobs.dm
@@ -13,7 +13,7 @@
spawn(75)
if(!host.ckey && !host.client)
host.death() // This seems redundant, but a lot of mobs don't
- host.stat = 2 // handle death() properly. Better safe than etc.
+ host.stat = DEAD // handle death() properly. Better safe than etc.
host.visible_message("[host] is malformed and unable to survive. It expires pitifully, leaving behind some seeds.")
var/total_yield = rand(1,3)
diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm
index dbfcdddcb36..b99e2ccf6b8 100644
--- a/code/modules/hydroponics/spreading/spreading.dm
+++ b/code/modules/hydroponics/spreading/spreading.dm
@@ -1,7 +1,7 @@
#define DEFAULT_SEED "glowshroom"
#define VINE_GROWTH_STAGES 5
-/proc/spacevine_infestation()
+/proc/spacevine_infestation(var/potency_min=70, var/potency_max=100, var/maturation_min=5, var/maturation_max=15)
spawn() //to stop the secrets panel hanging
var/list/turf/simulated/floor/turfs = list() //list of all the empty floor turfs in the hallway areas
for(var/areapath in typesof(/area/hallway))
@@ -14,8 +14,15 @@
var/turf/simulated/floor/T = pick(turfs)
var/datum/seed/seed = plant_controller.create_random_seed(1)
seed.set_trait(TRAIT_SPREAD,2) // So it will function properly as vines.
- seed.set_trait(TRAIT_POTENCY,rand(70,100)) // Guarantee a wide spread and powerful effects.
- new /obj/effect/plant(T,seed)
+ seed.set_trait(TRAIT_POTENCY,rand(potency_min, potency_max)) // 70-100 potency will help guarantee a wide spread and powerful effects.
+ seed.set_trait(TRAIT_MATURATION,rand(maturation_min, maturation_max))
+
+ //make vine zero start off fully matured
+ var/obj/effect/plant/vine = new(T,seed)
+ vine.health = vine.max_health
+ vine.mature_time = 0
+ vine.process()
+
message_admins("Event: Spacevines spawned at [T.loc] ([T.x],[T.y],[T.z])")
/obj/effect/dead_plant
@@ -56,6 +63,7 @@
var/spread_chance = 40
var/spread_distance = 3
var/evolve_chance = 2
+ var/mature_time
var/last_tick = 0
var/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/plant
@@ -114,7 +122,8 @@
if(max_growth > 2 && prob(50))
max_growth-- //Ensure some variation in final sprite, makes the carpet of crap look less wonky.
- spread_chance = seed.get_trait(TRAIT_POTENCY) * 4
+ mature_time = world.time + seed.get_trait(TRAIT_MATURATION) + 15 //prevent vines from maturing until at least a few seconds after they've been created.
+ spread_chance = seed.get_trait(TRAIT_POTENCY) * 3
spread_distance = ((growth_type>0) ? round(spread_chance*0.6) : round(spread_chance*0.3))
update_icon()
@@ -180,7 +189,8 @@
if(growth>2 && growth == max_growth)
layer = 5
- opacity = 1
+ if(seed.get_trait(TRAIT_SPREAD) == 2)
+ opacity = 1
if(!isnull(seed.chems["woodpulp"]))
density = 1
else
@@ -257,4 +267,4 @@
die_off()
/obj/effect/plant/proc/is_mature()
- return (health >= (max_health/3))
\ No newline at end of file
+ return (health >= (max_health/3) && world.time > mature_time)
\ No newline at end of file
diff --git a/code/modules/hydroponics/spreading/spreading_growth.dm b/code/modules/hydroponics/spreading/spreading_growth.dm
index cdd06639a1c..6b589427b2e 100644
--- a/code/modules/hydroponics/spreading/spreading_growth.dm
+++ b/code/modules/hydroponics/spreading/spreading_growth.dm
@@ -72,7 +72,10 @@
update_neighbors()
if(is_mature() && neighbors.len && prob(spread_chance))
- for(var/i=1,i<=seed.get_trait(TRAIT_YIELD),i++)
+ //spread to 1-3 adjacent turfs depending on yield trait.
+ var/max_spread = between(1, round(seed.get_trait(TRAIT_YIELD)*3/14), 3)
+
+ for(var/i in 1 to max_spread)
if(prob(spread_chance))
sleep(rand(3,5))
if(!neighbors.len)
diff --git a/code/modules/hydroponics/spreading/spreading_response.dm b/code/modules/hydroponics/spreading/spreading_response.dm
index d175fdda221..228cd73fc24 100644
--- a/code/modules/hydroponics/spreading/spreading_response.dm
+++ b/code/modules/hydroponics/spreading/spreading_response.dm
@@ -7,8 +7,11 @@
if(!istype(M))
return
- if(!buckled_mob && !M.buckled && !M.anchored && (M.small || prob(round(seed.get_trait(TRAIT_POTENCY)/2))))
- entangle(M)
+ if(!buckled_mob && !M.buckled && !M.anchored && (M.small || prob(round(seed.get_trait(TRAIT_POTENCY)/6))))
+ //wait a tick for the Entered() proc that called HasProximity() to finish (and thus the moving animation),
+ //so we don't appear to teleport from two tiles away when moving into a turf adjacent to vines.
+ spawn(1)
+ entangle(M)
/obj/effect/plant/attack_hand(mob/user as mob)
// Todo, cause damage.
@@ -60,13 +63,11 @@
if(buckled_mob)
return
- if(!Adjacent(victim))
+ if(victim.buckled)
return
- victim.buckled = src
- victim.update_canmove()
- buckled_mob = victim
- if(!victim.anchored && !victim.buckled && victim.loc != get_turf(src))
+ //grabbing people
+ if(!victim.anchored && Adjacent(victim) && victim.loc != get_turf(src))
var/can_grab = 1
if(istype(victim, /mob/living/carbon/human))
var/mob/living/carbon/human/H = victim
@@ -75,4 +76,10 @@
if(can_grab)
src.visible_message("Tendrils lash out from \the [src] and drag \the [victim] in!")
victim.loc = src.loc
- victim << "Tendrils [pick("wind", "tangle", "tighten")] around you!"
+
+ //entangling people
+ if(victim.loc == src.loc)
+ victim.buckled = src
+ victim.update_canmove()
+ buckled_mob = victim
+ victim << "Tendrils [pick("wind", "tangle", "tighten")] around you!"
diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm
index 112b503fec1..2dae36c58d0 100644
--- a/code/modules/hydroponics/trays/tray.dm
+++ b/code/modules/hydroponics/trays/tray.dm
@@ -810,7 +810,7 @@
var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T
var/light_available
if(L)
- light_available = max(0,min(10,L.lum_r + L.lum_g + L.lum_b)-5)
+ light_available = L.get_clamped_lum()*10
else
light_available = 5
light_string = "a light level of [light_available] lumens"
@@ -830,3 +830,21 @@
closed_system = !closed_system
user << "You [closed_system ? "close" : "open"] the tray's lid."
update_icon()
+
+/obj/machinery/portable_atmospherics/hydroponics/verb/eject_tank_verb()
+ set name = "Eject Internal Tank"
+ set category = "Object"
+ set src in view(1)
+ eject_tank(usr)
+
+/obj/machinery/portable_atmospherics/hydroponics/proc/eject_tank(var/mob/living/user)
+ if(!user || user.stat || user.restrained())
+ return
+
+ if(!holding)
+ usr << "\red There is no tank loaded into [src] to eject."
+
+ if(istype(holding, /obj/item/weapon/tank))
+ usr << "\blue You eject [holding.name] from [src]."
+ holding.loc = loc
+ holding = null
diff --git a/code/modules/hydroponics/trays/tray_soil.dm b/code/modules/hydroponics/trays/tray_soil.dm
index bea2a8e82ed..ff47f069707 100644
--- a/code/modules/hydroponics/trays/tray_soil.dm
+++ b/code/modules/hydroponics/trays/tray_soil.dm
@@ -9,6 +9,8 @@
/obj/machinery/portable_atmospherics/hydroponics/soil/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(istype(O,/obj/item/weapon/tank))
return
+ else if(istype(O,/obj/item/weapon/crowbar))
+ return
else
..()
@@ -17,6 +19,7 @@
verbs -= /obj/machinery/portable_atmospherics/hydroponics/verb/close_lid_verb
verbs -= /obj/machinery/portable_atmospherics/hydroponics/verb/remove_label
verbs -= /obj/machinery/portable_atmospherics/hydroponics/verb/setlight
+ verbs -= /obj/machinery/portable_atmospherics/hydroponics/verb/eject_tank_verb
/obj/machinery/portable_atmospherics/hydroponics/soil/CanPass()
return 1
diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm
index d70035bdc84..7d69104e2b0 100644
--- a/code/modules/hydroponics/trays/tray_tools.dm
+++ b/code/modules/hydroponics/trays/tray_tools.dm
@@ -301,6 +301,7 @@
throw_speed = 2
throw_range = 3
w_class = 4.0
+ var/extend = 1
flags = NOSHIELD
slot_flags = SLOT_BACK
origin_tech = "materials=2;combat=2"
@@ -309,12 +310,71 @@
/obj/item/weapon/scythe/afterattack(atom/A, mob/user as mob, proximity)
if(!proximity) return
- if(istype(A, /obj/effect/plant))
+ if(istype(A, /obj/effect/plant) && extend == 1)
for(var/obj/effect/plant/B in orange(A,1))
if(prob(80))
B.die_off(1)
qdel(A)
+/obj/item/weapon/scythe/tele
+ icon_state = "tscythe0"
+ name = "telescopic scythe"
+ desc = "A sharp and curved blade on a collapsable fibremetal handle, this tool is the pinnacle of covert reaping technology."
+ force = 3.0
+ sharp = 0
+ edge = 0
+ throw_speed = 2
+ throw_range = 3
+ w_class = 2.0
+ extend = 0
+ flags = NOSHIELD
+ slot_flags = SLOT_BELT
+ origin_tech = "materials=3;combat=3"
+ attack_verb = list("chopped", "sliced", "cut", "reaped")
+ hitsound = "swing_hit"
+
+/obj/item/weapon/scythe/tele/attack_self(mob/user as mob)
+ extend = !extend
+ if(extend)
+ user << "With a flick of the wrist, you extend the scythe. It's reaping time!"
+ icon_state = "tscythe1"
+ item_state = "scythe0"
+ slot_flags &= ~SLOT_BELT
+ w_class = 4 //doesnt fit in backpack when its on for balance
+ force = 13 //normal scythe damage
+ attack_verb = list("chopped", "sliced", "cut", "reaped")
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ //Extend sound (blade unsheath)
+ playsound(src.loc, 'sound/weapons/blade_unsheath.ogg', 50, 1) //Sound credit to Qat of Freesound.org
+ else
+ user << "You collapse the scythe, folding it for easy storage."
+ icon_state = "tscythe0"
+ item_state = "tscythe0" //no sprite in other words
+ slot_flags |= SLOT_BELT
+ w_class = 2
+ force = 3 //not so robust now
+ attack_verb = list("hit", "poked")
+ hitsound = "swing_hit"
+ //Collapse sound (blade sheath)
+ playsound(src.loc, 'sound/weapons/blade_sheath.ogg', 50, 1) //Sound credit to Q.K. of Freesound.org
+ if(istype(user,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = user
+ H.update_inv_l_hand()
+ H.update_inv_r_hand()
+ add_fingerprint(user)
+ if (!blood_DNA) return
+ if(blood_overlay && (blood_DNA.len >= 1)) //updates blood overlay, if any
+ overlays.Cut()//this might delete other item overlays as well but eeeeeeeh
+
+ var/icon/I = new /icon(src.icon, src.icon_state)
+ I.Blend(new /icon('icons/effects/blood.dmi', rgb(255,255,255)),ICON_ADD)
+ I.Blend(new /icon('icons/effects/blood.dmi', "itemblood"),ICON_MULTIPLY)
+ blood_overlay = I
+
+ overlays += blood_overlay
+
+ return
+
/obj/item/weapon/rsp
name = "\improper Rapid-Seed-Producer (RSP)"
desc = "A device used to rapidly deploy seeds."
diff --git a/code/modules/lighting/light_source.dm b/code/modules/lighting/light_source.dm
index 35bd0db7323..22a734b436a 100644
--- a/code/modules/lighting/light_source.dm
+++ b/code/modules/lighting/light_source.dm
@@ -50,8 +50,8 @@
/datum/light_source/proc/destroy()
destroyed = 1
force_update()
- if(source_atom) source_atom.light_sources -= src
- if(top_atom) top_atom.light_sources -= src
+ if(source_atom && source_atom.light_sources) source_atom.light_sources -= src
+ if(top_atom && top_atom.light_sources) top_atom.light_sources -= src
/datum/light_source/proc/update(atom/new_top_atom)
if(new_top_atom && new_top_atom != top_atom)
@@ -69,7 +69,7 @@
lighting_update_lights += src
/datum/light_source/proc/check()
- if(!source_atom)
+ if(!source_atom || !light_range || !light_power)
destroy()
return 1
diff --git a/code/modules/lighting/lighting_overlay.dm b/code/modules/lighting/lighting_overlay.dm
index 932eee6461a..efc19265e43 100644
--- a/code/modules/lighting/lighting_overlay.dm
+++ b/code/modules/lighting/lighting_overlay.dm
@@ -3,7 +3,7 @@
mouse_opacity = 0
simulated = 0
anchored = 1
-
+ flags = NOREACT
icon = LIGHTING_ICON
layer = LIGHTING_LAYER
invisibility = INVISIBILITY_LIGHTING
@@ -25,6 +25,15 @@
. = ..()
verbs.Cut()
+/atom/movable/lighting_overlay/proc/get_clamped_lum(var/minlum = 0, var/maxlum = 1)
+ var/lum = max(lum_r, lum_g, lum_b)
+ if(lum <= minlum)
+ return 0
+ else if(lum >= maxlum)
+ return 1
+ else
+ return (lum - minlum) / (maxlum - minlum)
+
/atom/movable/lighting_overlay/proc/update_lumcount(delta_r, delta_g, delta_b)
lum_r += delta_r
lum_g += delta_g
diff --git a/code/modules/lighting/lighting_process.dm b/code/modules/lighting/lighting_process.dm
index a16a0317db5..3159cfcd852 100644
--- a/code/modules/lighting/lighting_process.dm
+++ b/code/modules/lighting/lighting_process.dm
@@ -1,3 +1,4 @@
+
/datum/controller/process/lighting/setup()
name = "lighting"
schedule_interval = LIGHTING_INTERVAL
@@ -7,17 +8,21 @@
/datum/controller/process/lighting/doWork()
for(var/datum/light_source/L in lighting_update_lights)
if(L.needs_update)
- if(L.destroyed)
+ if(L.destroyed || L.check() || L.force_update)
L.remove_lum()
- else if(L.check() || L.force_update)
- L.remove_lum()
- L.apply_lum()
+ if(!L.destroyed) L.apply_lum()
L.force_update = 0
L.needs_update = 0
+
+ scheck()
+
lighting_update_lights.Cut()
for(var/atom/movable/lighting_overlay/O in lighting_update_overlays)
if(O.needs_update)
O.update_overlay()
O.needs_update = 0
+
+ scheck()
+
lighting_update_overlays.Cut()
\ No newline at end of file
diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm
index d3e955d13c4..65e63b387de 100644
--- a/code/modules/mining/equipment_locker.dm
+++ b/code/modules/mining/equipment_locker.dm
@@ -422,7 +422,7 @@
playsound(src,'sound/weapons/resonator_blast.ogg',50,1)
if(creator)
for(var/mob/living/L in src.loc)
- add_logs(creator, L, "used a resonator field on", object="resonator")
+ add_logs(L, creator, "used a resonator field on", object="resonator")
L << "The [src.name] ruptured with you in it!"
L.adjustBruteLoss(resonance_damage)
else
diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm
index 78e0509cc0c..ab1aa6a8dd8 100644
--- a/code/modules/mining/ore.dm
+++ b/code/modules/mining/ore.dm
@@ -84,7 +84,7 @@
/obj/item/weapon/ore/New()
pixel_x = rand(0,16)-8
pixel_y = rand(0,8)-8
- if(src.z == ASTEROID_Z) score_oremined++ //When ore spawns, increment score. Only include ore spawned on mining asteroid (No Clown Planet)
+ if(src.z == ZLEVEL_ASTEROID) score_oremined++ //When ore spawns, increment score. Only include ore spawned on mining asteroid (No Clown Planet)
/obj/item/weapon/ore/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W,/obj/item/device/core_sampler))
diff --git a/code/modules/mining/surprises/tg.dm b/code/modules/mining/surprises/tg.dm
index 0fc8eb9dd65..7926e957240 100644
--- a/code/modules/mining/surprises/tg.dm
+++ b/code/modules/mining/surprises/tg.dm
@@ -82,7 +82,7 @@
/obj/item/weapon/storage/belt/soulstone=1,
/obj/item/trash/candle=3,
/obj/item/weapon/dice=3,
- /obj/item/weapon/staff=2,
+ /obj/item/weapon/twohanded/staff=2,
/obj/effect/decal/cleanable/dirt=3,
)
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 544999a099d..d92ef4d3047 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -229,6 +229,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(A)
A.Entered(src)
+/mob/dead/observer/experience_pressure_difference()
+ return 0
+
/mob/dead/observer/examine()
if(usr)
usr << desc
diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm
index 3b9c98c4846..60b2c20636a 100644
--- a/code/modules/mob/language.dm
+++ b/code/modules/mob/language.dm
@@ -326,6 +326,26 @@
key = "0"
syllables = list ("honk","squeak","bonk","toot","narf","zub","wee","wub","norf")
+/datum/language/wryn
+ name = "Wryn Hivemind"
+ desc = "Wryn have the strange ability to commune over a psychic hivemind."
+ speech_verb = "chitters"
+ ask_verb = "chitters"
+ exclaim_verb = "chitters"
+ colour = "alien"
+ key = "y"
+ flags = RESTRICTED | HIVEMIND
+
+/datum/language/wryn/check_special_condition(var/mob/other)
+
+ var/mob/living/carbon/M = other
+ if(!istype(M))
+ return 1
+ if(locate(/obj/item/organ/wryn/hivenode) in M.internal_organs)
+ return 1
+
+ return 0
+
/datum/language/xenocommon
name = "Xenomorph"
colour = "alien"
diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm
index ba9f1a30c7c..30ca1668054 100644
--- a/code/modules/mob/living/carbon/alien/larva/larva.dm
+++ b/code/modules/mob/living/carbon/alien/larva/larva.dm
@@ -151,7 +151,7 @@
"[M] [M.attacktext] [src]!")
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
adjustBruteLoss(damage)
- add_logs(M, src, "attacked", admin=0)
+ add_logs(src, M, "attacked", admin=0)
updatehealth()
diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm
index e66554ba79a..8b2060cf554 100644
--- a/code/modules/mob/living/carbon/brain/MMI.dm
+++ b/code/modules/mob/living/carbon/brain/MMI.dm
@@ -22,6 +22,9 @@
var/obj/mecha = null//This does not appear to be used outside of reference in mecha.dm.
attackby(var/obj/item/O as obj, var/mob/user as mob, params)
+ if(istype(O, /obj/item/organ/brain/crystal ))
+ user << " This brain is too malformed to be able to use with the [src]."
+ return
if(istype(O,/obj/item/organ/brain) && !brainmob) //Time to stick a brain in it --NEO
if(!O:brainmob)
user << "\red You aren't sure where this brain came from, but you're pretty sure it's a useless brain."
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 238088c0c7a..aaff0c0313d 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -275,14 +275,16 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
if(!Adjacent(clicked_on))
return
- var/IsVentcrawler = 1
+ var/ventcrawlerlocal = 0
+ if(ventcrawler)
+ ventcrawlerlocal = ventcrawler
+
if(!ventcrawler)
- IsVentcrawler = 0
if(ishuman(src))
var/mob/living/carbon/human/H = src
- if(!H.species.ventcrawler) IsVentcrawler = 1
+ if(!H.species.ventcrawler) ventcrawlerlocal = H.species.ventcrawler
- if(!IsVentcrawler) return
+ if(!ventcrawlerlocal) return
if(stat)
src << "You must be conscious to do this!"
@@ -322,11 +324,13 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
if(!client)
return
- if(iscarbon(src) && contents.len && ventcrawler < 2)//It must have atleast been 1 to get this far
+ if(iscarbon(src) && contents.len && ventcrawlerlocal < 2)//It must have atleast been 1 to get this far
for(var/obj/item/I in contents)
var/failed = 0
if(istype(I, /obj/item/weapon/implant))
continue
+ if(istype(I, /obj/item/organ))
+ continue
else
failed++
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index b3f2b7d8afc..16028dde831 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -110,6 +110,14 @@
h_style = "Bald"
..(new_loc, "Golem")
+/mob/living/carbon/human/wryn/New(var/new_loc)
+ h_style = "Antennae"
+ ..(new_loc, "Wryn")
+
+/mob/living/carbon/human/nucleation/New(var/new_loc)
+ h_style = "Nucleation Crystals"
+ ..(new_loc, "Nucleation")
+
/mob/living/carbon/human/Bump(atom/movable/AM as mob|obj, yes)
if ((!( yes ) || now_pushing))
return
@@ -244,12 +252,15 @@
var/limbs_affected = pick(2,3,4)
var/obj/item/organ/external/processing_dismember
+ var/list/valid_limbs = organs.Copy()
- while(limbs_affected != 0)
- processing_dismember = pick(organs)
+ while(limbs_affected != 0 && valid_limbs.len > 0)
+ processing_dismember = pick(valid_limbs)
if(processing_dismember.limb_name != "chest" && processing_dismember.limb_name != "head" && processing_dismember.limb_name != "groin")
processing_dismember.droplimb(1,pick(0,1,2),0,1)
+ valid_limbs -= processing_dismember
limbs_affected -= 1
+ else valid_limbs -= processing_dismember
//return
@@ -262,28 +273,25 @@
f_loss += 60
+ var/limbs_affected = 0
+ var/obj/item/organ/external/processing_dismember
+ var/list/valid_limbs = organs.Copy()
+
if (prob(getarmor(null, "bomb")))
b_loss = b_loss/1.5
f_loss = f_loss/1.5
- var/limbs_affected = pick(1, 1, 2)
- var/obj/item/organ/external/processing_dismember
-
- while(limbs_affected != 0)
- processing_dismember = pick(organs)
- if(processing_dismember.limb_name != "chest" && processing_dismember.limb_name != "head" && processing_dismember.limb_name != "groin")
- processing_dismember.droplimb(1,pick(0,2),0,1)
- limbs_affected -= 1
-
+ limbs_affected = pick(1, 1, 2)
else
- var/limbs_affected = pick(1, 2, 3)
- var/obj/item/organ/external/processing_dismember
+ limbs_affected = pick(1, 2, 3)
- while(limbs_affected != 0)
- processing_dismember = pick(organs)
- if(processing_dismember.limb_name != "chest" && processing_dismember.limb_name != "head" && processing_dismember.limb_name != "groin")
- processing_dismember.droplimb(1,pick(0,2),0,1)
- limbs_affected -= 1
+ while(limbs_affected != 0 && valid_limbs.len > 0)
+ processing_dismember = pick(valid_limbs)
+ if(processing_dismember.limb_name != "chest" && processing_dismember.limb_name != "head" && processing_dismember.limb_name != "groin")
+ processing_dismember.droplimb(1,pick(0,2),0,1)
+ valid_limbs -= processing_dismember
+ limbs_affected -= 1
+ else valid_limbs -= processing_dismember
if (!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs))
ear_damage += 30
@@ -300,12 +308,15 @@
var/limbs_affected = pick(0, 1)
var/obj/item/organ/external/processing_dismember
+ var/list/valid_limbs = organs.Copy()
- while(limbs_affected != 0)
- processing_dismember = pick(organs)
+ while(limbs_affected != 0 && valid_limbs.len > 0)
+ processing_dismember = pick(valid_limbs)
if(processing_dismember.limb_name != "chest" && processing_dismember.limb_name != "head" && processing_dismember.limb_name != "groin")
processing_dismember.droplimb(1,1,0,1)
+ valid_limbs -= processing_dismember
limbs_affected -= 1
+ else valid_limbs -= processing_dismember
if (!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs))
ear_damage += 15
@@ -656,13 +667,16 @@
/mob/living/carbon/human/Topic(href, href_list)
var/pickpocket = 0
+ if(ishuman(usr))
+ var/mob/living/carbon/human/H = usr
+ var/obj/item/clothing/gloves/G = H.gloves
+ if(G)
+ pickpocket = G.pickpocket
+
if(!usr.stat && usr.canmove && !usr.restrained() && in_range(src, usr))
// if looting pockets with gloves, do it quietly
if(href_list["pockets"])
- if(usr:gloves)
- var/obj/item/clothing/gloves/G = usr:gloves
- pickpocket = G.pickpocket
var/pocket_side = href_list["pockets"]
var/pocket_id = (pocket_side == "right" ? slot_r_store : slot_l_store)
var/obj/item/pocket_item = (pocket_id == slot_r_store ? src.r_store : src.l_store)
@@ -701,9 +715,6 @@
if(href_list["item"])
var/itemTarget = href_list["item"]
if(itemTarget == "id")
- if(usr:gloves)
- var/obj/item/clothing/gloves/G = usr:gloves
- pickpocket = G.pickpocket
if(pickpocket)
var/obj/item/worn_id = src.wear_id
var/obj/item/place_item = usr.get_active_hand() // Item to place in the pocket, if it's empty
@@ -748,9 +759,6 @@
if ((href_list["item"] && !( usr.stat ) && usr.canmove && !( usr.restrained() ) && in_range(src, usr) && ticker)) //if game hasn't started, can't make an equip_e
var/obj/effect/equip_e/human/O = new /obj/effect/equip_e/human( )
- if(ishuman(usr) && usr:gloves)
- var/obj/item/clothing/gloves/G = usr:gloves
- pickpocket = G.pickpocket
if(!pickpocket || href_list["item"] != "id") // Stop the non-stealthy verbose strip if pickpocketing id.
O.source = usr
O.target = src
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index 39c02d350ca..159ab81ad44 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -55,6 +55,8 @@
var/datum/martial_art/attacker_style = M.martial_art
+ species.handle_attack_hand(src,M)
+
switch(M.a_intent)
if("help")
if(health >= config.health_threshold_crit)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 7ba218dc9fa..4d4c20e8d5c 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -492,10 +492,8 @@ emp_act
/mob/living/carbon/human/experience_pressure_difference(pressure_difference, direction)
if(shoes)
- if(istype(shoes,/obj/item/clothing/shoes/magboots)) //TODO: Make a not-shit shoe var system to negate airflow.
- var/obj/item/clothing/shoes/magboots/MB = shoes
- if(MB.magpulse)
- return 0
+ if(istype(shoes,/obj/item/clothing/shoes/magboots) && (shoes.flags & NOSLIP)) //TODO: Make a not-shit shoe var system to negate airflow.
+ return 0
..()
/mob/living/carbon/human/water_act(volume, temperature, source)
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index b7f1bea99a8..aeb0cd160c1 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -10,6 +10,8 @@
if (istype(loc, /turf/space)) return -1 // It's hard to be slowed down in space by... anything
+ if(flying) return -1
+
if(embedded_flag)
handle_embedded_objects() //Moving with objects stuck in you can cause bad times.
@@ -77,6 +79,11 @@
//Can we act
if(restrained()) return 0
+ //Are we flying?
+ if(flying)
+ inertia_dir = 0
+ return 1
+
//Do we have a working jetpack
if(istype(back, /obj/item/weapon/tank/jetpack))
var/obj/item/weapon/tank/jetpack/J = back
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index e51a4e3c357..d8bcb331813 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -264,6 +264,16 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
gene.OnMobLife(src)
if (radiation)
+
+ if((locate(src.internal_organs_by_name["resonant crystal"]) in src.internal_organs))
+ var/rads = radiation/25
+ radiation -= rads
+ radiation -= 0.1
+ reagents.add_reagent("radium", rads/10)
+ if( prob(10) )
+ src << "\blue You feel relaxed."
+ return
+
if (radiation > 100)
radiation = 100
if(!(species.flags & RAD_ABSORB))
@@ -276,7 +286,6 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
radiation = 0
else
-
if(species.flags & RAD_ABSORB)
var/rads = radiation/25
radiation -= rads
@@ -746,7 +755,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
var/turf/T = loc
var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T
if(L)
- light_amount = min(10,L.lum_r + L.lum_g + L.lum_b) - 5 //hardcapped so it's not abused by having a ton of flashlights
+ light_amount = (L.get_clamped_lum()*10) - 5 //hardcapped so it's not abused by having a ton of flashlights
else
light_amount = 5
nutrition += light_amount
@@ -768,7 +777,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
var/turf/T = loc
var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T
if(L)
- light_amount = L.lum_r + L.lum_g + L.lum_b //hardcapped so it's not abused by having a ton of flashlights
+ light_amount = L.get_clamped_lum()*10
else
light_amount = 10
if(light_amount > species.light_dam) //if there's enough light, start dying
@@ -1034,6 +1043,14 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
if(jitteriness)
do_jitter_animation(jitteriness)
+ //Flying
+ if(flying)
+ spawn()
+ animate(src, pixel_y = pixel_y + 5 , time = 10, loop = 1, easing = SINE_EASING)
+ spawn(10)
+ if(flying)
+ animate(src, pixel_y = pixel_y - 5, time = 10, loop = 1, easing = SINE_EASING)
+
//Other
handle_statuses()
diff --git a/code/modules/mob/living/carbon/human/species/apollo.dm b/code/modules/mob/living/carbon/human/species/apollo.dm
new file mode 100644
index 00000000000..a1beed27be9
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/apollo.dm
@@ -0,0 +1,110 @@
+/datum/species/wryn
+ name = "Wryn"
+ icobase = 'icons/mob/human_races/r_wryn.dmi'
+ deform = 'icons/mob/human_races/r_wryn.dmi'
+ language = "Wryn Hivemind"
+ tail = "wryntail"
+ unarmed_type = /datum/unarmed_attack/punch/weak
+ primitive = /mob/living/carbon/monkey/wryn
+ darksight = 3
+ slowdown = 1
+ warning_low_pressure = -300
+ hazard_low_pressure = 1
+ blurb = "The wryn (r-in, singular r-in) are a humanoid race that possess many bee-like features. Originating from Alveare they \
+ have adapted extremely well to cold environments though have lost most of their muscles over generations.\
+ In order to communicate and work with multi-species crew Wryn were forced to take on names. Wryn have tended towards using only \
+ first names, these names are generally simplistic and easy to pronounce. Wryn have rarely had to communicate using their mouths, \
+ so in order to integrate with the multi-species crew they have been taught broken sol?."
+
+ cold_level_1 = 200 //Default 260 - Lower is better
+ cold_level_2 = 150 //Default 200
+ cold_level_3 = 115 //Default 120
+
+ heat_level_1 = 300 //Default 360 - Higher is better
+ heat_level_2 = 310 //Default 400
+ heat_level_3 = 317 //Default 1000
+
+ body_temperature = 286
+
+ has_organ = list(
+ "heart" = /obj/item/organ/heart,
+ "brain" = /obj/item/organ/brain,
+ "eyes" = /obj/item/organ/eyes,
+ "appendix" = /obj/item/organ/appendix,
+ "antennae" = /obj/item/organ/wryn/hivenode
+ )
+
+ flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | NO_BREATHE | HAS_SKIN_COLOR | NO_SCAN | NO_SCAN | HIVEMIND
+
+
+ base_color = "#704300"
+ flesh_color = "#704300"
+ blood_color = "#FFFF99"
+
+
+/datum/species/wryn/handle_death(var/mob/living/carbon/human/H)
+ for(var/mob/living/carbon/C in living_mob_list)
+ if(locate(/obj/item/organ/wryn/hivenode) in C.internal_organs)
+ C << "Your antennae tingle as you are overcome with pain..."
+ C << "It feels like part of you has died."
+
+/datum/species/wryn/handle_attack_hand(var/mob/living/carbon/human/H, var/mob/living/carbon/human/M)
+ if(M.a_intent == "harm")
+ if(H.handcuffed)
+ if(!(locate(H.internal_organs_by_name["antennae"]) in H.internal_organs)) return
+ var/turf/p_loc = M.loc
+ var/turf/p_loc_m = H.loc
+
+ M.visible_message("[M] begins to violently pull off [H]'s antennae.")
+ H << "[M] grips your antennae and starts violently pulling!"
+ do_after(H, 250)
+ if(p_loc == M.loc && p_loc_m == H.loc)
+ del(H.internal_organs_by_name["antennae"])
+ H.remove_language("Wryn Hivemind")
+ new /obj/item/organ/wryn/hivenode(M.loc)
+ M << "You hear a loud crunch as you mercilessly pull off [H]'s antennae."
+ H << "You hear a loud crunch as your antennae is ripped off your head by [M]."
+ H << "It's so quiet..."
+ H.h_style = "Bald"
+ H.update_hair()
+
+ M.attack_log += text("\[[time_stamp()]\] removed antennae [H.name] ([H.ckey])")
+ H.attack_log += text("\[[time_stamp()]\] Has had their antennae removed by [M.name] ([M.ckey])")
+ msg_admin_attack("[key_name(M)] removed [key_name(H)]'s antennae")
+ return 0
+
+/datum/species/nucleation
+ name = "Nucleation"
+ icobase = 'icons/mob/human_races/r_nucleation.dmi'
+ unarmed_type = /datum/unarmed_attack/punch
+ blurb = "A sub-race of unforunates who have been exposed to too much supermatter radiation. As a result, \
+ supermatter crystal clusters have begun to grow across their bodies. Research to find a cure for this ailment \
+ has been slow, and so this is a common fate for veteran engineers. The supermatter crystals produce oxygen, \
+ negating the need for the individual to breath. Their massive change in biology, however, renders most medicines \
+ obselete. Ionizing radiation seems to cause resonance in some of their crystals, which seems to encourage regeneration \
+ and produces a calming effect on the individual. Nucleations are highly stigmatized, and are treated much in the same \
+ way as lepers were back on Earth."
+ language = "Sol Common"
+ burn_mod = 4 // holy shite, poor guys wont survive half a second cooking smores
+ brute_mod = 2 // damn, double wham, double dam
+ flags = IS_WHITELISTED | NO_BREATHE | NO_BLOOD | NO_PAIN | HAS_LIPS | NO_SCAN
+
+ has_organ = list(
+ "heart" = /obj/item/organ/heart,
+ "crystalized brain" = /obj/item/organ/brain/crystal,
+ "eyes" = /obj/item/organ/eyes/luminescent_crystal,
+ "strange crystal" = /obj/item/organ/nucleation/strange_crystal,
+ "resonant crystal" = /obj/item/organ/nucleation/resonant_crystal
+ )
+
+/datum/species/nucleation/handle_post_spawn(var/mob/living/carbon/human/H)
+ H.light_color = "#1C1C00"
+ H.set_light(2)
+ return ..()
+
+/datum/species/nucleation/handle_death(var/mob/living/carbon/human/H)
+ var/turf/T = get_turf(H)
+ H.visible_message("\red[H]'s body explodes, leaving behind a pile of microscopic crystals!")
+ supermatter_delamination(T, 2, 0, 0) // Create a small supermatter burst upon death
+ new /obj/item/weapon/shard/supermatter( T )
+ del(H)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/metroid/say.dm b/code/modules/mob/living/carbon/metroid/say.dm
index f4de10ceb74..9c20a40b785 100644
--- a/code/modules/mob/living/carbon/metroid/say.dm
+++ b/code/modules/mob/living/carbon/metroid/say.dm
@@ -28,7 +28,7 @@
speech_buffer.Add(lowertext(html_decode(message)))
..()
-/mob/living/carbon/slime/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0, var/vname ="")
+/mob/living/carbon/slime/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0, var/vname ="", var/atom/follow_target)
if (speaker in Friends)
speech_buffer = list()
speech_buffer.Add(speaker)
diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm
index 6b555052d6b..ec2c33983af 100644
--- a/code/modules/mob/living/carbon/monkey/life.dm
+++ b/code/modules/mob/living/carbon/monkey/life.dm
@@ -442,7 +442,7 @@
var/turf/T = loc
var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T
if(L)
- light_amount = min(10,L.lum_r + L.lum_g + L.lum_b) - 5 //hardcapped so it's not abused by having a ton of flashlights
+ light_amount = (L.get_clamped_lum()*10) - 5 //hardcapped so it's not abused by having a ton of flashlights
else
light_amount = 5
@@ -672,4 +672,4 @@
proc/handle_wetness()
if(mob_master.current_cycle%20==2) //dry off a bit once every 20 ticks or so
wetlevel = max(wetlevel - 1,0)
- return
+ return
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index b07e9e0c5a2..4375800af54 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -38,6 +38,13 @@
icon_state = "stokkey1"
uni_append = list(0x044,0xC5D) // 044C5D
+/mob/living/carbon/monkey/wryn
+ name = "lajavi"
+ voice_name = "lajavi"
+ speak_emote = list("hisses")
+ icon_state = "wrynkey1"
+ uni_append = list(0x022,0xF5D) // 022F5D
+
/mob/living/carbon/monkey/New()
var/datum/reagents/R = new/datum/reagents(330)
reagents = R
diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm
index 6a6954ae419..a230ad2f7e5 100644
--- a/code/modules/mob/living/carbon/species.dm
+++ b/code/modules/mob/living/carbon/species.dm
@@ -301,6 +301,8 @@
/datum/species/proc/handle_death(var/mob/living/carbon/human/H) //Handles any species-specific death events (such as dionaea nymph spawns).
return
+/datum/species/proc/handle_attack_hand(var/mob/living/carbon/human/H, var/mob/living/carbon/human/M) //Handles any species-specific attackhand events.
+ return
/datum/species/proc/say_filter(mob/M, message, datum/language/speaking)
return message
@@ -726,10 +728,10 @@
if (organ_name == "head") // do the head last as that's when the user will be transfered to the posibrain
continue
var/obj/item/organ/external/O = H.organs_by_name[organ_name]
- if((O.body_part != UPPER_TORSO) && (O.body_part != LOWER_TORSO)) // We're making them fall apart, not gibbing them!
+ if(O && (O.body_part != UPPER_TORSO) && (O.body_part != LOWER_TORSO)) // We're making them fall apart, not gibbing them!
O.droplimb(1)
var/obj/item/organ/external/O = H.organs_by_name["head"]
- O.droplimb(1)
+ if(O) O.droplimb(1)
//Species unarmed attacks
@@ -745,6 +747,10 @@
/datum/unarmed_attack/punch
attack_verb = list("punch")
+/datum/unarmed_attack/punch/weak
+ attack_verb = list("flail")
+ damage = 1
+
/datum/unarmed_attack/diona
attack_verb = list("lash", "bludgeon")
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index f0de8268303..28757863c97 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -529,8 +529,8 @@
for(var/atom/A in M.contents)
if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder))
return
+ M.status_flags &= ~PASSEMOTES
- M.status_flags &= ~PASSEMOTES
return
/* resist_borer allows a mob to regain control of their body after a borer has assumed control.
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index dc13dd161bf..216ac7c9a2c 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -362,7 +362,7 @@
user << "You already grabbed [src]."
return
- add_logs(user, src, "grabbed", addition="passively")
+ add_logs(src, user, "grabbed", addition="passively")
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(user, src)
if(buckled)
diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm
index 01945aa86fd..86e9be09ca1 100644
--- a/code/modules/mob/living/silicon/ai/freelook/eye.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm
@@ -77,6 +77,9 @@
return
return ai.eyeobj.loc
+/mob/aiEye/experience_pressure_difference()
+ return 0
+
// AI MOVEMENT
// The AI's "eye". Described on the top of the page.
diff --git a/code/modules/mob/living/silicon/ai/nano.dm b/code/modules/mob/living/silicon/ai/nano.dm
index f9bb7a25d79..588849116ce 100644
--- a/code/modules/mob/living/silicon/ai/nano.dm
+++ b/code/modules/mob/living/silicon/ai/nano.dm
@@ -1,4 +1,5 @@
-var/obj/nano_module/crew_monitor/crew_monitor
+/mob/living/silicon/ai
+ var/obj/nano_module/crew_monitor/crew_monitor
/mob/living/silicon/ai/proc/init_subsystems()
crew_monitor = new(src)
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index fdef89d6865..ae26734975f 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -457,8 +457,9 @@
if(istype(T)) T.visible_message("[src] neatly folds inwards, compacting down to a rectangular card.")
src.stop_pulling()
- src.client.perspective = EYE_PERSPECTIVE
- src.client.eye = card
+ if(src.client)
+ src.client.perspective = EYE_PERSPECTIVE
+ src.client.eye = card
//This seems redundant but not including the forced loc setting messes the behavior up.
src.loc = card
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index dfeef3b004e..c3c7269515e 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -23,11 +23,9 @@
health = 40
melee_damage_lower = 1
melee_damage_upper = 5
- var/datum/reagents/udder = null
+ var/milk_content = 0
/mob/living/simple_animal/hostile/retaliate/goat/New()
- udder = new(50)
- udder.my_atom = src
..()
/mob/living/simple_animal/hostile/retaliate/goat/Life()
@@ -42,9 +40,8 @@
LoseTarget()
src.visible_message("\blue [src] calms down.")
- if(stat == CONSCIOUS)
- if(udder && prob(5))
- udder.add_reagent("milk", rand(5, 10))
+ if(stat == CONSCIOUS && prob(5))
+ milk_content = min(50, milk_content+rand(5, 10))
if(locate(/obj/effect/plant) in loc)
var/obj/effect/plant/SV = locate(/obj/effect/plant) in loc
@@ -75,12 +72,15 @@
/mob/living/simple_animal/hostile/retaliate/goat/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
if(stat == CONSCIOUS && istype(O, /obj/item/weapon/reagent_containers/glass))
user.changeNext_move(CLICK_CD_MELEE)
- user.visible_message("[user] milks [src] using \the [O].")
var/obj/item/weapon/reagent_containers/glass/G = O
- var/transfered = udder.trans_id_to(G, "milk", rand(5,10))
- if(G.reagents.total_volume >= G.volume)
- user << "\red The [O] is full."
- if(!transfered)
+ var/transfered = min(milk_content, rand(5,10), (G.volume - G.reagents.total_volume))
+ if(transfered > 0)
+ user.visible_message("[user] milks [src] using \the [O].")
+ G.reagents.add_reagent("milk", transfered)
+ milk_content -= transfered
+ else if(G.reagents.total_volume >= G.volume)
+ user << "\red \The [O] is full."
+ else
user << "\red The udder is dry. Wait a bit longer..."
else
..()
@@ -106,30 +106,31 @@
response_harm = "kicks the"
attacktext = "kicks"
health = 50
- var/datum/reagents/udder = null
+ var/milk_content = 0
/mob/living/simple_animal/cow/New()
- udder = new(50)
- udder.my_atom = src
..()
/mob/living/simple_animal/cow/attackby(var/obj/item/O as obj, var/mob/user as mob, params, params)
if(stat == CONSCIOUS && istype(O, /obj/item/weapon/reagent_containers/glass))
- user.visible_message("[user] milks [src] using \the [O].")
+ user.changeNext_move(CLICK_CD_MELEE)
var/obj/item/weapon/reagent_containers/glass/G = O
- var/transfered = udder.trans_id_to(G, "milk", rand(5,10))
- if(G.reagents.total_volume >= G.volume)
- user << "\red The [O] is full."
- if(!transfered)
+ var/transfered = min(milk_content, rand(5,10), (G.volume - G.reagents.total_volume))
+ if(transfered > 0)
+ user.visible_message("[user] milks [src] using \the [O].")
+ G.reagents.add_reagent("milk", transfered)
+ milk_content -= transfered
+ else if(G.reagents.total_volume >= G.volume)
+ user << "\red \The [O] is full."
+ else
user << "\red The udder is dry. Wait a bit longer..."
else
..()
/mob/living/simple_animal/cow/Life()
. = ..()
- if(stat == CONSCIOUS)
- if(udder && prob(5))
- udder.add_reagent("milk", rand(5, 10))
+ if(stat == CONSCIOUS && prob(5))
+ milk_content = min(50, milk_content+rand(5, 10))
/mob/living/simple_animal/cow/attack_hand(mob/living/carbon/M as mob)
if(!stat && M.a_intent == "disarm" && icon_state != icon_dead)
diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm
index dc52bc78c2c..1d0ca670899 100644
--- a/code/modules/mob/living/simple_animal/hostile/statue.dm
+++ b/code/modules/mob/living/simple_animal/hostile/statue.dm
@@ -116,19 +116,19 @@
var/DLlight_amount
var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T
if(L)
- light_amount = min(10,L.lum_r + L.lum_g + L.lum_b) - 5 //hardcapped so it's not abused by having a ton of flashlights
+ light_amount = L.lum_r + L.lum_g + L.lum_b
else
light_amount = 5
var/atom/movable/lighting_overlay/DL = locate(/atom/movable/lighting_overlay) in destination
if(DL)
- DLlight_amount = min(10,L.lum_r + L.lum_g + L.lum_b) - 5 //hardcapped so it's not abused by having a ton of flashlights
+ DLlight_amount = DL.lum_r + DL.lum_g + DL.lum_b
else
DLlight_amount = 5
if(T && destination)
// Don't check it twice if our destination is the tile we are on or we can't even get to our destination
if(T == destination)
destination = null
- else if(light_amount <= 1 && DLlight_amount <= 1) // No one can see us in the darkness, right?
+ else if(light_amount < 0.1 && DLlight_amount < 0.1) // No one can see us in the darkness, right?
return null
// We aren't in darkness, loop for viewers.
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index e0659a1d04d..04f5c411957 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -723,10 +723,10 @@
-/mob/living/simple_animal/parrot/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0)
+/mob/living/simple_animal/parrot/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0, var/atom/follow_target)
if(prob(50))
parrot_hear("[pick(available_channels)] [message]")
- ..(message,verb,language,part_a,part_b,speaker,hard_to_hear)
+ ..()
/mob/living/simple_animal/parrot/proc/parrot_hear(var/message="")
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 6c8d2762690..583075472e0 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -102,6 +102,7 @@
var/drowsyness = 0.0//Carbon
var/dizziness = 0//Carbon
var/jitteriness = 0//Carbon
+ var/flying = 0
var/charges = 0.0
var/nutrition = 400.0//Carbon
diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm
index 45627bc7d9b..6ba963c5f1b 100644
--- a/code/modules/mob/new_player/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories.dm
@@ -689,6 +689,51 @@
icon_state = "vox_keetquills"
species_allowed = list("Vox")
+// Apollo-specific
+
+ //Wryn antennae
+
+ wry_antennae_default
+ name = "Antennae"
+ icon_state = "wryn_antennae"
+ species_allowed = list("Wryn")
+
+ //Nucleation "hairstyles"
+
+ nuc_crystals
+ name = "Nucleation Crystals"
+ icon_state = "nuc_crystal"
+ species_allowed = list("Nucleation")
+
+ nuc_betaburns
+ name = "Nucleation Beta Burns"
+ icon_state = "nuc_betaburns"
+ species_allowed = list("Nucleation")
+
+ nuc_fallout
+ name = "Nucleation Fallout"
+ icon_state = "nuc_fallout"
+ species_allowed = list("Nucleation")
+
+ nuc_frission
+ name = "Nucleation Frission"
+ icon_state = "nuc_frission"
+ species_allowed = list("Nucleation")
+
+ nuc_radical
+ name = "Nucleation Free Radical"
+ icon_state = "nuc_radical"
+ species_allowed = list("Nucleation")
+
+ nuc_gammaray
+ name = "Nucleation Gamma Ray"
+ icon_state = "nuc_gammaray"
+ species_allowed = list("Nucleation")
+
+ nuc_neutron
+ name = "Nucleation Neutron Bomb"
+ icon_state = "nuc_neutron"
+ species_allowed = list("Nucleation")
/datum/sprite_accessory/facial_hair
diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm
index 6b0a26b2520..064211d30b5 100644
--- a/code/modules/organs/organ.dm
+++ b/code/modules/organs/organ.dm
@@ -77,10 +77,11 @@ var/list/organ_cache = list()
owner = null
if(!owner)
- var/datum/reagent/blood/B = locate(/datum/reagent/blood) in reagents.reagent_list
- if(B && prob(40))
- reagents.remove_reagent("blood",0.1)
- blood_splatter(src,B,1)
+ if(reagents)
+ var/datum/reagent/blood/B = locate(/datum/reagent/blood) in reagents.reagent_list
+ if(B && prob(40))
+ reagents.remove_reagent("blood",0.1)
+ blood_splatter(src,B,1)
if(prob(5)) //How about we not have organs become completely useless less than a minute after removal?
damage += 1
diff --git a/code/modules/organs/organ_alien.dm b/code/modules/organs/organ_alien.dm
index 89d17f6ced4..28d5dd2fb98 100644
--- a/code/modules/organs/organ_alien.dm
+++ b/code/modules/organs/organ_alien.dm
@@ -336,3 +336,51 @@
name = "vox cortical stack"
/obj/item/organ/stack/vox/stack
+
+
+//WRYN ORGAN
+
+/obj/item/organ/wryn/hivenode
+ name = "antennae"
+ parent_organ = "head"
+
+/obj/item/organ/wryn/hivenode
+ name = "antennae"
+ organ_tag = "antennae"
+ icon = 'icons/mob/human_races/r_wryn.dmi'
+ icon_state = "antennae"
+
+
+//NUCLEATION ORGAN
+
+/obj/item/organ/nucleation
+ name = "nucleation organ"
+ icon = 'icons/obj/surgery.dmi'
+ desc = "A crystalized human organ. /red It has a strangely iridescent glow."
+
+/obj/item/organ/nucleation/resonant_crystal
+ name = "resonant crystal"
+ icon_state = "resonant-crystal"
+ organ_tag = "resonant crystal"
+ parent_organ = "head"
+
+/obj/item/organ/nucleation/strange_crystal
+ name = "strange crystal"
+ icon_state = "strange-crystal"
+ organ_tag = "strange crystal"
+ parent_organ = "chest"
+
+/obj/item/organ/eyes/luminescent_crystal
+ name = "luminescent eyes"
+ icon_state = "crystal-eyes"
+ organ_tag = "luminescent eyes"
+ light_color = "#1C1C00"
+ parent_organ = "head"
+
+ New()
+ set_light(2)
+
+/obj/item/organ/brain/crystal
+ name = "crystalized brain"
+ icon_state = "crystal-brain"
+ organ_tag = "crystalized brain"
\ No newline at end of file
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index c02920141e5..f5def416ee7 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -220,7 +220,7 @@
else
droplimb(0,DROPLIMB_BLUNT)
- owner_old.updatehealth()
+ if(owner_old) owner_old.updatehealth()
return update_icon()
/obj/item/organ/external/proc/heal_damage(brute, burn, internal = 0, robo_repair = 0)
@@ -984,7 +984,7 @@ Note that amputating the affected organ does in fact remove the infection from t
can_grasp = 1
/obj/item/organ/external/hand/removed()
- owner.unEquip(owner.gloves)
+ if(owner) owner.unEquip(owner.gloves)
..()
/obj/item/organ/external/hand/right
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 89f288d0131..757bfc6b40f 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -119,7 +119,7 @@
if (building==0)
init()
else
- area = src.loc.loc:master
+ area = src.loc.loc
area.apc |= src
opened = 1
operating = 0
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index ac145588874..8ccf8648f7f 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -560,11 +560,9 @@
qdel(src)
return
if(2.0)
- if (prob(75))
- broken()
+ broken()
if(3.0)
- if (prob(50))
- broken()
+ broken()
return
//blob effect
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index 6c3172654aa..f320bb64f6c 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -5,6 +5,7 @@ var/global/narsie_cometh = 0
var/global/list/uneatable = list(
/turf/space,
/obj/effect/overlay,
+ /atom/movable/lighting_overlay,
/mob/dead,
/mob/camera,
/mob/new_player
@@ -222,6 +223,7 @@ var/global/list/uneatable = list(
for(var/atom/X in orange(grav_pull,src))
// N3X: Move this up here since get_dist is slow.
if(is_type_in_list(X, uneatable)) continue
+ if(!X.simulated) continue
var/dist = get_dist(X, src)
@@ -265,6 +267,8 @@ var/global/list/uneatable = list(
var/gain = 0
if(is_type_in_list(A, uneatable))
return 0
+ if(!A.simulated)
+ return 0
if (istype(A,/mob/living))//Mobs get gibbed
var/mob/living/M = A
gain = 20
@@ -561,6 +565,8 @@ var/global/list/uneatable = list(
/obj/machinery/singularity/narsie/consume(var/atom/A)
if(is_type_in_list(A, uneatable))
return 0
+ if(!A.simulated)
+ return 0
if (istype(A,/mob/living))//Mobs get gibbed
A:gib()
else if(istype(A,/obj))
diff --git a/code/modules/reagents/Chemistry-Colours.dm b/code/modules/reagents/Chemistry-Colours.dm
index a59147e85f6..0fcc50b6f4d 100644
--- a/code/modules/reagents/Chemistry-Colours.dm
+++ b/code/modules/reagents/Chemistry-Colours.dm
@@ -1,66 +1,31 @@
-/proc/mix_color_from_reagents(var/list/reagent_list)
- if(!reagent_list || !length(reagent_list))
- return 0
+/*
+ * Returns:
+ * #RRGGBB(AA) on success, null on failure
+ */
+/proc/mix_color_from_reagents(const/list/reagent_list)
+ if(!istype(reagent_list))
+ return
- var/contents = length(reagent_list)
- var/list/weight = new /list(contents)
- var/list/redcolor = new /list(contents)
- var/list/greencolor = new /list(contents)
- var/list/bluecolor = new /list(contents)
- var/i
+ var/color
+ var/reagent_color
+ var/vol_counter = 0
+ var/vol_temp
+ // see libs/IconProcs/IconProcs.dm
+ for(var/datum/reagent/reagent in reagent_list)
+ if(reagent.id == "blood" && reagent.data["blood_colour"])
+ reagent_color = reagent.data["blood_colour"]
+ else
+ reagent_color = reagent.color
- //fill the list of weights
- for(i=1; i<=contents; i++)
- var/datum/reagent/re = reagent_list[i]
- var/reagentweight = re.volume
- if(istype(re, /datum/reagent/paint))
- reagentweight *= 20 //Paint colours a mixture twenty times as much
- weight[i] = reagentweight
+ vol_temp = reagent.volume
+ vol_counter += vol_temp
+
+ if(isnull(color))
+ color = reagent.color
+ else if(length(color) >= length(reagent_color))
+ color = BlendRGB(color, reagent_color, vol_temp/vol_counter)
+ else
+ color = BlendRGB(reagent_color, color, vol_temp/vol_counter)
+ return color
- //fill the lists of colours
- for(i=1; i<=contents; i++)
- var/datum/reagent/re = reagent_list[i]
- var/hue = re.color
- if(length(hue) != 7)
- return 0
- redcolor[i]=hex2num(copytext(hue,2,4))
- greencolor[i]=hex2num(copytext(hue,4,6))
- bluecolor[i]=hex2num(copytext(hue,6,8))
-
- //mix all the colors
- var/red = mixOneColor(weight,redcolor)
- var/green = mixOneColor(weight,greencolor)
- var/blue = mixOneColor(weight,bluecolor)
-
- //assemble all the pieces
- var/finalcolor = rgb(red, green, blue)
- return finalcolor
-
-/proc/mixOneColor(var/list/weight, var/list/color)
- if (!weight || !color || length(weight)!=length(color))
- return 0
-
- var/contents = length(weight)
- var/i
-
- //normalize weights
- var/listsum = 0
- for(i=1; i<=contents; i++)
- listsum += weight[i]
- for(i=1; i<=contents; i++)
- weight[i] /= listsum
-
- //mix them
- var/mixedcolor = 0
- for(i=1; i<=contents; i++)
- mixedcolor += weight[i]*color[i]
- mixedcolor = round(mixedcolor)
-
- //until someone writes a formal proof for this algorithm, let's keep this in
-// if(mixedcolor<0x00 || mixedcolor>0xFF)
-// return 0
- //that's not the kind of operation we are running here, nerd
- mixedcolor=min(max(mixedcolor,0),255)
-
- return mixedcolor
diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm
index e0064fec12e..594116bb805 100644
--- a/code/modules/reagents/Chemistry-Holder.dm
+++ b/code/modules/reagents/Chemistry-Holder.dm
@@ -488,7 +488,7 @@ datum
R.holder = src
R.volume = amount
// SetViruses(R, data) // Includes setting data
- R.data = data
+ if(data) R.data = data
//debug
//world << "Adding data"
//for(var/D in R.data)
diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm
index bac4521f8ed..a4f712ba524 100644
--- a/code/modules/reagents/newchem/medicine.dm
+++ b/code/modules/reagents/newchem/medicine.dm
@@ -106,7 +106,7 @@ datum/reagent/charcoal
id = "charcoal"
description = "Activated charcoal helps to absorb toxins."
reagent_state = LIQUID
- color = "#C8A5DC"
+ color = "#000000"
datum/reagent/charcoal/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index f5cd9ab48be..95f149fa611 100755
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -6,24 +6,24 @@
density = 1
mouse_drag_pointer = MOUSE_ACTIVE_POINTER
var/obj/wrapped = null
+ var/init_welded = 0
var/giftwrapped = 0
var/sortTag = 0
/obj/structure/bigDelivery/attack_hand(mob/user as mob)
playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1)
- qdel(src)
-
-/obj/structure/bigDelivery/Destroy()
- if(wrapped) //sometimes items can disappear. For example, bombs. --rastaf0
- wrapped.loc = (get_turf(loc))
+ if(wrapped)
+ wrapped.loc = get_turf(src)
if(istype(wrapped, /obj/structure/closet))
var/obj/structure/closet/O = wrapped
- O.welded = 0
+ O.welded = init_welded
var/turf/T = get_turf(src)
- for(var/atom/movable/AM in contents)
+ for(var/atom/movable/AM in src)
AM.loc = T
- ..()
+
+ qdel(src)
+
/obj/structure/bigDelivery/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/device/destTagger))
@@ -170,6 +170,7 @@
if(use(3))
var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc))
P.wrapped = O
+ P.init_welded = O.welded
O.welded = 1
O.loc = P
else
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index 28c595b8321..02fc7f371f5 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -34,6 +34,7 @@ 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"
+ light_color = "#a97faa"
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.
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index e999c34df17..ac693cf293d 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -181,6 +181,7 @@
/obj/machinery/computer/rdservercontrol
name = "R&D Server Controller"
icon_state = "rdcomp"
+ light_color = "#a96faa"
circuit = /obj/item/weapon/circuitboard/rdservercontrol
var/screen = 0
var/obj/machinery/r_n_d/server/temp_server
diff --git a/code/modules/shuttles/whiteship.dm b/code/modules/shuttles/whiteship.dm
new file mode 100644
index 00000000000..2a27c2d2c90
--- /dev/null
+++ b/code/modules/shuttles/whiteship.dm
@@ -0,0 +1,23 @@
+/obj/machinery/computer/shuttle_control/multi/whiteship
+ name = "medical ship control console"
+ req_access = list()
+ shuttle_tag = "White Ship"
+ circuit = "/obj/item/weapon/circuitboard/white_ship"
+ light_color = "#CC0000"
+
+/obj/machinery/computer/shuttle_control/multi/whiteship/attack_ai(user as mob)
+ user << "\red Access Denied."
+ return 1
+
+/obj/machinery/computer/shuttle_control/multi/whiteship/New()
+ var/area/A = get_area(src)
+ if(!istype(A,/area/shuttle/derelict/ship))
+ visible_message("\The [src] displays a message: No connectable systems located. Shutting down.")
+ var/V = text2path(circuit)
+ new V(loc)
+
+ animate(src, alpha = 10, time = 20)
+ spawn(20)
+ visible_message("\The [src] fades out of existence!")
+ qdel(src)
+ ..()
\ No newline at end of file
diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm
index a1844d19760..7d8a81ad3ef 100644
--- a/code/modules/supermatter/supermatter.dm
+++ b/code/modules/supermatter/supermatter.dm
@@ -1,23 +1,35 @@
-#define NITROGEN_RETARDATION_FACTOR 4 //Higher == N2 slows reaction more
-#define THERMAL_RELEASE_MODIFIER 750 //Higher == more heat released during reaction
-#define PLASMA_RELEASE_MODIFIER 1500 //Higher == less plasma released by reaction
-#define OXYGEN_RELEASE_MODIFIER 1500 //Higher == less oxygen released at high temperature/power
-#define REACTION_POWER_MODIFIER 1.1 //Higher == more overall power
+#define NITROGEN_RETARDATION_FACTOR 0.15 //Higher == N2 slows reaction more
+#define THERMAL_RELEASE_MODIFIER 750 //Higher == more heat released during reaction
+#define PLASMA_RELEASE_MODIFIER 1500 //Higher == less plasma released by reaction
+#define OXYGEN_RELEASE_MODIFIER 1500 //Higher == less oxygen released at high temperature/power
+#define REACTION_POWER_MODIFIER 1.1 //Higher == more overall power
+
+/*
+ How to tweak the SM
+
+ POWER_FACTOR directly controls how much power the SM puts out at a given level of excitation (power var). Making this lower means you have to work the SM harder to get the same amount of power.
+ CRITICAL_TEMPERATURE The temperature at which the SM starts taking damage.
+
+ CHARGING_FACTOR Controls how much emitter shots excite the SM.
+ DAMAGE_RATE_LIMIT Controls the maximum rate at which the SM will take damage due to high temperatures.
+*/
//Controls how much power is produced by each collector in range - this is the main parameter for tweaking SM balance, as it basically controls how the power variable relates to the rest of the game.
-#define POWER_FACTOR 0.35 //Obtained from testing. Aiming to make the ideal running output (600 kW) run the SM to ~85% of the safety level.
-
-#define CHARGING_FACTOR 0.55
-#define DAMAGE_RATE_LIMIT 5 //damage rate cap at power = 900, scales linearly with power
+#define POWER_FACTOR 1.0
+#define DECAY_FACTOR 700 //Affects how fast the supermatter power decays
+#define CRITICAL_TEMPERATURE 800 //K
+#define CHARGING_FACTOR 0.05
+#define DAMAGE_RATE_LIMIT 3 //damage rate cap at power = 300, scales linearly with power
//These would be what you would get at point blank, decreases with distance
#define DETONATION_RADS 200
#define DETONATION_HALLUCINATION 600
+#define TRANSFORM_DISTANCE_MOD 2 // Size/this is maximum distance from SM during burst for transformation to Nucleation
-#define WARNING_DELAY 30 //seconds between warnings.
+#define WARNING_DELAY 30 //seconds between warnings.
/obj/machinery/power/supermatter
name = "Supermatter"
@@ -35,6 +47,7 @@
var/damage = 0
var/damage_archived = 0
var/safe_alert = "Crystaline hyperstructure returning to safe operating levels."
+ var/safe_warned = 0
var/warning_point = 100
var/warning_alert = "Danger! Crystal hyperstructure instability!"
var/emergency_point = 700
@@ -47,15 +60,20 @@
var/grav_pulling = 0
var/pull_radius = 14
+ // Time in ticks between delamination ('exploding') and exploding (as in the actual boom)
+ var/pull_time = 100
+ var/explosion_power = 8
var/emergency_issued = 0
- var/explosion_power = 8
+ // Time in 1/10th of seconds since the last sent warning
+ var/lastwarning = 0
+
+ // This stops spawning redundand explosions. Also incidentally makes supermatter unexplodable if set to 1.
+ var/exploded = 0
- var/lastwarning = 0 // Time in 1/10th of seconds since the last sent warning
var/power = 0
-
- var/oxygen = 0 // Moving this up here for easier debugging.
+ var/oxygen = 0
//Temporary values so that we can optimize this
//How much the bullets damage should be multiplied by when it is added to the internal variables
@@ -67,21 +85,7 @@
var/obj/item/device/radio/radio
- shard //Small subtype, less efficient and more sensitive, but less boom.
- name = "Supermatter Shard"
- desc = "A strangely translucent and iridescent crystal that looks like it used to be part of a larger structure. \red You get headaches just from looking at it."
- icon_state = "darkmatter_shard"
- base_icon_state = "darkmatter_shard"
-
- warning_point = 50
- emergency_point = 500
- explosion_point = 900
-
- gasefficency = 0.125
-
- pull_radius = 5
- explosion_power = 3 //3,6,9,12? Or is that too small?
-
+ var/debug = 0
/obj/machinery/power/supermatter/New()
. = ..()
@@ -93,17 +97,46 @@
. = ..()
/obj/machinery/power/supermatter/proc/explode()
+ message_admins("Supermatter exploded at ([x],[y],[z] - JMP)",0,1)
+ log_game("Supermatter exploded at ([x],[y],[z])")
anchored = 1
grav_pulling = 1
- spawn(100)
- explosion(get_turf(src), explosion_power, explosion_power * 2, explosion_power * 3, explosion_power * 4, 1)
+ exploded = 1
+ spawn(pull_time)
+ var/turf/epicenter = get_turf(src)
+ explosion(epicenter, explosion_power, explosion_power*2, explosion_power*3, explosion_power*4, 1)
+ supermatter_delamination( epicenter, explosion_power*4, 1 )
del src
return
-//Changes color and luminosity of the light to these values if they were not already set
+//Changes color and light_range of the light to these values if they were not already set
/obj/machinery/power/supermatter/proc/shift_light(var/lum, var/clr)
- if(lum != light_range || clr != light_color)
- set_light(lum, l_color = clr)
+ if(light_color != clr)
+ light_color = clr
+ if(light_range != lum)
+ set_light(lum)
+
+/obj/machinery/power/supermatter/proc/announce_warning()
+ var/integrity = damage / explosion_point
+ integrity = round(100 - integrity * 100)
+ integrity = integrity < 0 ? 0 : integrity
+ var/alert_msg = " Integrity at [integrity]%"
+
+ if(damage > emergency_point)
+ alert_msg = emergency_alert + alert_msg
+ lastwarning = world.timeofday - WARNING_DELAY * 4
+ else if(damage >= damage_archived) // The damage is still going up
+ safe_warned = 0
+ alert_msg = warning_alert + alert_msg
+ lastwarning = world.timeofday
+ else if(!safe_warned)
+ safe_warned = 1 // We are safe, warn only once
+ alert_msg = safe_alert
+ lastwarning = world.timeofday
+ else
+ alert_msg = null
+ if(alert_msg)
+ radio.autosay(alert_msg, "Supermatter Monitor")
/obj/machinery/power/supermatter/process()
@@ -115,105 +148,85 @@
if(!istype(L)) //We are in a crate or somewhere that isn't turf, if we return to turf resume processing but for now.
return //Yeah just stop.
- if(istype(L, /turf/space)) // Stop processing this stuff if we've been ejected.
- return
-
- if(damage > warning_point) // while the core is still damaged and it's still worth noting its status
-
- shift_light(5, warning_color)
- if((world.timeofday - lastwarning) / 10 >= WARNING_DELAY)
- var/stability = num2text(round((damage / explosion_point) * 100))
-
- if(damage > emergency_point)
- shift_light(7, emergency_color)
- radio.autosay(addtext(emergency_alert, " Instability: ",stability,"%"), "Supermatter Monitor")
- lastwarning = world.timeofday
-
- else if(damage >= damage_archived) // The damage is still going up
- radio.autosay(addtext(warning_alert," Instability: ",stability,"%"), "Supermatter Monitor")
- lastwarning = world.timeofday - 150
-
- else // Phew, we're safe
- radio.autosay(safe_alert, "Supermatter Monitor")
- lastwarning = world.timeofday
-
- if(damage > explosion_point)
- for(var/mob/living/mob in living_mob_list)
- if(loc.z == mob.loc.z)
- if(istype(mob, /mob/living/carbon/human))
- //Hilariously enough, running into a closet should make you get hit the hardest.
- var/mob/living/carbon/human/H = mob
- H.hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) )
- var/rads = DETONATION_RADS * sqrt( 1 / (get_dist(mob, src) + 1) )
- mob.apply_effect(rads, IRRADIATE)
-
+ if(damage > explosion_point)
+ if(!exploded)
+ if(!istype(L, /turf/space))
+ announce_warning()
explode()
+ else if(damage > warning_point) // while the core is still damaged and it's still worth noting its status
+ shift_light(5, warning_color)
+ if(damage > emergency_point)
+ shift_light(7, emergency_color)
+ if(!istype(L, /turf/space) && (world.timeofday - lastwarning) >= WARNING_DELAY * 10)
+ announce_warning()
else
shift_light(4,initial(light_color))
if(grav_pulling)
supermatter_pull()
- //Ok, get the air from the turf
- var/datum/gas_mixture/env = L.return_air()
+ //Ok, get the air from the turf
+ var/datum/gas_mixture/removed = null
+ var/datum/gas_mixture/env = null
- //Remove gas from surrounding area
- var/datum/gas_mixture/removed = env.remove(gasefficency * env.total_moles())
+ //ensure that damage doesn't increase too quickly due to super high temperatures resulting from no coolant, for example. We dont want the SM exploding before anyone can react.
+ //We want the cap to scale linearly with power (and explosion_point). Let's aim for a cap of 5 at power = 300 (based on testing, equals roughly 5% per SM alert announcement).
+ var/damage_inc_limit = (power/300)*(explosion_point/1000)*DAMAGE_RATE_LIMIT
- if(!removed || !removed.total_moles())
- damage += max((power-1600)/10, 0)
- power = min(power, 1600)
- return 1
+ if(!istype(L, /turf/space))
+ env = L.return_air()
+ removed = env.remove(gasefficency * env.total_moles()) //Remove gas from surrounding area
- damage_archived = damage
- damage = max( damage + ( (removed.temperature - 800) / 150 ) , 0 )
- //Ok, 100% oxygen atmosphere = best reaction
- //Maxes out at 100% oxygen pressure
- oxygen = max(min((removed.oxygen - (removed.nitrogen * NITROGEN_RETARDATION_FACTOR)) / MOLES_CELLSTANDARD, 1), 0)
-
- var/temp_factor = 50
-
- if(oxygen > 0.8)
- // with a perfect gas mix, make the power less based on heat
- icon_state = "[base_icon_state]_glow"
+ if(!env || !removed || !removed.total_moles())
+ damage += max((power - 15*POWER_FACTOR)/10, 0)
+ else if (grav_pulling) //If supermatter is detonating, remove all air from the zone
+ env.remove(env.total_moles())
else
- // in normal mode, base the produced energy around the heat
- temp_factor = 30
- icon_state = base_icon_state
+ damage_archived = damage
- power = max( (removed.temperature * temp_factor / T0C) * oxygen + power, 0) //Total laser power plus an overload
+ damage = max( damage + min( ( (removed.temperature - CRITICAL_TEMPERATURE) / 150 ), damage_inc_limit ) , 0 )
+ //Ok, 100% oxygen atmosphere = best reaction
+ //Maxes out at 100% oxygen pressure
+ oxygen = max(min((removed.oxygen - (removed.nitrogen * NITROGEN_RETARDATION_FACTOR)) / removed.total_moles(), 1), 0)
- //We've generated power, now let's transfer it to the collectors for storing/usage
- transfer_energy()
+ //calculate power gain for oxygen reaction
+ var/temp_factor
+ var/equilibrium_power
+ if (oxygen > 0.8)
+ //If chain reacting at oxygen == 1, we want the power at 800 K to stabilize at a power level of 400
+ equilibrium_power = 400
+ icon_state = "[base_icon_state]_glow"
+ else
+ //If chain reacting at oxygen == 1, we want the power at 800 K to stabilize at a power level of 250
+ equilibrium_power = 250
+ icon_state = base_icon_state
- var/device_energy = power * REACTION_POWER_MODIFIER
+ temp_factor = ( (equilibrium_power/DECAY_FACTOR)**3 )/800
+ power = max( (removed.temperature * temp_factor) * oxygen + power, 0)
- //To figure out how much temperature to add each tick, consider that at one atmosphere's worth
- //of pure oxygen, with all four lasers firing at standard energy and no N2 present, at room temperature
- //that the device energy is around 2140. At that stage, we don't want too much heat to be put out
- //Since the core is effectively "cold"
+ //We've generated power, now let's transfer it to the collectors for storing/usage
+ transfer_energy()
- //Also keep in mind we are only adding this temperature to (efficiency)% of the one tile the rock
- //is on. An increase of 4*C @ 25% efficiency here results in an increase of 1*C / (#tilesincore) overall.
- removed.temperature += (device_energy / THERMAL_RELEASE_MODIFIER)
+ var/device_energy = power * REACTION_POWER_MODIFIER
- removed.temperature = max(0, min(removed.temperature, 2500))
- //Calculate how much gas to release
- removed.toxins += max(device_energy / PLASMA_RELEASE_MODIFIER, 0)
+ //Calculate how much gas to release
+ removed.toxins += max(device_energy / PLASMA_RELEASE_MODIFIER, 0)
- removed.oxygen += max((device_energy + removed.temperature - T0C) / OXYGEN_RELEASE_MODIFIER, 0)
+ removed.oxygen += max((device_energy + removed.temperature - T0C) / OXYGEN_RELEASE_MODIFIER, 0)
- env.merge(removed)
+ env.merge(removed)
- for(var/mob/living/carbon/human/l in view(src, min(7, round(power ** 0.25)))) // If they can see it without mesons on. Bad on them.
+
+ for(var/mob/living/carbon/human/l in view(src, min(7, round(sqrt(power/6))))) // If they can see it without mesons on. Bad on them.
if(!istype(l.glasses, /obj/item/clothing/glasses/meson))
- l.hallucination = max(0, min(200, l.hallucination + power * config_hallucination_power * sqrt( 1 / max(1, get_dist(l, src)) ) ) )
+ l.hallucination = max(0, min(200, l.hallucination + power * config_hallucination_power * sqrt( 1 / max(1,get_dist(l, src)) ) ) )
- for(var/mob/living/l in range(src, round((power / 100) ** 0.25)))
- var/rads = (power / 10) * sqrt( 1 / max(get_dist(l, src),1) )
- l.apply_effect(irradiate=rads)
+ //adjusted range so that a power of 300 (pretty high) results in 8 tiles, roughly the distance from the core to the engine monitoring room.
+ for(var/mob/living/l in range(src, round(sqrt(power / 5))))
+ var/rads = (power / 10) * sqrt( 1 / get_dist(l, src) )
+ l.apply_effect(rads, IRRADIATE)
- power -= (power/500)**3
+ power -= (power/DECAY_FACTOR)**3 //energy losses due to radiation
return 1
@@ -225,17 +238,12 @@
// Then bring it inside to explode instantly upon landing on a valid turf.
- if(Proj.flag != "bullet")
- power += Proj.damage * config_bullet_energy * CHARGING_FACTOR
+ if(istype(Proj, /obj/item/projectile/beam))
+ power += Proj.damage * config_bullet_energy * CHARGING_FACTOR / POWER_FACTOR
else
damage += Proj.damage * config_bullet_energy
return 0
-
-/obj/machinery/power/supermatter/attack_paw(mob/user as mob)
- return attack_hand(user)
-
-
/obj/machinery/power/supermatter/attack_robot(mob/user as mob)
if(Adjacent(user))
return attack_hand(user)
@@ -247,6 +255,9 @@
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/attack_hand(mob/user as mob)
+ if(istype(user,/mob/living/carbon/human/nucleation)) // Nucleation's biology doesn't react to this
+ return
+
user.visible_message("\The [user] reaches out and touches \the [src], inducing a resonance... \his body starts to glow and bursts into flames before flashing into ash.",\
"You reach out and touch \the [src]. Everything starts burning and all you can hear is ringing. Your last thought is \"That was not a wise decision.\"",\
"You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.")
@@ -255,11 +266,13 @@
/obj/machinery/power/supermatter/proc/transfer_energy()
for(var/obj/machinery/power/rad_collector/R in rad_collectors)
- if(get_dist(R, src) <= 15) // Better than using orange() every process
- R.receive_pulse(power * POWER_FACTOR)
+ var/distance = get_dist(R, src)
+ if(distance <= 15)
+ //for collectors using standard plasma tanks at 1013 kPa, the actual power generated will be this power*POWER_FACTOR*20*29 = power*POWER_FACTOR*580
+ R.receive_pulse(power * POWER_FACTOR * (min(3/distance, 1))**2)
return
-/obj/machinery/power/supermatter/attackby(obj/item/weapon/W as obj, mob/living/user as mob, params)
+/obj/machinery/power/supermatter/attackby(obj/item/weapon/W as obj, mob/living/carbon/user as mob)
user.visible_message("\The [user] touches \a [W] to \the [src] as a silence fills the room...",\
"You touch \the [W] to \the [src] when everything suddenly goes silent.\"\n\The [W] flashes into dust as you flinch away from \the [src].",\
"Everything suddenly goes silent.")
@@ -272,6 +285,8 @@
/obj/machinery/power/supermatter/Bumped(atom/AM as mob|obj)
if(istype(AM, /mob/living))
+ if(istype(AM,/mob/living/carbon/human/nucleation)) // Nucleation's biology doesn't react to this
+ return
AM.visible_message("\The [AM] slams into \the [src] inducing a resonance... \his body starts to glow and catch flame before flashing into ash.",\
"You slam into \the [src] as your ears are filled with unearthly ringing. Your last thought is \"Oh, fuck.\"",\
"You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.")
@@ -283,6 +298,9 @@
/obj/machinery/power/supermatter/proc/Consume(var/mob/living/user)
+ if(istype(user,/mob/living/carbon/human/nucleation)) // Nucleation's biology doesn't react to this
+ return
+
if(istype(user))
user.dust()
power += 200
@@ -299,11 +317,10 @@
else
l.show_message("You hear an uneartly ringing and notice your skin is covered in fresh radiation burns.", 2)
var/rads = 500 * sqrt( 1 / (get_dist(l, src) + 1) )
- l.apply_effect(rads, IRRADIATE, 0) // Permit blocking
+ l.apply_effect(rads, IRRADIATE)
/obj/machinery/power/supermatter/proc/supermatter_pull()
-
//following is adapted from singulo code
if(defer_powernet_rebuild != 2)
defer_powernet_rebuild = 1
@@ -335,4 +352,110 @@
if(defer_powernet_rebuild != 2)
defer_powernet_rebuild = 0
- return
\ No newline at end of file
+ return
+
+
+proc/supermatter_delamination(var/turf/epicenter, var/size, var/transform_mobs = 0, var/adminlog = 1)
+ spawn(0)
+ var/start = world.timeofday
+ epicenter = get_turf(epicenter)
+ if(!epicenter) return
+
+ if(adminlog)
+ message_admins("Supermatter delamination with size ([size]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z] - JMP)")
+ log_game("Supermatter delamination with size ([size]) in area [epicenter.loc.name] ")
+
+ playsound(epicenter, 'sound/effects/explosionfar.ogg', 100, 1, round(size*2,1) )
+ playsound(epicenter, "explosion", 100, 1, round(size,1) )
+
+ if(defer_powernet_rebuild != 2)
+ defer_powernet_rebuild = 1
+
+ var/x = epicenter.x
+ var/y = epicenter.y
+ var/z = epicenter.z
+
+ epicenter.ChangeTurf( /turf/simulated/floor/plating/smatter )
+
+ for(var/mob/living/mob in orange( epicenter, size*2 )) // Irradiate area twice the size of the main blast
+ if(epicenter.z == mob.loc.z)
+ if( ishuman(mob) )
+ //Hilariously enough, running into a closet should make you get hit the hardest.
+ var/mob/living/carbon/human/H = mob
+ H.hallucination += max(50, min(size*10, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, epicenter) + 1)) ) )
+ var/rads = size*10 * sqrt( 1 / (get_dist(mob, epicenter) + 1) )
+ mob.apply_effect(rads, IRRADIATE)
+
+ for(var/i=0, i120 bpm
-#define PULSE_THREADY 5 //occurs during hypovolemic shock
-//feel free to add shit to lists below
-var/list/tachycardics = list("coffee", "methamphetamine", "nitroglycerin", "thirteenloko", "nicotine") //increase heart rate
-var/list/bradycardics = list("neurotoxin", "cryoxadone", "space_drugs") //decrease heart rate
-var/list/heartstopper = list("capulettium", "capulettium_plus") //this stops the heart
-var/list/cheartstopper = list() //this stops the heart when overdose is met -- c = conditional
-
-//proc/get_pulse methods
-#define GETPULSE_HAND 0 //less accurate (hand)
-#define GETPULSE_TOOL 1 //more accurate (med scanner, sleeper, etc)
-
-var/list/restricted_camera_networks = list( //Those networks can only be accessed by preexisting terminals. AIs and new terminals can't use them.
- "CentCom",
- "ERT",
- "NukeOps",
- "Thunderdome",
- "UO45",
- "UO45R",
- "Xeno"
- )
-
-//Species flags.
-
-#define NO_BLOOD 1
-#define NO_BREATHE 2
-#define RAD_ABSORB 8
-#define NO_SCAN 16
-#define NO_PAIN 32
-#define REQUIRE_LIGHT 64
-#define IS_WHITELISTED 128
-#define HAS_LIPS 512
-#define HAS_UNDERWEAR 1024
-#define IS_SYNTHETIC 2048
-#define IS_PLANT 4096
-#define CAN_BE_FAT 8192
-#define IS_RESTRICTED 16384
-#define NO_INTORGANS 32768
-
-//Species Blood Flags
-#define BLOOD_SLIME 1
-//Species Body Flags
-#define FEET_CLAWS 1
-#define FEET_PADDED 2
-#define FEET_NOSLIP 4
-#define HAS_TAIL 8
-#define HAS_SKIN_TONE 16
-#define HAS_SKIN_COLOR 32
-#define TAIL_WAGGING 64
-
-//Language flags.
-#define WHITELISTED 1 // Language is available if the speaker is whitelisted.
-#define RESTRICTED 2 // Language can only be accquired by spawning or an admin.
-#define NONVERBAL 4 // Language has a significant non-verbal component. Speech is garbled without line-of-sight
-#define SIGNLANG 8 // Language is completely non-verbal. Speech is displayed through emotes for those who can understand.
-#define HIVEMIND 16 // Broadcast to all mobs with this language.
-#define NONGLOBAL 32 // Do not add to general languages list
-#define INNATE 64 // All mobs can be assumed to speak and understand this language (audible emotes)
-#define NO_TALK_MSG 128 // Do not show the "\The [speaker] talks into \the [radio]" message
-
-//Flags for zone sleeping
-#define ZONE_ACTIVE 1
-#define ZONE_SLEEPING 0
-
-// Vampire power defines
-#define VAMP_REJUV 1
-#define VAMP_GLARE 2
-#define VAMP_HYPNO 3
-#define VAMP_SHAPE 4
-#define VAMP_VISION 5
-#define VAMP_DISEASE 6
-#define VAMP_CLOAK 7
-#define VAMP_BATS 8
-#define VAMP_SCREAM 9
-#define VAMP_JAUNT 10
-#define VAMP_SLAVE 11
-#define VAMP_BLINK 12
-#define VAMP_FULL 13
-
-// Moved from machine_interactions.dm
-#define STATION_Z 1
-#define CENTCOMM_Z 2
-#define TELECOMM_Z 3
-#define ASTEROID_Z 5
-
-//some colors
-#define COLOR_RED "#FF0000"
-#define COLOR_GREEN "#00FF00"
-#define COLOR_BLUE "#0000FF"
-#define COLOR_CYAN "#00FFFF"
-#define COLOR_PINK "#FF00FF"
-#define COLOR_YELLOW "#FFFF00"
-#define COLOR_ORANGE "#FF9900"
-#define COLOR_WHITE "#FFFFFF"
-
-
-
-/*
- Germs and infections
-*/
-
-#define GERM_LEVEL_AMBIENT 110 //maximum germ level you can reach by standing still
-#define GERM_LEVEL_MOVE_CAP 200 //maximum germ level you can reach by running around
-
-#define INFECTION_LEVEL_ONE 100
-#define INFECTION_LEVEL_TWO 500
-#define INFECTION_LEVEL_THREE 1000
-
-
-/*
- Shuttles
-*/
-
-// these define the time taken for the shuttle to get to SS13
-// and the time before it leaves again
-#define SHUTTLE_PREPTIME 300 // 5 minutes = 300 seconds - after this time, the shuttle departs centcom and cannot be recalled
-#define SHUTTLE_LEAVETIME 180 // 3 minutes = 180 seconds - the duration for which the shuttle will wait at the station after arriving
-#define SHUTTLE_TRANSIT_DURATION 300 // 5 minutes = 300 seconds - how long it takes for the shuttle to get to the station
-#define SHUTTLE_TRANSIT_DURATION_RETURN 120 // 2 minutes = 120 seconds - for some reason it takes less time to come back, go figure.
-
-//Shuttle moving status
-#define SHUTTLE_IDLE 0
-#define SHUTTLE_WARMUP 1
-#define SHUTTLE_INTRANSIT 2
-#define SHUTTLE_STRANDED 3
-
-//Ferry shuttle processing status
-#define IDLE_STATE 0
-#define WAIT_LAUNCH 1
-#define WAIT_ARRIVE 2
-#define WAIT_FINISH 3
-
-//computer3 error codes, move lower in the file when it passes dev -Sayu
- #define PROG_CRASH 1 // Generic crash
- #define MISSING_PERIPHERAL 2 // Missing hardware
- #define BUSTED_ASS_COMPUTER 4 // Self-perpetuating error. BAC will continue to crash forever.
- #define MISSING_PROGRAM 8 // Some files try to automatically launch a program. This is that failing.
- #define FILE_DRM 16 // Some files want to not be copied/moved. This is them complaining that you tried.
- #define NETWORK_FAILURE 32
-
-//Some on_mob_life() procs check for alien races.
-#define IS_DIONA 1
-#define IS_VOX 2
-#define IS_SKRELL 3
-#define IS_UNATHI 4
-
-var/list/hit_appends = list("-OOF", "-ACK", "-UGH", "-HRNK", "-HURGH", "-GLORF")
-
-#define BACKGROUND_ENABLED 0 // The default value for all uses of set background. Set background can cause gradual lag and is recommended you only turn this on if necessary.
-
-#define MINERAL_MATERIAL_AMOUNT 2000 //The amount of materials you get from a sheet of mineral like iron/diamond/glass etc
-
-#define IMPRINTER 1 //For circuits. Uses glass/chemicals.
-#define PROTOLATHE 2 //New stuff. Uses glass/metal/chemicals
-#define AUTOLATHE 4 //Uses glass/metal only.
-#define CRAFTLATHE 8 //Uses fuck if I know. For use eventually.
-#define MECHFAB 16 //Remember, objects utilising this flag should have construction_time and construction_cost vars.
-#define PODFAB 32 //Used by the spacepod part fabricator. Same idea as the mechfab
-//Note: More then one of these can be added to a design but imprinter and lathe designs are incompatable.
-
-// Suit sensor levels
-#define SUIT_SENSOR_OFF 0
-#define SUIT_SENSOR_BINARY 1
-#define SUIT_SENSOR_VITAL 2
-#define SUIT_SENSOR_TRACKING 3
-
-// NanoUI flags
-#define STATUS_INTERACTIVE 2 // GREEN Visability
-#define STATUS_UPDATE 1 // ORANGE Visability
-#define STATUS_DISABLED 0 // RED Visability
-#define STATUS_CLOSE -1 // Close the interface
-
-#define HYDRO_SPEED_MULTIPLIER 1
-
-#define NANO_IGNORE_DISTANCE 1
-
-//Click cooldowns, in tenths of a second
-#define CLICK_CD_MELEE 8
-#define CLICK_CD_RANGE 4
-#define CLICK_CD_BREAKOUT 100
-#define CLICK_CD_HANDCUFFED 10
-#define CLICK_CD_TKSTRANGLE 10
-#define CLICK_CD_POINT 10
-#define CLICK_CD_RESIST 20
-
-#define CLAMP01(x) max(0, min(1, x))
diff --git a/icons/atmos/pipes.dmi b/icons/atmos/pipes.dmi
index 6bd0b15f618..893e450f5cf 100644
Binary files a/icons/atmos/pipes.dmi and b/icons/atmos/pipes.dmi differ
diff --git a/icons/effects/crayondecal.dmi b/icons/effects/crayondecal.dmi
index f62c3fc188e..1552d6d8e4e 100644
Binary files a/icons/effects/crayondecal.dmi and b/icons/effects/crayondecal.dmi differ
diff --git a/icons/effects/species.dmi b/icons/effects/species.dmi
index 33971514325..59422946e24 100644
Binary files a/icons/effects/species.dmi and b/icons/effects/species.dmi differ
diff --git a/icons/effects/tile_effects.dmi b/icons/effects/tile_effects.dmi
index e152a311b63..65110e13d1d 100644
Binary files a/icons/effects/tile_effects.dmi and b/icons/effects/tile_effects.dmi differ
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index 727d0d901cb..65178bc773d 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ
diff --git a/icons/mob/human_races/r_nucleation.dmi b/icons/mob/human_races/r_nucleation.dmi
new file mode 100644
index 00000000000..272060431a9
Binary files /dev/null and b/icons/mob/human_races/r_nucleation.dmi differ
diff --git a/icons/mob/human_races/r_wryn.dmi b/icons/mob/human_races/r_wryn.dmi
new file mode 100644
index 00000000000..07ab49ba83c
Binary files /dev/null and b/icons/mob/human_races/r_wryn.dmi differ
diff --git a/icons/mob/in-hand/staff.dmi b/icons/mob/in-hand/staff.dmi
index 3a8f1ebee4f..6d59d81ecfb 100644
Binary files a/icons/mob/in-hand/staff.dmi and b/icons/mob/in-hand/staff.dmi differ
diff --git a/icons/mob/monkey.dmi b/icons/mob/monkey.dmi
index 3f2ec5c5e59..a1cb0de8864 100644
Binary files a/icons/mob/monkey.dmi and b/icons/mob/monkey.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index d6d6d2d42b4..b28d20830c8 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index 42a26238d5b..f2c0ee0094f 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi
index 61b1d4e26d5..35e2db58989 100644
Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ
diff --git a/icons/obj/shards.dmi b/icons/obj/shards.dmi
index bf7f28168fa..f65d418df5b 100644
Binary files a/icons/obj/shards.dmi and b/icons/obj/shards.dmi differ
diff --git a/icons/obj/supermatter.dmi b/icons/obj/supermatter.dmi
new file mode 100644
index 00000000000..0ea980b13fa
Binary files /dev/null and b/icons/obj/supermatter.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index a202ddfa0f0..8e2e13f655c 100644
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi
index 67dbeb84163..041703a632a 100644
Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ
diff --git a/icons/obj/wizard.dmi b/icons/obj/wizard.dmi
index b659bdc23ec..52bbd89fe86 100644
Binary files a/icons/obj/wizard.dmi and b/icons/obj/wizard.dmi differ
diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi
index 4db212c3144..52830dad431 100644
Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ
diff --git a/icons/turf/walls.dmi b/icons/turf/walls.dmi
index d977584bd34..756cc6bc68f 100644
Binary files a/icons/turf/walls.dmi and b/icons/turf/walls.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 553802d8c21..4b9f0ff2d86 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -11,12 +11,26 @@
// END_PREFERENCES
// BEGIN_INCLUDE
#include "_maps\cyberiad.dm"
-#include "code\global.dm"
+#include "code\_compile_options.dm"
#include "code\hub.dm"
-#include "code\names.dm"
-#include "code\setup.dm"
#include "code\stylesheet.dm"
#include "code\world.dm"
+#include "code\__DEFINES\_readme.dm"
+#include "code\__DEFINES\admin.dm"
+#include "code\__DEFINES\atmospherics.dm"
+#include "code\__DEFINES\clothing.dm"
+#include "code\__DEFINES\combat.dm"
+#include "code\__DEFINES\flags.dm"
+#include "code\__DEFINES\genetics.dm"
+#include "code\__DEFINES\hud.dm"
+#include "code\__DEFINES\language.dm"
+#include "code\__DEFINES\machines.dm"
+#include "code\__DEFINES\math.dm"
+#include "code\__DEFINES\misc.dm"
+#include "code\__DEFINES\mob.dm"
+#include "code\__DEFINES\preferences.dm"
+#include "code\__DEFINES\sight.dm"
+#include "code\__DEFINES\stat.dm"
#include "code\__HELPERS\constants.dm"
#include "code\__HELPERS\experimental.dm"
#include "code\__HELPERS\files.dm"
@@ -35,8 +49,20 @@
#include "code\__HELPERS\timed_alerts.dm"
#include "code\__HELPERS\type2type.dm"
#include "code\__HELPERS\unsorted.dm"
+#include "code\_globalvars\configuration.dm"
+#include "code\_globalvars\database.dm"
+#include "code\_globalvars\game_modes.dm"
+#include "code\_globalvars\genetics.dm"
+#include "code\_globalvars\logging.dm"
#include "code\_globalvars\mapping.dm"
+#include "code\_globalvars\misc.dm"
#include "code\_globalvars\station.dm"
+#include "code\_globalvars\unused.dm"
+#include "code\_globalvars\lists\flavor_misc.dm"
+#include "code\_globalvars\lists\misc.dm"
+#include "code\_globalvars\lists\mobs.dm"
+#include "code\_globalvars\lists\names.dm"
+#include "code\_globalvars\lists\objects.dm"
#include "code\_hooks\area.dm"
#include "code\_hooks\hooks.dm"
#include "code\_hooks\mob.dm"
@@ -549,6 +575,7 @@
#include "code\game\objects\effects\misc.dm"
#include "code\game\objects\effects\overlays.dm"
#include "code\game\objects\effects\portals.dm"
+#include "code\game\objects\effects\sm_crystals.dm"
#include "code\game\objects\effects\spiders.dm"
#include "code\game\objects\effects\step_triggers.dm"
#include "code\game\objects\effects\decals\cleanable.dm"
@@ -682,11 +709,11 @@
#include "code\game\objects\items\weapons\shards.dm"
#include "code\game\objects\items\weapons\shields.dm"
#include "code\game\objects\items\weapons\signs.dm"
+#include "code\game\objects\items\weapons\sm_shard.dm"
#include "code\game\objects\items\weapons\soap.dm"
#include "code\game\objects\items\weapons\staff.dm"
#include "code\game\objects\items\weapons\stock_parts.dm"
#include "code\game\objects\items\weapons\stunbaton.dm"
-#include "code\game\objects\items\weapons\surgery_tools.dm"
#include "code\game\objects\items\weapons\swords_axes_etc.dm"
#include "code\game\objects\items\weapons\syndie_uplink.dm"
#include "code\game\objects\items\weapons\table_rack_parts.dm"
@@ -1275,6 +1302,7 @@
#include "code\modules\mob\living\carbon\human\say.dm"
#include "code\modules\mob\living\carbon\human\update_icons.dm"
#include "code\modules\mob\living\carbon\human\whisper.dm"
+#include "code\modules\mob\living\carbon\human\species\apollo.dm"
#include "code\modules\mob\living\carbon\human\species\golem.dm"
#include "code\modules\mob\living\carbon\human\species\plasmaman.dm"
#include "code\modules\mob\living\carbon\human\species\shadow.dm"
@@ -1695,9 +1723,11 @@
#include "code\modules\shuttles\shuttle_specops.dm"
#include "code\modules\shuttles\shuttle_supply.dm"
#include "code\modules\shuttles\shuttles_multi.dm"
+#include "code\modules\shuttles\whiteship.dm"
#include "code\modules\store\items.dm"
#include "code\modules\store\store.dm"
#include "code\modules\supermatter\supermatter.dm"
+#include "code\modules\supermatter\wall.dm"
#include "code\modules\surgery\bones.dm"
#include "code\modules\surgery\brainrepair.dm"
#include "code\modules\surgery\encased.dm"
diff --git a/sound/effects/glass_step_sm.ogg b/sound/effects/glass_step_sm.ogg
new file mode 100644
index 00000000000..2741ef49dea
Binary files /dev/null and b/sound/effects/glass_step_sm.ogg differ
diff --git a/sound/effects/tong_pickup.ogg b/sound/effects/tong_pickup.ogg
new file mode 100644
index 00000000000..f4548ebb063
Binary files /dev/null and b/sound/effects/tong_pickup.ogg differ
diff --git a/sound/weapons/blade_sheath.ogg b/sound/weapons/blade_sheath.ogg
new file mode 100644
index 00000000000..4d01d529c84
Binary files /dev/null and b/sound/weapons/blade_sheath.ogg differ
diff --git a/sound/weapons/blade_unsheath.ogg b/sound/weapons/blade_unsheath.ogg
new file mode 100644
index 00000000000..befe44eeab9
Binary files /dev/null and b/sound/weapons/blade_unsheath.ogg differ