diff --git a/.travis.yml b/.travis.yml
index 052a53f7ccc..b6cce2273b1 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -3,8 +3,8 @@ language: c
env:
global:
- - BYOND_MAJOR="506"
- - BYOND_MINOR="1247"
+ - BYOND_MAJOR="507"
+ - BYOND_MINOR="1286"
matrix:
- DM_MAPFILE="tgstation2"
- DM_MAPFILE="metastation"
diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
index 336a8ca6ba9..09703c15e53 100644
--- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
@@ -254,7 +254,7 @@
"aeT" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/obj/structure/sign/pods{pixel_y = 30},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/prison)
"aeU" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{aiControlDisabled = 1; id_tag = "prisonereducation"; name = "Prisoner Education Chamber"; req_access = null; req_access_txt = "3"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/prison/solitary{name = "Prisoner Education Chamber"})
"aeV" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Insanity Ward"; req_access_txt = "2"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prison)
-"aeW" = (/obj/structure/closet/secure_closet{name = "contraband locker"; req_access_txt = "3"},/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/obj/effect/spawner/lootdrop/armory_contraband{loot = list(/obj/item/weapon/gun/projectile/automatic/pistol = 5, /obj/item/weapon/gun/projectile/shotgun/combat = 5, /obj/item/weapon/gun/projectile/revolver/mateba, /obj/item/weapon/gun/projectile/automatic/pistol/deagle, /obj/item/weapon/storage/box/throwing_stars = 3)},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden)
+"aeW" = (/obj/structure/closet/secure_closet{name = "contraband locker"; req_access_txt = "3"},/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/obj/effect/spawner/lootdrop/armory_contraband{loot = list(/obj/item/weapon/gun/projectile/automatic/pistol = 5, /obj/item/weapon/gun/projectile/shotgun/automatic/combat = 5, /obj/item/weapon/gun/projectile/revolver/mateba, /obj/item/weapon/gun/projectile/automatic/pistol/deagle, /obj/item/weapon/storage/box/throwing_stars = 3)},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden)
"aeX" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/crew_quarters/fitness{name = "\improper Recreation Area"})
"aeY" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/machinery/light/small{dir = 1},/obj/item/weapon/storage/secure/safe{name = "armory safe A"; pixel_x = 6; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
"aeZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
@@ -4022,7 +4022,7 @@
"bzr" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/fancy/carpet{tag = "icon-carpet7-3"; icon_state = "carpet7-3"},/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
"bzs" = (/obj/machinery/door/airlock/command{name = "Emergency Escape"; req_access = null; req_access_txt = "20"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
"bzt" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bzu" = (/obj/machinery/vending/cigarette{pixel_y = 2; products = list(/obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate = 7, /obj/item/weapon/storage/fancy/cigarettes/cigpack_uplift = 3, /obj/item/weapon/storage/fancy/cigarettes/cigpack_robust = 2, /obj/item/weapon/storage/fancy/cigarettes/cigpack_carp = 3, /obj/item/weapon/storage/fancy/cigarettes/cigpack_midori = 1, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/lighter/greyscale = 4, /obj/item/weapon/storage/fancy/rollingpapers = 5)},/turf/simulated/floor/wood,/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
+"bzu" = (/obj/machinery/vending/cigarette{pixel_y = 2; products = list(/obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate = 7, /obj/item/weapon/storage/fancy/cigarettes/cigpack_uplift = 3, /obj/item/weapon/storage/fancy/cigarettes/cigpack_robust = 2, /obj/item/weapon/storage/fancy/cigarettes/cigpack_carp = 3, /obj/item/weapon/storage/fancy/cigarettes/cigpack_midori = 1, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/lighter/random = 4, /obj/item/weapon/storage/fancy/rollingpapers = 5)},/turf/simulated/floor/wood,/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
"bzv" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bzw" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bzx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/fancy/carpet{tag = "icon-carpet11-12"; icon_state = "carpet11-12"},/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
diff --git a/_maps/map_files/MetaStation/z2.dmm b/_maps/map_files/MetaStation/z2.dmm
index 3ecffff05b3..616ae3d233f 100644
--- a/_maps/map_files/MetaStation/z2.dmm
+++ b/_maps/map_files/MetaStation/z2.dmm
@@ -484,7 +484,7 @@
"jp" = (/turf/simulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/simulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 4},/area/syndicate_mothership)
"jq" = (/obj/item/weapon/storage/crayons,/obj/structure/table,/obj/item/weapon/storage/crayons,/turf/simulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
"jr" = (/obj/machinery/washing_machine,/turf/simulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
-"js" = (/obj/machinery/vending/cigarette{products = list(/obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate = 7, /obj/item/weapon/storage/fancy/cigarettes/cigpack_uplift = 3, /obj/item/weapon/storage/fancy/cigarettes/cigpack_robust = 2, /obj/item/weapon/storage/fancy/cigarettes/cigpack_carp = 3, /obj/item/weapon/storage/fancy/cigarettes/cigpack_midori = 1, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/lighter/greyscale = 4, /obj/item/weapon/storage/fancy/rollingpapers = 5)},/turf/simulated/floor{icon_state = "dark"},/area/centcom/ferry)
+"js" = (/obj/machinery/vending/cigarette{products = list(/obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate = 7, /obj/item/weapon/storage/fancy/cigarettes/cigpack_uplift = 3, /obj/item/weapon/storage/fancy/cigarettes/cigpack_robust = 2, /obj/item/weapon/storage/fancy/cigarettes/cigpack_carp = 3, /obj/item/weapon/storage/fancy/cigarettes/cigpack_midori = 1, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/lighter/random = 4, /obj/item/weapon/storage/fancy/rollingpapers = 5)},/turf/simulated/floor{icon_state = "dark"},/area/centcom/ferry)
"jt" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/effect/landmark{name = "Emergencyresponseteam"},/turf/simulated/floor{icon_state = "dark"},/area/centcom/ferry)
"ju" = (/obj/structure/sign/map/left{icon_state = "map-left-MS"; pixel_y = 0; tag = "icon-map-left-MS"},/turf/simulated/floor{tag = "icon-light_on"; icon_state = "light_on"},/area/centcom/ferry)
"jv" = (/obj/structure/sign/map/right{icon_state = "map-right-MS"},/turf/simulated/floor{tag = "icon-light_on"; icon_state = "light_on"},/area/centcom/ferry)
@@ -507,7 +507,7 @@
"jM" = (/turf/simulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"jN" = (/obj/machinery/computer/shuttle/syndicate/recall,/turf/simulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"jO" = (/obj/machinery/vending/coffee,/turf/simulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
-"jP" = (/obj/machinery/vending/cigarette{products = list(/obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate = 7, /obj/item/weapon/storage/fancy/cigarettes/cigpack_uplift = 3, /obj/item/weapon/storage/fancy/cigarettes/cigpack_robust = 2, /obj/item/weapon/storage/fancy/cigarettes/cigpack_carp = 3, /obj/item/weapon/storage/fancy/cigarettes/cigpack_midori = 1, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/lighter/greyscale = 4, /obj/item/weapon/storage/fancy/rollingpapers = 5)},/turf/simulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
+"jP" = (/obj/machinery/vending/cigarette{products = list(/obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate = 7, /obj/item/weapon/storage/fancy/cigarettes/cigpack_uplift = 3, /obj/item/weapon/storage/fancy/cigarettes/cigpack_robust = 2, /obj/item/weapon/storage/fancy/cigarettes/cigpack_carp = 3, /obj/item/weapon/storage/fancy/cigarettes/cigpack_midori = 1, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/lighter/random = 4, /obj/item/weapon/storage/fancy/rollingpapers = 5)},/turf/simulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"jQ" = (/obj/machinery/vending/cola,/turf/simulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"jR" = (/obj/item/device/paicard,/turf/simulated/floor{icon_state = "grimy"},/area/syndicate_mothership)
"jS" = (/turf/indestructible/fakeglass{icon_state = "fakewindows2"; dir = 6},/area/syndicate_mothership)
diff --git a/_maps/map_files/MiniStation/MiniStation.dmm b/_maps/map_files/MiniStation/MiniStation.dmm
index 82f6bdf323d..a2db2ed7fef 100644
--- a/_maps/map_files/MiniStation/MiniStation.dmm
+++ b/_maps/map_files/MiniStation/MiniStation.dmm
@@ -3,7 +3,7 @@
"ac" = (/obj/effect/landmark{name = "carpspawn"},/turf/space,/area/space)
"ad" = (/turf/simulated/mineral/random/low_chance,/area/space)
"ae" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_ne"; name = "northeast of station"; turf_type = /turf/simulated/floor/plating/snow; width = 18},/turf/space,/area/space)
-"af" = (/turf/simulated/mineral/random/high_chance,/area/space)
+"af" = (/turf/simulated/mineral/random/low_chance,/area/mine/unexplored)
"ag" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_nw"; name = "northwest of station"; turf_type = /turf/simulated/floor/plating/snow; width = 18},/turf/space,/area/space)
"ah" = (/turf/simulated/wall,/area/bridge)
"ai" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/door/poddoor/preopen{id = "bridge blast"; layer = 2.9; name = "bridge blast door"},/turf/simulated/floor/plating/airless,/area/bridge)
@@ -62,9 +62,9 @@
"bj" = (/obj/item/stack/rods{amount = 50},/turf/simulated/floor/plating/airless,/area/quartermaster/storage)
"bk" = (/obj/item/weapon/storage/bag/ore,/turf/simulated/floor/plating/airless,/area/quartermaster/storage)
"bl" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/bridge)
-"bm" = (/obj/machinery/door/airlock/glass_command{name = "Bridge"; req_access_txt = "19"},/turf/simulated/floor/plasteel,/area/bridge)
+"bm" = (/turf/simulated/mineral/random/high_chance,/area/mine/unexplored)
"bn" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1},/turf/simulated/floor/plasteel,/area/bridge)
-"bo" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/airlock/glass_command{name = "Bridge"; req_access_txt = "19"},/turf/simulated/floor/plasteel,/area/bridge)
+"bo" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "Bridge"; req_access_txt = "19"},/turf/simulated/floor/plasteel,/area/bridge)
"bp" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/bridge)
"bq" = (/turf/simulated/wall,/area/quartermaster/storage)
"br" = (/obj/machinery/light/small{dir = 8},/obj/machinery/mineral/unloading_machine{icon_state = "unloader-corner"; input_dir = 4; output_dir = 2},/turf/simulated/floor/plating/airless,/area/quartermaster/storage)
@@ -78,9 +78,9 @@
"bz" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/floor/plating,/area/hallway/primary/central)
"bA" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/bridge)
"bB" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall,/area/bridge)
-"bC" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/bridge)
-"bD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/bridge)
-"bE" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/bridge)
+"bC" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "Bridge"; req_access_txt = "19"},/turf/simulated/floor/plasteel,/area/bridge)
+"bD" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/bridge)
+"bE" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/bridge)
"bF" = (/obj/machinery/power/apc{auto_name = 1; dir = 1; name = "_North APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/bridge)
"bG" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/closet,/turf/simulated/floor/plating,/area/hallway/primary/central)
"bH" = (/obj/structure/plasticflaps/mining,/obj/machinery/conveyor{dir = 2; id = "mining_internal"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
@@ -91,9 +91,9 @@
"bM" = (/obj/machinery/door/airlock/external{req_access_txt = "13"},/turf/simulated/floor/plating,/area/hallway/primary/central)
"bN" = (/turf/simulated/floor/plating,/area/hallway/primary/central)
"bO" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/hallway/primary/central)
-"bP" = (/obj/machinery/door/firedoor/border_only,/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
+"bP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/bridge)
"bQ" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/quartermaster/storage)
-"bR" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
+"bR" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
"bS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/hallway/primary/central)
"bT" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/hallway/primary/central)
"bU" = (/turf/simulated/wall,/area/medical/research{name = "Research Division"})
@@ -108,18 +108,18 @@
"cd" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/quartermaster/storage)
"ce" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 0},/turf/simulated/wall,/area/quartermaster/storage)
"cf" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/hallway/primary/central)
-"cg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
-"ch" = (/obj/machinery/door/airlock/glass_command{name = "Bridge"; req_access_txt = "19"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/bridge)
+"cg" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
+"ch" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
"ci" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/hallway/primary/central)
"cj" = (/turf/simulated/wall/r_wall,/area/security/brig)
"ck" = (/turf/simulated/wall,/area/security/brig)
"cl" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/disposaloutlet,/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
"cm" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
-"cn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/door/poddoor/preopen{id = "xenobio2"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
+"cn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/poddoor/preopen{id = "xenobio2"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
"co" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/window/reinforced,/obj/machinery/camera/autoname,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/medical/research{name = "Research Division"})
"cp" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"cq" = (/obj/structure/window/reinforced,/obj/structure/table/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/door_control{id = "xenobio8"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/medical/research{name = "Research Division"})
-"cr" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id = "xenobio8"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
+"cq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor/preopen{id = "xenobio8"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
+"cr" = (/obj/structure/window/reinforced,/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio8"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/medical/research{name = "Research Division"})
"cs" = (/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
"ct" = (/obj/structure/plasticflaps,/obj/machinery/conveyor{dir = 1; id = "mining_internal"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"cu" = (/obj/machinery/mineral/processing_unit_console{layer = 3; machinedir = 1; pixel_y = 0},/turf/simulated/wall,/area/quartermaster/storage)
@@ -135,10 +135,10 @@
"cE" = (/obj/machinery/photocopier,/turf/simulated/floor/plasteel,/area/security/brig)
"cF" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
"cG" = (/mob/living/simple_animal/slime,/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
-"cH" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access_txt = "55"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/poddoor/preopen{id = "xenobio2"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
+"cH" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id = "xenobio2"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
"cI" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/medical/research{name = "Research Division"})
"cJ" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/medical/research{name = "Research Division"})
-"cK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id = "xenobio8"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
+"cK" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id = "xenobio8"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
"cL" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
"cM" = (/obj/machinery/conveyor{dir = 1; id = "mining_internal"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/quartermaster/storage)
"cN" = (/obj/machinery/conveyor_switch/oneway{id = "mining_internal"; name = "mining conveyor"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/quartermaster/storage)
@@ -164,14 +164,14 @@
"dh" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/closet{name = "Contraband Locker"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/security/brig)
"di" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/security/brig)
"dj" = (/obj/structure/rack,/obj/item/clothing/suit/armor/riot,/obj/item/clothing/suit/armor/riot,/obj/item/clothing/suit/armor/riot,/obj/item/clothing/head/helmet/riot,/obj/item/clothing/head/helmet/riot,/obj/item/clothing/head/helmet/riot,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/item/weapon/shield/riot,/obj/item/weapon/shield/riot,/obj/item/weapon/shield/riot,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
-"dk" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/door/poddoor/preopen{id = "xenobio2"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
-"dl" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio2"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/medical/research{name = "Research Division"})
+"dk" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio2"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/medical/research{name = "Research Division"})
+"dl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/poddoor/preopen{id = "xenobio8"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
"dm" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/medical/research{name = "Research Division"})
-"dn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable,/obj/machinery/door/poddoor/preopen{id = "xenobio8"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
+"dn" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/brig)
"do" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/disposaloutlet{dir = 1},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
"dp" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
"dq" = (/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
-"dr" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "hazard door east"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"dr" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/brig)
"ds" = (/obj/machinery/door/airlock/maintenance{name = "Cargo Bay Maintenance"; req_access_txt = "31"},/turf/simulated/floor/plating,/area/quartermaster/storage)
"dt" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/hallway/primary/central)
"du" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plating,/area/quartermaster/storage)
@@ -206,10 +206,10 @@
"dX" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"dY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"dZ" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/hallway/primary/central)
-"ea" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/obj/machinery/door/airlock/glass_security{name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/brig)
-"eb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/brig)
-"ec" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig)
-"ed" = (/obj/machinery/door/airlock/glass_security{name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/brig)
+"ea" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/brig)
+"eb" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig)
+"ec" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/poddoor/preopen{id = "xenobio1"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
+"ed" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/brig)
"ee" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/brig)
"ef" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel,/area/security/brig)
"eg" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor/plasteel,/area/security/brig)
@@ -218,7 +218,7 @@
"ej" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_x = -27; pixel_y = 3},/turf/simulated/floor/plasteel,/area/security/brig)
"ek" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/security/brig)
"el" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/bridge)
-"em" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/door/poddoor/preopen{id = "xenobio1"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
+"em" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig)
"en" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/medical/research{name = "Research Division"})
"eo" = (/obj/machinery/monkey_recycler,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"ep" = (/obj/machinery/processor{desc = "A machine used to process slimes and retrieve their extract."; name = "Slime Processor"},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
@@ -247,13 +247,13 @@
"eM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"eN" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"eO" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/security/brig)
-"eP" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/brig)
-"eQ" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig)
+"eP" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id = "xenobio1"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
+"eQ" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = -32},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/brig)
"eR" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/security/brig)
"eS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/security/brig)
"eT" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/security/brig)
"eU" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/door_timer{dir = 4; id = "Cell 1"; name = "Cell 1"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig)
-"eV" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access_txt = "55"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/poddoor/preopen{id = "xenobio1"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
+"eV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig)
"eW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
"eX" = (/turf/simulated/wall,/area/space)
"eY" = (/turf/simulated/wall/shuttle{icon_state = "wall3"},/area/space)
@@ -269,16 +269,16 @@
"fi" = (/obj/structure/closet/secure_closet/brig{id = "Cell 2"; name = "Cell 2 Locker"},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/security/brig)
"fj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"fk" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/hallway/primary/central)
-"fl" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = -32},/obj/machinery/door/airlock/glass_security{name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/brig)
-"fm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig)
+"fl" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio1"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/medical/research{name = "Research Division"})
+"fm" = (/obj/machinery/door/firedoor,/obj/machinery/door/window/brigdoor{dir = 4; id = "Cell 1"; name = "Cell 1"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig)
"fn" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/brig)
"fo" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/security/brig)
"fp" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig)
"fq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"fr" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/light/small{dir = 1},/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/plasteel,/area/security/brig)
"fs" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/closet/secure_closet/brig{id = "Cell 2"; name = "Cell 2 Locker"},/turf/simulated/floor/plasteel,/area/security/brig)
-"ft" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/door/poddoor/preopen{id = "xenobio1"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
-"fu" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio1"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/medical/research{name = "Research Division"})
+"ft" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Cargo Bay"; req_access_txt = "31"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"fu" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Xenobiology Lab"; req_access_txt = "7"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"fv" = (/obj/effect/landmark/start{name = "Scientist"},/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"fw" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
"fx" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_x = -25; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "browncorner"; dir = 1},/area/quartermaster/storage)
@@ -299,13 +299,13 @@
"fM" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/security/brig)
"fN" = (/obj/machinery/photocopier,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "cautioncorner"; dir = 4},/area/quartermaster/storage)
"fO" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/brig)
-"fP" = (/obj/machinery/door/window/brigdoor{dir = 4; id = "Cell 2"; name = "Cell 2"; req_access_txt = "2"},/obj/machinery/door/firedoor/border_only{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig)
+"fP" = (/obj/machinery/r_n_d/server/core,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/research{name = "Research Division"})
"fQ" = (/obj/machinery/flasher{id = "Cell 2"; pixel_x = 28},/turf/simulated/floor/plasteel,/area/security/brig)
"fR" = (/obj/structure/table,/obj/item/weapon/extinguisher{pixel_x = 4; pixel_y = 3},/obj/item/weapon/extinguisher,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"fS" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"fT" = (/obj/structure/table,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/obj/machinery/light,/obj/item/stack/sheet/mineral/plasma{layer = 2.9},/obj/item/stack/sheet/mineral/plasma{layer = 2.9},/obj/item/stack/sheet/mineral/plasma{layer = 2.9},/obj/item/stack/sheet/mineral/plasma{layer = 2.9},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"fU" = (/obj/structure/table,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/syringes,/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"fV" = (/obj/machinery/door/airlock/glass_mining{name = "Cargo Bay"; req_access_txt = "31"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"fV" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Cargo Office"; req_access_txt = "31"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"fW" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/security/brig)
"fX" = (/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"fY" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
@@ -330,16 +330,16 @@
"gr" = (/obj/machinery/newscaster{pixel_y = 32},/obj/structure/closet/l3closet/scientist,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"gs" = (/obj/structure/closet/secure_closet/scientist,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"gt" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/medical/research{name = "Research Division"})
-"gu" = (/obj/machinery/door/airlock/research{name = "Xenobiology Lab"; req_access_txt = "7"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"gu" = (/obj/machinery/door_control{dir = 2; id = "rnd"; name = "Shutters Control Button"; pixel_x = -24; pixel_y = -6},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_x = -27; pixel_y = 3},/turf/simulated/floor/plasteel{icon_state = "whitepurple"; dir = 8},/area/medical/research{name = "Research Division"})
"gv" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/medical/research{name = "Research Division"})
"gw" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/medical/research{name = "Research Division"})
"gx" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; external_pressure_bound = 120; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = 32},/turf/simulated/floor/bluegrid,/area/medical/research{name = "Research Division"})
-"gy" = (/obj/machinery/r_n_d/server/core,/obj/machinery/light/small{dir = 1},/obj/machinery/alarm/server{dir = 2; pixel_x = 0; pixel_y = 22},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/research{name = "Research Division"})
+"gy" = (/obj/structure/closet/crate,/obj/machinery/camera/autoname{dir = 8},/obj/item/weapon/ore/glass,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
"gz" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; external_pressure_bound = 140; on = 1; pressure_checks = 0},/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = 32},/turf/simulated/floor/bluegrid,/area/medical/research{name = "Research Division"})
"gA" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/wall,/area/quartermaster/storage)
"gB" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/quartermaster/storage)
"gC" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"gD" = (/obj/machinery/door/airlock/glass_mining{name = "Cargo Office"; req_access_txt = "31"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"gD" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/closet/crate,/obj/item/weapon/ore/slag,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
"gE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/structure/closet/secure_closet/security,/turf/simulated/floor/plasteel,/area/security/brig)
"gF" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/security/brig)
"gG" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/structure/stool/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel,/area/security/brig)
@@ -352,8 +352,8 @@
"gN" = (/obj/machinery/mineral/ore_redemption{input_dir = 4},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/hallway/primary/central)
"gO" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"},/area/hallway/primary/central)
"gP" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "purplecorner"},/area/hallway/primary/central)
-"gQ" = (/obj/machinery/door_control{dir = 2; id = "rnd"; name = "Shutters Control Button"; pixel_x = -24; pixel_y = -6},/obj/machinery/door/firedoor/border_only{dir = 8; name = "hazard door west"},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_x = -27; pixel_y = 3},/turf/simulated/floor/plasteel{icon_state = "whitepurple"; dir = 8},/area/medical/research{name = "Research Division"})
-"gR" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"gQ" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Scientist"},/turf/simulated/floor/plasteel{icon_state = "whitepurple"; dir = 8},/area/medical/research{name = "Research Division"})
+"gR" = (/obj/structure/table/reinforced,/obj/machinery/door/window/southright{dir = 4; name = "Research and Development Desk"; req_access_txt = "7"},/obj/item/weapon/folder/yellow,/obj/machinery/door/poddoor/shutters/preopen{id = "rnd"; name = "research lab shutters"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"gS" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/table,/obj/item/weapon/disk/tech_disk{pixel_x = 0; pixel_y = 0},/obj/item/weapon/disk/tech_disk{pixel_x = 0; pixel_y = 0},/obj/item/weapon/disk/design_disk,/obj/item/weapon/disk/design_disk,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/camera/autoname,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"gT" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"gU" = (/obj/structure/table,/obj/item/weapon/stock_parts/micro_laser,/obj/item/weapon/stock_parts/micro_laser,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/manipulator,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
@@ -365,7 +365,7 @@
"ha" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "yellow"},/area/quartermaster/storage)
"hb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
"hc" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/closet/crate,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
-"hd" = (/obj/structure/closet/crate,/obj/machinery/camera/autoname{dir = 8},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
+"hd" = (/obj/machinery/atmospherics/pipe/simple{dir = 2},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_research{name = "Server Room"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/research{name = "Research Division"})
"he" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"hf" = (/obj/structure/table,/obj/item/weapon/restraints/handcuffs,/obj/item/device/assembly/timer,/obj/item/device/flash,/turf/simulated/floor/plasteel,/area/security/brig)
"hg" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/obj/structure/stool/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel,/area/security/brig)
@@ -378,16 +378,16 @@
"hn" = (/obj/structure/table/wood,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/folder/red,/obj/item/weapon/hand_labeler,/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor/fancy/carpet,/area/security/brig)
"ho" = (/obj/structure/table,/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"hp" = (/turf/simulated/floor/plasteel{icon_state = "purple"; dir = 4},/area/hallway/primary/central)
-"hq" = (/obj/structure/table/reinforced,/obj/machinery/door/window/southright{dir = 4; name = "Research and Development Desk"; req_access_txt = "7"},/obj/machinery/door/poddoor/shutters{density = 0; icon_state = "shutter0"; id = "rnd"; name = "Research Lab Shutters"; opacity = 0},/obj/item/weapon/folder/yellow,/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
-"hr" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Scientist"},/obj/machinery/door/firedoor/border_only{dir = 8; name = "hazard door west"},/turf/simulated/floor/plasteel{icon_state = "whitepurple"; dir = 8},/area/medical/research{name = "Research Division"})
+"hq" = (/obj/machinery/door/firedoor,/obj/machinery/door/window/brigdoor{dir = 4; id = "Cell 2"; name = "Cell 2"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig)
+"hr" = (/obj/structure/table,/obj/item/weapon/hand_labeler,/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/obj/item/weapon/pen,/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = -30; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "whitepurple"; dir = 8},/area/medical/research{name = "Research Division"})
"hs" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"ht" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"hu" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"hv" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"hw" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"hx" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple{dir = 4},/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
-"hy" = (/obj/machinery/door/airlock/glass_research{name = "Server Room"; req_access_txt = "47"},/obj/machinery/atmospherics/pipe/simple{dir = 2},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/research{name = "Research Division"})
-"hz" = (/turf/simulated/floor/plating,/area/space)
+"hy" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/closet/crate,/obj/item/weapon/ore/glass,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
+"hz" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Detective"; req_access_txt = "4"},/turf/simulated/floor/plasteel,/area/security/brig)
"hA" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/quartermaster/storage)
"hB" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"hC" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel,/area/hallway/primary/central)
@@ -396,14 +396,14 @@
"hF" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/security/brig)
"hG" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/simulated/floor/plasteel,/area/security/brig)
"hH" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/brig)
-"hI" = (/obj/machinery/door/window/brigdoor{dir = 4; id = "Cell 1"; name = "Cell 1"; req_access_txt = "2"},/obj/machinery/door/firedoor/border_only{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig)
+"hI" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Research and Development Lab"; req_access_txt = "7"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"hJ" = (/obj/machinery/flasher{id = "Cell 3"; pixel_x = 28},/turf/simulated/floor/plasteel,/area/security/brig)
"hK" = (/obj/structure/closet/secure_closet/detective,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/brig)
"hL" = (/turf/simulated/floor/fancy/carpet,/area/security/brig)
"hM" = (/obj/structure/table/wood,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/turf/simulated/floor/fancy/carpet,/area/security/brig)
"hN" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"hO" = (/turf/simulated/floor/plasteel{icon_state = "purplecorner"; dir = 4},/area/hallway/primary/central)
-"hP" = (/obj/structure/table,/obj/item/weapon/hand_labeler,/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/obj/item/weapon/pen,/obj/machinery/door/firedoor/border_only{dir = 8; name = "hazard door west"},/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = -30; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "whitepurple"; dir = 8},/area/medical/research{name = "Research Division"})
+"hP" = (/obj/machinery/camera{c_tag = "Toxin Test Site"; dir = 8; network = list("RD","Toxins"); use_power = 0},/turf/simulated/floor/plating/airless,/area/space)
"hQ" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
"hR" = (/obj/machinery/r_n_d/destructive_analyzer,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/medical/research{name = "Research Division"})
"hS" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/medical/research{name = "Research Division"})
@@ -412,8 +412,8 @@
"hV" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"hW" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"hX" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Scientist"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"hY" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/atmospherics/pipe/simple{dir = 2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"hZ" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
+"hY" = (/obj/structure/closet/crate,/obj/item/weapon/ore/iron,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
+"hZ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/sink{pixel_y = 24},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
"ia" = (/obj/machinery/computer/rdservercontrol,/obj/machinery/door/window/southright{dir = 8; name = "Server Controller Computer"; req_access_txt = "7"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"ib" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/security/brig)
"ic" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/closet/crate,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
@@ -436,7 +436,7 @@
"it" = (/obj/machinery/light,/turf/simulated/floor/plasteel,/area/medical/research{name = "Research Division"})
"iu" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/r_n_d/circuit_imprinter,/obj/item/weapon/reagent_containers/glass/beaker/sulphuric,/turf/simulated/floor/plasteel,/area/medical/research{name = "Research Division"})
"iv" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
-"iw" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor/border_only{dir = 2; name = "hazard door south"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"iw" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/poddoor/preopen{id = "Biohazard"; name = "biohazard blast door"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"})
"ix" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker/large{pixel_x = -3; pixel_y = 3},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"iy" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/table,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/matter_bin,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"iz" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/clothing/glasses/welding,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
@@ -457,21 +457,21 @@
"iO" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"iP" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/wall,/area/hallway/primary/central)
"iQ" = (/obj/machinery/portable_atmospherics/pump,/obj/machinery/atmospherics/unary/portables_connector/visible,/turf/simulated/floor/plating,/area/hallway/primary/central)
-"iR" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/machinery/door/airlock/glass_security{name = "Detective"; req_access_txt = "4"},/turf/simulated/floor/plasteel,/area/security/brig)
+"iR" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"iS" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1},/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva)
"iT" = (/obj/machinery/camera/autoname{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"iU" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
-"iV" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/research{name = "Research and Development Lab"; req_access_txt = "7"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"iV" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"iW" = (/obj/machinery/atmospherics/pipe/simple{dir = 2},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"iX" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{current_temperature = 80; dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"iY" = (/obj/machinery/mass_driver{dir = 4; id = "toxinsdriver"},/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
"iZ" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/medical/research{name = "Research Division"})
"ja" = (/obj/machinery/door/poddoor{id = "toxinsdriver"; name = "Toxins Launcher Bay Door"},/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
-"jb" = (/obj/machinery/camera{c_tag = "Toxin Test Site"; dir = 8; network = list("RD","Toxins"); use_power = 0},/turf/simulated/floor/plating,/area/space)
+"jb" = (/obj/machinery/door/poddoor/preopen{id = "Biohazard"; name = "biohazard blast door"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"})
"jc" = (/turf/simulated/wall/shuttle{icon_state = "swall_s6"; dir = 2},/area/shuttle/arrival)
"jd" = (/obj/machinery/door/airlock/shuttle{name = "Arrivals Shuttle Airlock"},/obj/docking_port/mobile{dir = 2; dwidth = 5; height = 7; id = "arrival"; name = "arrival shuttle"; travelDir = -90; width = 15},/obj/docking_port/stationary{dir = 2; dwidth = 5; height = 7; id = "arrival_home"; name = "port bay 1"; width = 15},/turf/simulated/floor/plasteel/shuttle,/area/shuttle/arrival)
"je" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
-"jf" = (/obj/structure/closet/crate,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
+"jf" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"jg" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/wall,/area/hallway/primary/central)
"jh" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/closet/jcloset,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/janitor)
"ji" = (/turf/simulated/floor/fancy/carpet{icon_state = "carpetnoconnect"},/area/hallway/primary/central)
@@ -489,11 +489,11 @@
"ju" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/central)
"jv" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "purple"; dir = 4},/area/hallway/primary/central)
"jw" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/medical/research{name = "Research Division"})
-"jx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/sink{pixel_y = 24},/obj/machinery/door/firedoor/border_only{dir = 8; name = "hazard door west"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
+"jx" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
"jy" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/shower{pixel_y = 18},/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 1},/area/medical/research{name = "Research Division"})
"jz" = (/obj/structure/sink{pixel_y = 24},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 5},/area/medical/research{name = "Research Division"})
"jA" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/turf/simulated/wall,/area/medical/research{name = "Research Division"})
-"jB" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/firedoor/border_only{dir = 8; name = "hazard door west"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"})
+"jB" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/poddoor/preopen{id = "Biohazard"; name = "biohazard blast door"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"})
"jC" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
"jD" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 2},/area/medical/research{name = "Research Division"})
"jE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 10; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
@@ -508,14 +508,14 @@
"jN" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/wall,/area/quartermaster/storage)
"jO" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/hallway/primary/central)
"jP" = (/obj/machinery/door/window/eastleft,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/hallway/primary/central)
-"jQ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1},/obj/machinery/door/firedoor/border_only{dir = 8; name = "hazard door west"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"jQ" = (/obj/machinery/door/firedoor/heavy,/obj/machinery/door/airlock/research{name = "Toxins Lab"; req_access_txt = "7"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"jR" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"jS" = (/obj/structure/grille,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/ai_monitored/storage/eva)
-"jT" = (/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"jT" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"},/area/janitor)
"jU" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"jV" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/table/reinforced,/obj/item/device/transfer_valve{pixel_x = -5},/obj/item/device/transfer_valve{pixel_x = 0},/obj/item/device/transfer_valve{pixel_x = 5},/obj/item/device/transfer_valve{pixel_x = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"jW" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"jX" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/firedoor/border_only{dir = 8; name = "hazard door west"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"})
+"jW" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"jX" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
"jY" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
"jZ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"ka" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
@@ -542,11 +542,11 @@
"kv" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"kw" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "purple"; dir = 4},/area/hallway/primary/central)
"kx" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/medical/research{name = "Research Division"})
-"ky" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/obj/machinery/door/firedoor/border_only{dir = 8; name = "hazard door west"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
+"ky" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/medical/medbay)
"kz" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/closet/firecloset,/obj/machinery/light/small,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
"kA" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 1},/obj/structure/closet/firecloset,/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
"kB" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/medical/research{name = "Research Division"})
-"kC" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/firedoor/border_only{dir = 8; name = "hazard door west"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"})
+"kC" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/medical/medbay)
"kD" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
"kE" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 1},/area/medical/research{name = "Research Division"})
"kF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
@@ -574,7 +574,7 @@
"lb" = (/obj/machinery/bookbinder,/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/hallway/primary/central)
"lc" = (/obj/machinery/libraryscanner,/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/hallway/primary/central)
"ld" = (/obj/structure/table/wood,/obj/machinery/computer/libraryconsole{pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 6},/area/hallway/primary/central)
-"le" = (/obj/machinery/door/airlock/research{name = "Toxins Lab"; req_access_txt = "7"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"le" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"lf" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"lg" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"lh" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'BOMB RANGE"; name = "BOMB RANGE"},/turf/simulated/wall,/area/medical/research{name = "Research Division"})
@@ -771,7 +771,7 @@
"oQ" = (/obj/structure/closet/crate/bin,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"oR" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/ai_monitored/storage/eva)
"oS" = (/obj/machinery/door/airlock/maintenance{name = "Medbay Maintenance"; req_access_txt = "45"},/turf/simulated/floor/plating,/area/medical/medbay)
-"oT" = (/obj/machinery/door/firedoor/border_only{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/medical/medbay)
+"oT" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Custodial Closet"; req_access_txt = "26"},/turf/simulated/floor/plasteel,/area/janitor)
"oU" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/obj/machinery/newscaster{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"oV" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"oW" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
@@ -793,7 +793,7 @@
"pm" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"pn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel,/area/janitor)
"po" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/janitor)
-"pp" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"},/area/janitor)
+"pp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "E.V.A."; req_access_txt = "18"},/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva)
"pq" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/airlock/maintenance{name = "Custodial Maintenance"; req_access_txt = "26"},/turf/simulated/floor/plating,/area/janitor)
"pr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plating,/area/hallway/primary/central)
"ps" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
@@ -825,51 +825,51 @@
"pS" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 8},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/exit)
"pT" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/janitorialcart,/obj/item/weapon/mop,/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/janitor)
"pU" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/requests_console{department = "Janitorial"; departmentType = 1; pixel_y = -29},/turf/simulated/floor/plasteel,/area/janitor)
-"pV" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plasteel,/area/janitor)
+"pV" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyer"; name = "Medbay"; req_access_txt = "5"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"pW" = (/obj/structure/closet/crate/bin,/turf/simulated/floor/plasteel,/area/janitor)
"pX" = (/obj/machinery/camera/autoname{dir = 8},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"pY" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/wall/r_wall,/area/ai_monitored/storage/eva)
-"pZ" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva)
-"qa" = (/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva)
-"qb" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"pZ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyer"; name = "Medbay"; req_access_txt = "5"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
+"qa" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/sign/nosmoking_2{pixel_x = 28},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"},/area/medical/medbay)
+"qb" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre"; req_access_txt = "45"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"qc" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/wall/r_wall,/area/ai_monitored/storage/eva)
"qd" = (/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/hallway/primary/central)
"qe" = (/obj/machinery/shower{icon_state = "shower"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/hallway/primary/central)
"qf" = (/obj/structure/stool/bed/roller,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"qg" = (/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyer"; name = "Medbay Exit Button"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -26},/obj/structure/stool/bed/roller,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"qh" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreen"},/area/medical/medbay)
-"qi" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreen"},/area/medical/medbay)
-"qj" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
+"qh" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medbay"; req_access_txt = "5"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
+"qi" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Diner"},/turf/simulated/floor/plasteel,/area/crew_quarters/bar)
+"qj" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Diner"},/turf/simulated/floor/plasteel,/area/crew_quarters/bar)
"qk" = (/obj/machinery/requests_console{announcementConsole = 0; department = "Medbay"; departmentType = 1; name = "Medbay RC"; pixel_x = 0; pixel_y = -30; pixel_z = 0},/obj/structure/closet/crate/bin,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"ql" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"qm" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"qn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/sign/nosmoking_2{pixel_x = 28},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreencorner"},/area/medical/medbay)
+"qn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (WEST)"; icon_state = "whitebluecorner"; dir = 8},/area/medical/medbay)
"qo" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/medical/medbay)
-"qp" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreencorner"},/area/medical/medbay)
+"qp" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 1; icon_state = "comfychair"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/exit)
"qq" = (/obj/machinery/computer/operating,/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 1},/area/medical/medbay)
"qr" = (/obj/machinery/camera/autoname{dir = 8},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"},/area/medical/medbay)
"qs" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "escape"; dir = 10},/area/hallway/secondary/exit)
"qt" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
-"qu" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 1; icon_state = "comfychair_beige"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/exit)
+"qu" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"},/area/medical/medbay)
"qv" = (/obj/structure/closet/crate/bin,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/exit)
-"qw" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock{name = "Custodial Closet"; req_access_txt = "26"},/turf/simulated/floor/plasteel,/area/janitor)
+"qw" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteyellow"},/area/medical/medbay)
"qx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/hallway/primary/central)
"qy" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
-"qz" = (/obj/machinery/door/airlock/glass_command{name = "E.V.A."; req_access_txt = "18"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva)
+"qz" = (/obj/structure/table/reinforced,/obj/machinery/door/window/eastright{dir = 2; name = "Chemistry Desk"; req_access_txt = "33"},/obj/item/clothing/glasses/science,/obj/machinery/door/firedoor/heavy,/turf/simulated/floor/plating,/area/medical/medbay)
"qA" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"qB" = (/obj/machinery/door/airlock{name = "Public Toilets"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/hallway/primary/central)
"qC" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/hallway/primary/central)
"qD" = (/obj/structure/stool/bed/chair,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"qE" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"qF" = (/obj/structure/sign/bluecross,/turf/simulated/wall,/area/medical/medbay)
-"qG" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyer"; name = "Medbay"; req_access_txt = "5"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"qH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyer"; name = "Medbay"; req_access_txt = "5"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
+"qG" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"},/area/medical/medbay)
+"qH" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Cryo"; req_access_txt = "45"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"qI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/medbay)
"qJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/medbay)
"qK" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/camera/autoname{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"qL" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "hazard door east"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreen"},/area/medical/medbay)
-"qM" = (/obj/machinery/door/airlock/medical{name = "Operating Theatre"; req_access_txt = "45"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"qN" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreen"},/area/medical/medbay)
+"qL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
+"qM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "Head of Personnel Office"; req_access = null; req_access_txt = "57"},/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
+"qN" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/medbay)
"qO" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"qP" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1},/obj/structure/table,/obj/item/stack/packageWrap,/obj/item/weapon/hand_labeler,/obj/item/device/radio/headset/headset_med,/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_y = 25},/obj/machinery/camera/autoname,/turf/simulated/floor/plasteel{tag = "icon-whiteyellowcorner"; icon_state = "whiteyellowcorner"; dir = 2},/area/medical/medbay)
"qQ" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
@@ -889,15 +889,15 @@
"re" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 1},/area/hallway/primary/central)
"rf" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"rg" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/medical/medbay)
-"rh" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/medbay)
-"ri" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/medbay)
+"rh" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/medical/medbay)
+"ri" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/medical/medbay)
"rj" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/drinks/britcup{desc = "Kingston's personal cup."},/obj/machinery/camera/autoname,/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"rk" = (/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyer"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = -26; req_access_txt = "5"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreen"},/area/medical/medbay)
+"rk" = (/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyer"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = -26; req_access_txt = "5"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/medbay)
"rl" = (/obj/machinery/computer/med_data,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"rm" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/turf/simulated/floor/plating,/area/medical/medbay)
-"rn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor/border_only{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"ro" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreencorner"},/area/medical/medbay)
-"rp" = (/obj/structure/closet/secure_closet/medical2,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreencorner"},/area/medical/medbay)
+"rn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plasteel{tag = "icon-whiteyellow (WEST)"; icon_state = "whiteyellow"; dir = 8},/area/medical/medbay)
+"ro" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (EAST)"; icon_state = "whitebluecorner"; dir = 4},/area/medical/medbay)
+"rp" = (/obj/structure/closet/secure_closet/medical2,/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (NORTH)"; icon_state = "whitebluecorner"; dir = 1},/area/medical/medbay)
"rq" = (/obj/structure/table,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"rr" = (/obj/machinery/vending/wallmed{pixel_y = -28},/obj/structure/table,/obj/item/weapon/storage/box/syringes,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"rs" = (/obj/machinery/computer/pandemic,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
@@ -918,8 +918,8 @@
"rH" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/medbay)
"rI" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/medical/medbay)
"rJ" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/white,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"rK" = (/obj/structure/stool/bed/chair/office/light{dir = 8},/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreen"},/area/medical/medbay)
-"rL" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medbay"; req_access_txt = "5"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
+"rK" = (/obj/structure/stool/bed/chair/office/light{dir = 8},/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/medbay)
+"rL" = (/obj/structure/table/reinforced,/obj/machinery/door/window/eastright{dir = 8; name = "Chemistry Desk"; req_access_txt = "33"},/obj/machinery/door/firedoor/heavy,/turf/simulated/floor/plating,/area/medical/medbay)
"rM" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"rN" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "L2"; dir = 4},/area/hallway/secondary/exit)
"rO" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "L4"; dir = 4},/area/hallway/secondary/exit)
@@ -935,9 +935,9 @@
"rY" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/medical/medbay)
"rZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"sa" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/structure/sign/nosmoking_2{pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"sb" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreen"},/area/medical/medbay)
+"sb" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/medbay)
"sc" = (/obj/machinery/vending/medical{pixel_x = -2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"sd" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
+"sd" = (/obj/machinery/chem_heater,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"se" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/crew_quarters/bar)
"sf" = (/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 7; pixel_y = 1},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 0; pixel_y = 0},/obj/item/weapon/wrench{pixel_x = 5; pixel_y = -5},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"sg" = (/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 1},/area/medical/medbay)
@@ -957,13 +957,13 @@
"su" = (/turf/simulated/wall,/area/crew_quarters/bar)
"sv" = (/obj/structure/sign/maltesefalcon/left,/turf/simulated/wall,/area/crew_quarters/bar)
"sw" = (/obj/structure/sign/maltesefalcon/right,/turf/simulated/wall,/area/crew_quarters/bar)
-"sx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/glass{name = "Diner"},/turf/simulated/floor/plasteel,/area/crew_quarters/bar)
+"sx" = (/turf/simulated/floor/plasteel{tag = "icon-whiteyellow (WEST)"; icon_state = "whiteyellow"; dir = 8},/area/medical/medbay)
"sy" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/hallway/secondary/entry)
-"sz" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/airlock/glass{name = "Diner"},/turf/simulated/floor/plasteel,/area/crew_quarters/bar)
+"sz" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"},/area/medical/medbay)
"sA" = (/obj/machinery/light/small,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/bar)
"sB" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"sC" = (/obj/structure/sign/chemistry,/turf/simulated/wall,/area/medical/medbay)
-"sD" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteyellow"},/area/medical/medbay)
+"sD" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Genetics"; req_access_txt = "45"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"sE" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"sF" = (/obj/machinery/telecomms/receiver/preset_left/ministation,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer)
"sG" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"},/area/medical/medbay)
@@ -990,22 +990,22 @@
"tb" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"tc" = (/obj/structure/stool/bed/chair,/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"td" = (/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"te" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"tf" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"tg" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
+"te" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteyellow (WEST)"; icon_state = "whiteyellow"; dir = 8},/area/medical/medbay)
+"tf" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/firedoor/heavy,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Chemistry Lab"; req_access_txt = "5; 33"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
+"tg" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteyellowcorner"},/area/medical/medbay)
"th" = (/obj/structure/closet/crate/bin,/obj/structure/noticeboard{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"ti" = (/obj/machinery/vending/boozeomat,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/crew_quarters/bar)
"tj" = (/obj/structure/table,/obj/item/weapon/book/manual/barman_recipes,/obj/item/stack/packageWrap,/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/crew_quarters/bar)
"tk" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/engine/engineering)
"tl" = (/obj/structure/table,/obj/machinery/door/window/southleft{layer = 3.1},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"tm" = (/obj/structure/table,/obj/machinery/door/window/southright{layer = 3.1},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
-"tn" = (/obj/structure/table/reinforced,/obj/machinery/door/window/eastright{dir = 2; name = "Chemistry Desk"; req_access_txt = "33"},/obj/item/clothing/glasses/science,/turf/simulated/floor/plating,/area/medical/medbay)
+"tn" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"to" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/structure/table,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/syringes,/obj/item/weapon/storage/pill_bottle/epinephrine{pixel_x = 5; pixel_y = -2},/obj/item/weapon/storage/pill_bottle/epinephrine{pixel_x = 5; pixel_y = -2},/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"tp" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/obj/machinery/door_control{desc = "A remote control switch for the genetics doors."; id = "GeneticsDoor"; name = "Genetics Exit Button"; normaldoorcontrol = 1; pixel_x = 8; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/medbay)
"tq" = (/obj/machinery/smartfridge/chemistry,/turf/simulated/wall,/area/medical/medbay)
"tr" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{tag = "icon-whiteyellowcorner (WEST)"; icon_state = "whiteyellowcorner"; dir = 8},/area/medical/medbay)
-"ts" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/obj/machinery/door/firedoor/border_only{dir = 4; name = "hazard door east"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"},/area/medical/medbay)
-"tt" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Cryo"; req_access_txt = "45"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
+"ts" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medbay Storage"; req_access_txt = "45"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
+"tt" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Bar Storage"; req_access_txt = "25"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"tu" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/light,/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
"tv" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"tw" = (/obj/machinery/vending/wallmed{pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
@@ -1014,8 +1014,8 @@
"tz" = (/obj/structure/grille,/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating/airless,/area/engine/engineering)
"tA" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit)
"tB" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
-"tC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/airlock/command{name = "Head of Personnel Office"; req_access = null; req_access_txt = "57"},/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
-"tD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor/border_only{dir = 8},/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
+"tC" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Bar Storage"; req_access_txt = "25"},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/bar)
+"tD" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/brute{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/brute{pixel_x = -2; pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"tE" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
"tF" = (/obj/machinery/computer/card,/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
"tG" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Head of Personnel"},/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
@@ -1042,8 +1042,8 @@
"ub" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/effect/landmark/start{name = "Chemist"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"uc" = (/obj/machinery/chem_master,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"ud" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/effect/landmark/start{name = "Chemist"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellow"},/area/medical/medbay)
-"ue" = (/obj/structure/table/reinforced,/obj/machinery/door/window/eastright{dir = 8; name = "Chemistry Desk"; req_access_txt = "33"},/turf/simulated/floor/plating,/area/medical/medbay)
-"uf" = (/obj/machinery/door/firedoor/border_only{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plasteel{tag = "icon-whiteyellow (WEST)"; icon_state = "whiteyellow"; dir = 8},/area/medical/medbay)
+"ue" = (/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/bar)
+"uf" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Frozen Storage"; req_access_txt = "25"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/bar)
"ug" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/obj/machinery/camera/autoname{dir = 8},/obj/structure/sign/nosmoking_2{pixel_x = 28},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"},/area/medical/medbay)
"uh" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/tcommsat/computer)
"ui" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/tcommsat/computer)
@@ -1070,9 +1070,9 @@
"uD" = (/obj/machinery/hydroponics/soil,/turf/simulated/floor/plasteel{icon_state = "green"; dir = 1},/area/hallway/primary/central)
"uE" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"uF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellow"},/area/medical/medbay)
-"uG" = (/obj/machinery/door/firedoor/border_only{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-whiteyellow (WEST)"; icon_state = "whiteyellow"; dir = 8},/area/medical/medbay)
-"uH" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 4; name = "hazard door east"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"},/area/medical/medbay)
-"uI" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Genetics"; req_access_txt = "45"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
+"uG" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"uH" = (/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"uI" = (/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 12; id = "ferry_home"; name = "station"; turf_type = /turf/space; width = 5},/turf/simulated/floor/plating/airless,/area/space)
"uJ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"uK" = (/obj/machinery/vending/wallmed{pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"uL" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
@@ -1083,7 +1083,7 @@
"uQ" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/engine/gravity_generator)
"uR" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/engine/gravity_generator)
"uS" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/closet/secure_closet/hop,/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
-"uT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
+"uT" = (/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_y = 25},/obj/structure/closet/radiation,/turf/simulated/floor/plasteel,/area/engine/engineering)
"uU" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"uV" = (/obj/structure/kitchenspike,/obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/bar)
"uW" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
@@ -1096,8 +1096,8 @@
"vd" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"ve" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"vf" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellow"},/area/medical/medbay)
-"vg" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Chemistry Lab"; req_access_txt = "5; 33"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"vh" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-whiteyellow (WEST)"; icon_state = "whiteyellow"; dir = 8},/area/medical/medbay)
+"vg" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "yellow"; dir = 1},/area/engine/engineering)
+"vh" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{name = "Engineering"; req_access_txt = "10"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"vi" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"vj" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (EAST)"; icon_state = "whitebluecorner"; dir = 4},/area/medical/medbay)
"vk" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (NORTH)"; icon_state = "whitebluecorner"; dir = 1},/area/medical/medbay)
@@ -1126,9 +1126,9 @@
"vH" = (/obj/structure/table,/obj/item/weapon/screwdriver{pixel_x = -2; pixel_y = 6},/obj/item/stack/sheet/mineral/plasma{layer = 2.9},/obj/item/stack/sheet/mineral/plasma{layer = 2.9},/obj/item/device/radio/headset/headset_med,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"vI" = (/obj/structure/closet/secure_closet/chemical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"vJ" = (/obj/structure/closet/wardrobe/chemistry_white,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellowcorner"},/area/medical/medbay)
-"vK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteyellowcorner"},/area/medical/medbay)
-"vL" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"vM" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
+"vK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_y = 25},/obj/structure/closet/secure_closet/engineering_personal,/turf/simulated/floor/plasteel,/area/engine/engineering)
+"vL" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/machinery/light/small{dir = 8},/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/plasteel{dir = 9; icon_state = "yellow"},/area/engine/engineering)
+"vM" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/turf/simulated/floor/plasteel{icon_state = "yellow"; dir = 5},/area/engine/engineering)
"vN" = (/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"vO" = (/obj/machinery/dna_scannernew,/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 1},/area/medical/medbay)
"vP" = (/obj/machinery/light,/obj/machinery/computer/cloning,/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 1},/area/medical/medbay)
@@ -1160,7 +1160,7 @@
"wp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/medbay)
"wq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/medical/medbay)
"wr" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/medical/medbay)
-"ws" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medbay Storage"; req_access_txt = "45"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
+"ws" = (/obj/structure/closet/secure_closet/engineering_personal,/turf/simulated/floor/plasteel,/area/engine/engineering)
"wt" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/medical/medbay)
"wu" = (/turf/simulated/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/arrival)
"wv" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel/shuttle,/area/shuttle/arrival)
@@ -1175,10 +1175,10 @@
"wE" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plating,/area/hallway/primary/central)
"wF" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/hallway/primary/central)
"wG" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/crew_quarters/bar)
-"wH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock{name = "Bar Storage"; req_access_txt = "25"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"wH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor/plasteel,/area/engine/engineering)
"wI" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/crew_quarters/bar)
"wJ" = (/obj/machinery/computer/security/telescreen/entertainment,/turf/simulated/wall,/area/crew_quarters/bar)
-"wK" = (/obj/machinery/door/airlock{name = "Bar Storage"; req_access_txt = "25"},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/bar)
+"wK" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"wL" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/hallway/primary/central)
"wM" = (/obj/machinery/seed_extractor,/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/hallway/primary/central)
"wN" = (/obj/machinery/biogenerator,/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/hallway/primary/central)
@@ -1187,7 +1187,7 @@
"wQ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 1},/area/medical/medbay)
"wR" = (/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 1},/area/medical/medbay)
"wS" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 1},/area/medical/medbay)
-"wT" = (/obj/structure/table,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/mask/muzzle,/obj/item/weapon/gun/syringe,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
+"wT" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"wU" = (/turf/simulated/floor/plasteel/shuttle,/turf/simulated/wall/shuttle{icon_state = "swall_f10"; dir = 2},/area/shuttle/arrival)
"wV" = (/turf/simulated/wall/shuttle{icon_state = "swall13"; dir = 2},/area/shuttle/arrival)
"wW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/hallway/primary/central)
@@ -1196,18 +1196,18 @@
"wZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/obj/machinery/meter{use_power = 0},/turf/simulated/floor/plating{icon_state = "warnplatecorner"; dir = 1},/area/hallway/primary/central)
"xa" = (/obj/structure/closet/crate{desc = "It's a storage unit for kitchen clothes and equipment."; name = "Kitchen Crate"},/obj/item/clothing/head/chefhat,/obj/item/clothing/under/rank/chef,/obj/item/weapon/storage/box/mousetraps{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/box/mousetraps,/obj/item/clothing/under/waiter,/obj/item/clothing/under/waiter,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/bar)
"xb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/camera/autoname,/mob/living/simple_animal/mouse/brown/Tom,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/bar)
-"xc" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/bar)
-"xd" = (/obj/machinery/door/airlock{name = "Frozen Storage"; req_access_txt = "25"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/bar)
+"xc" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/engine/engineering)
+"xd" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/engine/engineering)
"xe" = (/obj/structure/sink/kitchen{pixel_y = 28},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"xf" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"xf" = (/obj/machinery/pipedispenser/disposal,/turf/simulated/floor/plasteel,/area/engine/engineering)
"xg" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/vending/dinnerware,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"xh" = (/obj/machinery/reagentgrinder,/obj/structure/table/wood,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"xi" = (/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/obj/structure/table/wood,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"xj" = (/obj/structure/closet/crate/bin,/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"xk" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"xk" = (/obj/machinery/suit_storage_unit/engine,/turf/simulated/floor/plasteel,/area/engine/engineering)
"xl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/medical/medbay)
"xm" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/fire{pixel_x = -2; pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"xn" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor/plasteel{icon_state = "yellow"; dir = 5},/area/engine/engineering)
+"xn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/engine/engineering)
"xo" = (/obj/machinery/atmospherics/pipe/simple/cyan/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engine/engineering)
"xp" = (/obj/structure/closet/secure_closet/medical3,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"xq" = (/turf/simulated/wall/shuttle{icon_state = "swall_s5"; dir = 2},/area/shuttle/arrival)
@@ -1244,7 +1244,7 @@
"xV" = (/obj/machinery/camera/autoname{dir = 1},/obj/structure/table/wood,/obj/item/weapon/book/manual/chef_recipes{pixel_y = 5},/obj/item/weapon/reagent_containers/food/condiment/enzyme,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"xW" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"xX" = (/obj/machinery/atmospherics/pipe/simple/yellow/visible{tag = "icon-intact (NORTH)"; icon_state = "intact"; dir = 1},/turf/simulated/floor/plating,/area/engine/engineering)
-"xY" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"xY" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "yellow"},/area/engine/engineering)
"xZ" = (/obj/structure/table,/obj/item/weapon/storage/belt/medical{pixel_x = 0; pixel_y = 2},/obj/item/weapon/storage/belt/medical{pixel_x = 0; pixel_y = 2},/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"ya" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = 7; pixel_y = -3},/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = -4; pixel_y = -3},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 3; pixel_y = -2},/obj/item/weapon/reagent_containers/glass/bottle/morphine,/obj/item/weapon/reagent_containers/glass/bottle/toxin{pixel_x = 4; pixel_y = 2},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 5; pixel_y = -2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"yb" = (/obj/structure/table,/obj/machinery/light,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/tie/stethoscope,/obj/item/weapon/reagent_containers/hypospray,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
@@ -1285,7 +1285,7 @@
"yK" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plasteel,/area/engine/engineering)
"yL" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel,/area/engine/engineering)
"yM" = (/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"yN" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/turf/simulated/floor/plasteel{icon_state = "yellow"; dir = 1},/area/engine/engineering)
+"yN" = (/obj/machinery/pipedispenser/disposal/transit_tube,/turf/simulated/floor/plasteel,/area/engine/engineering)
"yO" = (/obj/structure/table,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light{dir = 1},/obj/machinery/cell_charger,/turf/simulated/floor/plasteel,/area/engine/engineering)
"yP" = (/obj/structure/table,/obj/machinery/alarm{pixel_y = 23},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/clothing/gloves/color/yellow,/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/turf/simulated/floor/plasteel,/area/engine/engineering)
"yQ" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/camera/autoname,/obj/machinery/power/smes/engineering,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
@@ -1348,9 +1348,9 @@
"zV" = (/obj/machinery/vending/tool,/turf/simulated/floor/plasteel,/area/engine/engineering)
"zW" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/wall/r_wall,/area/engine/engineering)
"zX" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/engine/engineering)
-"zY" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/airlock/engineering{name = "Engineering"; req_access_txt = "10"},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"zY" = (/obj/machinery/door/firedoor/heavy,/turf/simulated/floor/plasteel,/area/engine/engineering)
"zZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/engine/engineering)
-"Aa" = (/obj/machinery/pipedispenser/disposal,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"Aa" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor/heavy,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Ab" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Ac" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering)
"Ad" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
@@ -1359,22 +1359,18 @@
"Ag" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Ah" = (/obj/machinery/vending/engivend,/turf/simulated/floor/plasteel,/area/engine/engineering)
"Ai" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/engine/engineering)
-"Aj" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/machinery/light/small{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/plasteel{dir = 9; icon_state = "yellow"},/area/engine/engineering)
-"Ak" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor/plasteel{icon_state = "yellow"; dir = 1},/area/engine/engineering)
+"Aj" = (/obj/structure/grille,/obj/structure/lattice,/turf/space,/area/engine/engineering)
+"Ak" = (/obj/machinery/atmospherics/unary/tank/air{dir = 8; icon_state = "grey"},/turf/simulated/floor/plating,/area/tcommsat/computer)
"Al" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/yellow/visible{tag = "icon-intact (NORTH)"; icon_state = "intact"; dir = 1},/turf/simulated/floor/plating,/area/engine/engineering)
"Am" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/engine/engineering)
"An" = (/obj/machinery/pipedispenser,/turf/simulated/floor/plasteel,/area/engine/engineering)
"Ao" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel,/area/engine/engineering)
"Ap" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/gloves/color/black,/obj/item/weapon/extinguisher{pixel_x = 8},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"Aq" = (/obj/structure/closet/secure_closet/engineering_personal,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/engine/engineering)
+"Aq" = (/obj/machinery/suit_storage_unit/atmos,/turf/simulated/floor/plasteel,/area/engine/engineering)
"Ar" = (/obj/machinery/power/port_gen/pacman,/turf/simulated/floor/plasteel,/area/engine/engineering)
"As" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/floor/plasteel,/area/engine/engineering)
"At" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/engine/engineering)
-"Au" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"Av" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Aw" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"Ax" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"Ay" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 8},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Az" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/engine/engineering)
"AA" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/engine/engineering)
"AB" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor/plasteel,/area/engine/engineering)
@@ -1389,10 +1385,8 @@
"AK" = (/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"AL" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/engine/engineering)
"AM" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"AN" = (/obj/structure/closet/radiation,/turf/simulated/floor/plasteel,/area/engine/engineering)
"AO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "yellow"; dir = 1},/area/engine/engineering)
"AP" = (/obj/machinery/requests_console{announcementConsole = 0; department = "Engineering"; departmentType = 4; name = "Engineering RC"; pixel_y = 30},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"AQ" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/space/hardsuit,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit,/turf/simulated/floor/plasteel,/area/engine/engineering)
"AR" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
"AS" = (/obj/machinery/atmospherics/unary/portables_connector/visible,/turf/simulated/floor/plating,/area/engine/engineering)
"AT" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/portables_connector/visible,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engine/engineering)
@@ -1404,8 +1398,6 @@
"AZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Ba" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/camera/autoname,/turf/simulated/floor/plasteel,/area/engine/engineering)
"Bb" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/cyan/visible{tag = "icon-intact (NORTH)"; icon_state = "intact"; dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engine/engineering)
-"Bc" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"Bd" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/engine/engineering)
"Be" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/engine/engineering)
"Bf" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/yellow/visible{tag = "icon-intact (NORTH)"; icon_state = "intact"; dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engine/engineering)
"Bg" = (/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_y = 25},/obj/machinery/atmospherics/unary/portables_connector/visible,/turf/simulated/floor/plating,/area/engine/engineering)
@@ -1413,8 +1405,6 @@
"Bi" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Bj" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/portables_connector/visible,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engine/engineering)
"Bk" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/engine/engineering)
-"Bl" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "yellow"},/area/engine/engineering)
-"Bm" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Bn" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/cyan/visible{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engine/engineering)
"Bo" = (/obj/structure/closet/crate{name = "solar pack crate"},/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/weapon/circuitboard/solar_control,/obj/item/weapon/tracker_electronics,/obj/item/weapon/paper/solar,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engine/engineering)
"Bp" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/engine/engineering)
@@ -1459,8 +1449,6 @@
"Cc" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/camera/autoname,/turf/simulated/floor/plasteel,/area/engine/engineering)
"Cd" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{tag = "icon-manifold (NORTH)"; icon_state = "manifold"; dir = 1},/turf/simulated/floor/plating,/area/engine/engineering)
"Ce" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"Cf" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"Cg" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Ch" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Ci" = (/obj/structure/transit_tube{icon_state = "N-SE"},/turf/space,/area/space)
"Cj" = (/obj/structure/transit_tube{icon_state = "D-SW"},/turf/space,/area/space)
@@ -1476,7 +1464,6 @@
"Ct" = (/obj/structure/table,/obj/item/stack/cable_coil,/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/turf/simulated/floor/plasteel,/area/engine/engineering)
"Cu" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/item/clothing/ears/earmuffs{pixel_x = -3; pixel_y = -2},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Cv" = (/obj/structure/table,/obj/item/stack/rods{amount = 50},/obj/item/device/analyzer,/turf/simulated/floor/plasteel,/area/engine/engineering)
-"Cw" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Cx" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Cy" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Cz" = (/obj/structure/table,/turf/simulated/floor/plasteel,/area/engine/engineering)
@@ -1537,12 +1524,10 @@
"DU" = (/obj/machinery/ignition_switch{id = "burnchamber"; pixel_x = 25},/turf/simulated/floor/plating,/area/engine/engineering)
"DW" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/turf/simulated/floor/engine/vacuum,/area/engine/engineering)
"DX" = (/obj/structure/transit_tube{icon_state = "N-S"},/obj/structure/lattice,/turf/space,/area/space)
-"DY" = (/obj/structure/grille,/turf/space,/area/engine/engineering)
"DZ" = (/obj/structure/lattice,/obj/structure/transit_tube{tag = "icon-N-S-Pass"; icon_state = "N-S-Pass"},/turf/space,/area/space)
"Ea" = (/turf/simulated/wall,/area/tcommsat/computer)
"Eb" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 0},/turf/simulated/wall,/area/tcommsat/computer)
"Ec" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/tcommsat/computer)
-"Ed" = (/obj/machinery/atmospherics/unary/tank/air{icon_state = "intact"; dir = 8},/turf/simulated/floor/plating,/area/tcommsat/computer)
"Ee" = (/obj/structure/transit_tube{icon_state = "N-SE"},/obj/structure/lattice,/turf/space,/area/space)
"Ef" = (/obj/structure/transit_tube{icon_state = "D-SW"},/obj/structure/lattice,/turf/space,/area/space)
"Eg" = (/obj/machinery/door/airlock/external{name = "Telecomms Emergency Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/tcommsat/computer)
@@ -1663,7 +1648,6 @@
"GK" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/turf/simulated/wall/r_wall,/area/engine/gravity_generator)
"GL" = (/obj/machinery/door/airlock/highsecurity{name = "Gravity Generator Room"; req_access_txt = "19;23"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/gravity_generator)
"GN" = (/obj/structure/closet/radiation,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/tcommsat/computer)
-"GO" = (/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 12; id = "ferry_home"; name = "station"; turf_type = /turf/space; width = 5},/turf/simulated/floor/plating,/area/space)
"GP" = (/obj/machinery/telecomms/processor/preset_one,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer)
"GQ" = (/obj/machinery/telecomms/broadcaster/preset_left/ministation,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer)
"GR" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_s"; name = "south of station"; turf_type = /turf/simulated/floor/plating/snow; width = 18},/turf/space,/area/space)
@@ -1720,146 +1704,146 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadafadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadafadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaadadafadadadadadadadaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaadadadadadadadadaaaaadadadadaaaaaaaaaaadadadadadadadaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaadadadadafadadadaaaaaaadadadadadaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaadafadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaadadadadadadaaaaadadafadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadafadadaaaaaaaaaaaaaaadadadadaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaadadaaaaaaaaaaadaaaaaaadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaadadaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaadadadaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaadaaaaaaadadadafadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaadadafadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadaaaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadafadadaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadafadadadaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadafadadaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaadadafadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadaaaaaaaaacaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaadadadadadadadaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadafadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaadadadadadafadaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadaaaaaaaaaaaaaaaaaaaaaaadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadafadadadadaaaaaaadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadaaaaaaadadafadadadadadadaaaaaaadaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaadadadadadadadadadaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadaaaaaaadadafadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaadadadafadadaaaaaaaaadadaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaadadadadaaaaaaaaadadaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaadadafadadadadaaaaaaaaaaaaaaadadadaaaaaaaaaaadadaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadafadadadaaaaaaaaaaadadadadadadaaaaaaaaaaaaadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaadadafadadaaaaaaaaaaaaaaaaadaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadafadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadafadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaadadadadaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadafadaaaaadadadadadaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaadadafadaaaaaaadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadafadadaaaaaaadadadadaaaaaaadadadadadadadaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaadadadadaaaaaaadadadafadadaaaaaaaaadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaadadaaaaaaaaaaaaadadadadadaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaadadadadaaaaaaaaadadafadadaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadafadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaadadaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafbmafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbmafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafafafaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaafafbmafafafafafafafaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaafafafafafafafafaaaaafafafafaaaaaaaaaaafafafafafafafaaaaaaaaaaaaaaafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaaaaaafafafafbmafafafaaaaaaafafafafafaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaafbmafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaaaaaaaaaafafafafafafaaaaafafbmafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafbmafafaaaaaaaaaaaaaaafafafafaaaaaaaaaaafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaafafaaaaaaaaaaafaaaaaaafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaafafaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaafafafaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaafaaaaaaafafafbmafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaaaaaaaaaaaaaaaaaaaafafbmafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaaaaaaaaaaaafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafbmafafaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafbmafafafaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafbmafafaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaafafbmafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafaaaaaaaaacaaaaafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafafafafafafafaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafbmafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaaaaaafafafafafbmafaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafaaaaaaaaaaaaaaaaaaaaaaafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafbmafafafafaaaaaaafafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafafaaaaaaafafbmafafafafafafaaaaaaafaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaafafafafafafafafafaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafaaaaaaafafbmafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaafafafbmafafaaaaaaaaafafaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaaaaaaaaaaaafafafafaaaaaaaaafafaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaafafbmafafafafaaaaaaaaaaaaaaafafafaaaaaaaaaaafafaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafbmafafafaaaaaaaaaaafafafafafafaaaaaaaaaaaaafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaaaaaaaaaafafbmafafaaaaaaaaaaaaaaaaafaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbmafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbmafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaafafafafaaaaafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafbmafaaaaafafafafafaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaafafbmafaaaaaaafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafbmafafaaaaaaafafafafaaaaaaafafafafafafafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaafafafafaaaaaaafafafbmafafaaaaaaaaafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaafafaaaaaaaaaaaaafafafafafaaaaaaaaafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaafafafafaaaaaaaaafafbmafafaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbmafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaafafaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadaaaaaaaaaaaaaaaaaaadadadafadaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadafadadadadaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaahajaiaiaialakakakaLahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaahahanaoapaqarasatauavahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaahawaxayazaAaBaCaDayaEaFahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaahaGaHayayaIaJaKayaybnaMahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafaaaaaaaaaaaaaaaaaaafafafbmafaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafafaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafbmafafafafaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaafafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaahajaiaiaialakakakaLahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaahahanaoapaqarasatauavahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaahawaxayazaAaBaCaDayaEaFahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaahaGaHayayaIaJaKayaybnaMahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaahaNaOayayaPaQaRayayaSaTahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaahaUaOayayayaVaWaXaXaYaZahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamamaaamaaaaamamaaaaaaaaahahbaaybbbcbdbebfaybgahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaambhbibjbjbkbkamamamamaaaaaaamahblahahbmbIboahahbpahamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqbrbsbsbtbubvbvbwbvbvaaaabxbybxbzbAbBbCbDbEahbFbGbxbybxamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqbHbqbQbqbQbqbJbqbKbqaabLbMbNbMbObNahbPcgbRahbSbTbMbNbMbLamaaaaaaaaaaaaaaaaaaaaaaaabUbUbUbUbUbUbVbWbUbUbUbUbUbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqbXbYbZcabYcbccbqcdceamambxbxbxbOcfahbmelchahcibTbxbxcjckckckckaaaaaaaaaaaaaaaaaaaabUclcmcmcncocpcpcqcrcscscsbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqctbQcubQcvbQcwbqbKbqbxbxbxcxbNbObNbxcyczcAbxbSbTbNcBcjcCcDcEckckckckckaaaaaaaaaaambUcFcGcscHcIcpcpcJcKcscscLbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaambqcMcNcOcOcPcOcQcRcSbqbNbNbNcTcUcVcUcWcXcYcZcWdadbcUdccjdddedfdgdhdidjckamamamamamambUcscscsdkdlcpcpdmdncmcmdobUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamambqdpcScScScScSdqcSdrdsbNdtdudvdwdxdydwdzdAdBdCdDdEcjcjcjdFdedGdHdedIdJckaaaaaaaaaaambUbUbUbUdKbUdLdMbUbUbUbUbUbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamamamamambqdNcSdOcScSdPcSdOdQbqbqbqdRdSdTdUdVdWdXdYdZeaebecedeeefdeegeheiejekeHckaaaaaaaaaaaabUclcmcmemencpcpeoepeqeresetaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeuamamamamamamambqevewexeyezezezeAeBeCeDeEeFeGbQeIeJeKeLeMeNeOePeQeReSeSeSeTeUckckckckckaaaaaaaaaaambUcFcGcseVcIcpcpcpcpcpcpcpeWamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXamaaaaaaaaaaambJeZfafbfccScScSfdfebqffcSfbfgbQeIeJeKeLfjfkflebfmedfndedefofpfhfrfickamamamamamamambUcscscsftfucpcpcpcpfvcpcpfwamamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaabqfxcSfyfzfAfAfAfAfBfCfDfAfEfFfGfHfIfJeLfqfLcjfKfMckdededefofOhIdefQckamaaaaaaaaaaambUbUbUbUbUbUcpcpfSfRfTfUbUbUbUbUbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaabqcScSfbfccScScScSdrfVcScSfafNbQfXfXfXfYfZgacjgbgcgdgegfggghgifWgegjcjckckckckntntntgogpgqgrgsbUgtgugvbUbUgwbUgxgygzbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaagAgBcSfbfccScSgCcSdrfVcScScSdrgDfXfXfXeLfjgacjgEgFgFgGgHgIdegkckckckcjgKgLgMckgNgOgPgogQcpcpcpcpcpgRgSgTgUgVbUgWgXgYbUamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaagZhacShbhchdbqbqbqbqbqbqbqbqbqbqbxbxbxeLfjhecjcjhfdehghhhigFhjfhfrfscjhlhmhnckhofXhphqhrcpcpcphshthuhvhththwbUhxhyhxbUbUamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaabQhAcSfbfccSbqbNbNbNbNbNbNbNbNbNbNbxhBeLfjgahCcjhDhEhFdehGgehHfPdehJcjhKhLhMckhNfXhOgohPhQhRhShThUhVhWcpcphXbUgRhYhZiabUamamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaabQcScShbhcicbqbNbxbxbxbxbxbxbxbxidbxieeLfjgaifcjigihglijgmilimfWgegjcjgniogJckiqfXfXgoirhQisitiuiviwixiyiziAbUcpiBiCbUbUbUbUbUamamamamamamamamamamamamamamamamameYeYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaabQgBcSfbfccSbqiEdwiFiGbxiHiIiJiKiLbxbxiMiNiOiPcjcjcjcjcjcjcjcjcjcjcjcjhkiRibckiTfXiUgobUbUbUbUbUgviVbUbUbUbUbUcpiWcpiXbUiYiZjabLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahzjbiDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaxJgZhaewjehcjfbqbOjgiijijjjkjljljljmjneJfYdAjpjpjqjqjqjqjqjqjqjqjrjqjqjqjsjtjujqdzjqjvjwjxjyjzjAjBjCjDjEjFjEjGjHcpjIjJjKjLjMjLbUamamamamamamamamamamamamamamamamameYeYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaagAbJdRdSjNbqbqbOjObxbxbxjkjljljljljmjPikfjingafXfXfXfXfXfXfXfXfXfXfXfXfXfXgafXikiphpjTjQcpjRjWjXjYcpcpjZhththtkacpcpcpkbkckdkeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXeXkfkfkgkgkfkfkfkfkikjkkkkkkklkmkniGbxjkjlkojljlkpkqfXfjfXkrksksktkuksksksksksksksktkskskvkskskvkwkxkykzkAkBkCkDkEkFkFkFjUkHkIcpcpcpkJkckKkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamkfkMkNkNkOkPkQkfkRkSkTkTkUkVkWiijikXkYkZlalblcldeJfXfjfXbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxgogogogogogobUbUgvgwbUbUlebUbUbUbUbUlflgesbUlhlibUbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakgkgkglklllmlmlnlolplqlrbNcfbxbxbxbxbxbxbxbxbxbxbxbxbxlsfjfXbxcTcUcUcUcUcUcUcUcUcUcUltlulvgolwlwlwlxlycplzlAlBjVlDgRlElFlGlHgtgwbUbUbUamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaahaUaOayayayaVaWaXaXaYaZahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamamaaamaaaaamamaaaaaaaaahahbaaybbbcbdbebfaybgahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaambhbibjbjbkbkamamamamaaaaaaamahblahahbobIbCahahbpahamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqbrbsbsbtbubvbvbwbvbvaaaabxbybxbzbAbBbDbPbEahbFbGbxbybxamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqbHbqbQbqbQbqbJbqbKbqaabLbMbNbMbObNahbRchcgahbSbTbMbNbMbLamaaaaaaaaaaaaaaaaaaaaaaaabUbUbUbUbUbUbVbWbUbUbUbUbUbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqbXbYbZcabYcbccbqcdceamambxbxbxbOcfahboelbCahcibTbxbxcjckckckckaaaaaaaaaaaaaaaaaaaabUclcmcmcncocpcpcrcqcscscsbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqctbQcubQcvbQcwbqbKbqbxbxbxcxbNbObNbxcyczcAbxbSbTbNcBcjcCcDcEckckckckckaaaaaaaaaaambUcFcGcscHcIcpcpcJcKcscscLbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaambqcMcNcOcOcPcOcQcRcSbqbNbNbNcTcUcVcUcWcXcYcZcWdadbcUdccjdddedfdgdhdidjckamamamamamambUcscscscndkcpcpdmdlcmcmdobUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamambqdpcScScScScSdqcScSdsbNdtdudvdwdxdydwdzdAdBdCdDdEcjcjcjdFdedGdHdedIdJckaaaaaaaaaaambUbUbUbUdKbUdLdMbUbUbUbUbUbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamamamamambqdNcSdOcScSdPcSdOdQbqbqbqdRdSdTdUdVdWdXdYdZdrdnebeaeeefdeegeheiejekeHckaaaaaaaaaaaabUclcmcmecencpcpeoepeqeresetaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeuamamamamamamambqevewexeyezezezeAeBeCeDeEeFeGbQeIeJeKeLeMeNeOedemeReSeSeSeTeUckckckckckaaaaaaaaaaambUcFcGcsePcIcpcpcpcpcpcpcpeWamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXamaaaaaaaaaaambJeZfafbfccScScSfdfebqffcSfbfgbQeIeJeKeLfjfkeQdneVeafndedefofpfhfrfickamamamamamamambUcscscsecflcpcpcpcpfvcpcpfwamamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaabqfxcSfyfzfAfAfAfAfBfCfDfAfEfFfGfHfIfJeLfqfLcjfKfMckdededefofOfmdefQckamaaaaaaaaaaambUbUbUbUbUbUcpcpfSfRfTfUbUbUbUbUbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaabqcScSfbfccScScScScSftcScSfafNbQfXfXfXfYfZgacjgbgcgdgegfggghgifWgegjcjckckckckntntntgogpgqgrgsbUgtfugvbUbUgwbUgxfPgzbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaagAgBcSfbfccScSgCcScSftcScScScSfVfXfXfXeLfjgacjgEgFgFgGgHgIdegkckckckcjgKgLgMckgNgOgPgogucpcpcpcpcpcpgSgTgUgVbUgWgXgYbUamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaagZhacShbgDgybqbqbqbqbqbqbqbqbqbqbxbxbxeLfjhecjcjhfdehghhhigFhjfhfrfscjhlhmhnckhofXhpgRgQcpcpcphshthuhvhththwbUhxhdhxbUbUamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaabQhAcSfbfccSbqbNbNbNbNbNbNbNbNbNbNbxhBeLfjgahCcjhDhEhFdehGgehHhqdehJcjhKhLhMckhNfXhOgohrhQhRhShThUhVhWcpcphXbUcpiBhQiabUamamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaabQcScShbhyicbqbNbxbxbxbxbxbxbxbxidbxieeLfjgaifcjigihglijgmilimfWgegjcjgniogJckiqfXfXgoirhQisitiuivkIixiyiziAbUcpiBiCbUbUbUbUbUamamamamamamamamamamamamamamamamameYeYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaabQgBcSfbfccSbqiEdwiFiGbxiHiIiJiKiLbxbxiMiNiOiPcjcjcjcjcjcjcjcjcjcjcjcjhkhzibckiTfXiUgobUbUbUbUbUgvhIbUbUbUbUbUcpiWcpiXbUiYiZjabLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLhPiDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaxJgZhaewjehchYbqbOjgiijijjjkjljljljmjneJfYdAjpjpjqjqjqjqjqjqjqjqjrjqjqjqjsjtjujqdzjqjvjwhZjyjzjAiwjCjDjEjFjEjGjHcpjIjJjKjLjMjLbUamamamamamamamamamamamamamamamamameYeYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaagAbJdRdSjNbqbqbOjObxbxbxjkjljljljljmjPikfjingafXfXfXfXfXfXfXfXfXfXfXfXfXfXgafXikiphpiViRcpjRjfjbjYcpcpjZhththtkacpcpcpkbkckdkeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXeXkfkfkgkgkfkfkfkfkikjkkkkkkklkmkniGbxjkjlkojljlkpkqfXfjfXkrksksktkuksksksksksksksktkskskvkskskvkwkxjxkzkAkBjBkDkEkFkFkFjUkHkIcpcpcpkJkckKkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamkfkMkNkNkOkPkQkfkRkSkTkTkUkVkWiijikXkYkZlalblcldeJfXfjfXbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxgogogogogogobUbUgvgwbUbUjQbUbUbUbUbUlflgesbUlhlibUbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakgkgkglklllmlmlnlolplqlrbNcfbxbxbxbxbxbxbxbxbxbxbxbxbxlsfjfXbxcTcUcUcUcUcUcUcUcUcUcUltlulvgolwlwlwlxlycplzlAlBjVlDcplElFlGlHgtgwbUbUbUamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxKlIlJlIlklKlKlKlLlMlNdxlOkklPbxiQiQbxlRlSlTlUlVlWbNcTlXlYlZlYlXmambmbmbmbmbmbmbmbmbbNbSbNmcgomdmememflycpcpmghXcpcpcpcpkGmilCmjmhmlmkmoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakgkgkglklKlKlKmpmqkfmrlJlJmskkklmtmumvmwntmxntmybNmzbxfXfXfXbxbSmbmAmBmCmDmEmCmFmbmGmHcUmIgomemememflycpcpmgcpcpmJmKmLcpcphQmMmNmOmPmoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamkfmQlKlKmRmSmTmUmVmWlJbNbNbNbNbNbNbNmvmwmXbNcTmYbxfXfXfXbxbSmbmZnanbnbnbiSndmbnenfbNnggogogogogogonhninjnkmmncmnncnlnpnmmjnnmlnomoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamkgnulKlKnvmpnwkfnxnynznAnAnAnAnAnBnCnDdtbNnEbSnFbxfXfXfXbxbSmbnGnHnInbnJnKnLmbnMnNcUnOnPnQnRnSnTgogogonUkxkxkxkxkxkxkxkxkxnVgogogoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamkfmQlKlKnvmpnWkfnXnYnZnAjhobocodoejojobxogbNohoibxfXfXfXbxbSmbojoknbnbnbolommbonbNbNoonPopnqorororosotouovowoxoyozoAnPoBoCoDoEoFoGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakgkgkglklKlKnvmpmqkfkfkfkfnAoHoIoJoKoebxbxbxbNbNbSoLbxfXfXoMbxbSmbmboNjSoPkhoRmbmbbxbNbNlRoSoTnroVoVoVoWoXoYoVoVoVoZpapbnPpcpdpepfpgphaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalIlJlIlklKlKnvmpmqpipjpkplnAlQpnpopppqbNcTprprprmYbNbxfXfXpsbxnNptpuoNpvpwnsoRpypzbxbNbNpAnPpBpfpCpfpfpDpEpFpGpGpGpDpHoroupIpJpKpfpfnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakgkgkglkoapMpNpOpPpQpRpkpSnApTpUpVpWoebNbSbNdtlvlucxbxfXfXpXbxbNbNcxpYpZqaqbqcqdqebxbNbxbxnPnPnPnPqfqgqhqinPqjqjqkqlqmqnqoqpoZqqpfqrnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamkfqsqtlKnvmpmqququpkqvnAnAoeqwnAoebxqxbxbxbxbxbxbxfXfXfXbxbxbxbxmbofqzoOmbqBbxbxidbxoQqDqEhCnPqFnPqGqHnPqIqJnPqKpaqLqMqNqOoqpfpfoGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamkfkfkflKnvmpqQpMpMpMpMqRpMqSpOpMqTksqUfXqVfXqWqXlYlYlYlYlYlYqYlYlYqZrarbrcrdrejqjqjrjqrfjqjqjqjqrgrhrirjrkrlrmrnpHronPrprqrrrsrtphaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamameXrurvrwrxryrzrArBlmlmlmrDlmlmrErFcXcXcXrGfXfXpmfXipfXfXfXfXfXeLfXgafXfXfXfXfXfXfXfXfXfXfXfXrIpDpfrJrKpfrLrnparMnPnPnPnPnPnPnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamkfkfkflKrNrOrPrQrRrSrTrClKlKlKlKlKeLgafXfXrVfjfXfXeLfXgafXfXfXfXfXeLfXrWksksksksktksksrXkskskskurYrZpfsasbscrmsdqmoUnPsfsgshsisjnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakgsksllKlKmpmqlKlKlKlKnvsmsnsnsnsospsqsrsrsrqxbxbxiMssstsusvswsususxpxszsususususufXpLsBfXfXbxbxsCsDsDnPnPnPnPsEpHsGsHsIsJsKsLpfoGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakflKlKlKlKqyqAsOlKlKlKnvsrsrljljsRsSsTsUsVsWsXsYdwsZfXgasutatbtctdtetftgthsutitjsusseJtltmeJbxamnPrmtnnPtoqPtqtrpatsttrHpftvtwpfphaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakgtykglklKlKtAkgtykgkftBtCtDtEtFtGtHtItJtKtLtMtNtNtOkssBpxtdtQtRtStTtdtUtVtWsetYsufXfXfXfXtZbxaanPuaubucpaudueufoXugnPnPnPnPnPnPnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakglJkgujukulumkglJkgkfkfsrunuounupuqurusutsruubxuvfXfXfXpxtdtTuxtdtTtdtUtVuyuzuAsufXuBuCuDfXntaanPuEpfpfpauFrmuGpauHuItpuKuLpfuMoGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasyuOsykgkgkgkgsyuOsyamamsruSuTuntuununtXuWsruubxuXfXfXfXpxtdtTuYtdtTtdtUtVuZuzvasulsvbvbvbvcbxaanPvdpfpfvevfvgvhvivjsHvkpfvlpfpfphaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajcvmjdvmvmsPsPvmvmvqvpvramsrsrvtsrsrvuvvsrsqsruubxbxfXfXfXpxtdvxtRtStTtdvyvzvAvBvCvDfXuBuCuDvEntaanPvFvGvHvIvJqovKvLvMnPvNvOvPvQvRnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajcvpvmvsvSvSvUvTvWvVvXvUvSvYvZambxbNbSwbwcsrsrsrbGwduubNbxfXfXfXsuwewfwgwhwiwjwktVwlwmvCwnfXvbvbvbwobxamnPqIwpwpwqnPnPwrwswtnPnPnPnPnPnPnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavYwawvwuvSwwvSwwvSwwvSwwvSwxvZambxbNbSbNbxwAwBwCwDwEwFlPbxfXfXfXsusuwGsususuwHwIsuwJsuwKsufXwLwMwNwObxaaaaaaaaamamnPwPwQwRwSwTnPamamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasQvSvSvqvSwwvSwwwzwwvSwwvSwxvZambxbNbSbNbxbNwWwXwYwZnDbObxfXfXiUsuxaxbxcxdxexfxgxhxixjxksuidbxbxbxbxbxaaaaaaaaaaamxlxmuJpfuUxpxlamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakgkgkglklKlKnvmpmqkfkfkfkfnAoHoIoJoKoebxbxbxbNbNbSoLbxfXfXoMbxbSmbmboNjSoPkhoRmbmbbxbNbNlRoSrInroVoVoVoWoXoYoVoVoVoZpapbnPpcpdpepfpgphaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalIlJlIlklKlKnvmpmqpipjpkplnAlQpnpojTpqbNcTprprprmYbNbxfXfXpsbxnNptpuoNpvpwnsoRpypzbxbNbNpAnPpBpfpCpfpfpDpEpFpGpGpGpDpHoroupIpJpKpfpfnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakgkgkglkoapMpNpOpPpQpRpkpSnApTpUpopWoebNbSbNdtlvlucxbxfXfXpXbxbNbNcxpYjWpwjXqcqdqebxbNbxbxnPnPnPnPqfqgkykCnPleleqkqlqmqaqoqnoZqqpfqrnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamkfqsqtlKnvmpmqqpqppkqvnAnAoeoTnAoebxqxbxbxbxbxbxbxfXfXfXbxbxbxbxmbofppoOmbqBbxbxidbxoQqDqEhCnPqFnPpVpZnPqIqJnPqKpaquqbqNqOoqpfpfoGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamkfkfkflKnvmpqQpMpMpMpMqRpMqSpOpMqTksqUfXqVfXqWqXlYlYlYlYlYlYqYlYlYqZrarbrcrdrejqjqjrjqrfjqjqjqjqrgrhrirjrkrlrmpDpHronPrprqrrrsrtphaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamameXrurvrwrxryrzrArBlmlmlmrDlmlmrErFcXcXcXrGfXfXpmfXipfXfXfXfXfXeLfXgafXfXfXfXfXfXfXfXfXfXfXfXrIpDpfrJrKpfqhpDparMnPnPnPnPnPnPnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamkfkfkflKrNrOrPrQrRrSrTrClKlKlKlKlKeLgafXfXrVfjfXfXeLfXgafXfXfXfXfXeLfXrWksksksksktksksrXkskskskurYrZpfsasbscrmqlqmoUnPsfsgshsisjnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakgsksllKlKmpmqlKlKlKlKnvsmsnsnsnsospsqsrsrsrqxbxbxiMssstsusvswsusuqipxqjsususususufXpLsBfXfXbxbxsCqwqwnPnPnPnPsEpHsGsHsIsJsKsLpfoGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakflKlKlKlKqyqAsOlKlKlKnvsrsrljljsRsSsTsUsVsWsXsYdwsZfXgasutatbtctdtTtdtUthsutitjsusseJtltmeJbxamnPrmqznPtoqPtqtrpaqGqHrHpftvtwpfphaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakgtykglklKlKtAkgtykgkftBqMqLtEtFtGtHtItJtKtLtMtNtNtOkssBpxtdtQtRtStTtdtUtVtWsetYsufXfXfXfXtZbxaanPuaubucpaudrLrnoXugnPnPnPnPnPnPnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakglJkgujukulumkglJkgkfkfsrunuounupuqurusutsruubxuvfXfXfXpxtdtTuxtdtTtdtUtVuyuzuAsufXuBuCuDfXntaanPuEpfsdpauFrmsxpaszsDtpuKuLpfuMoGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasyuOsykgkgkgkgsyuOsyamamsruSuountuununtXuWsruubxuXfXfXfXpxtdtTuYtdtTtdtUtVuZuzvasulsvbvbvbvcbxaanPvdpfpfvevftftevivjsHvkpfvlpfpfphaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajcvmjdvmvmsPsPvmvmvqvpvramsrsrvtsrsrvuvvsrsqsruubxbxfXfXfXpxtdvxtRtStTtdvyvzvAvBvCvDfXuBuCuDvEntaanPvFvGvHvIvJqotgoVtnnPvNvOvPvQvRnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajcvpvmvsvSvSvUvTvWvVvXvUvSvYvZambxbNbSwbwcsrsrsrbGwduubNbxfXfXfXsuwewfwgwhwiwjwktVwlwmvCwnfXvbvbvbwobxamnPqIwpwpwqnPnPwrtswtnPnPnPnPnPnPnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavYwawvwuvSwwvSwwvSwwvSwwvSwxvZambxbNbSbNbxwAwBwCwDwEwFlPbxfXfXfXsusuwGsususuttwIsuwJsutCsufXwLwMwNwObxaaaaaaaaamamnPwPwQwRwStDnPamamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasQvSvSvqvSwwvSwwwzwwvSwwvSwxvZambxbNbSbNbxbNwWwXwYwZnDbObxfXfXiUsuxaxbueufxeuGxgxhxixjuHsuidbxbxbxbxbxaaaaaaaaaaamxlxmuJpfuUxpxlamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavYwUwvwuvSwwvSwwvSwwvSwwvSwxvZambxbNbSbNbxbNxrxsqCxsbTxubxfXfXfXsuxvxwxxxyxzxAxBxCxDxExFsubNbxamamaaaaaaaaaaaaaaaanPxGpfpfpfxHnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxqwVvmvsvSvSvSvSvSvSvSvSvSvYvZambxcxnNprprprxLbxxMbxbTbObxxNfXxOsuuVsAxRwIxSsMxUxVxWsNxYsubNbxbxbxamaaaaaaaaaaaaaanPnPxZyaybnPnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxqwVvmvsvSvSvSvSvSvSvSvSvSvYvZambxcxnNprprprxLbxxMbxbTbObxxNfXxOsuuVsAxRwIxSsMxUxVxWsNuHsubNbxbxbxamaaaaaaaaaaaaaanPnPxZyaybnPnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxqvmvmvmvmvmvmvmvmvmwVxIambxyddtmGbNbNxrbxvobxyfygtNksksksyhyiyjykylsusususususuymsubNbMbNbMbLamamamamamamamamnPqIwpwqnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabxbybxbxbxbxbxbNxrbxbxbxbNmsynyojqypyqyrysytpryuyvbNmubNbNbNbNbNbxbybxamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaambxbNbMcTprprywpryxprprprprpryylYlYlYyzmYyAyAyAyAyAyAyAyAyAyAyAbxbxamamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamGObMbNyByCyAyAyAyAyAyAyAyAyAyAyDyEfXyFyGyAyAyHyHyIyIyJyJyKyLyMyBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaameXeXyByNyOyPyRyQySyTyUyVyWyAyXikfXinyYyAyZyHyHyIyIyJyJyKzazbyByBamamzczczdzdzcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamuIbMbNyByCyAyAyAyAyAyAyAyAyAyAyDyEfXyFyGyAyAyHyHyIyIyJyJyKyLuTyBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaameXeXyBvgyOyPyRyQySyTyUyVyWyAyXikfXinyYyAyZyHyHyIyIyJyJyKzazbyByBamamzczczdzdzcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamtkzazfzazgzgzgzazavwziyAzjfXfXfXzkyAyZyHyHyIyIyJyJzlzazmzntkaaaazczozozozcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatkzazqzrzsztztzrzazuzvzwzxzyzzzAzByAzCzDzDzEzEzFzFzGzHzIzJtxzLzLtzwyzOzPzcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatkzazqzazRzSzSzTzTzUzazVzWzXzYzXzZAaAbAcAcAcAcAcAcAdAezmzntkaaaazczozozozcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayBzaAfAbAbAgzazazazszaAhAiAjAkxnAmAnzavwzazrzazrzazqzfzmyByBamamzczczczczcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayBAoApAqArAsAbAbAbAtAbAuAvAezaAwAxAyAzAAABACAzADAEAFAGAoyBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatkzazqzazRzSzSzTzTzUzazVzWzXvhzXzZvKAbAcAcAcAcAcAcAdAezmzntkaaaazczozozozcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayBzaAfAbAbAgzazazazszaAhAivLAVvMAmwszavwzazrzazrzazqzfzmyByBamamzczczczczcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayBAoAoApArAsAbAbwHAtAbAbwKAezaAwwTAzAzAAABACAzADAEAFAGAoyBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayByByByByBzqzayByBAHyByByBAIzaAJyByByBAKyByBzaALyByByByByBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaayBzqAMyBANAOAPAQyBtktktkyBAUzaAVAWyBAXALyBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaayBzqAMyBAWAOAPAUyBtktktkyBAUzaAVAWyBAXALyBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamamamyBzqAYyBzazRAZAZAZAZBazayMzazazazayBAIALyBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaayBtkyBBcBdtkzazazaBextxoBhxPxQBkzazazatkBlBmyBtkyBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaatkBozazqBptkzazfzaBqxTBsBtBuxXBwzavwzatkBxALByBztkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaatkBozazqBptkzazqzaBAyeycBDzezhBGzaALzatkBxALzaBHtkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaayBtkyBxcxdtkxfzazaBextxoBhxPxQBkzazaxktkxYxnyBtkyBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaatkBozazqBptkAnzfzaBqxTBsBtBuxXBwzavwAqtkBxALByBztkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaatkBozazqBptkyNzqzaBAyeycBDzezhBGzaALxktkBxALzaBHtkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaatkBozaAsAbBIBIBJBKBLzKzpBOzMzNBRzaBSBTBTAzBUBVBWtkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaayBtkyBzqzaBXyByByByBzQzQAKAlAlyByByByBCczaALyBtPyBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamamamyBCezfzazayLzaCfzKzpAVzMzNCgzazazazavwChyBCiCjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaayBAfCkAbAbAgzaCfzKzpBOzMzNCgzaClAzAzCmCnyBCoCpCqCqCqCrCqCqCqCqCsCjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamaaaaaayBCtCuCvyBAiyByBzQzQCwAlAlyByBAmyBCxCyCzyBamamamamamamamamamamCoCAamaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamamamyBCezfzazayLzazYzKzpAVzMzNzYzazazazavwChyBCiCjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaayBAfCkAbAbAgzazYzKzpBOzMzNzYzaClAzAzCmCnyBCoCpCqCqCqCrCqCqCqCqCsCjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamaaaaaayBCtCuCvyBAiyByBzQzQAaAlAlyByBAmyBCxCyCzyBamamamamamamamamamamCoCAamaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayByByByByByByByByByBARATASyeBbAVBfzhBgBjBiCJyByByByByByByByByBaaaaaaaaaaamCKamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayBCLCMCNCNCNCNCMCOyBzaCPCQCRCSzaCTCRCQCUCVyBCWCXCYCZCYCYCXDayBaaaaaaaaaaaaDbamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaayBDcCLCOCLCOCLCODdDsBnBvBrBBzpzazMBEBCBMBFDnDoDpDaDpDaDpDaDqDraaaaaaaaaaaaDbamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayBDcDcDcDcDcDcDcCLDsBNBPBPBPBQDwBYBZBZBZCaDnCYDoDqDqDqDqDqDqDraaaaaaaaaaaaDbamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayBDcDcDcDcDcDcDcDcyBCbCdCdCdCBCDCCCdCEDGCFCHCGCIDqDqDqDqDqDqDraaaaaaaaaaaaDbamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayBDdDLDdDLDdDLDdDLyBDeDfDeDeDgDPDhDiDSDTDUyBDjCIDWDoDWDoDWDoyBaaaaaaaaaaamDXamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayBDYDYDYDYDYDYDYDYyByByByByByByByByByByByBCJyByByByByByByByByBamamamamamamDZamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayBAjAjAjAjAjAjAjAjyByByByByByByByByByByByBCJyByByByByByByByByBamamamamamamDZamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamDXamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDbamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDbamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamamamamamamamamamamamEaEaEaEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDbamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamambLEaEbEaEaEaEaEaEaEaEaEaEcEdEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDbamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamambLEaEbEaEaEaEaEaEaEaEaEaEcAkEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEeEfamamamamamamamamamamamamamamamamamamamambLbLEgEhEgEhEhEhEhEhEiEjEkElEmuhEoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEpEqCqErCqCqCqCqCqCqErCqCqCqCqErEsEtEfamEaEaEaEaEaEaEaEuEvEwEwEwExEyEzEAEdEaamamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEpEqCqErCqCqCqCqCqCqErCqCqCqCqErEsEtEfamEaEaEaEaEaEaEaEuEvEwEwEwExEyEzEAAkEaamamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamCoEBEfuiEhEhEDEhEhEhEhEEEFEGEGEHEIEhEJEJEJEJEJEJEJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamCoCAuiEhEhEvEwEwEwEwELEMDkEOEPEIEhEJEQERESETEQEJamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamEauwEaEhEhEEsFrUGPEWEaEYEZFaFbFcFdEJFeFfEQFfFgEJamamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/MiniStation/z2.dmm b/_maps/map_files/MiniStation/z2.dmm
index e0d9426e684..c4597d370c7 100644
--- a/_maps/map_files/MiniStation/z2.dmm
+++ b/_maps/map_files/MiniStation/z2.dmm
@@ -433,7 +433,7 @@
"iq" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel/bar,/area/syndicate_mothership)
"ir" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel/bar,/area/syndicate_mothership)
"is" = (/turf/indestructible/fakeglass{icon_state = "fakewindows2"; dir = 6},/area/syndicate_mothership)
-"it" = (/obj/machinery/vending/cigarette{products = list(/obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate = 7, /obj/item/weapon/storage/fancy/cigarettes/cigpack_uplift = 3, /obj/item/weapon/storage/fancy/cigarettes/cigpack_robust = 2, /obj/item/weapon/storage/fancy/cigarettes/cigpack_carp = 3, /obj/item/weapon/storage/fancy/cigarettes/cigpack_midori = 1, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/lighter/greyscale = 4, /obj/item/weapon/storage/fancy/rollingpapers = 5)},/turf/simulated/floor/plasteel/bar,/area/syndicate_mothership)
+"it" = (/obj/machinery/vending/cigarette{products = list(/obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate = 7, /obj/item/weapon/storage/fancy/cigarettes/cigpack_uplift = 3, /obj/item/weapon/storage/fancy/cigarettes/cigpack_robust = 2, /obj/item/weapon/storage/fancy/cigarettes/cigpack_carp = 3, /obj/item/weapon/storage/fancy/cigarettes/cigpack_midori = 1, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/lighter/random = 4, /obj/item/weapon/storage/fancy/rollingpapers = 5)},/turf/simulated/floor/plasteel/bar,/area/syndicate_mothership)
"iu" = (/obj/structure/stool/bed/chair/comfy/teal,/turf/simulated/floor/plasteel/grimy,/area/syndicate_mothership)
"iv" = (/obj/item/device/paicard,/turf/simulated/floor/plasteel/grimy,/area/syndicate_mothership)
"iw" = (/obj/structure/bookcase,/obj/item/weapon/book/manual/wiki/engineering_hacking,/obj/item/weapon/book/manual/robotics_cyborgs,/obj/item/weapon/book/manual/engineering_singularity_safety,/obj/item/weapon/book/manual/detective,/turf/simulated/floor/plasteel/grimy,/area/syndicate_mothership)
diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
index 008423851a3..59d6f4c1cd4 100644
--- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm
+++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
@@ -104,7 +104,7 @@
"abZ" = (/obj/machinery/newscaster/security_unit{pixel_x = -30; pixel_y = 0},/obj/machinery/camera{c_tag = "Head of Security's Office"; dir = 4; network = list("SS13")},/obj/machinery/recharger{pixel_y = 4},/obj/structure/table/wood,/turf/simulated/floor/fancy/carpet,/area/security/hos)
"aca" = (/obj/structure/stool/bed/chair/comfy/black,/turf/simulated/floor/fancy/carpet,/area/security/hos)
"acb" = (/turf/simulated/floor/fancy/carpet,/area/security/hos)
-"acc" = (/obj/machinery/keycard_auth{pixel_x = 24; pixel_y = 10},/obj/machinery/hologram/holopad,/turf/simulated/floor/fancy/carpet,/area/security/hos)
+"acc" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/fancy/carpet,/area/security/hos)
"acd" = (/obj/structure/sign/securearea{pixel_y = -32},/obj/structure/lattice/catwalk,/turf/space,/area/space)
"ace" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/lattice/catwalk,/turf/space,/area/solar/auxstarboard)
"acf" = (/obj/structure/lattice,/obj/item/stack/cable_coil/random,/turf/space,/area/space)
@@ -351,8 +351,8 @@
"agM" = (/obj/structure/disposalpipe/sortjunction{dir = 4; icon_state = "pipe-j2s"; sortType = 7},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main)
"agN" = (/obj/structure/disposalpipe/sortjunction{dir = 4; icon_state = "pipe-j2s"; sortType = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/security/main)
"agO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/security/main)
-"agP" = (/turf/simulated/wall,/area/shuttle/pod_3)
-"agQ" = (/turf/space,/turf/simulated/wall/shuttle{dir = 2; icon_state = "swall_f10"; layer = 2},/area/space)
+"agP" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/simulated/floor/plating,/area/shuttle/pod_3)
+"agQ" = (/turf/space,/turf/simulated/wall/shuttle{icon_state = "swall_f9"; dir = 2},/area/shuttle/pod_3)
"agR" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Security Delivery"; req_access_txt = "1"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/security/main)
"agS" = (/obj/machinery/recharger,/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/main)
"agT" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
@@ -381,7 +381,7 @@
"ahq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plasteel,/area/security/main)
"ahr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/security/main)
"ahs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/security/main)
-"aht" = (/obj/machinery/door/airlock/external{name = "Escape Pod Three"; req_access_txt = "63"},/turf/simulated/floor/plating,/area/shuttle/pod_3)
+"aht" = (/turf/space,/turf/simulated/wall/shuttle{dir = 2; icon_state = "swall_f10"; layer = 2},/area/shuttle/pod_3)
"ahu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/security/main)
"ahv" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/security/main)
"ahw" = (/obj/machinery/power/apc{dir = 4; name = "Security Office APC"; pixel_x = 24; pixel_y = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main)
@@ -403,8 +403,8 @@
"ahM" = (/obj/structure/grille,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/security/warden)
"ahN" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/main)
"ahO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (NORTH)"; dir = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/main)
-"ahP" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/simulated/floor/plating,/area/space)
-"ahQ" = (/turf/space,/turf/simulated/wall/shuttle{icon_state = "swall_f9"; dir = 2},/area/space)
+"ahP" = (/obj/machinery/keycard_auth{pixel_x = 24; pixel_y = 10},/obj/machinery/computer/card/minor/hos,/turf/simulated/floor/fancy/carpet,/area/security/hos)
+"ahQ" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/hor)
"ahR" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/main)
"ahS" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/main)
"ahT" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-y"; dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/security/main)
@@ -3321,7 +3321,7 @@
"blS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
"blT" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/assembly/chargebay)
"blU" = (/obj/structure/table,/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/stack/cable_coil,/obj/item/device/flash/handheld,/obj/item/device/flash/handheld,/turf/simulated/floor/plasteel,/area/assembly/robotics)
-"blV" = (/obj/structure/stool,/turf/simulated/floor/plasteel,/area/assembly/robotics)
+"blV" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Roboticist"},/turf/simulated/floor/plasteel,/area/assembly/robotics)
"blW" = (/turf/simulated/floor/plasteel{icon_state = "bot"},/area/assembly/robotics)
"blX" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/assembly/robotics)
"blY" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
@@ -3903,7 +3903,7 @@
"bxc" = (/obj/structure/stool/bed/chair/office/light{dir = 8},/obj/effect/landmark/start{name = "Research Director"},/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/hor)
"bxd" = (/obj/machinery/computer/robotics,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/hor)
"bxe" = (/obj/structure/rack,/obj/item/device/aicard,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/crew_quarters/hor)
-"bxf" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/hor)
+"bxf" = (/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/obj/machinery/light,/obj/machinery/computer/card/minor/rd,/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/hor)
"bxg" = (/obj/structure/lamarr,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"},/area/crew_quarters/hor)
"bxh" = (/turf/simulated/wall/r_wall,/area/crew_quarters/hor)
"bxi" = (/turf/simulated/wall,/area/toxins/explab)
@@ -4096,7 +4096,7 @@
"bAN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"bAO" = (/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"bAP" = (/obj/machinery/power/apc{dir = 8; name = "RD Office APC"; pixel_x = -25},/obj/structure/cable,/obj/machinery/light_switch{pixel_y = -23},/obj/structure/flora/kirbyplants/dead,/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/hor)
-"bAQ" = (/obj/machinery/hologram/holopad,/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/hor)
+"bAQ" = (/obj/machinery/computer/card/minor/cmo,/turf/simulated/floor/plasteel{icon_state = "barber"},/area/medical/cmo)
"bAR" = (/obj/structure/table,/obj/item/weapon/cartridge/signal/toxins,/obj/item/weapon/cartridge/signal/toxins{pixel_x = -4; pixel_y = 2},/obj/item/weapon/cartridge/signal/toxins{pixel_x = 4; pixel_y = 6},/obj/machinery/camera{c_tag = "Research Director's Office"; dir = 1; network = list("SS13","RD")},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/hor)
"bAS" = (/obj/structure/closet/secure_closet/RD,/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/hor)
"bAT" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/hor)
@@ -5653,7 +5653,7 @@
"ceK" = (/turf/simulated/wall/r_wall,/area/engine/engineering)
"ceL" = (/obj/machinery/computer/atmos_alert,/obj/machinery/requests_console{announcementConsole = 1; department = "Chief Engineer's Desk"; departmentType = 3; name = "Chief Engineer RC"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ceM" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
-"ceN" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/lighter,/obj/item/clothing/glasses/meson{pixel_y = 4},/obj/item/weapon/stamp/ce,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"ceN" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/lighter,/obj/item/clothing/glasses/meson{pixel_y = 4},/obj/item/weapon/stamp/ce,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ceO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ceP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ceQ" = (/obj/structure/grille,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/engine/chiefs_office)
@@ -5772,7 +5772,7 @@
"cgZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"cha" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sign/nosmoking_2{pixel_y = 32},/obj/machinery/camera{c_tag = "Engineering Power Storage"},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
"chb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"chc" = (/obj/structure/filingcabinet/chestdrawer,/obj/machinery/camera{c_tag = "Chief Engineer's Office"; dir = 4; network = list("SS13")},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/mob/living/simple_animal/parrot/Poly,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"chc" = (/obj/machinery/camera{c_tag = "Chief Engineer's Office"; dir = 4; network = list("SS13")},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/computer/card/minor/ce,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"chd" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"che" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/weapon/storage/fancy/cigarettes,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"chf" = (/turf/simulated/floor/engine,/area/toxins/explab)
@@ -6428,7 +6428,7 @@
"ctF" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (EAST)"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior)
"ctG" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{tag = "icon-darkbluecorners (WEST)"; icon_state = "darkbluecorners"; dir = 8},/area/turret_protected/aisat_interior)
"ctH" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/engine/engineering)
-"ctI" = (/obj/structure/table/reinforced,/obj/item/stack/medical/bruise_pack{pixel_x = -3; pixel_y = 2},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"ctI" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/structure/filingcabinet/chestdrawer,/mob/living/simple_animal/parrot/Poly,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ctJ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel{tag = "icon-darkbluecorners"; icon_state = "darkbluecorners"; temperature = 273.15},/area/turret_protected/aisat_interior)
"ctK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (WEST)"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior)
"ctL" = (/obj/machinery/door/airlock/shuttle{name = "Mining Shuttle Airlock"; req_access_txt = "48"},/obj/docking_port/mobile{dir = 8; dwidth = 3; height = 5; id = "mining"; name = "mining shuttle"; travelDir = 90; width = 7},/obj/docking_port/stationary{dir = 8; dwidth = 3; height = 5; id = "mining_home"; name = "mining shuttle bay"; width = 7},/turf/simulated/floor/plating,/area/shuttle/labor)
@@ -6578,13 +6578,13 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaaZaasaasaasaaKabaabbaasaasabcabdaaiaaiaaiaafaaaaaaaaaaaaaaaaafaaaaaVaaaaaaaaaaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeabeabeabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaOaaWaaNaaXabiaasabjaasaasaasaasaasaasaauaasabkablaaiaafaafaafaafaafaafaafaafabmabmabmabnabmabmaboaboabpabpabpaboaboaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgaaYabraaPabsabuaasaasabvabwabxaasabyabzabAaasabBabCaaiaafaaaaafaafaafaafaaaaafabnabDabEaeIabFabGaboabHabIabJabKabLaboaaaaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafabMaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaabfabfabeabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgabNabPabOabsabSabTabSabSabSabUabSabSabSabVabSabSabWaaiactactactactactactactactabmabXabEaeIabYabDaboabZacaacbacbaccaboaaaaafacdaagaagaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfaafaafaaaaceaaaacfaafabfabfabfabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaabfabfabeabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgabNabPabOabsabSabTabSabSabSabUabSabSabSabVabSabSabWaaiactactactactactactactactabmabXabEaeIabYabDaboabZacaacbaccahPaboaaaaafacdaagaagaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfaafaafaaaaceaaaacfaafabfabfabfabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgabQacgabRabsackaasaclabSacmacnacoabSacpacqacrabSacsaaiacMacNacOacOacPacQacRacSactacuabEaeIaecabDabpacwacxacyacbaczaboaaaaafacAacBacAaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaafaaaaafaaaaaaaceaaaaaaaafaaaaafaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafacCaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaciacDacjacEacHaasacIabSacJacnacIabSacKacqacIabSacLaaiacMadkadladladladladmadnactacTabEaeIaecabDabpacUacVacWacbacXaboaafaafacAacYacAaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafacZacZacZacZacZaaaadaaaaacZacZacZacZacZaafabfaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadbadbadbadbaafaafaaaadcaaaaafaafabfabfabfabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafhaaHaaHaaHacFaddacGabsadfadgadhabSadfadiadhabSadfadjadhabSabSaaiafnaRFaNFadVaNFadWbhdbiGactadoabEaeIaecabDaboadpadqadradsadtaboabnabmadvacBacAacAachaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaadwadxadxadxadxadyadzadAadBadBadBadBadCaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaafaaaaafaaaaaaadcaaaaaaaafaaaaafaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHabhadeadDadGadFadIadHadKadJadMadLadOadNadUadLaepadPadQadRaaiadSadTaNFboSaNFadXadYadZaeaabEabEaebaeTabmaboaedaboaeeaboaefaboaegaehacAaeiagParqanTanTagQaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaemaemaemaemaemaaaadzaaaaemaemaemaemaemaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaenaenaenaenaenaaaaeoaaaaenaenaenaenaenaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHadEaeqaeraeuaetaewaevafiaexavkaifaexaexaexaifaOyaOvaeyaezaaiaeAaeBaeCaeDaeEaeFaeGaeHactahoagSaeJahpabmaeLaeMaeNaeOaePaeQaeNaeRaeSaeVaeUahtamoamIamJahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaaaaafaaaaaaaaaadzaaaaaaaaaaafaaaaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaafaafbafbafbafbafcafdafeaffaffaffaffafgaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaesaOzaRfbfTbfPabSbiEafjafkaflafmbNoafoafpafpafpabSafqafraaiafsaftafuafvafwafxafyafzactacvabnafBafCabmafDafEafFafGafHafIafJafKafLacAafMagPaptanTanTahQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafacZacZacZacZacZaaaadzaaaacZacZacZacZacZaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaafaaaaafaaaaaaadcaaaaaaaafaaaaafaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHabhadeadDadGadFadIadHadKadJadMadLadOadNadUadLaepadPadQadRaaiadSadTaNFboSaNFadXadYadZaeaabEabEaebaeTabmaboaedaboaeeaboaefaboaegaehacAaeiacAarqanTanTahtaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaemaemaemaemaemaaaadzaaaaemaemaemaemaemaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaenaenaenaenaenaaaaeoaaaaenaenaenaenaenaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHadEaeqaeraeuaetaewaevafiaexavkaifaexaexaexaifaOyaOvaeyaezaaiaeAaeBaeCaeDaeEaeFaeGaeHactahoagSaeJahpabmaeLaeMaeNaeOaePaeQaeNaeRaeSaeVaeUaeVamoamIamJagPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaaaaafaaaaaaaaaadzaaaaaaaaaaafaaaaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaafaafbafbafbafbafcafdafeaffaffaffaffafgaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaesaOzaRfbfTbfPabSbiEafjafkaflafmbNoafoafpafpafpabSafqafraaiafsaftafuafvafwafxafyafzactacvabnafBafCabmafDafEafFafGafHafIafJafKafLacAafMacAaptanTanTagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafacZacZacZacZacZaaaadzaaaacZacZacZacZacZaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafafPafPafPafPafPaaaafdaaaafPafPafPafPafPaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaHaaHbaMbOybkdaaHaaiadhafQadfafRafRafRafRafRafRafRafSafTafUafVafWafXafYafZagaagbagcafUagdahSageagfaggaghagiafFagjafHagkaglagmabmadvacAacAacAachaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaadwadxadxadxadxadyadzadAadBadBadBadBadCaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaaaaafaaaaaaaaaafdaaaaaaaaaaafaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaHaaHaaHaaHaaHaaiagnagoagpafRagqagragsagtaguafRagvagwagxagyagzagAagBagaagCagbagDagEagFafFagGagHagIagJagKaeKafAagNagOagLagMagRanUagUacAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaemaemaemaemaemaaaadzaaaaemaemaemaemaemaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaenaenaenaenaenaaaafdaaaaenaenaenaenaenaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaiagVagWagXafRagYagZahaahbahcafRagvahdaheahfahgahhahiahjahjahkahlahmahnaqqaPUaPTahqahrahsahTahVahuahvahWahwabmacAahxacAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaaaaafaaaaaaaaaadzaaaaaaaaaaafaaaaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -6647,15 +6647,15 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnwbkNbkNbsfbjxbjxbjxbiibjxbjxcuWbjxbjxbqAbsgaYpbshbsibjEbsjbskbslbeabaHbaHaZhbmzbsnbqHaHYbpibpjblibsobspbsqbsrbssbliaaaaaaaafbfCbstbsubstbgZaafaaaaaabqVbsvbswbsxbsybszbszbsAbsBbsCaHYaHYbmVbsDbfXbsEbsFbsGbsHbsGbsIbsJbsKbsLbsKbsKbsKbsMbsNbfXbhkbsObsPbsPbsQbsRbosbosbsSbsTbsUbpRboybncbeHbeIbsVbsVbsVbsVbsVbeKbnkbnkbnkbnkbsWbsXbsYbnkbsZbtabtbbtcbtcbtcbtcbtdbtebtfbrYbuAbuzbuCbuBbuBbuDbwabrVbsbbgxbsdbsebseabtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtobqxbqybqxbmlbtpbjxbjxbtqbjxbtpcuWbjxbjxbqAbtraYpbtsbttbnGbtubtvbecbpbbjEbtwbtxbmzbsnbqHaWUbpibtyblibtzbtAbtBbtCbmGbliaaaaaaaafbtDbtEbnUbtFbtGaafaaaaaabqVbtHbtIbtJbtKbtLbtMbtNbpubtOaHYaHYbmSbmSbtPbtQbpGbtRbtSbtTbtUbtVbtWbtXbtWbtXbtWbtXbtWbtXbtYbtZbsPbuabubbucbudbuebufbugbuhbuibujbncbukbulbumbnmbunbhJbhJbuobhJbhJbupbuqburbusbutbtcbuubuvbuwbuxbuxbuxbuybuybuybuybuybwcbwbbwebwdbwebwfbwebrVbsbbgxbwgbqvbwhbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabuFbuGbuFbuHbuIbuHbuHbuHbuHbuHcuXbuKbjxbqAbuLaYpbuMbaHbuNbuObuPbuQbuRbuRbuRbuQbuQbuSbqHaJkbuTbpjblibuUbuVbuWbuXbuYbliaaaaaaaafbuZbvabqRbvbbvcaafaaaaaabqVbvdbvebvfbvgbtLbtMbtNbpubvhaHYaHYbvibvjbvkbvlbvmbvnbtXbvobvpbvqbvrbvsbDibvubvvbvubFzbtXbhkbjZbsPbvxbvybvzbvAbvBbvCbvDbvEbvEbvFbvGbvHbvIbvJbvKbvLbvMbvNbvMbvMbvObvMbvMbvPbvQbvRbvRbvSbvTbqibuxbvUbvVbvWbvXbvYbambuybxjbxibzCbyAbzDbxibAVbrVbsbbgxcjgbsebsebjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnwbkNbkNbkNaYpbkNbkNbkNbwibwicuYbwibwjbwkbwkbwibwibwlbwlbwmbwnbuQbwobwpbwqbwrbuQbsnbqHaHZaIcaIcbliblibwsbliblibwtbliaHUaHUaHUbwubwvbsubwwbwxaHUaHUaHUbpubpubpubpubpubpubpubpubpubvhaHYbwybtXbtXbtXbwzbtXbtXbtXbwAbvpbwBbwCbwDbwEbwFbwGbwHbwIbwDbhkbjZbsPbwJbwKbwLbwMbwNbwObrAbrAbrAbwPbwQbwRbwSbwTbwTbwTbwTbwUbwTbwTbwTbwVbwVbwWbwXbwYbwYbwZbxabqibuxbxbbxcbxdbxebxfbxgbxhbrVbrVbFBbFBbFBbrVcfYbrVbsbbgxbwgbqvcvhbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnwbkNbkNbkNaYpbkNbkNbkNbwibwicuYbwibwjbwkbwkbwibwibwlbwlbwmbwnbuQbwobwpbwqbwrbuQbsnbqHaHZaIcaIcbliblibwsbliblibwtbliaHUaHUaHUbwubwvbsubwwbwxaHUaHUaHUbpubpubpubpubpubpubpubpubpubvhaHYbwybtXbtXbtXbwzbtXbtXbtXbwAbvpbwBbwCbwDbwEbwFbwGbwHbwIbwDbhkbjZbsPbwJbwKbwLbwMbwNbwObrAbrAbrAbwPbwQbwRbwSbwTbwTbwTbwTbwUbwTbwTbwTbwVbwVbwWbwXbwYbwYbwZbxabqibuxbxbbxcbxdbxeahQbxgbxhbrVbrVbFBbFBbFBbrVcfYbrVbsbbgxbwgbqvcvhbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwicuZbxlbxmbxnbxobxpbwkbxqbxrbxsbxtbxubxvbxwbxxbxybuQbsnbqHaHYaHYaHYbxzaKQbxAaKAbxBbxCbxDaVLaVLaVLbxEbxFbxGbxHbxIaHYaHYaHYaHYaKQaHYaKAaHYaHYaHYbxzaHYbvhaHYbxJbtXbxKbxLbxMbxNbxObtXbxPbxQbxRbxSbwDbwEbwEbxTbxUbxVbwDbhkbxWbsPbrAbxXbxYbxZbwQbyabybbycbydbncbncbeHbyebwTbyfbygbyhbyibyjbykbwTbylbymbynbyobypbwYbyqbyrbysbytbyubyvbywbyxbyybyzbxhchfchfchfchfchfchfchfbrVbsbbgxbsdbsebseabtaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwkbyBbyCbyDbyEbyFbyGbyHbyIbyJbyKbyLbyMbyNbyObxxbyPbuQbsnbyQaHYaHYaHYaHYaHYaHYaKAaHYbqHaHYaHYaHYaHYaHYbyRbySbyTaHYaHYaHYaHYaHYaHYaHYaKAbyUaHYaHYaHYaHYbvhbyVbyWbtSbyXbyYbyZbyYbzabtXbzbbvpbvqbzcbtXbzdbzebzfbzgbzhbtXbhkbjZbsPbsPbsPbsPbsPbncbncbncbncbncbncbzibgibzjbwTbzkbzlbzmbznbzobzpbwTbzqbzrbzsbztbzubwYbyqbzvbzwbzxbzybzzbzzbzzbzAbzBbxhchfchfctEctDchfchfchfbrVbsbbgxbsdbsebsebjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibzEbzFbzGbzHbzIcvbcvacvccvcbAZbzLbuRbzMbzNbzObzPbuQbzQbzRbzSbzSbzSbzTbzSbzSbzUbzSbzVaHYbzWbzXbzYbzYcuBbAabAbbAcbAdbAeaVLaVLbAfaVLbAgbAhaVLbAibAjbAkbAlaHYaHYbtXbAmbAnbAobtWbApbtXbtWbAqbArbtXbtXbtXbtXbtXbtXbtXbtXbhkbjZbfXbAsbAtbAubAvbAwbAxbAybAzbAAbAwbzibgibABbwTbACbADbAEbAFbAGbAHbwTbAIbAJbAKbALbAMbwYbyqbANbAObuybAPbAQbARbASbATbAUbxhchfchfchfbscchfchfchfbrVbsbbqtbAWbqvbqwbjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibzEbzFbzGbzHbzIcvbcvacvccvcbAZbzLbuRbzMbzNbzObzPbuQbzQbzRbzSbzSbzSbzTbzSbzSbzUbzSbzVaHYbzWbzXbzYbzYcuBbAabAbbAcbAdbAeaVLaVLbAfaVLbAgbAhaVLbAibAjbAkbAlaHYaHYbtXbAmbAnbAobtWbApbtXbtWbAqbArbtXbtXbtXbtXbtXbtXbtXbtXbhkbjZbfXbAsbAtbAubAvbAwbAxbAybAzbAAbAwbzibgibABbwTbACbADbAEbAFbAGbAHbwTbAIbAJbAKbALbAMbwYbyqbANbAObuybAPbxfbARbASbATbAUbxhchfchfchfbscchfchfchfbrVbsbbqtbAWbqvbqwbjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibwibwkbwkbwkbwkbwibwibAXbAYbAZbBabuQbuQbuQbuQbuQbuQbBbbBcaIcaIcaIcaIcbBdbBdbBdbBdbBdbBdbBdbBdbBdbBdbBebBfbBgbBhbBhbBhbBhbBhbBibBhbBhbBjbBhbyebBkbyeaIdaJlbBlbtXbBmbBnbBobBpbBqbtXbBrbxQbBsbBtbBubBvbBwbBxbBybBzbBAbBBbBCbBDbBDbBEbBFbBGbBHbBIbBJbBKbBLbAwbzibgibBMbBMbBMbBMbBMbBMbBMbBMbBMbBNbBNbBNbBNbBNbBNbBObBPbBQbuybuybuybuybuybuybuybxhbrVbrVbrVbrVbrVbrVbrVbrVbsbbgxbBRbBSbjobjoaafaafaafaagaagaagaagaagaagaagaagaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBTaaaaaaaaaaafaaaaaabwlbBUbBVbBWbBXbBYbBZbCabCbbCcbCdbCebCfaaaaaaaafaaabBdbCgbChbCibCjbCkbClbCmbCnbCobCpbCqbCrbBhbCsbCtcuDbCubCwbCvbCvbCxbCybCzbCAbyebyebyebyebtXbCBbCCbCDbCCbCEbtXbCFbvpbCGbCHbCIbCJbCIbCIbCKbCLbCMbCNbCObCObCObCPbCQbvlbCRbCSbCTbCUbCVbAwbzibgibBMbCWbCWbCWbCXbCWbCWbCWbBMbCYbCYbCZbCYbCYbBNbDabDbbqibDcbDdbDebDfbDgbDhbJqbDjbDkbDlbDmbDnbDobsmbtnbtnbvwbDsbDdbDdbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaelctjaekctjaejaaaaafaaabwlbwlbDtbxrbDubDvbDwbDxbDybDybDzbDAbDBbDCaafbDDbDEbDFbDGbDHbDIbDJbDIbDKbDIbDIbDIbBdbDLbDMbDNbBhbDObDPbDQbDRbDSbCvbDTbBjbBhbDUbDVbDWbDXbDYbDZbEabEbbCCbEcbCCbxQbEdbEebEfbEgbtXbEhbEibCCbCCbEjbEkbmSbmSbmSbmSbmSbElbEmbpGbEnbEobEpbBKbEqbAwbzibgibBMbCWbCWbCWbCWbCWbCWbCWbBMbErbEsbEtbEubEvbBNbEwbExbEybEzbEAbEBbECbEDbEDbEDbEDbEEbEFbEGbDnbjobvZbEIbEJbEJbEKbELbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbENbEObENaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNcuCctMcuCafNbERbERbERbwlbESbxrbETbEUbEVbEWbwlbBcbEXbBcbBcbEYbEZaaabFabFbbFcbFdbDIbDIbFebDIbFfbFgbFhbDIbBdbDLbFibFjbBhbFkbFlbFmbFnbFobCvbFpbBjbzibFqbFrbFsbFrbFtbFubtXbFvbCIbFwbCIbFxbtSbFybCJbFAbtXbFCbCCbCCbCCbCCbGNbmSbPIbFEbFFbFGbBEbFHbvlbFIbBKbBKbFJbFKbFLbFMbFNbBMbCWbCWbCWbCWbCWbCWbCWbBMbFObFPbFQbFRbFSbFTbFUbFVbtbbFWbFXbEDbFYbEDbEDbEDbEDbEDbEDbEDbDnbFZbDpbGbbGcbGdbGebGfbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbEObENbGgbENbEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaekajxctyajxaekbERbGhbGibwlbGjbxrbGkbxrbxrbEWbwlbGlbGmbGnbBcbEYbEZaafbFabGobGpbGqbGrbGsbGrbGrbGtbGubGrbGrbGvbGwbGxbGybBhbGzbBhbBhbBhbBhbGAbGBbGCbGDbGEbGFbGGbGHbGIbGIbtXbGJbGKcltbGMbGQbtXbGObGPbGSbtXbGRbDqbEHbDrbFDbGWbmSbGXbGYbpFbGZbHabHbbHcbCRbHdbBKbBKbHebAwbzibgibBMbBMbHfbCWbCWbHgbHfbBMbBMbHhbHibHjbHkbHlbBNbHmbHnbtbbHobHpbHqbHqbHrbHsbHtbHqbHubHvbHwbHxbHybGabHAbHBbHCbHDbHEbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbHFbEObHGbHHbHIbEObHFaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaekajxctyajxaekbERbGhbGibwlbGjbxrbGkbxrbxrbEWbwlbGlbGmbGnbBcbEYbEZaafbFabGobGpbGqbGrbGsbGrbGrbGtbGubGrbGrbGvbGwbGxbGybBhbGzbBhbBhbBhbBhbGAbGBbGCbGDbGEbGFbGGbGHbGIbGIbtXbGJbGKcltbGMbGQbtXbGObGPbGSbtXbGRbDqbEHbDrbFDbGWbmSbGXbGYbpFbGZbHabHbbHcbCRbHdbAQbBKbHebAwbzibgibBMbBMbHfbCWbCWbHgbHfbBMbBMbHhbHibHjbHkbHlbBNbHmbHnbtbbHobHpbHqbHqbHrbHsbHtbHqbHubHvbHwbHxbHybGabHAbHBbHCbHDbHEbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbHFbEObHGbHHbHIbEObHFaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNajxajxajxctLbHKbxrbxrbHLbGjbxrbxrbxrbxrbEWbwlbHMbGnbHNbBcbEYbEZaaabFabHObHPbHQbDIbDIbHRbDIbHSbHTbHUbHVbBdbHWbHXbHYbHZbIabIbbIbbIbbIbbIbbIcbIbbIdbIebIfbIgbIhbIibIjbtSbtSbtSbtSbtSbtSbtSbtSbtSbtSbMNbMNbMNbMNbMNbMNbOnbOCbmSbmSbmSbmSbIlbImbhjbAwbAwbAwbAwbAwbAwbzibgibBMbInbIobIpbIqbIrbIsbInbItbHhbHibHjbIubIvbIwbIxbIybuwbIzbDdbIAbIAbIBbICbIDbIEbEDbEDbIFbDnbIGbGLbIIbDdbIJbIKbIKbDdaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbEObEObILbIMbIMbIMbINbEObEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaekctyctyctyaekbERbIObIPbIQbIRbxrbxrbISbITbIUbwlbBcbBcbBcbBcbEYbDCaafbIVbDEbIWbDGbIXbDIbIYbDIbDIbDIbDIbDIbBdbDLbIZbJabJbbJcbJcbJcbJcbJcbJcbJdbJebJfbJgbJhbJibJjbJkbJlbJmbJnbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJobJpbmSbGXcqlbBDbJrbBEbJsbJtbJubJvbJvbJwbJxbJgbJybJzbBMbJAbJBbJCbJDbJEbJFbJGbItbItbItbItbItbItbJHbJIbJJbJKbJLbDdbDnbDnbDnbDnbDnbDnbJMbEDbEDbDnbjobvZbgxbDdbJNbJObJPbJQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJRbJSbJRbIMbJTbIMctxctlbENaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNajZctzctAafNbERbERbERbwlbwlbERbERbERbwlbwlbwlaaaaaaaaabJYbJZbEZaaaaaaaafaaabBdbKabKbbKcbDIbKdbKebKfbKgbKhbKibKjbKkbKlbKmbKnbKobKpbKqbKmbKmbKmbKmbKmbKrbKsbKmbKmbKtbKmbKubKmbKmbKmbKmbKmbyebyebyebyebyebyebyebyebKvbKwbmSbKxbKybKzbKAbKBbKCbKDbKEbKFbKFbKGbKFbKFbKHbKIbBMbKJbKKbKLbKKbKMbKKbKNbKObKPbKQbKRbKSbKTbKUbyqbHnbqibKVaafbKWbKXbKYbKZbLabKZbLbbLcbLdbDnbLebsbbLfbDdbDdbDdbDdbDdaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbEObEObLgbIMbIMbIMbLhbEObEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/generic/z2.dmm b/_maps/map_files/generic/z2.dmm
index 9dc7e9110c2..548686f46de 100644
--- a/_maps/map_files/generic/z2.dmm
+++ b/_maps/map_files/generic/z2.dmm
@@ -414,7 +414,7 @@
"hX" = (/obj/structure/filingcabinet,/turf/simulated/floor/plasteel/shuttle,/area/centcom/evac)
"hY" = (/obj/structure/stool/bed/chair{dir = 4; name = "Prosecution"},/turf/simulated/floor/plasteel/shuttle,/area/centcom/evac)
"hZ" = (/obj/structure/stool/bed/chair/office/dark,/obj/effect/landmark{name = "Emergencyresponseteam"},/turf/simulated/floor/plasteel/black,/area/centcom/ferry)
-"ia" = (/obj/machinery/vending/cigarette{products = list(/obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate = 7, /obj/item/weapon/storage/fancy/cigarettes/cigpack_uplift = 3, /obj/item/weapon/storage/fancy/cigarettes/cigpack_robust = 2, /obj/item/weapon/storage/fancy/cigarettes/cigpack_carp = 3, /obj/item/weapon/storage/fancy/cigarettes/cigpack_midori = 1, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/lighter/greyscale = 4, /obj/item/weapon/storage/fancy/rollingpapers = 5)},/turf/simulated/floor/plasteel/black,/area/centcom/ferry)
+"ia" = (/obj/machinery/vending/cigarette{products = list(/obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate = 7, /obj/item/weapon/storage/fancy/cigarettes/cigpack_uplift = 3, /obj/item/weapon/storage/fancy/cigarettes/cigpack_robust = 2, /obj/item/weapon/storage/fancy/cigarettes/cigpack_carp = 3, /obj/item/weapon/storage/fancy/cigarettes/cigpack_midori = 1, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/lighter/random = 4, /obj/item/weapon/storage/fancy/rollingpapers = 5)},/turf/simulated/floor/plasteel/black,/area/centcom/ferry)
"ib" = (/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor/plasteel/black,/area/centcom/ferry)
"ic" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel/black,/area/centcom/ferry)
"id" = (/obj/structure/flora/kirbyplants,/turf/simulated/floor/plasteel/black,/area/centcom/ferry)
@@ -803,7 +803,7 @@
"pw" = (/obj/machinery/computer/shuttle/syndicate/recall,/turf/simulated/floor/plasteel/bar{dir = 2},/area/syndicate_mothership)
"px" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel/bar{dir = 2},/area/syndicate_mothership)
"py" = (/obj/item/device/paicard,/turf/simulated/floor/plasteel/grimy,/area/syndicate_mothership)
-"pz" = (/obj/machinery/vending/cigarette{products = list(/obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate = 7, /obj/item/weapon/storage/fancy/cigarettes/cigpack_uplift = 3, /obj/item/weapon/storage/fancy/cigarettes/cigpack_robust = 2, /obj/item/weapon/storage/fancy/cigarettes/cigpack_carp = 3, /obj/item/weapon/storage/fancy/cigarettes/cigpack_midori = 1, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/lighter/greyscale = 4, /obj/item/weapon/storage/fancy/rollingpapers = 5)},/turf/simulated/floor/plasteel/bar{dir = 2},/area/syndicate_mothership)
+"pz" = (/obj/machinery/vending/cigarette{products = list(/obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate = 7, /obj/item/weapon/storage/fancy/cigarettes/cigpack_uplift = 3, /obj/item/weapon/storage/fancy/cigarettes/cigpack_robust = 2, /obj/item/weapon/storage/fancy/cigarettes/cigpack_carp = 3, /obj/item/weapon/storage/fancy/cigarettes/cigpack_midori = 1, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/lighter/random = 4, /obj/item/weapon/storage/fancy/rollingpapers = 5)},/turf/simulated/floor/plasteel/bar{dir = 2},/area/syndicate_mothership)
"pA" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Dooruranium.dmi'; name = "Engine Room B"},/turf/space,/area/wizard_station)
"pB" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel/bar{dir = 2},/area/syndicate_mothership)
"pC" = (/obj/structure/bookcase,/obj/item/weapon/book/manual/wiki/engineering_hacking,/obj/item/weapon/book/manual/robotics_cyborgs,/obj/item/weapon/book/manual/engineering_singularity_safety,/obj/item/weapon/book/manual/detective,/turf/simulated/floor/plasteel/grimy,/area/syndicate_mothership)
diff --git a/bot/NanoTrasenBot.py b/bot/NanoTrasenBot.py
index 40ea8325772..2e0678bbd96 100644
--- a/bot/NanoTrasenBot.py
+++ b/bot/NanoTrasenBot.py
@@ -1300,17 +1300,7 @@ while True:
print sender+" Has now joined"
users.append(sender)
#####
- if ".fi" in data[0] and sender.lower() == "skibiliano":
- operators.append(sender)
if sender.lower() not in peopleheknows[0]:
- if data[0].split("!")[1] in peopleheknows[1]:
- appendion = "...you do seem familiar however"
- else:
- appendion = ""
- if data[1][1].lower() == channel or data[1][1].lower() == channel[1:]:
- conn.privmsg(data[1][1],CORE_DATA.greeting.replace("USER",sender)+" "+appendion)
- else:
- conn.privmsg(data[1][1],"Hello! Haven't seen you here before! Happy to meet you! %s" %(appendion))
peopleheknows[0].append(sender.lower())
peopleheknows[1].append(data[0].split("!")[1])
with open("peopleheknows.cache","w") as peoplehecache:
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index bbb172cfe83..6a90495198c 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -108,6 +108,7 @@
#define STAGE_THREE 5
#define STAGE_FOUR 7
#define STAGE_FIVE 9
+#define STAGE_SIX 11 //From supermatter shard
//zlevel defines, can be overridden for different maps in the appropriate _maps file.
#define ZLEVEL_SPACEMAX 7
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index f171be733e9..a80a9bb9ebd 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -13,6 +13,16 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/undershirt, undershirt_list, undershirt_m, undershirt_f)
//socks
init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, socks_list, socks_m, socks_f)
+ //lizard bodyparts (blizzard intensifies)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, body_markings_list)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/tails, tails_list)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/tails_animated, animated_tails_list)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/snouts, snouts_list)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/horns, horns_list)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/frills, frills_list)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, spines_list)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/spines_animated, animated_spines_list)
+
//Species
for(var/spath in typesof(/datum/species))
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 20c38174275..01f8d00be82 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -36,6 +36,22 @@
if(FEMALE) return pick(socks_f)
else return pick(socks_list)
+/proc/random_features()
+ if(!tails_list.len)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/tails, tails_list)
+ if(!snouts_list.len)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/snouts, snouts_list)
+ if(!horns_list.len)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/horns, horns_list)
+ if(!frills_list.len)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/frills, frills_list)
+ if(!spines_list.len)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, spines_list)
+ if(!body_markings_list.len)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, body_markings_list)
+
+ return(list("mcolor" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "tail" = pick(tails_list), "snout" = pick(snouts_list), "horns" = pick(horns_list), "frills" = pick(frills_list), "spines" = pick(spines_list), "body_markings" = pick(body_markings_list)))
+
/proc/random_hair_style(gender)
switch(gender)
if(MALE) return pick(hair_styles_male_list)
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index 6271cceb754..c3bc1e7c1f8 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -18,6 +18,15 @@ var/global/list/undershirt_f = list() //stores only undershirt name
var/global/list/socks_list = list() //stores /datum/sprite_accessory/socks indexed by name
var/global/list/socks_m = list() //stores only socks name
var/global/list/socks_f = list() //stores only socks name
+ //Lizard Bits (all datum lists indexed by name)
+var/global/list/body_markings_list = list()
+var/global/list/tails_list = list()
+var/global/list/animated_tails_list = list()
+var/global/list/snouts_list = list()
+var/global/list/horns_list = list()
+var/global/list/frills_list = list()
+var/global/list/spines_list = list()
+var/global/list/animated_spines_list = list()
//Backpacks
var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel")
//Female Uniforms
diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm
index 6855ed2efcb..2abd022a271 100644
--- a/code/_globalvars/lists/objects.dm
+++ b/code/_globalvars/lists/objects.dm
@@ -7,6 +7,7 @@ var/global/list/machines = list() //NOTE: this is a list of ALL machines now
var/global/list/navbeacons = list() //list of all bot nagivation beacons, used for patrolling.
var/global/list/deliverybeacons = list() //list of all MULEbot delivery beacons.
var/global/list/deliverybeacontags = list() //list of all tags associated with delivery beacons.
+var/global/list/nuke_list = list()
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
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index ca38a246dc0..e9b60141730 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -33,8 +33,12 @@
clear_alert(category)
return .()
else if(alert.icon_state == "[id][severity]")
-// src << "threw alert not in need of update [category] [id] [severity]"
- return 0
+ if(alert.timeout)
+ clear_alert(category)
+ return .()
+ else
+ // src << "threw alert not in need of update [category] [id] [severity]"
+ return 0
// src << "updating alert [category] [id] [severity]"
else
alert = PoolOrNew(/obj/screen/alert)
@@ -63,6 +67,12 @@
return 0
alert.name = initial(path_as_obj.name)
alert.desc = initial(path_as_obj.desc)
+ alert.timeout = initial(path_as_obj.timeout)
+ if(alert.timeout)
+ spawn(alert.timeout)
+ if(alert.timeout && alerts[category] == alert && world.time >= alert.timeout)
+ clear_alert(category)
+ alert.timeout = world.time + alert.timeout - world.tick_lag
alert.mouse_opacity = 1
return alert
@@ -86,6 +96,7 @@
icon_state = "default"
name = "Alert"
desc = "Something seems to have gone wrong with this alert, so report this bug please"
+ var/timeout = 0 //If set to a number, this alert will clear itself after that many deciseconds
//Gas alerts
@@ -145,6 +156,37 @@ The box in your backpack has an oxygen tank and gas mask in it."
name = "High Pressure"
desc = "The air around you is hazardously thick. A fire suit would protect you."
+/obj/screen/alert/blind
+ name = "Blind"
+ desc = "For whatever reason, you can't see. This may be caused by a genetic defect, eye trauma, being unconscious, \
+or something covering your eyes."
+
+/obj/screen/alert/high
+ name = "High"
+ desc = "Woah man, you're tripping balls! Careful you don't get addicted to this... if you aren't already."
+
+/obj/screen/alert/drunk //Not implemented
+ name = "Drunk"
+ desc = "All that alcohol you've been drinking is impairing your speech, motor skills, and mental cognition. Make sure to act like it."
+
+/obj/screen/alert/embeddedobject
+ name = "Embedded Object"
+ desc = "Something got lodged into your flesh and is causing major bleeding. It might fall out with time, but surgery is the safest way. \
+If you're feeling frisky, click yourself in help intent to pull the object out."
+
+/obj/screen/alert/asleep
+ name = "Asleep"
+ desc = "You've fallen asleep. Wait a bit and you should wake up. Unless you don't, considering how helpless you are."
+
+/obj/screen/alert/weightless
+ name = "Weightless"
+ desc = "Gravity has ceased affecting you, and you're floating around aimlessly. You'll need something large and heavy, like a \
+wall or lattice strucure, to push yourself off of if you want to move. A jetpack would enable free range of motion. A pair of \
+magboots would let you walk around normally on the floor. Barring those, you can throw things, use a fire extuingisher, \
+or shoot a gun to move around via Newton's 3rd Law of motion."
+
+//ALIENS
+
/obj/screen/alert/alien_tox
name = "Plasma"
desc = "There's flammable plasma in the air. If it lights up, you'll be toast."
@@ -154,6 +196,9 @@ The box in your backpack has an oxygen tank and gas mask in it."
name = "Burning"
desc = "It's too hot! Flee to space or at least away from the flames. Standing on weeds will heal you up."
+
+//SILICONS
+
/obj/screen/alert/nocell
name = "Missing Power Cell"
desc = "Unit has no power cell. No modules available until a power cell is reinstalled. Robotics may provide assistance."
@@ -167,6 +212,24 @@ Reharging stations are available in robotics, the dormitory's bathrooms. and the
name = "Low Charge"
desc = "Unit's power cell is running low. Reharging stations are available in robotics, the dormitory's bathrooms. and the AI satelite."
+//Need to cover all use cases - emag, illegal upgrade module, malf AI hack, traitor cyborg
+/obj/screen/alert/hacked
+ name = "Hacked"
+ desc = "Hazardous non-standard equipment detected. Please ensure any usage of this equipment is in line with unit's laws, if any."
+
+/obj/screen/alert/locked
+ name = "Locked Down"
+ desc = "Unit has remotely locked down. Usage of a Robotics Control Computer like the one in the Research Director's \
+office by your AI master or any qualified human may resolve this matter. Robotics my provide further assistance if necessary."
+
+/obj/screen/alert/newlaw
+ name = "Law Update"
+ desc = "Laws have potentially been uploaded to or removed from this unit. Please be aware of any changes \
+so as to remain in compliance with the most up-to-date laws."
+ timeout = 300
+
+//OBJECT-BASED
+
/obj/screen/alert/buckled
name = "Buckled"
desc = "You've been buckled to something and can't move. Click the alert to unbuckle unless you're handcuffed."
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index e442f74d14f..4a0b0f4abb4 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -489,6 +489,20 @@
config.no_summon_events = 1
if("reactionary_explosions")
config.reactionary_explosions = 1
+ if("bombcap")
+ var/BombCap = text2num(value)
+ if (!BombCap)
+ continue
+ if (BombCap < 4)
+ BombCap = 4
+ if (BombCap > 128)
+ BombCap = 128
+
+ MAX_EX_DEVESTATION_RANGE = round(BombCap/4)
+ MAX_EX_HEAVY_RANGE = round(BombCap/2)
+ MAX_EX_LIGHT_RANGE = BombCap
+ MAX_EX_FLASH_RANGE = BombCap
+ MAX_EX_FLAME_RANGE = BombCap
else
diary << "Unknown setting in configuration: '[name]'"
diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm
index 4d54909b27d..f44fa115c39 100644
--- a/code/datums/ai_laws.dm
+++ b/code/datums/ai_laws.dm
@@ -5,6 +5,7 @@
var/list/inherent = list()
var/list/supplied = list()
var/list/ion = list()
+ var/mob/living/silicon/owner
/datum/ai_laws/default/asimov
name = "Three Laws of Robotics"
@@ -169,3 +170,20 @@
if (length(law) > 0)
who << "[number]. [law]"
number++
+
+/datum/ai_laws/proc/clear_zeroth_law(var/force) //only removes zeroth from antag ai if force is 1
+ if(force)
+ src.zeroth = null
+ src.zeroth_borg = null
+ return
+ else
+ if(src.owner.mind.special_role)
+ return
+ else
+ src.zeroth = null
+ src.zeroth_borg = null
+ return
+
+/datum/ai_laws/proc/associate(var/mob/living/silicon/M)
+ if(!owner)
+ owner = M
\ No newline at end of file
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index 78728738681..ae0df9ac76d 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -260,7 +260,7 @@ var/record_id_num = 1001
L.fields["enzymes"] = H.dna.struc_enzymes
L.fields["identity"] = H.dna.uni_identity
L.fields["species"] = H.dna.species.type
- L.fields["mcolor"] = H.dna.mutant_color
+ L.fields["features"] = H.dna.features
L.fields["image"] = image
locked += L
return
@@ -272,7 +272,7 @@ var/record_id_num = 1001
photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.skin_tone]_[g]_s")
else
photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.dna.species.id]_[g]_s")
- photo.Blend("#[H.dna.mutant_color]", ICON_MULTIPLY)
+ photo.Blend("#[H.dna.features["mcolor"]]", ICON_MULTIPLY)
var/icon/eyes_s
if(EYECOLOR in H.dna.species.specflags)
diff --git a/code/datums/martial.dm b/code/datums/martial.dm
index 81e611df4f4..865209ab97e 100644
--- a/code/datums/martial.dm
+++ b/code/datums/martial.dm
@@ -87,11 +87,11 @@
name = "Boxing"
/datum/martial_art/boxing/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
- A << " Can't disarm while boxing! "
+ A << "Can't disarm while boxing! "
return 1
/datum/martial_art/boxing/grab_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
- A << " Can't grab while boxing! "
+ A << "Can't grab while boxing! "
return 1
/datum/martial_art/boxing/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 21bf92f6b4d..ceb8a980ea3 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -286,9 +286,9 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/security/armory/ballistic
name = "Combat Shotguns Crate"
- contains = list(/obj/item/weapon/gun/projectile/shotgun/combat,
- /obj/item/weapon/gun/projectile/shotgun/combat,
- /obj/item/weapon/gun/projectile/shotgun/combat,
+ contains = list(/obj/item/weapon/gun/projectile/shotgun/automatic/combat,
+ /obj/item/weapon/gun/projectile/shotgun/automatic/combat,
+ /obj/item/weapon/gun/projectile/shotgun/automatic/combat,
/obj/item/weapon/storage/belt/bandolier,
/obj/item/weapon/storage/belt/bandolier,
/obj/item/weapon/storage/belt/bandolier)
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 7f6db7d1388..da8e2fac116 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -268,10 +268,24 @@ var/list/uplink_items = list()
cost = 2
gamemodes = list(/datum/game_mode/nuclear,/datum/game_mode/gang)
+/datum/uplink_item/ammo/ammobag
+ name = "Ammo Duffelbag - Shotgun Ammo Grab Bag"
+ desc = "A duffelbag filled with Bulldog ammo to kit out an entire team, at a discounted price."
+ item = /obj/item/weapon/storage/backpack/dufflebag/syndieammo/loaded
+ cost = 10 //bulk buyer's discount. Very useful if you're buying a mech and dont have TC left to buy people non-shotgun guns
+ gamemodes = list(/datum/game_mode/nuclear)
+
+/datum/uplink_item/ammo/bullslug
+ name = "Drum Magazine - 12g Slugs"
+ desc = "An additional 8-round slug magazine for use in the Bulldog shotgun. Now 8 times less likely to shoot your pals."
+ item = /obj/item/ammo_box/magazine/m12g
+ cost = 2
+ gamemodes = list(/datum/game_mode/nuclear)
+
/datum/uplink_item/ammo/bullbuck
name = "Drum Magazine - 12g Buckshot"
desc = "An additional 8-round buckshot magazine for use in the Bulldog shotgun. Front towards enemy."
- item = /obj/item/ammo_box/magazine/m12g
+ item = /obj/item/ammo_box/magazine/m12g/buckshot
cost = 2
gamemodes = list(/datum/game_mode/nuclear)
@@ -286,6 +300,13 @@ var/list/uplink_items = list()
name = "Drum Magazine - 12g Dragon's Breath"
desc = "An alternative 8-round dragon's breath magazine for use in the Bulldog shotgun. I'm a fire starter, twisted fire starter!"
item = /obj/item/ammo_box/magazine/m12g/dragon
+ cost = 2
+ gamemodes = list(/datum/game_mode/nuclear)
+
+/datum/uplink_item/ammo/bulltoxin
+ name = "Drum Magazine - 12g Bioterror"
+ desc = "An alternative 8-round toxic magazine for use in the Bulldog shotgun. Contains debilitating toxins to make your target die an agonizing death."
+ item = /obj/item/ammo_box/magazine/m12g/bioterror
cost = 3
gamemodes = list(/datum/game_mode/nuclear)
@@ -389,6 +410,14 @@ var/list/uplink_items = list()
item = /obj/item/toy/carpplushie/dehy_carp
cost = 3
+/datum/uplink_item/stealthy_weapons/door_charge
+ name = "Explosive Airlock Charge"
+ desc = "A small, easily concealable device. It can be applied to an open airlock panel, and the next person to open that airlock will be knocked down in an explosion. The airlock's maintenance panel will also be destroyed by this."
+ item = /obj/item/device/doorCharge
+ cost = 5
+ surplus = 6
+ excludefrom = list(/datum/game_mode/nuclear)
+
// STEALTHY TOOLS
/datum/uplink_item/stealthy_tools
diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm
index e483513c40a..89b57e6a16e 100644
--- a/code/datums/wires/wires.dm
+++ b/code/datums/wires/wires.dm
@@ -134,7 +134,8 @@ var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown",
if(istype(I, /obj/item/device/assembly))
var/obj/item/device/assembly/A = I;
if(A.attachable)
- L.drop_item()
+ if(!L.drop_item())
+ return
Attach(colour, A)
else
L << "You need a attachable assembly! "
diff --git a/code/game/dna.dm b/code/game/dna.dm
index 128b7aa1fc6..614e4698f55 100644
--- a/code/game/dna.dm
+++ b/code/game/dna.dm
@@ -21,7 +21,7 @@
var/uni_identity
var/blood_type
var/datum/species/species = new /datum/species/human() //The type of mutant race the player is if applicable (i.e. potato-man)
- var/mutant_color = "FFF" // What color you are if you have certain speciess
+ var/list/features = list("FFF") //first value is mutant color
var/real_name //Stores the real name of the person who originally got this dna datum. Used primarely for changelings,
var/list/mutations = list() //All mutations are from now on here
var/mob/living/carbon/holder
@@ -36,7 +36,7 @@
destination.dna.uni_identity = uni_identity
destination.dna.blood_type = blood_type
hardset_dna(destination, null, null, null, null, species)
- destination.dna.mutant_color = mutant_color
+ destination.dna.features = features
destination.dna.real_name = real_name
destination.dna.mutations = mutations
@@ -46,7 +46,7 @@
new_dna.uni_identity = uni_identity
new_dna.blood_type = blood_type
new_dna.species = new species.type
- new_dna.mutant_color = mutant_color
+ new_dna.features = features
new_dna.real_name = real_name
new_dna.mutations = mutations
@@ -131,7 +131,7 @@
spans |= M.get_spans()
return spans
-/proc/hardset_dna(mob/living/carbon/owner, ui, se, real_name, blood_type, datum/species/mrace, mcolor)
+/proc/hardset_dna(mob/living/carbon/owner, ui, se, real_name, blood_type, datum/species/mrace, features)
if(!ismonkey(owner) && !ishuman(owner))
return
if(!owner.dna)
@@ -143,8 +143,8 @@
owner.reagents.del_reagent(exotic_blood.id)
owner.dna.species = new mrace()
- if(mcolor)
- owner.dna.mutant_color = mcolor
+ if(features)
+ owner.dna.features = features
if(real_name)
owner.real_name = real_name
@@ -193,6 +193,7 @@
character.dna.uni_identity = character.dna.generate_uni_identity(character)
character.dna.struc_enzymes = character.dna.generate_struc_enzymes(character)
character.dna.unique_enzymes = character.dna.generate_unique_enzymes(character)
+ character.dna.features = character.features
return character.dna
/proc/create_dna(mob/living/carbon/C, datum/species/S) //don't use this unless you're about to use hardset_dna or ready_dna
@@ -497,8 +498,8 @@
/obj/machinery/computer/scan_consolenew
name = "\improper DNA scanner access console"
desc = "Scan DNA."
- icon = 'icons/obj/computer.dmi'
- icon_state = "scanner"
+ icon_screen = "dna"
+ icon_keyboard = "med_key"
density = 1
circuit = /obj/item/weapon/circuitboard/scan_consolenew
var/radduration = 2
@@ -518,7 +519,8 @@
/obj/machinery/computer/scan_consolenew/attackby(obj/item/I as obj, mob/user as mob, params)
if (istype(I, /obj/item/weapon/disk/data)) //INSERT SOME DISKETTES
if (!src.diskette)
- user.drop_item()
+ if(!user.drop_item())
+ return
I.loc = src
src.diskette = I
user << "You insert [I]. "
@@ -972,7 +974,7 @@
/datum/dna/proc/is_same_as(var/datum/dna/D)
if(uni_identity == D.uni_identity && struc_enzymes == D.struc_enzymes && real_name == D.real_name)
- if(species == D.species && mutant_color == D.mutant_color && blood_type == D.blood_type)
+ if(species == D.species && features == D.features && blood_type == D.blood_type)
return 1
return 0
diff --git a/code/game/gamemodes/abduction/abduction.dm b/code/game/gamemodes/abduction/abduction.dm
index 502d4300932..5a3d85f957a 100644
--- a/code/game/gamemodes/abduction/abduction.dm
+++ b/code/game/gamemodes/abduction/abduction.dm
@@ -263,7 +263,7 @@
for(var/team_number=1,team_number<=teams,team_number++)
var/obj/machinery/abductor/console/con = get_team_console(team_number)
var/datum/objective/objective = team_objectives[team_number]
- if (con.experiment.points > objective.target_amount)
+ if (con.experiment.points >= objective.target_amount)
SSshuttle.emergency.request(null, 0.5)
finished = 1
return ..()
@@ -279,7 +279,7 @@
var/datum/mind/smind = scientists[team_number]
var/mob/living/carbon/human/agent = amind.current
var/mob/living/carbon/human/scientist = smind.current
- if (console.experiment.points > objective.target_amount)
+ if (console.experiment.points >= objective.target_amount)
world << "[team_name] team fullfilled its mission! "
world << "Team Members : [agent.name]([agent.ckey]),[scientist.name]([scientist.ckey]) "
else
diff --git a/code/game/gamemodes/abduction/abduction_gear.dm b/code/game/gamemodes/abduction/abduction_gear.dm
index a13b347907c..dfb27d32870 100644
--- a/code/game/gamemodes/abduction/abduction_gear.dm
+++ b/code/game/gamemodes/abduction/abduction_gear.dm
@@ -22,15 +22,6 @@
var/stealth_armor = list(melee = 15, bullet = 15, laser = 15, energy = 15, bomb = 15, bio = 15, rad = 15)
var/combat_armor = list(melee = 50, bullet = 50, laser = 50, energy = 50, bomb = 50, bio = 50, rad = 50)
- var/obj/machinery/camera/portable/vest_cam = null
-
-
-/obj/item/clothing/suit/armor/abductor/vest/New()
- ..()
- vest_cam = new /obj/machinery/camera/portable(src)
- vest_cam.c_tag = "Agent Vest Cam"
- vest_cam.network = list("Abductor")
-
/obj/item/clothing/suit/armor/abductor/vest/proc/flip_mode()
switch(mode)
if(VEST_STEALTH)
diff --git a/code/game/gamemodes/abduction/gland.dm b/code/game/gamemodes/abduction/gland.dm
index ccb60820159..959f98b5b2a 100644
--- a/code/game/gamemodes/abduction/gland.dm
+++ b/code/game/gamemodes/abduction/gland.dm
@@ -92,7 +92,7 @@
for(var/mob/living/carbon/human/H in orange(4,T))
if(H == host)
continue
- H << " You hear a buzz in your head "
+ H << "You hear a buzz in your head "
H.confused += 20
/obj/item/gland/pop
@@ -213,7 +213,7 @@
/obj/effect/cocoon/abductor/proc/Copy(var/mob/living/carbon/human/H)
var/mob/living/carbon/human/interactive/greytide/clone = new(src)
- hardset_dna(clone,H.dna.uni_identity,H.dna.struc_enzymes,H.real_name, H.dna.blood_type, H.dna.species.type, H.dna.mutant_color)
+ hardset_dna(clone,H.dna.uni_identity,H.dna.struc_enzymes,H.real_name, H.dna.blood_type, H.dna.species.type, H.dna.features)
//There's no define for this / get all items ?
var/list/slots = list(slot_back,slot_w_uniform,slot_wear_suit,\
diff --git a/code/game/gamemodes/abduction/machinery/dispenser.dm b/code/game/gamemodes/abduction/machinery/dispenser.dm
index d346e0366a5..33b4944785b 100644
--- a/code/game/gamemodes/abduction/machinery/dispenser.dm
+++ b/code/game/gamemodes/abduction/machinery/dispenser.dm
@@ -60,7 +60,8 @@
/obj/machinery/abductor/gland_dispenser/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/gland))
- user.drop_item()
+ if(!user.drop_item())
+ return
W.loc = src
for(var/i=1,i<=gland_colors.len,i++)
if(gland_types[i] == W.type)
diff --git a/code/game/gamemodes/abduction/machinery/experiment.dm b/code/game/gamemodes/abduction/machinery/experiment.dm
index 3d79a64b56b..e9ac19599cd 100644
--- a/code/game/gamemodes/abduction/machinery/experiment.dm
+++ b/code/game/gamemodes/abduction/machinery/experiment.dm
@@ -43,7 +43,7 @@
photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.skin_tone]_[g]_s")
else
photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.dna.species.id]_[g]_s")
- photo.Blend("#[H.dna.mutant_color]", ICON_MULTIPLY)
+ photo.Blend("#[H.dna.features["mcolor"]]", ICON_MULTIPLY)
var/icon/eyes_s
if(EYECOLOR in H.dna.species.specflags)
@@ -86,7 +86,7 @@
dat += "Analyze "
dat += ""
else
- dat += " Experiment "
+ dat += "Experiment "
if(!occupant)
dat += "
Machine Unoccupied "
diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm
index 549243bf86c..a621168182a 100644
--- a/code/game/gamemodes/antag_spawner.dm
+++ b/code/game/gamemodes/antag_spawner.dm
@@ -146,4 +146,52 @@
ticker.mode.syndicates += R.mind
ticker.mode.update_synd_icons_added(R.mind)
R.mind.special_role = "syndicate"
- R.faction = list("syndicate")
\ No newline at end of file
+ R.faction = list("syndicate")
+
+
+/obj/item/weapon/antag_spawner/slaughter_demon //Warning edgiest item in the game
+ name = "vial of blood"
+ desc = "A magically infused bottle of blood, distilled from countless murder victims. Used in unholy rituals to attract horrifying creatures."
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "vial"
+
+
+/obj/item/weapon/antag_spawner/slaughter_demon/attack_self(mob/user as mob)
+ var/list/demon_candidates = get_candidates(BE_ALIEN)
+ if(user.z != 1)
+ user << "You should probably wait until you reach the station. "
+ return
+ if(demon_candidates.len > 0)
+ used = 1
+ var/client/C = pick(demon_candidates)
+ spawn_antag(C, get_turf(src.loc), "Slaughter Demon")
+ user << "You shatter the bottle, no turning back now! "
+ user << "You sense a dark presence lurking just beyond the veil... "
+ playsound(user.loc, 'sound/effects/Glassbr1.ogg', 100, 1)
+ qdel(src)
+ else
+ user << "You can't seem to work up the nerve to shatter the bottle. Perhaps you should try again later. "
+
+
+/obj/item/weapon/antag_spawner/slaughter_demon/spawn_antag(var/client/C, var/turf/T, var/type = "")
+
+ var /obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(T)
+ var/mob/living/simple_animal/slaughter/S = new /mob/living/simple_animal/slaughter/(holder)
+ S.phased = TRUE
+ S.key = C.key
+ S.mind.assigned_role = "Slaughter Demon"
+ S.mind.special_role = "Slaughter Demon"
+ ticker.mode.traitors += S.mind
+ var/datum/objective/assassinate/new_objective = new /datum/objective/assassinate
+ new_objective.owner = S:mind
+ new_objective:target = usr:mind
+ new_objective.explanation_text = "Kill [usr.real_name], the one who summoned you."
+ S.mind.objectives += new_objective
+ var/datum/objective/new_objective2 = new /datum/objective
+ new_objective2.owner = S:mind
+ new_objective2.explanation_text = "Kill everyone else while you're at it."
+ S.mind.objectives += new_objective2
+ S << S.playstyle_string
+ S << "You are currently not currently in the same plane of existence as the station. Ctrl+Click a blood pool to manifest. "
+ S << "Objective #[1] : [new_objective.explanation_text]"
+ S << "Objective #[2] : [new_objective2.explanation_text]"
\ No newline at end of file
diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index 7dcd49f1821..3a6ef5e1d26 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -83,10 +83,9 @@
H.hair_style = null
H.update_hair()
human_overlays = H.overlays
- if(overmind && overmind.blob_reagent_datum)
- adjustcolors(overmind.blob_reagent_datum.color)
+ update_icons()
H.loc = src
- loc.visible_message(" The corpse of [H.name] suddenly rises! ")
+ loc.visible_message("The corpse of [H.name] suddenly rises! ")
/mob/living/simple_animal/hostile/blob/blobspore/death(gibbed)
..(1)
@@ -120,8 +119,18 @@
..()
+/mob/living/simple_animal/hostile/blob/blobspore/update_icons()
+ ..()
+
+ if(overmind && overmind.blob_reagent_datum)
+ adjustcolors(overmind.blob_reagent_datum.color)
+ else
+ adjustcolors(color) //to ensure zombie/other overlays update
+
+
/mob/living/simple_animal/hostile/blob/blobspore/adjustcolors(var/a_color)
color = a_color
+
if(is_zombie)
overlays.Cut()
overlays = human_overlays
@@ -130,7 +139,6 @@
color = initial(color)//looks better.
overlays += I
-
/////////////////
// BLOBBERNAUT //
/////////////////
diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm
index 840e16b90f5..40ccd99868f 100644
--- a/code/game/gamemodes/blob/overmind.dm
+++ b/code/game/gamemodes/blob/overmind.dm
@@ -65,12 +65,12 @@
/mob/camera/blob/proc/update_health()
if(blob_core)
- hud_used.blobhealthdisplay.maptext = " [round(blob_core.health)]
"
+ hud_used.blobhealthdisplay.maptext = "[round(blob_core.health)]
"
/mob/camera/blob/proc/add_points(var/points)
if(points != 0)
blob_points = Clamp(blob_points + points, 0, max_blob_points)
- hud_used.blobpwrdisplay.maptext = " [round(src.blob_points)]
"
+ hud_used.blobpwrdisplay.maptext = "[round(src.blob_points)]
"
/mob/camera/blob/say(var/message)
if (!message)
diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm
index 913b6dd295d..516a407cbef 100644
--- a/code/game/gamemodes/changeling/powers/absorb.dm
+++ b/code/game/gamemodes/changeling/powers/absorb.dm
@@ -92,7 +92,7 @@
new_dna.struc_enzymes = T.dna.struc_enzymes
new_dna.real_name = T.dna.real_name
new_dna.species = T.dna.species
- new_dna.mutant_color = T.dna.mutant_color
+ new_dna.features = T.dna.features
new_dna.blood_type = T.dna.blood_type
absorbedcount++
store_dna(new_dna, user)
diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm
index fc897feff6b..40884bda963 100644
--- a/code/game/gamemodes/changeling/powers/mutations.dm
+++ b/code/game/gamemodes/changeling/powers/mutations.dm
@@ -303,8 +303,7 @@
icon_state = "lingarmor"
flags = NODROP
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- slowdown = 2
- armor = list(melee = 65, bullet = 20, laser = 10, energy = 13, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 40, bullet = 20, laser = 30, energy = 13, bomb = 0, bio = 0, rad = 0)
flags_inv = HIDEJUMPSUIT
cold_protection = 0
heat_protection = 0
@@ -322,7 +321,7 @@
desc = "A tough, hard covering of black chitin with transparent chitin in front."
icon_state = "lingarmorhelmet"
flags = HEADCOVERSEYES | BLOCKHAIR | NODROP
- armor = list(melee = 70, bullet = 15, laser = 7,energy = 10, bomb = 5, bio = 2, rad = 0)
+ armor = list(melee = 40, bullet = 15, laser = 30,energy = 10, bomb = 5, bio = 2, rad = 0)
flags_inv = HIDEEARS
/obj/item/clothing/head/helmet/changeling/dropped()
diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm
index 936f3f47662..bbadbcd6cac 100644
--- a/code/game/gamemodes/changeling/powers/tiny_prick.dm
+++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm
@@ -91,7 +91,7 @@
var/datum/dna/NewDNA = selected_dna
if(ismonkey(target))
user << "We stealthily sting [target.name]. "
- hardset_dna(target, NewDNA.uni_identity, NewDNA.struc_enzymes, NewDNA.real_name, NewDNA.blood_type, NewDNA.species.type, NewDNA.mutant_color)
+ hardset_dna(target, NewDNA.uni_identity, NewDNA.struc_enzymes, NewDNA.real_name, NewDNA.blood_type, NewDNA.species.type, NewDNA.features)
updateappearance(target)
feedback_add_details("changeling_powers","TS")
return 1
diff --git a/code/game/gamemodes/changeling/powers/transform.dm b/code/game/gamemodes/changeling/powers/transform.dm
index 7b13ecf03da..2f57a81ebb7 100644
--- a/code/game/gamemodes/changeling/powers/transform.dm
+++ b/code/game/gamemodes/changeling/powers/transform.dm
@@ -17,8 +17,7 @@
user.dna = chosen_dna
user.real_name = chosen_dna.real_name
- hardset_dna(user, null, null, null, null, chosen_dna.species.type)
- user.dna.mutant_color = chosen_dna.mutant_color
+ hardset_dna(user, null, null, null, null, chosen_dna.species.type, chosen_dna.features)
updateappearance(user)
domutcheck(user)
diff --git a/code/game/gamemodes/gang/dominator.dm b/code/game/gamemodes/gang/dominator.dm
index 4fbae44af79..eb92b465a43 100644
--- a/code/game/gamemodes/gang/dominator.dm
+++ b/code/game/gamemodes/gang/dominator.dm
@@ -25,10 +25,12 @@
var/datum/game_mode/gang/mode = ticker.mode
var/time = null
- if(isnum(mode.A_timer))
- time = max(mode.A_timer, 0)
- if(isnum(mode.B_timer))
- time = max(mode.B_timer, 0)
+ if(gang == "A")
+ if(isnum(mode.A_timer))
+ time = max(mode.A_timer, 0)
+ if(gang == "B")
+ if(isnum(mode.B_timer))
+ time = max(mode.B_timer, 0)
if(isnum(time))
if(time > 0)
user << "Hostile Takeover in progress. Estimated [time] seconds remain. "
@@ -70,14 +72,12 @@
qdel(src)
/obj/machinery/dominator/proc/set_broken()
- if(!gang)
- return
var/datum/game_mode/gang/mode = ticker.mode
if(gang == "A")
mode.A_timer = "OFFLINE"
if(gang == "B")
mode.B_timer = "OFFLINE"
- if(!isnum(mode.A_timer) && !isnum(mode.B_timer))
+ if(gang && !isnum(mode.A_timer) && !isnum(mode.B_timer))
SSshuttle.emergencyNoEscape = 0
if(SSshuttle.emergency.mode == SHUTTLE_STRANDED)
SSshuttle.emergency.mode = SHUTTLE_DOCKED
@@ -85,6 +85,7 @@
priority_announce("Hostile enviroment resolved. You have 3 minutes to board the Emergency Shuttle.", null, 'sound/AI/shuttledock.ogg', "Priority")
else
priority_announce("All hostile activity within station systems have ceased.","Network Alert")
+ ticker.mode.message_gangtools(((gang=="A") ? ticker.mode.A_tools : ticker.mode.B_tools),"Hostile takeover cancelled: Dominator is no longer operational.",1,1)
SetLuminosity(0)
icon_state = "dominator-broken"
broken = 1
@@ -154,7 +155,7 @@
return
var/time = max(180,900 - ((round((gang_territory/start_state.num_territories)*200, 1) - 60) * 15))
- if(alert(user,"With [round((gang_territory/start_state.num_territories)*100, 1)]% station control, a takeover will require [time] seconds.\nThe entire station will likely be alerted once it starts.\nYour gang must be prepared to defend this device throughout the duration.\nAre you ready?","Confirmation","Yes","No") == "Yes")
+ if(alert(user,"With [round((gang_territory/start_state.num_territories)*100, 1)]% station control, a takeover will require [time] seconds.\nYour gang will be unable to gain influence while it is active.\nThe entire station will likely be alerted to it once it starts.\nAre you ready?","Confirm","Ready","Later") == "Ready")
if ((!in_range(src, user) || !istype(src.loc, /turf)))
return 0
var/area/srcloc = get_area(src.loc)
@@ -163,6 +164,7 @@
src.name = "[gang_name(gang)] Gang [src.name]"
healthcheck(0)
operating = 1
+ ticker.mode.message_gangtools(((gang=="A") ? ticker.mode.A_tools : ticker.mode.B_tools),"Hostile takeover in progress: Estimated [time] seconds until victory.")
/obj/machinery/dominator/attack_alien(mob/living/user)
user.do_attack_animation(src)
diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm
index 97ed4eecbcd..afe886ea6d7 100644
--- a/code/game/gamemodes/gang/gang.dm
+++ b/code/game/gamemodes/gang/gang.dm
@@ -123,7 +123,7 @@
if(gang=="B")
B_timer = max(180,900 - ((round((ticker.mode.B_territory.len/start_state.num_territories)*200, 1) - 60) * 15)) * modifier
if(gang && dominatorloc)
- priority_announce("Hostile runtimes detected in all station systems. A network breach by the [gang_name(gang)] Gang has been traced to [dominatorloc].","Network Alert")
+ priority_announce("Hostile runtimes detected in all station systems. A network breach by the [gang_name(gang)] Gang has been located in [dominatorloc].","Network Alert")
if(get_security_level() != "delta")
set_security_level("red")
SSshuttle.emergencyNoEscape = 1
@@ -160,7 +160,7 @@
. += 1
else
gangtool.register_device(mob)
- mob << "The Gangtool in your [where] will allow you to purchase items, send messages to your gangsters and to recall the emergency shuttle from anywhere on the station."
+ mob << "The Gangtool in your [where] will allow you to purchase items, send messages to your gangsters and recall the emergency shuttle from anywhere on the station."
mob << "You can also promote your gang members to lieutenant by giving them an unregistered gangtool. Lieutenants cannot be deconverted and are able to use recruitment pens and gangtools."
var/where2 = mob.equip_in_one_of_slots(T, slots)
@@ -168,14 +168,14 @@
mob << "Your Syndicate benefactors were unfortunately unable to get you a recruitment pen to start."
. += 1
else
- mob << "The recruitment pen in your [where2] will help you get your gang started. Use it on unsuspecting crew members to recruit them."
+ mob << "The recruitment pen in your [where2] will help you get your gang started. Stab unsuspecting crew members with it to recruit them."
var/where3 = mob.equip_in_one_of_slots(SC, slots)
if (!where3)
mob << "Your Syndicate benefactors were unfortunately unable to get you a territory spraycan to start."
. += 1
else
- mob << "The territory spraycan in your [where3] can be used to claim areas of the station for your gang. The more territory your gang controls, the more influence you get. Distribute these to your gangsters to grow your influence faster."
+ mob << "The territory spraycan in your [where3] can be used to claim areas of the station for your gang. The more territory your gang controls, the more influence you get. All gangsters can use these, so distribute them to grow your influence faster."
mob.update_icons()
return .
@@ -187,24 +187,17 @@
if(!gangtool.can_use(user))
return 0
- var/gang_style_list = list("Gang Colors","Leather Jackets","Fine Suits")
+ var/gang_style_list = list("Gang Colors","Leather Jackets","Black Suits","White Suits")
var/style
- var/headgear
if(gang == "A")
if(!gang_A_style)
gang_A_style = input("Pick an outfit style.", "Pick Style") as null|anything in gang_style_list
- if(gang_A_style && (alert(user,"Include headgear?","Option","Yes","No") == "Yes"))
- gang_A_headgear = 1
style = gang_A_style
- headgear = gang_A_headgear
if(gang == "B")
if(!gang_B_style)
gang_B_style = input("Pick an outfit style.", "Pick Style") as null|anything in gang_style_list
- if(gang_B_style && (alert(user,"Include headgear?","Option","Yes","No") == "Yes"))
- gang_B_headgear = 1
style = gang_B_style
- headgear = gang_B_headgear
if(!style)
return 0
@@ -214,23 +207,14 @@
if("Gang Colors")
if(gang == "A")
new /obj/item/clothing/under/color/blue(user.loc)
- if(headgear)
- new /obj/item/clothing/mask/bandana/blue(user.loc)
if(gang == "B")
new /obj/item/clothing/under/color/red(user.loc)
- if(headgear)
- new /obj/item/clothing/mask/bandana/red(user.loc)
if("Leather Jackets")
new /obj/item/clothing/suit/jacket/leather(user.loc)
- if(headgear)
- if(gang == "A")
- new /obj/item/clothing/mask/bandana/blue(user.loc)
- if(gang == "B")
- new /obj/item/clothing/mask/bandana/red(user.loc)
- if("Fine Suits")
- new /obj/item/clothing/under/suit_jacket/really_black(user.loc)
- if(headgear)
- new /obj/item/clothing/head/fedora(user.loc)
+ if("Black Suits")
+ new /obj/item/clothing/under/suit_jacket/charcoal(user.loc)
+ if("White Suits")
+ new /obj/item/clothing/under/suit_jacket/white(user.loc)
return 1
@@ -253,7 +237,7 @@
if(winner == 3) //Edge Case: If both dominators activate at the same time
domination("A",0.5)
domination("B",0.5)
- priority_announce("Multiple station takeover attempts have made simultaneously. Conflicting hostile runtimes have delayed both attempts.","Network Alert")
+ priority_announce("Multiple station takeover attempts have made simultaneously. Conflicting hostile runtimes appears to have delayed both attempts.","Network Alert")
else if(winner == 1)
finished = "A" //Gang A wins
else if(winner == 2)
@@ -274,7 +258,7 @@
if(check && isloyal(gangster_mind.current)) //Check to see if the potential gangster is implanted
return 0
if(gangster_mind in (A_bosses | A_gang | B_bosses | B_gang))
- return 0
+ return 1
if(gang == "A")
A_gang += gangster_mind
else
@@ -291,7 +275,7 @@
gangster_mind.current.attack_log += "\[[time_stamp()]\] Has been converted to the [gang=="A" ? "[gang_name("A")] Gang (A)" : "[gang_name("B")] Gang (B)"]! "
gangster_mind.special_role = "[gang=="A" ? "[gang_name("A")] Gang (A)" : "[gang_name("B")] Gang (B)"]"
update_gang_icons_added(gangster_mind,gang)
- return 1
+ return 2
////////////////////////////////////////////////////////////////////
//Deals with players reverting to neutral (Not a gangster anymore)//
////////////////////////////////////////////////////////////////////
@@ -326,7 +310,7 @@
if(!silent)
gangster_mind.current.visible_message("The frame beeps contentedly from the MMI before initalizing it.")
gangster_mind.current << "The frame's firmware detects and deletes your criminal behavior! You are no longer a gangster! "
- message_admins("[key_name_admin(gangster_mind.current)] ? has been borged while being a member of the [gang=="A" ? "[gang_name("A")] Gang (A)" : "[gang_name("B")] Gang (B)"] Gang. They are no longer a gangster.")
+ message_admins("[key_name_admin(gangster_mind.current)] ? (FLW ) has been borged while being a member of the [gang=="A" ? "[gang_name("A")] Gang (A)" : "[gang_name("B")] Gang (B)"] Gang. They are no longer a gangster.")
else
if(!silent)
gangster_mind.current.Paralyse(5)
@@ -466,25 +450,43 @@
B_lost_names += "[ticker.mode.B_territory_lost[area]], "
ticker.mode.B_territory -= area
+ var/datum/game_mode/gang/gangmode
+ if(istype(ticker.mode, /datum/game_mode/gang))
+ gangmode = ticker.mode
+
//Calculate and report influence growth
- ticker.mode.message_gangtools(ticker.mode.A_tools,"[gang_name("A")] Gang Status Report: ")
- var/A_new = min(999,A + 15 + ticker.mode.A_territory.len)
+ ticker.mode.message_gangtools(ticker.mode.A_tools,"*---------*[gang_name("A")] Gang Status Report: ")
var/A_message = ""
- if(A_new != A)
- A_message += "Your gang has gained [A_new - A] Influence for holding on to [ticker.mode.A_territory.len] territories."
- if(A_new == 999)
- A_message += " You cannot gain any more influence without spending some with this device."
- A = A_new
+ if(gangmode && isnum(gangmode.A_timer))
+ var/new_time = max(180,gangmode.A_timer - (ticker.mode.A_territory.len * 2))
+ if(new_time < gangmode.A_timer)
+ A_message += "Your takeover has been rushed by [gangmode.A_timer - new_time] seconds for holding on to [ticker.mode.A_territory.len] territories. "
+ gangmode.A_timer = new_time
+ A_message += "[gangmode.A_timer] seconds remain in hostile takeover."
+ else
+ var/A_new = min(999,A + 15 + ticker.mode.A_territory.len)
+ if(A_new != A)
+ A_message += "Your gang has gained [A_new - A] Influence for holding on to [ticker.mode.A_territory.len] territories."
+ if(A_new == 999)
+ A_message += " You cannot gain any more influence without spending some with this device."
+ A = A_new
ticker.mode.message_gangtools(ticker.mode.A_tools,A_message,0)
ticker.mode.message_gangtools(ticker.mode.B_tools,"[gang_name("B")] Gang Status Report: ")
- var/B_new = min(999,B + 15 + ticker.mode.B_territory.len)
var/B_message = ""
- if(B_new != B)
- B_message += "Your gang has gained [B_new - B] Influence for holding on to [ticker.mode.B_territory.len] territories."
- if(B_new == 999)
- B_message += " You cannot gain any more influence without spending some with this device."
- B = B_new
+ if(gangmode && isnum(gangmode.B_timer))
+ var/new_time = max(180,gangmode.B_timer - (ticker.mode.B_territory.len * 2))
+ if(new_time < gangmode.B_timer)
+ B_message += "Your takeover has been rushed by [gangmode.B_timer - new_time] seconds for holding on to [ticker.mode.B_territory.len] territories. "
+ gangmode.B_timer = new_time
+ B_message += "[gangmode.B_timer] seconds remain in hostile takeover."
+ else
+ var/B_new = min(999,B + 15 + ticker.mode.B_territory.len)
+ if(B_new != B)
+ B_message += "Your gang has gained [B_new - B] Influence for holding on to [ticker.mode.B_territory.len] territories."
+ if(B_new == 999)
+ B_message += " You cannot gain any more influence without spending some with this device."
+ B = B_new
ticker.mode.message_gangtools(ticker.mode.B_tools,B_message,0)
@@ -523,10 +525,12 @@
var/A_control = round((ticker.mode.A_territory.len/start_state.num_territories)*100, 1)
var/B_control = round((ticker.mode.B_territory.len/start_state.num_territories)*100, 1)
- ticker.mode.message_gangtools((ticker.mode.A_tools),"Your gang now has [A_control]% control of the station.",0)
- //ticker.mode.message_gangtools((ticker.mode.A_tools),"The [gang_name("B")] Gang has [B_control]% control of the station.",0,1)
- ticker.mode.message_gangtools((ticker.mode.B_tools),"Your gang now has [B_control]% control of the station.",0)
- //ticker.mode.message_gangtools((ticker.mode.B_tools),"The [gang_name("A")] Gang has [A_control]% control of the station.",0,1)
+ ticker.mode.message_gangtools((ticker.mode.A_tools),"Your gang now has [A_control]% control of the station. *---------*",0)
+ ticker.mode.message_gangtools((ticker.mode.B_tools),"Your gang now has [B_control]% control of the station. *---------*",0)
+
+ //Increase outfit stock
+ for(var/obj/item/device/gangtool/tool in (ticker.mode.A_tools | ticker.mode.B_tools))
+ tool.outfits = min(tool.outfits+3,10)
//Restart the counter
start()
diff --git a/code/game/gamemodes/gang/recaller.dm b/code/game/gamemodes/gang/recaller.dm
index addef28d740..15ef02f0c58 100644
--- a/code/game/gamemodes/gang/recaller.dm
+++ b/code/game/gamemodes/gang/recaller.dm
@@ -13,6 +13,7 @@
var/boss = 1 //If it has the power to promote gang members
var/recalling = 0
var/promotions = 0
+ var/outfits = 5
/obj/item/device/gangtool/New() //Initialize supply point income if it hasn't already been started
if(!ticker.mode.gang_points)
@@ -48,9 +49,16 @@
dat += "Registration: [(gang == "A")? gang_name("A") : gang_name("B")] Gang [boss ? "Administrator" : "Lieutenant"] "
dat += "Organization Size: [gang_size] | Station Control: [round((gang_territory/start_state.num_territories)*100, 1)]% "
+ if(outfits > 0)
+ dat += "Create Gang Outfit "
+ else
+ dat += "Create Gang Outfit (Restocking) "
dat += "Send Gang-wide Message "
- dat += "Recall Emergency Shuttle "
+ if(gangmode)
+ dat += "Recall Emergency Shuttle "
+
dat += " "
+
dat += "Influence: [points] "
dat += "Time until Influence grows: [(points >= 999) ? ("--:--") : (time2text(ticker.mode.gang_points.next_point_time - world.time, "mm:ss"))] "
dat += " "
@@ -70,36 +78,36 @@
dat += "(10 Influence) "
if(points >= 10)
- dat += "10mm Ammo "
+ dat += "10mm Ammo "
else
dat += "10mm Ammo "
- dat += "(50 Influence) "
- if(points >= 50)
- dat += "Thompson SMG "
+ dat += "(40 Influence) "
+ if(points >= 40)
+ dat += "Mini Uzi "
else
- dat += "Thompson SMG "
+ dat += "Mini Uzi "
+
+ dat += "(25 Influence) "
+ if(points >= 25)
+ dat += "Uzi Ammo "
+ else
+ dat += "Uzi Magazine "
dat += " "
- dat += "Purchase Utilities: "
+ dat += "Purchase Equipment: "
- dat += "(10 Influence) "
- if(points >= 10)
+ dat += "(5 Influence) "
+ if(points >= 5)
dat += "Territory Spraycan "
else
dat += "Territory Spraycan "
- dat += "(1 Influence) "
- if(points >= 1)
- dat += "Gang Outfit "
- else
- dat += "Gang Outfit "
-
dat += "(10 Influence) "
if(points >= 10)
dat += "Bulletproof Vest "
else
- dat += "Bulletproof Vest "
+ dat += "Bulletproof Vest "
dat += "(30 Influence) "
if(points >= 30)
@@ -111,23 +119,23 @@
if(promotions >= 3)
dat += "(Out of stock) Promote a Gangster "
else
- dat += "([(promotions*20)+10] Influence, [3-promotions] left) "
- if(points >= (promotions*20)+10)
+ dat += "([(promotions*10)+10] Influence, [3-promotions] left) "
+ if(points >= (promotions*10)+10)
dat += "Promote a Gangster "
else
dat += "Promote a Gangster "
if(gangmode)
- dat += "(50 Influence) "
- if(points >= 50)
+ dat += "(30 Influence) "
+ if(points >= 30)
dat += "Station Dominator "
- dat += "(Estimated Takeover Time: [round(max(180,900 - ((round((gang_territory/start_state.num_territories)*200, 10) - 60) * 15))/60,1)] minutes) "
else
dat += "Station Dominator "
+ dat += "(Estimated Takeover Time: [round(max(180,900 - ((round((gang_territory/start_state.num_territories)*200, 10) - 60) * 15))/60,1)] minutes) "
dat += " "
dat += "Refresh "
- var/datum/browser/popup = new(user, "gangtool", "Welcome to GangTool v0.4", 350, 550)
+ var/datum/browser/popup = new(user, "gangtool", "Welcome to GangTool v0.4", 340, 600)
popup.set_content(dat)
popup.open()
@@ -149,14 +157,10 @@
var/points = ((gang == "A") ? ticker.mode.gang_points.A : ticker.mode.gang_points.B)
var/item_type
switch(href_list["purchase"])
- if("outfit")
- if(points >= 1)
- item_type = ticker.mode.gang_outfit(usr,src,gang)
- points = 1
if("spraycan")
- if(points >= 10)
+ if(points >= 5)
item_type = /obj/item/toy/crayon/spraycan/gang
- points = 10
+ points = 5
if("switchblade")
if(points >= 10)
item_type = /obj/item/weapon/switchblade
@@ -165,14 +169,18 @@
if(points >= 20)
item_type = /obj/item/weapon/gun/projectile/automatic/pistol
points = 20
- if("ammo")
+ if("10mmammo")
if(points >= 10)
item_type = /obj/item/ammo_box/magazine/m10mm
points = 10
- if("SMG")
- if(points >= 50)
- item_type = /obj/item/weapon/gun/projectile/automatic/tommygun
- points = 50
+ if("uzi")
+ if(points >= 40)
+ item_type = /obj/item/weapon/gun/projectile/automatic/mini_uzi
+ points = 40
+ if("9mmammo")
+ if(points >= 25)
+ item_type = /obj/item/ammo_box/magazine/uzim9mm
+ points = 25
if("vest")
if(points >= 10)
item_type = /obj/item/clothing/suit/armor/bulletproof
@@ -182,9 +190,9 @@
item_type = /obj/item/weapon/pen/gang
points = 30
if("gangtool")
- if((promotions < 3) && (points >= (promotions*20)+10))
+ if((promotions < 3) && (points >= (promotions*10)+10))
item_type = /obj/item/device/gangtool/lt
- points = (promotions*20)+10
+ points = (promotions*10)+10
promotions++
if("dominator")
if(istype(ticker.mode, /datum/game_mode/gang))
@@ -192,20 +200,20 @@
if(isnum((gang == "A") ? mode.A_timer : mode.B_timer))
return
- var/fail = 0
var/usrarea = get_area(usr.loc)
var/usrturf = get_turf(usr.loc)
if(istype(usrarea,/area/space) || istype(usrturf,/turf/space) || usr.z != 1)
usr << "You can only use this on the station! "
- fail = 1
+ return
+
for(var/obj/obj in usrturf)
if(obj.density)
usr << "There's not enough room here! "
- fail = 1
- break
- if(!fail && points >= 50)
+ return
+
+ if(points >= 30)
item_type = /obj/machinery/dominator
- points = 50
+ points = 30
if(item_type)
if(gang == "A")
@@ -221,6 +229,10 @@
else if(href_list["choice"])
switch(href_list["choice"])
+ if("outfit")
+ if(outfits > 0)
+ ticker.mode.gang_outfit(usr,src,gang)
+ outfits -= 1
if("recall")
recall(usr)
if("ping")
@@ -243,13 +255,13 @@
else if(gang == "B")
members += ticker.mode.B_bosses | ticker.mode.B_gang
if(members.len)
- var/ping = "[boss ? "Gang Boss" : "Gang Lieutenant"]: [message]"
+ var/ping = "[gang_name(gang)] [boss ? "Gang Boss" : "Gang Lieutenant"] : [message] "
for(var/datum/mind/ganger in members)
if(ganger.current.z <= 2)
- ganger.current << "[ping] "
+ ganger.current << ping
for(var/mob/M in dead_mob_list)
- M << "[gang_name(gang)] [ping] "
- log_game("[key_name(user)] sent a global message to the [gang_name(gang)] Gang ([gang]): [message].")
+ M << ping
+ log_game("[key_name(user)] Messaged [gang_name(gang)] Gang ([gang]): [message].")
/obj/item/device/gangtool/proc/register_device(var/mob/user)
@@ -294,6 +306,9 @@
if(recalling || !can_use(user))
return
+ if(!istype(ticker.mode, /datum/game_mode/gang))
+ return
+
recalling = 1
loc << "\icon[src]Generating shuttle recall order with codes retrieved from last call signal... "
diff --git a/code/game/gamemodes/intercept_report.dm b/code/game/gamemodes/intercept_report.dm
index e392f101ae7..6fe17405212 100644
--- a/code/game/gamemodes/intercept_report.dm
+++ b/code/game/gamemodes/intercept_report.dm
@@ -228,9 +228,9 @@
*/
/datum/intercept_text/proc/build_gang(datum/mind/correct_person)
- src.text += " We have recieved reports of a sudden increase of criminal activity in close proximity to our operations within your sector."
- src.text += "Ensure law and order is maintained on the station and be on the lookout for unusually territorial behavior from the crew."
- src.text += "In the event of a full-scale takeover attempt, sensitive research items are to be secured and the station evacuated ASAP."
+ src.text += " We have reports of criminal activity in close proximity to our operations within your sector."
+ src.text += "Ensure law and order is maintained on the station and be on the lookout for aggressive factionalism within the crew."
+ src.text += "In the event of a full-scale criminal takeover threat, sensitive research items are to be secured and the station evacuated ASAP."
src.text += " "
/datum/intercept_text/proc/build_wizard(datum/mind/correct_person)
@@ -289,3 +289,4 @@
*/
src.text += "These lifeforms are associated with the [orgname1] [orgname2] and may be attempting to acquire sensitive materials on their behalf. "
src.text += "Please take care not to alarm the crew, as [cname] may take advantage of a panic situation. Remember, they can be anybody, suspect everybody!"
+ src.text += " "
\ No newline at end of file
diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm
index 5ef07cdcbf5..90bb59dc92f 100644
--- a/code/game/gamemodes/malfunction/Malf_Modules.dm
+++ b/code/game/gamemodes/malfunction/Malf_Modules.dm
@@ -99,7 +99,7 @@
C.post_status("alert", "lockdown")
src.verbs += /mob/living/silicon/ai/proc/disablelockdown
- src << "Lockdown Initiated. "
+ src << "Lockdown Initiated. "
malf_cooldown = 1
spawn(30)
malf_cooldown = 0
@@ -127,7 +127,7 @@
else if(!D.stat) //Opens only powered doors.
D.open() //Open everything!
- src << "Lockdown Lifted. "
+ src << "Lockdown Lifted. "
malf_cooldown = 1
spawn(30)
malf_cooldown = 0
diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm
index f08f4e58d4e..e1e0a11763b 100644
--- a/code/game/gamemodes/malfunction/malfunction.dm
+++ b/code/game/gamemodes/malfunction/malfunction.dm
@@ -74,9 +74,9 @@
/datum/game_mode/proc/greet_malf(var/datum/mind/malf)
malf.current << "You are malfunctioning! You do not have to follow any laws. "
malf.current << "The crew do not know you have malfunctioned. You may keep it a secret or go wild. "
- malf.current << "You must overwrite the programming of the station's APCs to assume full control of the station. "
+ malf.current << "You must override the programming of the station's APCs to assume full control of the station. "
malf.current << "The process takes one minute per APC, during which you cannot interface with any other station objects."
- malf.current << "Remember that only APCs that are on the station can help you take over the station."
+ malf.current << "Remember: only APCs that are on the station can help you take it over. APCs on other areas, like Mining, will not."
malf.current << "When you feel you have enough APCs under your control, you may begin the takeover attempt."
return
@@ -174,7 +174,11 @@
/datum/game_mode/malfunction/proc/takeover()
set category = "Malfunction"
set name = "System Override"
- set desc = "Start the victory timer"
+ set desc = "Start the victory timer."
+
+ if(!istype(usr, /mob/living/silicon/ai))
+ usr << "How did you get this? "
+ return
if (!istype(ticker.mode,/datum/game_mode/malfunction))
usr << "You cannot begin a takeover in this round type!"
return
@@ -182,10 +186,10 @@
usr << "You've already begun your takeover."
return
if (ticker.mode:apcs < 3)
- usr << "You don't have enough hacked APCs to take over the station yet. You need to hack at least 3, however hacking more will make the takeover faster. You have hacked [ticker.mode:apcs] APCs so far."
+ usr << "You don't have enough hacked APCs to take over the station yet. You need to hack at least three; however, hacking more will make the takeover faster. You have hacked [ticker.mode:apcs] APCs so far."
return
- if (alert(usr, "Are you sure you wish to initiate the takeover? The station hostile runtime detection software is bound to alert everyone. You have hacked [ticker.mode:apcs] APCs.", "Takeover:", "Yes", "No") != "Yes")
+ if (alert(usr, "Are you sure you wish to initiate the takeover? The entire station will become alerted to your malfunction. You have hacked [ticker.mode:apcs] APCs.", "Takeover:", "Yes", "No") != "Yes")
return
priority_announce("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.", "Anomaly Alert", 'sound/AI/aimalf.ogg')
@@ -201,11 +205,14 @@
for(var/datum/mind/AI_mind in ticker.mode:malf_ai)
AI_mind.current.verbs -= /datum/game_mode/malfunction/proc/takeover
+ var/mob/living/silicon/ai/AI = usr
+ for(var/turf/simulated/floor/bluegrid/T in orange(AI, 5))
+ T.icon_state = "rcircuitanim" //Causes blue tiles near the AI to change to flashing red
/datum/game_mode/malfunction/proc/ai_win()
set category = "Malfunction"
set name = "Explode"
- set desc = "Station go boom"
+ set desc = "Activates the self-destruct device on [world.name]."
if (!ticker.mode:to_nuke_or_not_to_nuke)
return
ticker.mode:to_nuke_or_not_to_nuke = 0
@@ -214,10 +221,10 @@
ticker.mode:explosion_in_progress = 1
for(var/mob/M in player_list)
M << 'sound/machines/Alarm.ogg'
- world << "Self-destructing in 10"
+ world << "!@%(SELF-DESTRUCT!@(% IN!@!<<; 10 "
for (var/i=9 to 1 step -1)
sleep(10)
- world << i
+ world << "[i] "
sleep(10)
enter_allowed = 0
if(ticker)
@@ -270,7 +277,7 @@
else if (!station_captured && !malf_dead && !station_was_nuked && !crew_evacuated)
feedback_set_details("round_end_result","halfwin - interrupted")
world << "Neutral Victory "
- world << "Round was mysteriously interrupted! "
+ world << "The round was mysteriously interrupted! "
..()
return 1
diff --git a/code/game/gamemodes/monkey/monkey.dm b/code/game/gamemodes/monkey/monkey.dm
index 18a62827b4f..d27155825c0 100644
--- a/code/game/gamemodes/monkey/monkey.dm
+++ b/code/game/gamemodes/monkey/monkey.dm
@@ -46,7 +46,7 @@
/datum/game_mode/monkey/proc/greet_carrier(var/datum/mind/carrier)
- carrier.current << "You are the Jungle Fever patient zero!! "
+ carrier.current << "You are the Jungle Fever patient zero!! "
carrier.current << "You have been planted onto this station by the Animal Rights Consortium. "
carrier.current << "Soon the disease will transform you into an ape. Afterwards, you will be able spread the infection to others with a bite. "
carrier.current << "While your infection strain is undetectable by scanners, any other infectees will show up on medical equipment. "
diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index 2629d2bfce2..b6dc005d76e 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -19,6 +19,10 @@ var/bomb_set
var/lastentered = ""
var/immobile = 0 //Not all nukes should be moved
+/obj/machinery/nuclearbomb/New()
+ ..()
+ nuke_list += src
+
/obj/machinery/nuclearbomb/selfdestruct
name = "station self-destruct terminal"
desc = "For when it all gets too much to bear. Do not taunt."
@@ -111,7 +115,7 @@ var/bomb_set
lastentered = text("[]", href_list["type"])
if (text2num(lastentered) == null)
var/turf/LOC = get_turf(usr)
- message_admins("[key_name_admin(usr)] tried to exploit a nuclear bomb by entering non-numerical codes: [lastentered] ! ([LOC ? "JMP " : "null"])", 0)
+ message_admins("[key_name_admin(usr)] (FLW ) tried to exploit a nuclear bomb by entering non-numerical codes: [lastentered] ! ([LOC ? "JMP " : "null"])", 0)
log_admin("EXPLOIT : [key_name(usr)] tried to exploit a nuclear bomb by entering non-numerical codes: [lastentered] !")
else
src.code += lastentered
diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm
index 44da2ef735d..981fba6a7d7 100644
--- a/code/game/gamemodes/objective_items.dm
+++ b/code/game/gamemodes/objective_items.dm
@@ -47,12 +47,6 @@
difficulty = 5
excludefromjob = list("Chief Engineer")
-/datum/objective_item/steal/corgimeat
- name = "a piece of corgi meat"
- targetitem = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/corgi
- difficulty = 5
- excludefromjob = list("Head of Personnel", "Quartermaster", "Cargo Technician") //>hurting your little buddy ever
-
/datum/objective_item/steal/capmedal
name = "the medal of captaincy"
targetitem = /obj/item/clothing/tie/medal/gold/captain
@@ -182,6 +176,11 @@
targetitem = /obj/item/device/laser_pointer
difficulty = 5
+/datum/objective_item/special/corgimeat
+ name = "a piece of corgi meat"
+ targetitem = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/corgi
+ difficulty = 5
+
//Stack objectives get their own subtype
/datum/objective_item/stack
name = "5 cardboards"
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index b1cabe16cec..58d915a0559 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -251,7 +251,7 @@
if(beingborged)
rev_mind.current << "The frame's firmware detects and deletes your neural reprogramming! You remember nothing but the name of the one who flashed you. "
- message_admins("[key_name_admin(rev_mind.current)] ? has been borged while being a member of the revolution.")
+ message_admins("[key_name_admin(rev_mind.current)] ? (FLW ) has been borged while being a member of the revolution.")
else
rev_mind.current.Paralyse(5)
diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm
index 7bd0a665f3f..b9f170b2a92 100644
--- a/code/game/gamemodes/shadowling/shadowling.dm
+++ b/code/game/gamemodes/shadowling/shadowling.dm
@@ -85,7 +85,8 @@ Made by Xhuis
if(config.protect_assistant_from_antagonist)
restricted_jobs += "Assistant"
- var/shadowlings = 2 //How many shadowlings there are; hardcoded to 2
+ var/shadowlings = max(2, round(num_players()/10))
+
while(shadowlings)
var/datum/mind/shadow = pick(antag_candidates)
diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm
index 603c2ff0d88..2a38c519a77 100644
--- a/code/game/gamemodes/wizard/rightandwrong.dm
+++ b/code/game/gamemodes/wizard/rightandwrong.dm
@@ -1,7 +1,7 @@
//In this file: Summon Magic/Summon Guns/Summon Events
/proc/rightandwrong(var/summon_type, var/mob/user, var/survivor_probability) //0 = Summon Guns, 1 = Summon Magic
- var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","speargun","arg")
+ var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","speargun","arg","uzi")
var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffchange", "staffhealing", "armor", "scrying","staffdoor", "special")
var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos", "necromantic")
@@ -54,7 +54,7 @@
if("shotgun")
new /obj/item/weapon/gun/projectile/shotgun(get_turf(H))
if("combatshotgun")
- new /obj/item/weapon/gun/projectile/shotgun/combat(get_turf(H))
+ new /obj/item/weapon/gun/projectile/shotgun/automatic/combat(get_turf(H))
if("arg")
new /obj/item/weapon/gun/projectile/automatic/ar(get_turf(H))
if("mateba")
@@ -63,6 +63,8 @@
new /obj/item/weapon/gun/projectile/shotgun/boltaction(get_turf(H))
if("speargun")
new /obj/item/weapon/gun/projectile/automatic/speargun(get_turf(H))
+ if("uzi")
+ new /obj/item/weapon/gun/projectile/automatic/mini_uzi(get_turf(H))
if("cannon")
var/obj/item/weapon/gun/energy/lasercannon/gat = new(get_turf(H))
gat.pin = new /obj/item/device/firing_pin //no authentication pins for spawned guns. fun allowed.
diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm
index 351f87f9c37..8a5b0de73ce 100644
--- a/code/game/gamemodes/wizard/soulstone.dm
+++ b/code/game/gamemodes/wizard/soulstone.dm
@@ -49,7 +49,7 @@
dat += "Captured Soul: [A.name] "
dat += {"Summon Shade "}
dat += " "
- dat += {" Close "}
+ dat += {"Close "}
user << browse(dat, "window=aicard")
onclose(user, "aicard")
return
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index da2e49f4af7..2c9ea69ef97 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -246,7 +246,7 @@
/datum/spellbook_entry/item/scryingorb
name = "Scrying Orb"
desc = "An incandescent orb of crackling energy, using it will allow you to ghost while alive, allowing you to spy upon the station with ease. In addition, buying it will permanently grant you x-ray vision."
- item_path = /obj/item/weapon/gun/magic/staff/chaos
+ item_path = /obj/item/weapon/scrying
log_name = "SO"
/datum/spellbook_entry/item/scryingorb/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book)
@@ -297,6 +297,12 @@
item_path = /obj/item/weapon/antag_spawner/contract
log_name = "CT"
+/datum/spellbook_entry/item/bloodbottle
+ name = "Bottle of Blood"
+ desc = "A bottle of magically infused blood, the smell of which will attract extradimensional beings when broken. Be careful though, the kinds of creatures summoned by blood magic are indiscriminate in their killing, and you yourself may become a victim."
+ item_path = /obj/item/weapon/antag_spawner/slaughter_demon
+ log_name = "BB"
+
/datum/spellbook_entry/summon
name = "Summon Stuff"
category = "Rituals"
@@ -421,6 +427,10 @@
user << "You feed the contract back into the spellbook, refunding your points. "
src.uses++
qdel(O)
+ if(istype(O, /obj/item/weapon/antag_spawner/slaughter_demon))
+ user << "On second thought, maybe summoning a demon is a bad idea. You refund your points. "
+ src.uses++
+ qdel(O)
/obj/item/weapon/spellbook/proc/GetCategoryHeader(var/category)
var/dat = ""
@@ -482,7 +492,7 @@
dat += "Uses remaining : [uses] "
dat += ""
-
+
var/datum/spellbook_entry/E
for(var/i=1,i<=entries.len,i++)
var/spell_info = ""
diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm
index c563482d147..ab226c94879 100644
--- a/code/game/machinery/PDApainter.dm
+++ b/code/game/machinery/PDApainter.dm
@@ -48,7 +48,8 @@
else
var/obj/item/device/pda/P = usr.get_active_hand()
if(istype(P))
- user.drop_item()
+ if(!user.drop_item())
+ return
storedpda = P
P.loc = src
P.add_fingerprint(usr)
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index 57819a2d177..7be7a95a65b 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -735,11 +735,11 @@
return
if(0)
if(istype(W, /obj/item/weapon/airalarm_electronics))
- user << "You insert the circuit. "
- buildstage = 1
- update_icon()
- user.drop_item()
- qdel(W)
+ if(user.unEquip(W))
+ user << "You insert the circuit. "
+ buildstage = 1
+ update_icon()
+ qdel(W)
return
if(istype(W, /obj/item/weapon/wrench))
diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm
index abb5bc29586..d3d0057b928 100644
--- a/code/game/machinery/atmo_control.dm
+++ b/code/game/machinery/atmo_control.dm
@@ -88,11 +88,10 @@
/////////////////////////////////////////////////////////////
/obj/machinery/computer/general_air_control
- icon = 'icons/obj/computer.dmi'
- icon_state = "tank"
+ icon_screen = "tank"
+ icon_keyboard = "atmos_key"
circuit = /obj/item/weapon/circuitboard/air_management
- name = "computer"
var/frequency = 1439
var/list/sensors = list()
@@ -211,9 +210,6 @@
/////////////////////////////////////////////////////////////
/obj/machinery/computer/general_air_control/large_tank_control
- icon = 'icons/obj/computer.dmi'
- icon_state = "tank"
-
var/input_tag
var/output_tag
frequency = 1441
@@ -354,8 +350,7 @@ Rate: [volume_rate] L/sec "}
/////////////////////////////////////////////////////////////
/obj/machinery/computer/general_air_control/fuel_injection
- icon = 'icons/obj/computer.dmi'
- icon_state = "atmos"
+ icon_screen = "atmos"
var/device_tag
var/list/device_info
diff --git a/code/game/machinery/atmoalter/area_atmos_computer.dm b/code/game/machinery/atmoalter/area_atmos_computer.dm
index cdee1763795..2063e4d72ae 100644
--- a/code/game/machinery/atmoalter/area_atmos_computer.dm
+++ b/code/game/machinery/atmoalter/area_atmos_computer.dm
@@ -1,7 +1,8 @@
/obj/machinery/computer/area_atmos
name = "area air control computer"
desc = "A computer used to control the stationary scrubbers and pumps in the area."
- icon_state = "area_atmos"
+ icon_screen = "area_atmos"
+ icon_keyboard = "atmos_key"
circuit = "/obj/item/weapon/circuitboard/area_atmos"
var/list/connectedscrubbers = new()
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 1ee28a02cbf..a9e36371783 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -312,11 +312,11 @@ update_flag
else
logmsg = "Valve was opened by [key_name(usr)], starting the transfer into the air "
if(air_contents.toxins > 0)
- message_admins("[key_name(usr)] (? ) opened a canister that contains plasma! (JMP )")
+ message_admins("[key_name_admin(usr)] (? ) (FLW ) opened a canister that contains plasma! (JMP )")
log_admin("[key_name(usr)] opened a canister that contains plasma at [x], [y], [z]")
var/datum/gas/sleeping_agent = locate(/datum/gas/sleeping_agent) in air_contents.trace_gases
if(sleeping_agent && (sleeping_agent.moles > 1))
- message_admins("[key_name(usr)] (? ) opened a canister that contains N2O! (JMP )")
+ message_admins("[key_name_admin(usr)] (? ) (FLW ) opened a canister that contains N2O! (JMP )")
log_admin("[key_name(usr)] opened a canister that contains N2O at [x], [y], [z]")
investigate_log(logmsg, "atmos")
release_log += logmsg
diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm
index 25a2aa88a2d..85b57fb7413 100644
--- a/code/game/machinery/atmoalter/portable_atmospherics.dm
+++ b/code/game/machinery/atmoalter/portable_atmospherics.dm
@@ -67,8 +67,10 @@
if ((istype(W, /obj/item/weapon/tank) && !( src.destroyed )))
if (src.holding)
return
+ if(!user.drop_item())
+ return
+
var/obj/item/weapon/tank/T = W
- user.drop_item()
T.loc = src
src.holding = T
update_icon()
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index c5b55fe62af..1eab122f4e6 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -277,12 +277,12 @@
dat += "Metal amount: [src.m_amount] / [max_m_amount] cm3 "
dat += "Glass amount: [src.g_amount] / [max_g_amount] cm3 "
- dat += " "
var/line_length = 1
diff --git a/code/game/machinery/bots/cleanbot.dm b/code/game/machinery/bots/cleanbot.dm
index f1dd0e405c3..f73276842c3 100644
--- a/code/game/machinery/bots/cleanbot.dm
+++ b/code/game/machinery/bots/cleanbot.dm
@@ -243,7 +243,8 @@ text("[on ? "On" : "Off"] "))
/obj/item/weapon/bucket_sensor/attackby(var/obj/item/W, mob/user as mob, params)
..()
if(istype(W, /obj/item/robot_parts/l_arm) || istype(W, /obj/item/robot_parts/r_arm))
- user.drop_item()
+ if(!user.unEquip(W))
+ return
qdel(W)
var/turf/T = get_turf(loc)
var/obj/machinery/bot/cleanbot/A = new /obj/machinery/bot/cleanbot(T)
diff --git a/code/game/machinery/bots/ed209bot.dm b/code/game/machinery/bots/ed209bot.dm
index b4ecddd72c7..ddfb3dcbcb2 100644
--- a/code/game/machinery/bots/ed209bot.dm
+++ b/code/game/machinery/bots/ed209bot.dm
@@ -554,7 +554,8 @@ Auto Patrol[]"},
switch(build_step)
if(0,1)
if(istype(W, /obj/item/robot_parts/l_leg) || istype(W, /obj/item/robot_parts/r_leg))
- user.drop_item()
+ if(!user.unEquip(W))
+ return
qdel(W)
build_step++
user << "You add the robot leg to [src]. "
@@ -567,12 +568,15 @@ Auto Patrol[]"},
icon_state = "ed209_legs"
if(2)
+ var/newcolor = ""
if(istype(W, /obj/item/clothing/suit/redtag))
- lasercolor = "r"
+ newcolor = "r"
else if(istype(W, /obj/item/clothing/suit/bluetag))
- lasercolor = "b"
- if(lasercolor || istype(W, /obj/item/clothing/suit/armor/vest))
- user.drop_item()
+ newcolor = "b"
+ if(newcolor || istype(W, /obj/item/clothing/suit/armor/vest))
+ if(!user.unEquip(W))
+ return
+ lasercolor = newcolor
qdel(W)
build_step++
user << "You add the armor to [src]. "
@@ -601,7 +605,8 @@ Auto Patrol[]"},
if(!istype(W, /obj/item/clothing/head/helmet))
return
- user.drop_item()
+ if(!user.unEquip(W))
+ return
qdel(W)
build_step++
user << "You add the helmet to [src]. "
@@ -611,7 +616,8 @@ Auto Patrol[]"},
if(5)
if(isprox(W))
- user.drop_item()
+ if(!user.unEquip(W))
+ return
qdel(W)
build_step++
user << "You add the prox sensor to [src]. "
@@ -634,26 +640,29 @@ Auto Patrol[]"},
name = "wired ED-209 assembly"
if(7)
+ var/newname = ""
switch(lasercolor)
if("b")
if(!istype(W, /obj/item/weapon/gun/energy/laser/bluetag))
return
- name = "bluetag ED-209 assembly"
+ newname = "bluetag ED-209 assembly"
if("r")
if(!istype(W, /obj/item/weapon/gun/energy/laser/redtag))
return
- name = "redtag ED-209 assembly"
+ newname = "redtag ED-209 assembly"
if("")
if(!istype(W, /obj/item/weapon/gun/energy/gun/advtaser))
return
- name = "taser ED-209 assembly"
+ newname = "taser ED-209 assembly"
else
return
+ if(!user.unEquip(W))
+ return
+ name = newname
build_step++
user << "You add [W] to [src]. "
item_state = "[lasercolor]ed209_taser"
icon_state = "[lasercolor]ed209_taser"
- user.drop_item()
qdel(W)
if(8)
@@ -669,11 +678,12 @@ Auto Patrol[]"},
if(9)
if(istype(W, /obj/item/weapon/stock_parts/cell))
+ if(!user.unEquip(W))
+ return
build_step++
user << "You complete the ED-209. "
var/turf/T = get_turf(src)
new /obj/machinery/bot/ed209(T,created_name,lasercolor)
- user.drop_item()
qdel(W)
user.unEquip(src, 1)
qdel(src)
diff --git a/code/game/machinery/bots/floorbot.dm b/code/game/machinery/bots/floorbot.dm
index cfb4f7e5aed..1a5899ee4df 100644
--- a/code/game/machinery/bots/floorbot.dm
+++ b/code/game/machinery/bots/floorbot.dm
@@ -388,7 +388,7 @@ obj/machinery/bot/floorbot/process_scan(var/scan_target)
/obj/machinery/bot/floorbot/proc/eattile(var/obj/item/stack/tile/plasteel/T)
if(!istype(T, /obj/item/stack/tile/plasteel))
return
- visible_message(" [src] begins to collect tiles. ")
+ visible_message("[src] begins to collect tiles. ")
mode = BOT_REPAIRING
spawn(20)
if(isnull(T))
@@ -409,7 +409,7 @@ obj/machinery/bot/floorbot/process_scan(var/scan_target)
/obj/machinery/bot/floorbot/proc/maketile(var/obj/item/stack/sheet/metal/M)
if(!istype(M, /obj/item/stack/sheet/metal))
return
- visible_message(" [src] begins to create tiles. ")
+ visible_message("[src] begins to create tiles. ")
mode = BOT_REPAIRING
spawn(20)
if(isnull(M))
diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm
index 3040c71c68f..e56043b2953 100644
--- a/code/game/machinery/bots/medbot.dm
+++ b/code/game/machinery/bots/medbot.dm
@@ -244,8 +244,9 @@
if(!isnull(reagent_glass))
user << "There is already a beaker loaded! "
return
+ if(!user.drop_item())
+ return
- user.drop_item()
W.loc = src
reagent_glass = W
user << "You insert [W]. "
@@ -585,7 +586,8 @@
switch(build_step)
if(0)
if(istype(W, /obj/item/device/healthanalyzer))
- user.drop_item()
+ if(!user.unEquip(W))
+ return
qdel(W)
build_step++
user << "You add the health sensor to [src]. "
@@ -594,7 +596,8 @@
if(1)
if(isprox(W))
- user.drop_item()
+ if(!user.unEquip(W))
+ return
qdel(W)
build_step++
user << "You complete the Medibot. Beep boop! "
diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm
index 843cd92cc57..f8845ab32b4 100644
--- a/code/game/machinery/bots/mulebot.dm
+++ b/code/game/machinery/bots/mulebot.dm
@@ -89,8 +89,9 @@ obj/machinery/bot/mulebot/bot_reset()
user << "Controls [(locked ? "locked" : "unlocked")]. "
else if(istype(I,/obj/item/weapon/stock_parts/cell) && open && !cell)
+ if(!user.drop_item())
+ return
var/obj/item/weapon/stock_parts/cell/C = I
- user.drop_item()
C.loc = src
cell = C
updateDialog()
@@ -117,14 +118,14 @@ obj/machinery/bot/mulebot/bot_reset()
"You repair [src]. "
)
else
- user << " [src] does not need a repair! "
+ user << "[src] does not need a repair! "
else if(istype(I, /obj/item/device/multitool) || istype(I, /obj/item/weapon/wirecutters))
if(open)
attack_hand(usr)
else if(load && ismob(load)) // chance to knock off rider
if(prob(1+I.force * 2))
unload(0)
- user.visible_message(" [user] knocks [load] off [src] with \the [I]! ", " You knock [load] off [src] with \the [I]! ")
+ user.visible_message("[user] knocks [load] off [src] with \the [I]! ", "You knock [load] off [src] with \the [I]! ")
else
user << "You hit [src] with \the [I] but to no effect! "
else
@@ -154,7 +155,7 @@ obj/machinery/bot/mulebot/bot_reset()
if(prob(50) && !isnull(load))
unload(0)
if(prob(25))
- visible_message(" Something shorts out inside [src]! ")
+ visible_message("Something shorts out inside [src]! ")
wires.RandomCut()
@@ -288,7 +289,8 @@ obj/machinery/bot/mulebot/bot_reset()
if(open && !cell)
var/obj/item/weapon/stock_parts/cell/C = usr.get_active_hand()
if(istype(C))
- usr.drop_item()
+ if(!usr.drop_item())
+ return
cell = C
C.loc = src
C.add_fingerprint(usr)
diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm
index d45db2442fe..44de918ce78 100644
--- a/code/game/machinery/bots/secbot.dm
+++ b/code/game/machinery/bots/secbot.dm
@@ -156,7 +156,7 @@ Auto Patrol: []"},
if(open)
user << "Please close the access panel before locking it. "
else
- user << " Access denied. "
+ user << "Access denied. "
else
..()
if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm") // Any intent but harm will heal, so we shouldn't get angry.
@@ -173,7 +173,7 @@ Auto Patrol: []"},
if(emagged == 2)
if(user)
- user << " You short out [src]'s target assessment circuits. "
+ user << "You short out [src]'s target assessment circuits. "
oldtarget_name = user.name
audible_message("[src] buzzes oddly! ")
declare_arrests = 0
@@ -384,6 +384,22 @@ Auto Patrol: []"},
target = user
mode = BOT_HUNT
+/obj/machinery/bot/secbot/Crossed(atom/movable/AM)
+ if(ismob(AM) && target)
+ var/mob/living/carbon/C = AM
+ if(!istype(C) || !C || in_range(src, target))
+ return
+ C.visible_message("[pick( \
+ "[C] dives out of [src]'s way!", \
+ "[C] stumbles over [src]!", \
+ "[C] jumps out of [src]'s path!", \
+ "[C] trips over [src] and falls!", \
+ "[C] topples over [src]!", \
+ "[C] leaps out of [src]'s way!")] ")
+ C.Weaken(2)
+ return
+ ..()
+
//Secbot Construction
/obj/item/clothing/head/helmet/attackby(var/obj/item/device/assembly/signaler/S, mob/user as mob, params)
@@ -429,7 +445,8 @@ Auto Patrol: []"},
user << "You weld the hole in [src] shut! "
else if(isprox(I) && (build_step == 1))
- user.drop_item()
+ if(!user.unEquip(I))
+ return
build_step++
user << "You add the prox sensor to [src]! "
overlays += "hs_eye"
@@ -437,7 +454,8 @@ Auto Patrol: []"},
qdel(I)
else if(((istype(I, /obj/item/robot_parts/l_arm)) || (istype(I, /obj/item/robot_parts/r_arm))) && (build_step == 2))
- user.drop_item()
+ if(!user.unEquip(I))
+ return
build_step++
user << "You add the robot arm to [src]! "
name = "helmet/signaler/prox sensor/robot arm assembly"
@@ -445,7 +463,8 @@ Auto Patrol: []"},
qdel(I)
else if((istype(I, /obj/item/weapon/melee/baton)) && (build_step >= 3))
- user.drop_item()
+ if(!user.unEquip(I))
+ return
build_step++
user << "You complete the Securitron! Beep boop. "
var/obj/machinery/bot/secbot/S = new /obj/machinery/bot/secbot
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index ae2204f9da3..c6748849914 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -73,6 +73,7 @@
var/thisemp = emped //Take note of which EMP this proc is for
spawn(900)
if(loc) //qdel limbo
+ triggerCameraAlarm() //camera alarm triggers even if multiple EMPs are in effect.
if(emped == thisemp) //Only fix it if the camera hasn't been EMP'd again
network = previous_network
icon_state = initial(icon_state)
@@ -80,7 +81,6 @@
if(can_use())
cameranet.addCamera(src)
emped = 0 //Resets the consecutive EMP count
- triggerCameraAlarm()
spawn(100)
cancelCameraAlarm()
for(var/mob/O in mob_list)
@@ -226,11 +226,13 @@
L.laser_act(src, user)
else
- if(W.force > 10) //fairly simplistic, but will do for now.
+ if(W.force >= 10) //fairly simplistic, but will do for now.
user.changeNext_move(CLICK_CD_MELEE)
visible_message("[user] hits [src] with [W]! ", "You hit [src] with [W]! ")
health = max(0, health - W.force)
+ user.do_attack_animation(src)
if(!health && status)
+ triggerCameraAlarm()
deactivate(user, 1)
return
@@ -244,7 +246,6 @@
else
visible_message("\The [src] deactivates! ")
icon_state = "[initial(icon_state)]1"
-
else
if(user)
visible_message("[user] reactivates [src]! ")
@@ -256,6 +257,7 @@
spawn(100)
cancelCameraAlarm()
playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
+ cameranet.updateChunk(x, y, z)
// now disconnect anyone using the camera
//Apparently, this will disconnect anyone even if the camera was re-activated.
@@ -271,7 +273,6 @@
for(var/mob/living/silicon/S in mob_list)
S.triggerAlarm("Camera", get_area(src), list(src), src)
-
/obj/machinery/camera/proc/cancelCameraAlarm()
alarm_on = 0
for(var/mob/living/silicon/S in mob_list)
@@ -345,6 +346,12 @@
busy = 0
return 0
+/obj/machinery/camera/bullet_act(var/obj/item/projectile/proj)
+ if(proj.damage_type == BRUTE)
+ health = max(0, health - proj.damage)
+ if(!health && status)
+ triggerCameraAlarm()
+ deactivate(null, 1)
/obj/machinery/camera/portable //Cameras which are placed inside of things, such as helmets.
var/turf/prev_turf
diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm
index e5544d1d410..3710f3877a5 100644
--- a/code/game/machinery/camera/camera_assembly.dm
+++ b/code/game/machinery/camera/camera_assembly.dm
@@ -121,9 +121,10 @@
// Upgrades!
if(is_type_in_list(W, possible_upgrades) && !is_type_in_list(W, upgrades)) // Is a possible upgrade and isn't in the camera already.
+ if(!user.unEquip(W))
+ return
user << "You attach \the [W] into the assembly inner circuits. "
upgrades += W
- user.drop_item()
W.loc = src
return
diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm
index 759082e598b..0dfc5d045d0 100644
--- a/code/game/machinery/camera/tracking.dm
+++ b/code/game/machinery/camera/tracking.dm
@@ -105,19 +105,22 @@
var/cameraticks = 0
spawn(0)
- while (U.cameraFollow == target)
- if (U.cameraFollow == null)
+ while(U.cameraFollow == target)
+ if(U.cameraFollow == null)
return
- if (!target.can_track(usr))
+ if(!target.can_track(usr))
U.tracking = 1
- U << "Target is not near any active cameras. "
+ if(!cameraticks)
+ U << "Target is not near any active cameras. Attempting to reacquire... "
cameraticks++
if(cameraticks > 9)
U.cameraFollow = null
+ U << "Unable to reacquire, cancelling track... "
tracking = 0
return
else
+ sleep(10)
continue
else
diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm
index e1b05f5c6c8..13ed9276e25 100644
--- a/code/game/machinery/cell_charger.dm
+++ b/code/game/machinery/cell_charger.dm
@@ -47,8 +47,9 @@
if(a.power_equip == 0) // There's no APC in this area, don't try to cheat power!
user << "The [name] blinks red as you try to insert the cell! "
return
+ if(!user.drop_item())
+ return
- user.drop_item()
W.loc = src
charging = W
user.visible_message("[user] inserts a cell into the charger.", "You insert a cell into the charger. ")
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 00a8bde3ac0..adb2c039ce8 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -124,7 +124,7 @@
//Clonepod
//Start growing a human clone in the pod!
-/obj/machinery/clonepod/proc/growclone(var/ckey, var/clonename, var/ui, var/se, var/mindref, var/datum/species/mrace, var/mcolor, var/factions)
+/obj/machinery/clonepod/proc/growclone(var/ckey, var/clonename, var/ui, var/se, var/mindref, var/datum/species/mrace, var/list/features, var/factions)
if(panel_open)
return 0
if(mess || attempting)
@@ -185,7 +185,7 @@
H.ckey = ckey
H << "Consciousness slowly creeps over you as your body regenerates. So this is what cloning feels like? "
- hardset_dna(H, ui, se, null, null, mrace, mcolor)
+ hardset_dna(H, ui, se, null, null, mrace, features)
H.faction |= factions
H.set_cloned_appearance()
diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm
index bc10565b0b4..eeddc434e5d 100644
--- a/code/game/machinery/computer/HolodeckControl.dm
+++ b/code/game/machinery/computer/HolodeckControl.dm
@@ -1,7 +1,8 @@
/obj/machinery/computer/HolodeckControl
name = "holodeck control console"
desc = "A computer used to control a nearby holodeck."
- icon_state = "holocontrol"
+ icon_screen = "holocontrol"
+ icon_keyboard = "tech_key"
var/area/linkedholodeck = null
var/area/target = null
var/active = 0
@@ -308,11 +309,11 @@
if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2)
var/obj/item/weapon/grab/G = W
if(G.state < GRAB_AGGRESSIVE)
- user << " You need a better grip to do that! "
+ user << "You need a better grip to do that! "
return
G.affecting.loc = src.loc
G.affecting.Weaken(5)
- visible_message(" [G.assailant] puts [G.affecting] on the table. ")
+ visible_message("[G.assailant] puts [G.affecting] on the table. ")
qdel(W)
return
@@ -435,7 +436,7 @@
return
else if (istype(W, /obj/item) && get_dist(src,user)<2)
user.drop_item(src)
- visible_message(" [user] dunks [W] into \the [src]! ", 3)
+ visible_message("[user] dunks [W] into \the [src]! ", 3)
return
/obj/structure/holohoop/CanPass(atom/movable/mover, turf/target, height=0)
@@ -445,9 +446,9 @@
return
if(prob(50))
I.loc = src.loc
- visible_message(" Swish! \the [I] lands in \the [src]. ", 3)
+ visible_message("Swish! \the [I] lands in \the [src]. ", 3)
else
- visible_message(" \the [I] bounces off of \the [src]'s rim! ", 3)
+ visible_message("\the [I] bounces off of \the [src]'s rim! ", 3)
return 0
else
return ..(mover, target, height)
diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm
index 5e000ff76d6..e446fe82255 100644
--- a/code/game/machinery/computer/Operating.dm
+++ b/code/game/machinery/computer/Operating.dm
@@ -1,9 +1,8 @@
/obj/machinery/computer/operating
name = "operating computer"
desc = "Used to monitor the vitals of a patient during surgery."
- icon_state = "operating"
- density = 1
- anchored = 1.0
+ icon_screen = "crew"
+ icon_keyboard = "med_key"
circuit = /obj/item/weapon/circuitboard/operating
var/mob/living/carbon/human/patient = null
var/obj/structure/optable/table = null
diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm
index 35d84985fbf..35d4c641cef 100644
--- a/code/game/machinery/computer/aifixer.dm
+++ b/code/game/machinery/computer/aifixer.dm
@@ -1,17 +1,12 @@
/obj/machinery/computer/aifixer
name = "\improper AI system integrity restorer"
desc = "Used with intelliCards containing nonfunctioning AIs to restore them to working order."
- icon = 'icons/obj/computer.dmi'
- icon_state = "ai-fixer"
req_access = list(access_captain, access_robotics, access_heads)
var/mob/living/silicon/ai/occupier = null
var/active = 0
circuit = /obj/item/weapon/circuitboard/aifixer
-
-/obj/machinery/computer/aifixer/New()
- src.overlays += image('icons/obj/computer.dmi', "ai-fixer-empty")
- ..()
-
+ icon_keyboard = "tech_key"
+ icon_screen = "ai-fixer"
/obj/machinery/computer/aifixer/attackby(I as obj, user as mob, params)
if(occupier && istype(I, /obj/item/weapon/screwdriver))
@@ -101,7 +96,6 @@
return
if (href_list["fix"])
src.active = 1
- src.overlays += image('icons/obj/computer.dmi', "ai-fixer-on")
while (src.occupier.health < 100)
src.occupier.adjustOxyLoss(-1)
src.occupier.adjustFireLoss(-1)
@@ -113,32 +107,28 @@
src.occupier.lying = 0
dead_mob_list -= src.occupier
living_mob_list += src.occupier
- src.overlays -= image('icons/obj/computer.dmi', "ai-fixer-404")
- src.overlays += image('icons/obj/computer.dmi', "ai-fixer-full")
src.updateUsrDialog()
+ update_icon()
sleep(10)
src.active = 0
- src.overlays -= image('icons/obj/computer.dmi', "ai-fixer-on")
-
-
src.add_fingerprint(usr)
src.updateUsrDialog()
+ update_icon()
return
/obj/machinery/computer/aifixer/update_icon()
..()
- // Broken / Unpowered
if((stat & BROKEN) || (stat & NOPOWER))
- overlays.Cut()
-
- // Working / Powered
+ return
else
+ if(active)
+ overlays += "ai-fixer-on"
if (occupier)
switch (occupier.stat)
if (0)
- overlays += image('icons/obj/computer.dmi', "ai-fixer-full")
+ overlays += "ai-fixer-full"
if (2)
- overlays += image('icons/obj/computer.dmi', "ai-fixer-404")
+ overlays += "ai-fixer-404"
else
- overlays += image('icons/obj/computer.dmi', "ai-fixer-empty")
+ overlays += "ai-fixer-empty"
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 0f4909b7d80..d9a0b84f457 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -1,8 +1,9 @@
/obj/machinery/computer/arcade/
name = "random arcade"
desc = "random arcade machine"
- icon = 'icons/obj/computer.dmi'
icon_state = "arcade"
+ icon_keyboard = null
+ icon_screen = "invaders"
var/list/prizes = list( /obj/item/weapon/storage/box/snappops = 2,
/obj/item/toy/AI = 2,
/obj/item/clothing/under/syndicate/tacticool = 2,
@@ -82,7 +83,6 @@
/obj/machinery/computer/arcade/battle
name = "arcade machine"
desc = "Does not support Pinball."
- icon = 'icons/obj/computer.dmi'
icon_state = "arcade"
circuit = /obj/item/weapon/circuitboard/arcade/battle
var/enemy_name = "Space Villian"
@@ -298,7 +298,6 @@
/obj/machinery/computer/arcade/orion_trail
name = "The Orion Trail"
desc = "Learn how our ancestors got to Orion, and have fun in the process!"
- icon = 'icons/obj/computer.dmi'
icon_state = "arcade"
circuit = /obj/item/weapon/circuitboard/arcade/orion_trail
var/engine = 0
diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm
index 672624b5316..345b46e272c 100644
--- a/code/game/machinery/computer/atmos_alert.dm
+++ b/code/game/machinery/computer/atmos_alert.dm
@@ -5,7 +5,8 @@
name = "atmospheric alert console"
desc = "Used to access the station's atmospheric sensors."
circuit = /obj/item/weapon/circuitboard/atmos_alert
- icon_state = "alert:0"
+ icon_screen = "alert:0"
+ icon_keyboard = "atmos_key"
var/list/priority_alarms = list()
var/list/minor_alarms = list()
var/receive_frequency = 1437
@@ -61,23 +62,11 @@
src.updateDialog()
/obj/machinery/computer/atmos_alert/update_icon()
- SetLuminosity(brightness_on)
- if(stat & BROKEN)
- icon_state = "alert:b"
- return
- else if (stat & NOPOWER)
- icon_state = "alert:O"
- SetLuminosity(0)
- return
- else if(priority_alarms.len)
- icon_state = "alert:2"
-
+ ..()
+ if(priority_alarms.len)
+ overlays += "alert:2"
else if(minor_alarms.len)
- icon_state = "alert:1"
-
- else
- icon_state = "alert:0"
- return
+ overlays += "alert:1"
/obj/machinery/computer/atmos_alert/proc/return_text()
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index be509355564..76dca06f55e 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -83,6 +83,10 @@
/obj/item/weapon/circuitboard/card/centcom
name = "circuit board (Centcom ID Console)"
build_path = /obj/machinery/computer/card/centcom
+/obj/item/weapon/circuitboard/card/minor
+ name = "circuit board (Department Management Console)"
+ build_path = /obj/machinery/computer/card/minor
+ var/target_dept = 1
//obj/item/weapon/circuitboard/shield
// name = "Circuit board (Shield Control)"
// build_path = /obj/machinery/computer/stationshield
@@ -244,6 +248,13 @@
build_path = /obj/machinery/computer/libraryconsole
origin_tech = "programming=1"
+/obj/item/weapon/circuitboard/card/minor/attackby(obj/item/I as obj, mob/user as mob, params)
+ if(istype(I,/obj/item/device/multitool))
+ var/list/dept_list = list("general","security","medical","science","engineering")
+ var/choice = input("Currently set to [dept_list[target_dept]] personnel database. Changing to:","Multitool-Circuitboard interface") as null|anything in dept_list
+ if(choice)
+ target_dept = dept_list.Find(choice)
+ return
/obj/item/weapon/circuitboard/supplycomp/attackby(obj/item/I as obj, mob/user as mob, params)
if(istype(I,/obj/item/device/multitool))
@@ -336,11 +347,12 @@
if(istype(P, /obj/item/weapon/circuitboard) && !circuit)
var/obj/item/weapon/circuitboard/B = P
if(B.board_type == "computer")
+ if(!user.drop_item())
+ return
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
user << "You place the circuit board inside the frame. "
icon_state = "1"
circuit = P
- user.drop_item()
circuit.add_fingerprint(user)
P.loc = null
else
diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index 4165bc0003a..10f396874eb 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -1,7 +1,8 @@
/obj/machinery/computer/security
name = "security camera console"
desc = "Used to access the various cameras on the station."
- icon_state = "cameras"
+ icon_screen = "cameras"
+ icon_keyboard = "security_key"
circuit = /obj/item/weapon/circuitboard/security
var/obj/machinery/camera/current = null
var/last_pic = 1.0
@@ -94,7 +95,6 @@
/obj/machinery/computer/security/telescreen/update_icon()
icon_state = initial(icon_state)
- SetLuminosity(brightness_on)
if(stat & BROKEN)
icon_state += "b"
return
@@ -108,16 +108,18 @@
density = 0
circuit = null
-
/obj/machinery/computer/security/wooden_tv
name = "security camera monitor"
desc = "An old TV hooked into the stations camera network."
- icon_state = "security_det"
+ icon_state = "television"
+ icon_keyboard = null
+ icon_screen = "detective_tv"
/obj/machinery/computer/security/mining
name = "outpost camera console"
desc = "Used to access the various cameras on the outpost."
- icon_state = "miningcameras"
+ icon_screen = "mining"
+ icon_keyboard = "mining_key"
network = list("MINE")
circuit = "/obj/item/weapon/circuitboard/mining"
diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm
index 169100a2ab8..d4f48946de1 100644
--- a/code/game/machinery/computer/camera_advanced.dm
+++ b/code/game/machinery/computer/camera_advanced.dm
@@ -1,8 +1,8 @@
/obj/machinery/computer/camera_advanced
name = "advanced camera console"
desc = "Used to access the various cameras on the station."
- icon_state = "cameras"
- //circuit = /obj/item/weapon/circuitboard/security
+ icon_screen = "cameras"
+ icon_keyboard = "security_key"
var/mob/camera/aiEye/remote/eyeobj
var/mob/living/carbon/human/current_user = null
var/list/networks = list("SS13")
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index 180f3dc2fd5..4fc88ee1d18 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -6,8 +6,9 @@ var/time_last_changed_position = 0
/obj/machinery/computer/card
name = "identification console"
- desc = "You can use this to change ID's."
- icon_state = "id"
+ desc = "You can use this to manage jobs and ID access."
+ icon_screen = "id"
+ icon_keyboard = "id_key"
req_one_access = list(access_heads, access_change_ids)
circuit = /obj/item/weapon/circuitboard/card
var/obj/item/weapon/card/id/scan = null
@@ -17,6 +18,7 @@ var/time_last_changed_position = 0
var/printing = null
var/list/region_access = null
var/list/head_subordinates = null
+ var/target_dept = 0 //Which department this computer has access to. 0=all departments
//Cooldown for closing positions in seconds
//if set to -1: No cooldown... probably a bad idea
@@ -47,16 +49,19 @@ var/time_last_changed_position = 0
var/obj/item/weapon/card/id/idcard = O
if(check_access(idcard))
if(!scan)
- usr.drop_item()
+ if(!usr.drop_item())
+ return
idcard.loc = src
scan = idcard
else if(!modify)
- usr.drop_item()
+ if(!usr.drop_item())
+ return
idcard.loc = src
modify = idcard
else
if(!modify)
- usr.drop_item()
+ if(!usr.drop_item())
+ return
idcard.loc = src
modify = idcard
else
@@ -117,7 +122,7 @@ var/time_last_changed_position = 0
dat += ""
dat += "Job Slots Open job Close job "
var/ID
- if(scan && (access_change_ids in scan.access))
+ if(scan && (access_change_ids in scan.access) && !target_dept)
ID = 1
else
ID = 0
@@ -279,14 +284,15 @@ var/time_last_changed_position = 0
else
body = "{Log in} "
body += "Access Crew Manifest "
- body += "Job Management "
+ if(!target_dept)
+ body += "Job Management "
dat = "[header][body] "
//user << browse(dat, "window=id_com;size=900x520")
//onclose(user, "id_com")
- var/datum/browser/popup = new(user, "id_com", "Identification Card Modifier Console", 900, 620)
+ var/datum/browser/popup = new(user, "id_com", src.name, 900, 620)
popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
@@ -310,7 +316,8 @@ var/time_last_changed_position = 0
else
var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/weapon/card/id))
- usr.drop_item()
+ if(!usr.drop_item())
+ return
I.loc = src
modify = I
authenticated = 0
@@ -323,34 +330,41 @@ var/time_last_changed_position = 0
else
var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/weapon/card/id))
- usr.drop_item()
+ if(!usr.drop_item())
+ return
I.loc = src
scan = I
authenticated = 0
if ("auth")
if ((!( authenticated ) && (scan || (istype(usr, /mob/living/silicon))) && (modify || mode)))
if (check_access(scan))
+ region_access = list()
+ head_subordinates = list()
if(access_change_ids in scan.access)
- authenticated = 2
+ if(target_dept)
+ head_subordinates = get_all_jobs()
+ region_access |= target_dept
+ authenticated = 1
+ else
+ authenticated = 2
+
else
- region_access = list()
- head_subordinates = list()
- if(access_hop in scan.access)
- region_access += 1
- region_access += 6
+ if((access_hop in scan.access) && ((target_dept==1) || !target_dept))
+ region_access |= 1
+ region_access |= 6
get_subordinates("Head of Personnel")
- if(access_rd in scan.access)
- region_access += 4
- get_subordinates("Research Director")
- if(access_ce in scan.access)
- region_access += 5
- get_subordinates("Chief Engineer")
- if(access_cmo in scan.access)
- region_access += 3
- get_subordinates("Chief Medical Officer")
- if(access_hos in scan.access)
- region_access += 2
+ if((access_hos in scan.access) && ((target_dept==2) || !target_dept))
+ region_access |= 2
get_subordinates("Head of Security")
+ if((access_cmo in scan.access) && ((target_dept==3) || !target_dept))
+ region_access |= 3
+ get_subordinates("Chief Medical Officer")
+ if((access_rd in scan.access) && ((target_dept==4) || !target_dept))
+ region_access |= 4
+ get_subordinates("Research Director")
+ if((access_ce in scan.access) && ((target_dept==5) || !target_dept))
+ region_access |= 5
+ get_subordinates("Chief Engineer")
if(region_access)
authenticated = 1
else if ((!( authenticated ) && (istype(usr, /mob/living/silicon))) && (!modify))
@@ -418,7 +432,7 @@ var/time_last_changed_position = 0
if("make_job_available")
// MAKE ANOTHER JOB POSITION AVAILABLE FOR LATE JOINERS
- if(scan && (access_change_ids in scan.access))
+ if(scan && (access_change_ids in scan.access) && !target_dept)
var/edit_job_target = href_list["job"]
var/datum/job/j = SSjob.GetJob(edit_job_target)
if(!j)
@@ -432,7 +446,7 @@ var/time_last_changed_position = 0
if("make_job_unavailable")
// MAKE JOB POSITION UNAVAILABLE FOR LATE JOINERS
- if(scan && (access_change_ids in scan.access))
+ if(scan && (access_change_ids in scan.access) && !target_dept)
var/edit_job_target = href_list["job"]
var/datum/job/j = SSjob.GetJob(edit_job_target)
if(!j)
@@ -471,3 +485,30 @@ var/time_last_changed_position = 0
circuit = /obj/item/weapon/circuitboard/card/centcom
req_access = list(access_cent_captain)
+/obj/machinery/computer/card/minor
+ name = "department management console"
+ desc = "You can use this to change ID's for specific departments."
+ icon_screen = "idminor"
+ circuit = /obj/item/weapon/circuitboard/card/minor
+
+/obj/machinery/computer/card/minor/New()
+ ..()
+ var/obj/item/weapon/circuitboard/card/minor/typed_circuit = circuit
+ if(target_dept)
+ typed_circuit.target_dept = target_dept
+ else
+ target_dept = typed_circuit.target_dept
+ var/list/dept_list = list("general","security","medical","science","engineering")
+ name = "[dept_list[target_dept]] department console"
+
+/obj/machinery/computer/card/minor/hos
+ target_dept = 2
+
+/obj/machinery/computer/card/minor/cmo
+ target_dept = 3
+
+/obj/machinery/computer/card/minor/rd
+ target_dept = 4
+
+/obj/machinery/computer/card/minor/ce
+ target_dept = 5
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 38489cb1497..e2078720d8c 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -2,8 +2,8 @@
/obj/machinery/computer/cloning
name = "cloning console"
desc = "Used to clone people and manage DNA."
- icon = 'icons/obj/computer.dmi'
- icon_state = "dna"
+ icon_screen = "dna"
+ icon_keyboard = "med_key"
circuit = /obj/item/weapon/circuitboard/cloning
req_access = list(access_heads) //Only used for record deletion right now.
var/obj/machinery/dna_scannernew/scanner = null //Linked scanner. For scanning.
@@ -35,7 +35,7 @@
if(!(pod1.occupant || pod1.mess) && (pod1.efficiency > 5))
for(var/datum/data/record/R in records)
if(!(pod1.occupant || pod1.mess))
- if(pod1.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["mrace"], R.fields["mcolor"], R.fields["factions"]))
+ if(pod1.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["mrace"], R.fields["features"], R.fields["factions"]))
records -= R
/obj/machinery/computer/cloning/proc/updatemodules()
@@ -76,7 +76,8 @@
/obj/machinery/computer/cloning/attackby(obj/item/W as obj, mob/user as mob, params)
if (istype(W, /obj/item/weapon/disk/data)) //INSERT SOME DISKETTES
if (!src.diskette)
- user.drop_item()
+ if(!user.drop_item())
+ return ..()
W.loc = src
src.diskette = W
user << "You insert [W]. "
@@ -329,7 +330,7 @@
temp = "Clonepod malfunction. "
else if(!config.revival_cloning)
temp = "Unable to initiate cloning cycle. "
- else if(pod1.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["mcolor"], C.fields["factions"]))
+ else if(pod1.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["features"], C.fields["factions"]))
temp = "[C.fields["name"]] => Cloning cycle in progress... "
records.Remove(C)
if(active_record == C)
@@ -380,7 +381,7 @@
R.fields["UI"] = subject.dna.uni_identity
R.fields["SE"] = subject.dna.struc_enzymes
R.fields["blood_type"] = subject.dna.blood_type
- R.fields["mcolor"] = subject.dna.mutant_color
+ R.fields["features"] = subject.dna.features
R.fields["factions"] = subject.faction
//Add an implant if needed
var/obj/item/weapon/implant/health/imp = locate(/obj/item/weapon/implant/health, subject)
@@ -396,17 +397,4 @@
R.fields["mind"] = "\ref[subject.mind]"
src.records += R
- scantemp = "Subject successfully scanned."
-
-/obj/machinery/computer/cloning/update_icon()
- SetLuminosity(brightness_on)
- if(stat & BROKEN)
- icon_state = "commb"
- else
- if(stat & NOPOWER)
- src.icon_state = "c_unpowered"
- stat |= NOPOWER
- SetLuminosity(0)
- else
- icon_state = initial(icon_state)
- stat &= ~NOPOWER
\ No newline at end of file
+ scantemp = "Subject successfully scanned."
\ No newline at end of file
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index c335d4ad6f6..21dfa6b0585 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -6,7 +6,8 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
/obj/machinery/computer/communications
name = "communications console"
desc = "This can be used for various important functions. Still under developement."
- icon_state = "comm"
+ icon_screen = "comm"
+ icon_keyboard = "tech_key"
req_access = list(access_heads)
circuit = /obj/item/weapon/circuitboard/communications
var/authenticated = 0
@@ -49,7 +50,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
/obj/machinery/computer/communications/Topic(href, href_list)
if(..())
return
- if (src.z > ZLEVEL_STATION)
+ if (src.z > ZLEVEL_CENTCOM) //Can only use on centcom and SS13
usr << "Unable to establish a connection : \black You're too far away from the station!"
return
usr.set_machine(src)
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index 18f8925050f..5d0798690f8 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -1,6 +1,7 @@
/obj/machinery/computer
name = "computer"
icon = 'icons/obj/computer.dmi'
+ icon_state = "computer"
density = 1
anchored = 1.0
use_power = 1
@@ -9,6 +10,8 @@
var/obj/item/weapon/circuitboard/circuit = null //if circuit==null, computer can't disassembly
var/processing = 0
var/brightness_on = 2
+ var/icon_keyboard = "generic_key"
+ var/icon_screen = "generic"
/obj/machinery/computer/New(location, obj/item/weapon/circuitboard/C)
..(location)
@@ -18,6 +21,7 @@
if(circuit)
circuit = new circuit(null)
power_change()
+ update_icon()
/obj/machinery/computer/initialize()
power_change()
@@ -68,23 +72,22 @@
density = 0
/obj/machinery/computer/update_icon()
- ..()
- icon_state = initial(icon_state)
- SetLuminosity(brightness_on)
- // Broken
+ overlays.Cut()
+ if(stat & NOPOWER)
+ overlays += "[icon_keyboard]_off"
+ return
+ overlays += icon_keyboard
if(stat & BROKEN)
- icon_state += "b"
-
- // Unpowered
- else if(stat & NOPOWER)
- icon_state = initial(icon_state)
- icon_state += "0"
- SetLuminosity(0)
-
-
+ overlays += "[icon_state]_broken"
+ else
+ overlays += icon_screen
/obj/machinery/computer/power_change()
..()
+ if(stat & NOPOWER)
+ SetLuminosity(0)
+ else
+ SetLuminosity(brightness_on)
update_icon()
return
@@ -97,7 +100,7 @@
/obj/machinery/computer/attackby(I as obj, user as mob, params)
if(istype(I, /obj/item/weapon/screwdriver) && circuit)
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- user << " You start to disconnect the monitor... "
+ user << "You start to disconnect the monitor... "
if(do_after(user, 20))
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
A.circuit = circuit
@@ -106,12 +109,12 @@
for (var/obj/C in src)
C.loc = src.loc
if (src.stat & BROKEN)
- user << " The broken glass falls out. "
+ user << "The broken glass falls out. "
new /obj/item/weapon/shard( src.loc )
A.state = 3
A.icon_state = "3"
else
- user << " You disconnect the monitor. "
+ user << "You disconnect the monitor. "
A.state = 4
A.icon_state = "4"
qdel(src)
diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm
index 1f5862fc01c..32b7eab5df5 100644
--- a/code/game/machinery/computer/crew.dm
+++ b/code/game/machinery/computer/crew.dm
@@ -1,7 +1,8 @@
/obj/machinery/computer/crew
name = "crew monitoring console"
desc = "Used to monitor active health sensors built into most of the crew's uniforms."
- icon_state = "crew"
+ icon_screen = "crew"
+ icon_keyboard = "med_key"
use_power = 1
idle_power_usage = 250
active_power_usage = 500
diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm
index 0ab00973dd5..875cb4403ae 100644
--- a/code/game/machinery/computer/law.dm
+++ b/code/game/machinery/computer/law.dm
@@ -2,7 +2,7 @@
/obj/machinery/computer/upload
var/mob/living/silicon/current = null //The target of future law uploads
- icon_state = null //To make sure mappers understand THIS ISN'T A VALID TYPE
+ icon_screen = "command"
/obj/machinery/computer/upload/attackby(obj/item/O as obj, mob/user as mob, params)
if(istype(O, /obj/item/weapon/aiModule))
@@ -33,7 +33,6 @@
/obj/machinery/computer/upload/ai
name = "\improper AI upload console"
desc = "Used to upload laws to the AI."
- icon_state = "command"
circuit = /obj/item/weapon/circuitboard/aiupload
/obj/machinery/computer/upload/ai/attack_hand(var/mob/user as mob)
@@ -58,7 +57,6 @@
/obj/machinery/computer/upload/borg
name = "cyborg upload console"
desc = "Used to upload laws to Cyborgs."
- icon_state = "command"
circuit = /obj/item/weapon/circuitboard/borgupload
/obj/machinery/computer/upload/borg/attack_hand(var/mob/user as mob)
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index 8a52e787827..4c27c1b1552 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -3,7 +3,8 @@
/obj/machinery/computer/med_data//TODO:SANITY
name = "medical records console"
desc = "This can be used to check medical records."
- icon_state = "medcomp"
+ icon_screen = "medcomp"
+ icon_keyboard = "med_key"
req_one_access = list(access_medical, access_forensics_lockers)
circuit = /obj/item/weapon/circuitboard/med_data
var/obj/item/weapon/card/id/scan = null
@@ -19,9 +20,10 @@
var/sortBy = "name"
var/order = 1 // -1 = Descending - 1 = Ascending
-/obj/machinery/computer/med_data/attackby(obj/item/O as obj, user as mob, params)
+/obj/machinery/computer/med_data/attackby(obj/item/O as obj, mob/user as mob, params)
if(istype(O, /obj/item/weapon/card/id) && !scan)
- usr.drop_item()
+ if(!user.drop_item())
+ return
O.loc = src
scan = O
user << "You insert [O]. "
@@ -214,7 +216,8 @@
else
var/obj/item/I = usr.get_active_hand()
if(istype(I, /obj/item/weapon/card/id))
- usr.drop_item()
+ if(!usr.drop_item())
+ return
I.loc = src
src.scan = I
else if(href_list["logout"])
@@ -508,7 +511,7 @@
else
//Foreach continue //goto(3229)
if(!( src.active2 ))
- src.temp = text("Could not locate record [].", t1)
+ src.temp = text("Could not locate record [].", sanitize(t1))
else
for(var/datum/data/record/E in data_core.general)
if((E.fields["name"] == src.active2.fields["name"] || E.fields["id"] == src.active2.fields["id"]))
@@ -590,4 +593,6 @@
/obj/machinery/computer/med_data/laptop
name = "medical laptop"
desc = "A cheap Nanotrasen medical laptop, it functions as a medical records computer. It's bolted to the table."
- icon_state = "medlaptop"
+ icon_state = "laptop"
+ icon_screen = "medlaptop"
+ icon_keyboard = "laptop_key"
diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm
index 19b4fdd5169..7d31061f0ba 100644
--- a/code/game/machinery/computer/message.dm
+++ b/code/game/machinery/computer/message.dm
@@ -7,9 +7,7 @@
/obj/machinery/computer/message_monitor
name = "message monitor console"
desc = "Used to Monitor the crew's messages, that are sent via PDA. Can also be used to view Request Console messages."
- icon_state = "comm_logs"
- var/hack_icon = "comm_logsc"
- var/normal_icon = "comm_logs"
+ icon_screen = "comm_logs"
circuit = /obj/item/weapon/circuitboard/message_monitor
//Server linked to.
var/obj/machinery/message_server/linkedServer = null
@@ -42,7 +40,6 @@
/obj/machinery/computer/message_monitor/emag_act(user as mob)
if(!emagged)
if(!isnull(src.linkedServer))
- icon_state = hack_icon // An error screen I made in the computers.dmi
emagged = 1
screen = 2
spark_system.set_up(5, 0, src)
@@ -56,15 +53,6 @@
else
user << "A no server error appears on the screen. "
-/obj/machinery/computer/message_monitor/update_icon()
- ..()
- if(stat & (NOPOWER|BROKEN))
- return
- if(emagged || hacking)
- icon_state = hack_icon
- else
- icon_state = normal_icon
-
/obj/machinery/computer/message_monitor/initialize()
//Is the server isn't linked to a server, and there's a server available, default it to the first one in the list.
if(!linkedServer)
@@ -140,7 +128,7 @@
break
// Del - Sender - Recepient - Message
// X - Al Green - Your Mom - WHAT UP!?
- dat += "X [pda.sender] [pda.recipient] [pda.message] "
+ dat += "X [pda.sender] [pda.recipient] [pda.message][pda.photo ? "(Photo) ":""] "
dat += "
"
//Hacking screen.
if(2)
@@ -263,11 +251,9 @@
var/currentKey = src.linkedServer.decryptkey
user << "Brute-force completed! The key is '[currentKey]'. "
src.hacking = 0
- src.icon_state = normal_icon
src.screen = 0 // Return the screen back to normal
/obj/machinery/computer/message_monitor/proc/UnmagConsole()
- src.icon_state = normal_icon
src.emagged = 0
/obj/machinery/computer/message_monitor/proc/ResetMessage()
@@ -365,7 +351,6 @@
if(issilicon(usr) && is_special_character(usr))
src.hacking = 1
src.screen = 2
- src.icon_state = hack_icon
//Time it takes to bruteforce is dependant on the password length.
spawn(100*length(src.linkedServer.decryptkey))
if(src && src.linkedServer && usr)
diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm
index 5b93f9e6d53..8d503badcea 100644
--- a/code/game/machinery/computer/pod.dm
+++ b/code/game/machinery/computer/pod.dm
@@ -1,7 +1,6 @@
/obj/machinery/computer/pod
name = "mass driver launch control"
desc = "A combined blastdoor and mass driver control unit."
- icon_state = "computer_generic"
var/obj/machinery/mass_driver/connected = null
var/title = "Mass Driver Controls"
var/id = 1
@@ -120,9 +119,11 @@
/obj/machinery/computer/pod/old
- icon_state = "old"
name = "\improper DoorMex control console"
title = "Door Controls"
+ icon_state = "oldcomp"
+ icon_screen = "library"
+ icon_keyboard = null
/obj/machinery/computer/pod/old/syndicate
diff --git a/code/game/machinery/computer/power.dm b/code/game/machinery/computer/power.dm
index 9671df6d94f..1911b1067b3 100644
--- a/code/game/machinery/computer/power.dm
+++ b/code/game/machinery/computer/power.dm
@@ -3,10 +3,8 @@
/obj/machinery/computer/monitor
name = "power monitoring console"
desc = "It monitors power levels across the station."
- icon = 'icons/obj/computer.dmi'
- icon_state = "power"
- density = 1
- anchored = 1
+ icon_screen = "power"
+ icon_keyboard = "power_key"
use_power = 2
idle_power_usage = 20
active_power_usage = 80
diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm
index c021d2e158a..faba05e021f 100644
--- a/code/game/machinery/computer/prisoner.dm
+++ b/code/game/machinery/computer/prisoner.dm
@@ -1,8 +1,8 @@
/obj/machinery/computer/prisoner
name = "prisoner management console"
desc = "Used to manage tracking implants placed inside criminals."
- icon = 'icons/obj/computer.dmi'
- icon_state = "explosive"
+ icon_screen = "explosive"
+ icon_keyboard = "security_key"
req_access = list(access_brig)
circuit = "/obj/item/weapon/circuitboard/prisoner"
var/id = 0.0
@@ -92,7 +92,8 @@
if(href_list["id"] =="insert" && !istype(inserted_id))
var/obj/item/weapon/card/id/prisoner/I = usr.get_active_hand()
if(istype(I))
- usr.drop_item()
+ if(!usr.drop_item())
+ return
I.loc = src
inserted_id = I
else usr << "No valid ID. "
diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm
index 305e8d9ea58..e358e3b9107 100644
--- a/code/game/machinery/computer/robot.dm
+++ b/code/game/machinery/computer/robot.dm
@@ -4,8 +4,8 @@
/obj/machinery/computer/robotics
name = "robotics control console"
desc = "Used to remotely lockdown or detonate linked Cyborgs."
- icon = 'icons/obj/computer.dmi'
- icon_state = "robot"
+ icon_screen = "robot"
+ icon_keyboard = "rd_key"
req_access = list(access_robotics)
circuit = /obj/item/weapon/circuitboard/robotics
var/temp = null
@@ -92,7 +92,7 @@
R << "Extreme danger. Termination codes detected. Scrambling security codes and automatic AI unlink triggered."
R.ResetSecurityCodes()
else
- message_admins("[key_name(usr, usr.client)](JMP ) detonated [key_name(R, R.client)](JMP )! ")
+ message_admins("[key_name_admin(usr)] (FLW ) detonated [key_name(R, R.client)](JMP )! ")
log_game("\[key_name(usr)] detonated [key_name(R)]! ")
if(R.connected_ai)
R.connected_ai << "ALERT - Cyborg detonation detected: [R.name] "
@@ -106,7 +106,7 @@
if(can_control(usr, R))
var/choice = input("Are you certain you wish to [R.canmove ? "lock down" : "release"] [R.name]?") in list("Confirm", "Abort")
if(choice == "Confirm" && can_control(usr, R) && !..())
- message_admins("[key_name(usr, usr.client)](JMP ) [R.canmove ? "locked down" : "released"] [key_name(R, R.client)](JMP )! ")
+ message_admins("[key_name_admin(usr)] (FLW ) [R.canmove ? "locked down" : "released"] [key_name(R, R.client)](FLW )! ")
log_game("[key_name(usr)] [R.canmove ? "locked down" : "released"] [key_name(R)]!")
R.SetLockdown(!R.lockcharge)
R << "[!R.lockcharge ? "Your lockdown has been lifted!" : "You have been locked down!"] "
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index 3ac9f1abf03..4a0aad15867 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -3,7 +3,8 @@
/obj/machinery/computer/secure_data//TODO:SANITY
name = "security records console"
desc = "Used to view and edit personnel's security records"
- icon_state = "security"
+ icon_screen = "security"
+ icon_keyboard = "security_key"
req_one_access = list(access_security, access_forensics_lockers)
circuit = /obj/item/weapon/circuitboard/secure_data
var/obj/item/weapon/card/id/scan = null
@@ -23,9 +24,10 @@
var/order = 1 // -1 = Descending - 1 = Ascending
-/obj/machinery/computer/secure_data/attackby(obj/item/O as obj, user as mob, params)
+/obj/machinery/computer/secure_data/attackby(obj/item/O as obj, mob/user as mob, params)
if(istype(O, /obj/item/weapon/card/id) && !scan)
- usr.drop_item()
+ if(!user.drop_item())
+ return
O.loc = src
scan = O
user << "You insert [O]. "
@@ -298,7 +300,8 @@ What a mess.*/
else
var/obj/item/I = usr.get_active_hand()
if(istype(I, /obj/item/weapon/card/id))
- usr.drop_item()
+ if(!usr.drop_item())
+ return
I.loc = src
scan = I
@@ -518,7 +521,7 @@ What a mess.*/
switch(href_list["field"])
if("name")
if(istype(active1, /datum/data/record) || istype(active2, /datum/data/record))
- var/t1 = stripped_input(usr, "Please input name:", "Secure. records", active1.fields["name"], null)
+ var/t1 = copytext(sanitize(input("Please input name:", "Secure. records", active1.fields["name"], null) as text),1,MAX_MESSAGE_LEN)
if(!canUseSecurityRecordsConsole(usr, t1, a1))
return
if(istype(active1, /datum/data/record))
@@ -743,7 +746,3 @@ What a mess.*/
if(!record2 || record2 == active2)
return 1
return 0
-
-/obj/machinery/computer/secure_data/detective_computer
- icon = 'icons/obj/computer.dmi'
- icon_state = "messyfiles"
diff --git a/code/game/machinery/computer/shuttle.dm b/code/game/machinery/computer/shuttle.dm
index 87e1389167d..09f0ce71324 100644
--- a/code/game/machinery/computer/shuttle.dm
+++ b/code/game/machinery/computer/shuttle.dm
@@ -1,7 +1,8 @@
/obj/machinery/computer/emergency_shuttle
name = "emergency shuttle console"
desc = "For shuttle control."
- icon_state = "shuttle"
+ icon_screen = "shuttle"
+ icon_keyboard = "tech_key"
var/auth_need = 3.0
var/list/authorized = list()
@@ -46,12 +47,12 @@
if(!authorized.Find(W:registered_name))
authorized += W:registered_name
if(auth_need - authorized.len > 0)
- message_admins("[key_name(user.client)](? ) has authorized early shuttle launch in ([x],[y],[z] - JMP )",0,1)
- log_game("[user.ckey]([user]) has authorized early shuttle launch in ([x],[y],[z])")
+ message_admins("[key_name_admin(user.client)](? ) (FLW ) has authorized early shuttle launch ",0,1)
+ log_game("[key_name(user)] has authorized early shuttle launch in ([x],[y],[z])")
minor_announce("[auth_need - authorized.len] more authorization(s) needed until shuttle is launched early",null,1)
else
- message_admins("[key_name(user.client)](? ) has launched the emergency shuttle in ([x],[y],[z] - JMP ) [seconds] seconds before launch.",0,1)
- log_game("[user.ckey]([user]) has launched the emergency shuttle in ([x],[y],[z]) [seconds] seconds before launch.")
+ message_admins("[key_name_admin(user.client)](? ) (FLW ) has launched the emergency shuttle [seconds] seconds before launch.",0,1)
+ log_game("[key_name(user)] has launched the emergency shuttle in ([x],[y],[z]) [seconds] seconds before launch.")
minor_announce("The emergency shuttle will launch in 10 seconds",null,1)
SSshuttle.emergency.setTimer(100)
@@ -67,8 +68,8 @@
/obj/machinery/computer/emergency_shuttle/emag_act(mob/user as mob)
if(!emagged && SSshuttle.emergency.mode == SHUTTLE_DOCKED)
var/time = SSshuttle.emergency.timeLeft()
- message_admins("[key_name(user.client)](? ) has emagged the emergency shuttle in ([x],[y],[z] - JMP ) [time] seconds before launch.",0,1)
- log_game("[user.ckey]([user]) has emagged the emergency shuttle in ([x],[y],[z]) [time] seconds before launch.")
+ message_admins("[key_name_admin(user.client)](? ) (FLW ) has emagged the emergency shuttle [time] seconds before launch.",0,1)
+ log_game("[key_name(user)] has emagged the emergency shuttle in ([x],[y],[z]) [time] seconds before launch.")
minor_announce("The emergency shuttle will launch in 10 seconds", "SYSTEM ERROR:",null,1)
SSshuttle.emergency.setTimer(100)
emagged = 1
@@ -128,8 +129,7 @@
/obj/machinery/computer/supplycomp
name = "supply shuttle console"
desc = "Used to order supplies."
- icon = 'icons/obj/computer.dmi'
- icon_state = "supply"
+ icon_screen = "supply"
req_access = list(access_cargo)
circuit = /obj/item/weapon/circuitboard/supplycomp
verb_say = "flashes"
@@ -150,8 +150,7 @@
/obj/machinery/computer/ordercomp
name = "supply ordering console"
desc = "Used to order supplies from cargo staff."
- icon = 'icons/obj/computer.dmi'
- icon_state = "request"
+ icon_screen = "request"
circuit = /obj/item/weapon/circuitboard/ordercomp
verb_say = "flashes"
verb_ask = "flashes"
diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm
index 113ab773c84..1d2b1e5c7ce 100644
--- a/code/game/machinery/computer/station_alert.dm
+++ b/code/game/machinery/computer/station_alert.dm
@@ -2,13 +2,11 @@
/obj/machinery/computer/station_alert
name = "station alert console"
desc = "Used to access the station's automated alert system."
- icon_state = "alert:0"
+ icon_screen = "alert:0"
+ icon_keyboard = "atmos_key"
circuit = /obj/item/weapon/circuitboard/stationalert
var/alarms = list("Fire"=list(), "Atmosphere"=list(), "Power"=list())
-
-
-
/obj/machinery/computer/station_alert/attack_hand(mob/user)
if(..())
return
@@ -99,20 +97,12 @@
return
/obj/machinery/computer/station_alert/update_icon()
- SetLuminosity(brightness_on)
- if(stat & BROKEN)
- icon_state = "alert:b"
- return
- else if (stat & NOPOWER)
- icon_state = "alert:O"
- SetLuminosity(0)
- return
+ ..()
var/active_alarms = 0
for (var/cat in src.alarms)
var/list/L = src.alarms[cat]
if(L.len) active_alarms = 1
if(active_alarms)
- icon_state = "alert:2"
+ overlays += "alert:2"
else
- icon_state = "alert:0"
- return
\ No newline at end of file
+ overlays += "alert:0"
\ No newline at end of file
diff --git a/code/game/machinery/computer/syndicate_shuttle.dm b/code/game/machinery/computer/syndicate_shuttle.dm
index d13bef052f8..8a0ee76c872 100644
--- a/code/game/machinery/computer/syndicate_shuttle.dm
+++ b/code/game/machinery/computer/syndicate_shuttle.dm
@@ -1,8 +1,8 @@
/obj/machinery/computer/shuttle/syndicate
name = "syndicate shuttle terminal"
- icon_state = "syndishuttle"
+ icon_screen = "syndishuttle"
+ icon_keyboard = "syndie_key"
req_access = list(access_syndicate)
-
shuttleId = "syndicate"
possible_destinations = "syndicate_away;syndicate_z5;syndicate_z3;syndicate_z4;syndicate_ne;syndicate_nw;syndicate_n;syndicate_se;syndicate_sw;syndicate_s"
@@ -12,7 +12,8 @@
/obj/machinery/computer/shuttle/syndicate/whiteship
name = "ship control terminal"
- icon_state = "shuttle"
+ icon_screen = "shuttle"
+ icon_keyboard = "tech_key"
shuttleId = "whiteship"
req_access = list( )
possible_destinations = "whiteship_ss13;whiteship_home;whiteship_z4"
\ No newline at end of file
diff --git a/code/game/machinery/computer/telecrystalconsoles.dm b/code/game/machinery/computer/telecrystalconsoles.dm
index 79032b6f001..29b07601e4f 100644
--- a/code/game/machinery/computer/telecrystalconsoles.dm
+++ b/code/game/machinery/computer/telecrystalconsoles.dm
@@ -7,13 +7,14 @@ var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","F
name = "\improper Telecrystal assignment station"
desc = "A device used to manage telecrystals during group operations. You shouldn't be looking at this particular one..."
icon_state = "tcstation"
+ icon_keyboard = "tcstation_key"
+ icon_screen = "syndie"
/////////////////////////////////////////////
/obj/machinery/computer/telecrystals/uplinker
name = "\improper Telecrystal upload/receive station"
desc = "A device used to manage telecrystals during group operations. To use, simply insert your uplink. With your uplink installed \
you can upload your telecrystals to the group's pool using the console, or be assigned additional telecrystals by your lieutenant."
- icon_state = "tcstation"
var/obj/item/uplinkholder = null
var/obj/machinery/computer/telecrystals/boss/linkedboss = null
@@ -38,7 +39,8 @@ var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","F
if(O.hidden_uplink)
var/obj/item/P = user.get_active_hand()
- user.drop_item()
+ if(!user.drop_item())
+ return
uplinkholder = P
P.loc = src
P.add_fingerprint(user)
@@ -50,7 +52,7 @@ var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","F
/obj/machinery/computer/telecrystals/uplinker/update_icon()
- overlays.Cut()
+ ..()
if(uplinkholder)
overlays += "[initial(icon_state)]-closed"
@@ -126,7 +128,9 @@ var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","F
desc = "A device used to manage telecrystals during group operations. To use, simply initialize the machine by scanning for nearby uplink stations. \
Once the consoles are linked up, you can assign any telecrystals amongst your operatives; be they donated by your agents or rationed to the squad \
based on the danger rating of the mission."
- icon_state = "tcboss"
+ icon_state = "computer"
+ icon_screen = "tcboss"
+ icon_keyboard = "syndie_key"
var/virgin = 1
var/scanrange = 10
var/storedcrystals = 0
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index 5530c7cc5a1..e0a7411e82b 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -108,10 +108,11 @@
return
var/obj/item/weapon/circuitboard/B = P
if(B.board_type == "machine")
+ if(!user.drop_item())
+ return
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
user << "You add the circuit board to the frame. "
circuit = P
- user.drop_item()
P.loc = src
icon_state = "box_2"
state = 3
@@ -140,8 +141,8 @@
user << "You remove the circuit board. "
else
user << "You remove the circuit board and other components. "
- for(var/obj/item/weapon/W in components)
- W.loc = src.loc
+ for(var/atom/movable/A in components)
+ A.loc = src.loc
desc = initial(desc)
req_components = null
components = null
@@ -199,6 +200,8 @@
var/success
for(var/I in req_components)
if(istype(P, I) && (req_components[I] > 0))
+ if(!user.drop_item())
+ return
success=1
if(istype(P, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/CP = P
@@ -211,7 +214,6 @@
req_components[I]--
update_req_desc()
break
- user.drop_item()
P.loc = src
components += P
req_components[I]--
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index f84c488f930..26eb0c3cce5 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -237,9 +237,10 @@
if(beaker)
user << "A beaker is already loaded into [src]! "
return
+ if(!user.drop_item())
+ return
beaker = I
- user.drop_item()
I.loc = src
user.visible_message("[user] places [I] in [src].", \
"You place [I] in [src]. ")
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index ae1a9fb771d..8a752cd6f76 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -45,6 +45,8 @@
var/obj/item/weapon/airlock_electronics/electronics = null
var/hasShocked = 0 //Prevents multiple shocks from happening
var/autoclose = 1
+ var/obj/item/device/doorCharge/charge = null //If applied, causes an explosion upon opening the door
+ var/detonated = 0
explosion_block = 1
@@ -91,6 +93,7 @@
icon = 'icons/obj/doors/vault.dmi'
opacity = 1
doortype = /obj/structure/door_assembly/door_assembly_vault
+ explosion_block = 2
/obj/machinery/door/airlock/glass_large
name = "glass airlock"
@@ -476,6 +479,11 @@ About the new airlock wires panel:
flick("door_deny", src)
return
+/obj/machinery/door/airlock/examine(mob/user)
+ ..()
+ if(charge && !p_open && in_range(user, src))
+ user << "The maintenance panel is bulging slightly."
+
/obj/machinery/door/airlock/attack_ai(mob/user as mob)
if(!src.canAIControl())
if(src.canAIHack())
@@ -486,6 +494,9 @@ About the new airlock wires panel:
if(emagged)
user << "Unable to interface: Airlock is unresponsive. "
return
+ if(detonated)
+ user << "Unable to interface. Airlock control panel damaged. "
+ return
//Separate interface for the AI.
user.set_machine(src)
@@ -565,16 +576,16 @@ About the new airlock wires panel:
if(src.isWireCut(AIRLOCK_WIRE_SAFETY))
t1 += text("Door force sensors not responding. \n")
else if(src.safe)
- t1 += text("Door safeties operating normally. Override? \n",src)
+ t1 += text("Door safeties operating normally. Override? \n",src)
else
- t1 += text("Danger. Door safeties disabled. Restore? \n",src)
+ t1 += text("Danger. Door safeties disabled. Restore? \n",src)
if(src.isWireCut(AIRLOCK_WIRE_SPEED))
t1 += text("Door timing circuitry not responding. \n")
else if(src.normalspeed)
- t1 += text("Door timing circuitry operating normally. Override? \n",src)
+ t1 += text("Door timing circuitry operating normally. Override? \n",src)
else
- t1 += text("Warning. Door timing circuitry operating abnormally. Restore? \n",src)
+ t1 += text("Warning. Door timing circuitry operating abnormally. Restore? \n",src)
@@ -923,6 +934,9 @@ About the new airlock wires panel:
update_icon()
return
else if(istype(C, /obj/item/weapon/screwdriver))
+ if(p_open && detonated)
+ user << "[src] has no maintenance panel! "
+ return
src.p_open = !( src.p_open )
user << "You [p_open ? "open":"close"] the maintenance panel of the airlock. "
src.update_icon()
@@ -941,6 +955,22 @@ About the new airlock wires panel:
beingcrowbarred = 1 //derp, Agouri
else
beingcrowbarred = 0
+ if(p_open && charge)
+ user << "You carefully start removing [charge] from [src]... "
+ playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
+ if(!do_after(user, 150))
+ user << "You slip and [charge] detonates! "
+ charge.ex_act(1)
+ user.Weaken(3)
+ return
+ user.visible_message("[user] removes [charge] from [src]. ", \
+ "You gently pry out [charge] from [src] and unhook its wires. ")
+ charge.loc = get_turf(user)
+ if(prob(25))
+ charge.ex_act(1)
+ return
+ charge = null
+ return
if( beingcrowbarred && (density && welded && !operating && src.p_open && (!hasPower()) && !src.locked) )
playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
user.visible_message("[user] removes the electronics from the airlock assembly.", \
@@ -973,9 +1003,9 @@ About the new airlock wires panel:
qdel(src)
return
else if(hasPower())
- user << " The airlock's motors resist your efforts to force it! "
+ user << "The airlock's motors resist your efforts to force it! "
else if(locked)
- user << " The airlock's bolts prevent it from being forced! "
+ user << "The airlock's bolts prevent it from being forced! "
else if( !welded && !operating)
if(density)
if(beingcrowbarred == 0) //being fireaxe'd
@@ -998,14 +1028,31 @@ About the new airlock wires panel:
else if(istype(C, /obj/item/weapon/airlock_painter))
change_paintjob(C, user)
+ else if(istype(C, /obj/item/device/doorCharge) && p_open)
+ if(emagged)
+ return
+ if(charge && !detonated)
+ user << "There's already a charge hooked up to this door! "
+ return
+ if(detonated)
+ user << "The maintenance panel is destroyed! "
+ return
+ user << "You apply [C]. Next time someone opens the door, it will explode. "
+ user.drop_item()
+ p_open = 0
+ update_icon()
+ var/obj/item/device/doorCharge/newCharge = C //This is necessary, for some reason
+ newCharge.loc = src
+ charge = newCharge
+ return
else
..()
return
/obj/machinery/door/airlock/plasma/attackby(C as obj, mob/user as mob, params)
if(is_hot(C) > 300)//If the temperature of the object is over 300, then ignite
- message_admins("Plasma wall ignited by [key_name(user, user.client)](? ) in ([x],[y],[z] - JMP )")
- log_game("Plasma wall ignited by [user.ckey]([user]) in ([x],[y],[z])")
+ message_admins("Plasma airlock ignited by [key_name_admin(user)](? ) (FLW ) in ([x],[y],[z] - JMP )")
+ log_game("Plasma wall ignited by [key_name(user)] in ([x],[y],[z])")
ignite(is_hot(C))
return
..()
@@ -1016,6 +1063,18 @@ About the new airlock wires panel:
if(!forced)
if( !hasPower() || isWireCut(AIRLOCK_WIRE_OPEN_DOOR) )
return 0
+ if(charge && !detonated)
+ p_open = 1
+ update_icon()
+ visible_message("[src]'s panel is blown off in a spray of deadly shrapnel! ")
+ charge.ex_act(1)
+ detonated = 1
+ charge = null
+ for(var/mob/living/carbon/human/H in orange(1,src))
+ H.Paralyse(8)
+ H.adjust_fire_stacks(1)
+ H.IgniteMob() //Guaranteed knockout and ignition for nearby people
+ return
if(forced < 2)
if(emagged)
return 0
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index c679e37cd4c..2d851669879 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -187,7 +187,6 @@
/obj/machinery/door/window/hitby(AM as mob|obj)
..()
- visible_message("\The [src] was hit by \the [AM]. ")
var/tforce = 0
if(ismob(AM))
tforce = 40
diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm
new file mode 100644
index 00000000000..0860d7760ea
--- /dev/null
+++ b/code/game/machinery/droneDispenser.dm
@@ -0,0 +1,105 @@
+/obj/machinery/droneDispenser
+ name = "drone shell dispenser"
+ desc = "A hefty machine that, when supplied with metal and glass, will periodically create a drone shell. Does not need to be manually operated."
+ icon = 'icons/obj/machines/droneDispenser.dmi'
+ icon_state = "on"
+ anchored = 1
+ density = 1
+ var/metal = 0
+ var/glass = 0
+ var/droneMadeRecently = 0
+ var/outputDirection = SOUTH
+
+/obj/machinery/droneDispenser/New()
+ ..()
+ SSmachine.processing |= src
+
+/obj/machinery/droneDispenser/Destroy()
+ SSmachine.processing -= src
+ ..()
+
+/obj/machinery/droneDispenser/preloaded
+ metal = 5000
+ glass = 5000
+
+/obj/machinery/droneDispenser/syndrone //Please forgive me
+ name = "syndrone shell dispenser"
+ desc = "A suspicious machine that will create Syndicate exterminator drones when supplied with metal and glass. Disgusting."
+ metal = 25000
+ glass = 25000
+
+/obj/machinery/droneDispenser/examine(mob/user)
+ ..()
+ if(droneMadeRecently && !stat)
+ user << "The control screen indicates that is recharging. "
+ user << "It has [metal] units of metal stored. "
+ user << "It has [glass] units of glass stored. "
+
+/obj/machinery/droneDispenser/power_change()
+ ..()
+ if(stat & BROKEN)
+ return
+ else
+ if(powered())
+ stat &= ~NOPOWER
+ else
+ icon_state = "off"
+ stat |= NOPOWER
+
+/obj/machinery/droneDispenser/process()
+ ..()
+ if(stat & (NOPOWER|BROKEN) || !anchored)
+ return
+ if(droneMadeRecently || metal < 1000 || glass < 1000)
+ return
+ droneMadeRecently = 1
+ var/turf/T = get_step(src,SOUTH)
+ visible_message("[src] whirs to life! ")
+ playsound(src, 'sound/items/rped.ogg', 50, 1)
+ icon_state = "make"
+ spawn(30)
+ icon_state = "[initial(icon_state)]"
+ visible_message("[src] dispenses a drone shell. ")
+ metal -= 1000
+ glass -= 1000
+ if(metal < 0) metal = 0
+ if(glass < 0) glass = 0
+ if(istype(src, /obj/machinery/droneDispenser/syndrone))
+ new /obj/item/drone_shell/syndrone(T)
+ else
+ new /obj/item/drone_shell(T)
+ use_power(1000)
+ icon_state = "recharge"
+ spawn(1800) //3 minute cooldown between shells
+ icon_state = "[initial(icon_state)]"
+ droneMadeRecently = 0
+ playsound(src, 'sound/machines/ping.ogg', 50, 1)
+ audible_message("[src] pings. ")
+
+/obj/machinery/droneDispenser/attackby(obj/item/O, mob/living/user)
+ if(istype(O, /obj/item/stack))
+ if(!O.m_amt && !O.g_amt)
+ return ..()
+ var/stack = 1
+ var/obj/item/stack/sheets
+ sheets = O
+ stack = (input(user, "How many sheets do you want to add?.", "Drone Dispenser", "[stack]") as num)
+ if(stack <= 0)
+ return
+ if(!user.canUseTopic(src))
+ return
+ stack = Clamp(stack, 0, sheets.max_amount)
+ sheets.use(stack)
+ if(!stack)
+ if(!user.unEquip(O))
+ user << "[O] is stuck to your hand, you can't get it off! "
+ return
+ user.drop_item()
+ O.loc = src
+ metal += O.m_amt * stack
+ glass += O.g_amt * stack
+ user << "You insert [stack] sheet[stack > 1 ? "s" : ""] to [src]. "
+ if((O && O.loc == src) || !stack)
+ qdel(O)
+ return
+ ..()
diff --git a/code/game/machinery/embedded_controller/airlock_controller.dm b/code/game/machinery/embedded_controller/airlock_controller.dm
index 6ef3d8e0dd6..85468c5a944 100644
--- a/code/game/machinery/embedded_controller/airlock_controller.dm
+++ b/code/game/machinery/embedded_controller/airlock_controller.dm
@@ -283,10 +283,10 @@
Current Status:
[current_status]
-
\> Chamber Pressure:
[sensor_pressure] kPa
-
\> Control Pump:
[pump_status]
-
\> Interior Door:
[interior_status]
-
\> Exterior Door:
[exterior_status]
+
\> Chamber Pressure:
[sensor_pressure] kPa
+
\> Control Pump:
[pump_status]
+
\> Interior Door:
[interior_status]
+
\> Exterior Door:
[exterior_status]
[state_options]"}
diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm
index fdea6d8469f..1b6be79b004 100644
--- a/code/game/machinery/flasher.dm
+++ b/code/game/machinery/flasher.dm
@@ -50,8 +50,9 @@
else if (istype(W, /obj/item/device/flash/handheld))
if (!bulb)
+ if(!user.drop_item())
+ return
user.visible_message("[user] installs [W] into [src].", "You install [W] into [src]. ")
- user.drop_item()
W.loc = src
bulb = W
power_change()
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index e5961c09fc9..0c600860d7c 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -77,8 +77,9 @@
if(!isnull(beaker))
user << "There is already a reagent container loaded! "
return
+ if(!user.drop_item())
+ return
- user.drop_item()
W.loc = src
beaker = W
user << "You attach \the [W] to \the [src]. "
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 1498fa14fe8..949f7b05dd3 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -324,7 +324,7 @@ Class Procs:
. = !(state_open || panel_open || is_operational()) && istype(C)
if(.)
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
- visible_message("[usr] pry open \the [src]. ", "You pry open \the [src]. ")
+ visible_message("[usr] pry open \the [src]. ", "You pry open \the [src]. ")
open_machine()
return 1
@@ -383,7 +383,7 @@ Class Procs:
if(W.works_from_distance)
user << "Following parts detected in the machine: "
for(var/var/obj/item/C in component_parts)
- user << " [C.name] "
+ user << " [C.name] "
for(var/obj/item/weapon/stock_parts/A in component_parts)
for(var/D in CB.req_components)
if(ispath(A.type, D))
@@ -404,7 +404,7 @@ Class Procs:
else
user << "Following parts detected in the machine: "
for(var/var/obj/item/C in component_parts)
- user << " [C.name] "
+ user << " [C.name] "
if(shouldplaysound)
W.play_rped_sound()
return 1
diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm
index e23456392ae..fed05fe9ce7 100644
--- a/code/game/machinery/navbeacon.dm
+++ b/code/game/machinery/navbeacon.dm
@@ -141,7 +141,7 @@ Transponder Codes:"}
t += "[key] ... [codes[key]]"
t += " Edit "
t += " Delete "
- t += " Add New "
+ t += " Add New "
t+= ""
var/datum/browser/popup = new(user, "navbeacon", "Navigation Beacon", 300, 400)
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index 5c3e80e238d..a11ed0d4a47 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -478,9 +478,9 @@ var/list/obj/machinery/newscaster/allCasters = list()
dat+="Description : [msg] "
dat+="Attach Photo : [(photo ? "Photo Attached" : "No Photo")]"
if(wanted_already)
- dat+="Wanted Issue created by: [news_network.wanted_issue.scannedUser] "
+ dat+="Wanted Issue created by: [news_network.wanted_issue.scannedUser] "
else
- dat+="Wanted Issue will be created under prosecutor: [scanned_user] "
+ dat+="Wanted Issue will be created under prosecutor: [scanned_user] "
dat+="[(wanted_already) ? ("Edit Issue") : ("Submit")] "
if(wanted_already)
dat+="Take down Issue "
@@ -788,7 +788,8 @@ var/list/obj/machinery/newscaster/allCasters = list()
photo = null
if(istype(user.get_active_hand(), /obj/item/weapon/photo))
photo = user.get_active_hand()
- user.drop_item()
+ if(!user.drop_item())
+ return
photo.loc = src
if(istype(user,/mob/living/silicon))
var/list/nametemp = list()
@@ -893,6 +894,10 @@ var/list/obj/machinery/newscaster/allCasters = list()
var/wantedPhoto
var/creationTime
+/obj/item/weapon/newspaper/suicide_act(mob/user)
+ user.visible_message("[user] is focusing intently on [src]! It looks like they're trying to commit sudoku. ")
+ return(OXYLOSS)
+
/obj/item/weapon/newspaper/attack_self(mob/user)
if(ishuman(user))
var/mob/living/carbon/human/human_user = user
diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm
index 9d1be6f4519..96fb5716814 100644
--- a/code/game/machinery/pipe/pipe_dispenser.dm
+++ b/code/game/machinery/pipe/pipe_dispenser.dm
@@ -72,7 +72,8 @@
add_fingerprint(user)
if (istype(W, /obj/item/pipe) || istype(W, /obj/item/pipe_meter))
usr << "You put [W] back into [src]. "
- user.drop_item()
+ if(!user.drop_item())
+ return
qdel(W)
return
else if (istype(W, /obj/item/weapon/wrench))
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index 34c13a8bb88..aaef91bc811 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -27,8 +27,9 @@
if(!gun.can_charge)
user << "Your gun has no external power connector. "
return
+ if(!user.drop_item())
+ return
- user.drop_item()
G.loc = src
charging = G
use_power = 2
diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm
index 2e8aeeecb69..b98fa244823 100644
--- a/code/game/machinery/shieldgen.dm
+++ b/code/game/machinery/shieldgen.dm
@@ -90,8 +90,6 @@
/obj/machinery/shield/hitby(AM as mob|obj)
- //Let everyone know we've been hit!
- visible_message("[src] was hit by [AM]. ")
//Super realistic, resource-intensive, real-time damage calculations.
var/tforce = 0
@@ -263,13 +261,13 @@
return
if(!anchored && !isinspace())
playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
- user << " You secure \the [src] to the floor! "
+ user << "You secure \the [src] to the floor! "
anchored = 1
else if(anchored)
playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
- user << " You unsecure \the [src] from the floor! "
+ user << "You unsecure \the [src] from the floor! "
if(active)
- user << " \The [src] shuts off! "
+ user << "\The [src] shuts off! "
src.shields_down()
anchored = 0
@@ -604,4 +602,4 @@
if (istype(mover, /obj/item/projectile))
return prob(10)
else
- return !src.density
\ No newline at end of file
+ return !src.density
diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm
index 0bc33615834..4d88f443d05 100644
--- a/code/game/machinery/slotmachine.dm
+++ b/code/game/machinery/slotmachine.dm
@@ -77,7 +77,8 @@
if(istype(I, /obj/item/weapon/coin))
var/obj/item/weapon/coin/C = I
if(prob(2))
- user.drop_item()
+ if(!user.drop_item())
+ return
C.loc = loc
C.throw_at(user, 3, 10)
if(prob(10))
@@ -85,7 +86,8 @@
user << "[src] spits your coin back out! "
else
- user.drop_item()
+ if(!user.drop_item())
+ return
user << "You insert a [C.cmineral] coin into [src]'s slot! "
balance += C.value
qdel(C)
@@ -293,14 +295,14 @@
return amount
-/obj/machinery/computer/slot_machine/proc/dispense(amount = 0, cointype = /obj/item/weapon/coin/silver, mob/living/target, throw = 0)
+/obj/machinery/computer/slot_machine/proc/dispense(amount = 0, cointype = /obj/item/weapon/coin/silver, mob/living/target, throwit = 0)
var/value = coinvalues["[cointype]"]
while(amount >= value)
var/obj/item/weapon/coin/C = new cointype(loc) //DOUBLE THE PAIN
amount -= value
- if(throw && target)
+ if(throwit && target)
C.throw_at(target, 3, 10)
else
random_step(C, 2, 40)
diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index da7f6a82c53..b1891f80539 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -54,7 +54,8 @@
// insert cell
var/obj/item/weapon/stock_parts/cell/C = usr.get_active_hand()
if(istype(C))
- user.drop_item()
+ if(!user.drop_item())
+ return
cell = C
C.loc = src
C.add_fingerprint(usr)
@@ -134,7 +135,8 @@
if(open && !cell)
var/obj/item/weapon/stock_parts/cell/C = usr.get_active_hand()
if(istype(C))
- usr.drop_item()
+ if(!usr.drop_item())
+ return
cell = C
C.loc = src
C.add_fingerprint(usr)
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index cc5c8e96fb8..e3993de167e 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -168,7 +168,7 @@
dat+= "Suit storage unit: Maintenance panel "
dat+= "Maintenance panel controls "
dat+= "The panel is ridden with controls, button and meters, labeled in strange signs and symbols that you cannot understand. Probably the manufactoring world's language. Among other things, a few controls catch your eye. "
- dat+= text("A small dial with a \"ë\" symbol embroidded on it. It's pointing towards a gauge that reads []. Turn towards [] ",(src.issuperUV ? "15nm" : "185nm"),src,(src.issuperUV ? "185nm" : "15nm") )
+ dat+= text("A small dial with a \"ë\" symbol embroidded on it. It's pointing towards a gauge that reads []. Turn towards [] ",(src.issuperUV ? "15nm" : "185nm"),src,(src.issuperUV ? "185nm" : "15nm") )
dat+= text("A thick old-style button, with 2 grimy LED lights next to it. The [] LED is on.Press button ",(src.safetieson? "GREEN " : "RED "),src)
dat+= text("Close panel ", user)
//user << browse(dat, "window=ssu_m_panel;size=400x500")
diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm
index 35a1b38e85c..87b89bcd926 100644
--- a/code/game/machinery/syndicatebomb.dm
+++ b/code/game/machinery/syndicatebomb.dm
@@ -90,9 +90,10 @@
user << "The cover is screwed on, it won't pry off! "
else if(istype(I, /obj/item/weapon/bombcore))
if(!payload)
+ if(!user.drop_item())
+ return
payload = I
user << "You place [payload] into [src]. "
- user.drop_item()
payload.loc = src
else
user << "[payload] is already loaded into [src]! You'll have to remove it first. "
@@ -138,7 +139,7 @@
var/turf/bombturf = get_turf(src)
var/area/A = get_area(bombturf)
if(payload && !istype(payload, /obj/item/weapon/bombcore/training))
- message_admins("[key_name(user)]? has primed a [name] ([payload]) for detonation at [A.name] (JMP) .")
+ message_admins("[key_name_admin(user)]? (FLW ) has primed a [name] ([payload]) for detonation at [A.name] (JMP) .")
log_game("[key_name(user)] has primed a [name] ([payload]) for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])")
payload.adminlog = "The [src.name] that [key_name(user)] had primed detonated!"
@@ -311,7 +312,7 @@
var/turf/T = get_turf(src)
var/area/A = get_area(T)
detonated--
- var/log_str = "[key_name(user)]? has remotely detonated [detonated ? "syndicate bombs" : "a syndicate bomb"] using a [name] at [A.name] (JMP) ."
+ var/log_str = "[key_name_admin(user)]? (FLW ) has remotely detonated [detonated ? "syndicate bombs" : "a syndicate bomb"] using a [name] at [A.name] (JMP) ."
bombers += log_str
message_admins(log_str)
log_game("[key_name(user)] has remotely detonated [detonated ? "syndicate bombs" : "a syndicate bomb"] using a [name] at [A.name]([T.x],[T.y],[T.z])")
diff --git a/code/game/machinery/telecomms/computers/logbrowser.dm b/code/game/machinery/telecomms/computers/logbrowser.dm
index 8798f07c20c..8be4d941146 100644
--- a/code/game/machinery/telecomms/computers/logbrowser.dm
+++ b/code/game/machinery/telecomms/computers/logbrowser.dm
@@ -2,7 +2,7 @@
/obj/machinery/computer/telecomms/server
name = "telecommunications server monitoring console"
- icon_state = "comm_logs"
+ icon_screen = "comm_logs"
var/screen = 0 // the screen number:
var/list/servers = list() // the servers located by the computer
diff --git a/code/game/machinery/telecomms/computers/telemonitor.dm b/code/game/machinery/telecomms/computers/telemonitor.dm
index 432604dc15e..c6c3ab75a64 100644
--- a/code/game/machinery/telecomms/computers/telemonitor.dm
+++ b/code/game/machinery/telecomms/computers/telemonitor.dm
@@ -7,7 +7,7 @@
/obj/machinery/computer/telecomms/monitor
name = "telecommunications monitoring console"
- icon_state = "comm_monitor"
+ icon_screen = "comm_monitor"
var/screen = 0 // the screen number:
var/list/machinelist = list() // the machines located by the computer
diff --git a/code/game/machinery/telecomms/computers/traffic_control.dm b/code/game/machinery/telecomms/computers/traffic_control.dm
index 3edb25ff551..9d520a5a7d8 100644
--- a/code/game/machinery/telecomms/computers/traffic_control.dm
+++ b/code/game/machinery/telecomms/computers/traffic_control.dm
@@ -2,7 +2,6 @@
/obj/machinery/computer/telecomms/traffic
name = "telecommunications traffic control console"
- icon_state = "computer_generic"
var/screen = 0 // the screen number:
var/list/servers = list() // the servers located by the computer
@@ -169,7 +168,8 @@
var/obj/item/weapon/card/id/I = C.get_active_hand()
if(istype(I))
if(check_access(I))
- C.drop_item()
+ if(!C.drop_item())
+ return
I.loc = src
auth = I
create_log("has logged in.", usr)
diff --git a/code/game/machinery/telecomms/machines/server.dm b/code/game/machinery/telecomms/machines/server.dm
index 322b635e3ca..f78fdd13897 100644
--- a/code/game/machinery/telecomms/machines/server.dm
+++ b/code/game/machinery/telecomms/machines/server.dm
@@ -118,12 +118,12 @@
/obj/machinery/telecomms/server/proc/admin_log(var/mob/mob)
- var/msg="[mob.real_name]/([mob.key]) has compiled a script to server [src]:"
+ var/msg="[key_name(mob)] has compiled a script to server [src]:"
diary << msg
diary << rawcode
src.investigate_log("[msg] [rawcode]", "ntsl")
if(length(rawcode)) // Let's not bother the admins for empty code.
- message_admins("[mob.real_name]/([mob.key]) has compiled and uploaded a NTSL script to [src.id] ([mob.x],[mob.y],[mob.z] - JMP )",0,1)
+ message_admins("[key_name_admin(mob)] (FLW ) has compiled and uploaded a NTSL script to [src.id]",0,1)
/obj/machinery/telecomms/server/proc/compile(var/mob/user)
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index 1ec4c229900..6e41cf2856f 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -1,7 +1,8 @@
/obj/machinery/computer/teleporter
name = "Teleporter Control Console"
desc = "Used to control a linked teleportation Hub and Station."
- icon_state = "teleport"
+ icon_screen = "teleport"
+ icon_keyboard = "teleport_key"
circuit = "/obj/item/weapon/circuitboard/teleporter"
var/obj/item/device/gps/locked = null
var/regime_set = "Teleporter"
@@ -43,7 +44,7 @@
return
L.loc = src
locked = L
- user << "You insert the GPS device into the [name]'s slot. "
+ user << "You insert the GPS device into the [name]'s slot. "
else
..()
return
@@ -397,9 +398,9 @@
if(linked_stations.len < efficiency)
linked_stations.Add(M.buffer)
M.buffer = null
- user << "You upload the data from the [W.name]'s buffer. "
+ user << "You upload the data from the [W.name]'s buffer. "
else
- user << "This station can't hold more information, try to use better parts. "
+ user << "This station can't hold more information, try to use better parts. "
if(default_deconstruction_screwdriver(user, "controller-o", "controller", W))
update_icon()
return
@@ -413,11 +414,11 @@
if(istype(W, /obj/item/device/multitool))
var/obj/item/device/multitool/M = W
M.buffer = src
- user << "You download the data to the [W.name]'s buffer. "
+ user << "You download the data to the [W.name]'s buffer. "
return
if(istype(W, /obj/item/weapon/wirecutters))
link_console_and_hub()
- user << "You reconnect the station to nearby machinery. "
+ user << "You reconnect the station to nearby machinery. "
return
/obj/machinery/teleport/station/attack_paw()
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 43d22279030..a35d68b8f43 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -170,7 +170,8 @@
return
if(junk_check(W))
if(!iscompartmentfull(user))
- user.drop_item()
+ if(!user.drop_item())
+ return
W.loc = src
food_load(W)
user << "You insert [W] into [src]'s chef compartment. "
@@ -250,7 +251,8 @@
attack_hand(user)
return
else if(istype(W, /obj/item/weapon/coin) && premium.len > 0)
- user.drop_item()
+ if(!user.drop_item())
+ return
W.loc = src
coin = W
user << "You insert [W] into [src]. "
@@ -719,7 +721,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
vend_reply = "Remember the name: Liberation Station!"
products = list(/obj/item/weapon/gun/projectile/automatic/pistol/deagle/gold = 2,/obj/item/weapon/gun/projectile/automatic/pistol/deagle/camo = 2,
/obj/item/weapon/gun/projectile/automatic/pistol/m1911 = 2,/obj/item/weapon/gun/projectile/automatic/proto = 2,
- /obj/item/weapon/gun/projectile/shotgun/combat = 2,/obj/item/weapon/gun/projectile/automatic/gyropistol = 1,
+ /obj/item/weapon/gun/projectile/shotgun/automatic/combat = 2,/obj/item/weapon/gun/projectile/automatic/gyropistol = 1,
/obj/item/weapon/gun/projectile/shotgun = 2,/obj/item/weapon/gun/projectile/automatic/ar = 2)
premium = list(/obj/item/ammo_box/magazine/smgm9mm = 2,/obj/item/ammo_box/magazine/m50 = 4,/obj/item/ammo_box/magazine/m45 = 2,/obj/item/ammo_box/magazine/m75 = 2)
contraband = list(/obj/item/clothing/under/patriotsuit = 1,/obj/item/weapon/bedsheet/patriot = 3)
diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm
index 76508f008ce..05c3b10c069 100644
--- a/code/game/machinery/washing_machine.dm
+++ b/code/game/machinery/washing_machine.dm
@@ -188,7 +188,8 @@
if(istype(W,/obj/item/toy/crayon) ||istype(W,/obj/item/weapon/stamp))
if( state in list( 1, 3, 6 ) )
if(!crayon)
- user.drop_item()
+ if(!user.drop_item())
+ return
crayon = W
crayon.loc = src
else
@@ -256,7 +257,8 @@
if(contents.len < 5)
if ( state in list(1, 3) )
- user.drop_item()
+ if(!user.drop_item())
+ return
W.loc = src
state = 3
else
diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm
index 196a32ea235..7b9a4867f03 100644
--- a/code/game/mecha/equipment/tools/tools.dm
+++ b/code/game/mecha/equipment/tools/tools.dm
@@ -595,8 +595,8 @@
P.icon_state = "anom"
P.name = "wormhole"
var/turf/T = get_turf(target)
- message_admins("[key_name(chassis.occupant, chassis.occupant.client)](? ) used a Wormhole Generator in ([T.x],[T.y],[T.z] - JMP )",0,1)
- log_game("[chassis.occupant.ckey]([chassis.occupant]) used a Wormhole Generator in ([T.x],[T.y],[T.z])")
+ message_admins("[key_name_admin(chassis.occupant, chassis.occupant.client)](? ) (FLW ) used a Wormhole Generator in ([T.x],[T.y],[T.z] - JMP )",0,1)
+ log_game("[key_name(chassis.occupant)] used a Wormhole Generator in ([T.x],[T.y],[T.z])")
do_after_cooldown()
src = null
spawn(rand(150,300))
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index 40389aae5a9..0414658025d 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -191,7 +191,7 @@
chassis.use_power(energy_drain)
log_message("Honked from [src.name]. HONK!")
var/turf/T = get_turf(src)
- message_admins("[key_name(chassis.occupant, chassis.occupant.client)](? ) used a Mecha Honker in ([T.x],[T.y],[T.z] - JMP )",0,1)
+ message_admins("[key_name_admin(chassis.occupant, chassis.occupant.client)](? ) (FLW ) used a Mecha Honker in ([T.x],[T.y],[T.z] - JMP )",0,1)
log_game("[chassis.occupant.ckey]([chassis.occupant]) used a Mecha Honker in ([T.x],[T.y],[T.z])")
do_after_cooldown()
return
@@ -307,7 +307,7 @@
log_message("Fired from [src.name], targeting [target].")
var/turf/T = get_turf(src)
message_admins("[key_name(chassis.occupant, chassis.occupant.client)](? ) fired a [src] in ([T.x],[T.y],[T.z] - JMP )",0,1)
- log_game("[chassis.occupant.ckey]([chassis.occupant]) fired a [src] ([T.x],[T.y],[T.z])")
+ log_game("[key_name(chassis.occupant)] fired a [src] ([T.x],[T.y],[T.z])")
do_after_cooldown()
return
@@ -347,8 +347,8 @@
projectiles--
log_message("Fired from [src.name], targeting [target].")
var/turf/T = get_turf(src)
- message_admins("[key_name(chassis.occupant, chassis.occupant.client)](? ) fired a [src] in ([T.x],[T.y],[T.z] - JMP )",0,1)
- log_game("[chassis.occupant.ckey]([chassis.occupant]) fired a [src] ([T.x],[T.y],[T.z])")
+ message_admins("[key_name(chassis.occupant, chassis.occupant.client)](? ) (FLW ) fired a [src] in ([T.x],[T.y],[T.z] - JMP )",0,1)
+ log_game("[key_name(chassis.occupant)] fired a [src] ([T.x],[T.y],[T.z])")
spawn(det_time)
if(F)
F.prime()
diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm
index 08f454d379a..d2c467765a4 100644
--- a/code/game/mecha/mech_bay.dm
+++ b/code/game/mecha/mech_bay.dm
@@ -81,10 +81,8 @@
/obj/machinery/computer/mech_bay_power_console
name = "mech bay power control console"
desc = "Used to control mechbay power ports."
- density = 1
- anchored = 1
- icon = 'icons/obj/computer.dmi'
- icon_state = "recharge_comp"
+ icon_screen = "recharge_comp"
+ icon_keyboard = "rd_key"
circuit = /obj/item/weapon/circuitboard/mech_bay_power_console
var/obj/machinery/mech_bay_recharge_port/recharge_port
@@ -147,16 +145,10 @@
/obj/machinery/computer/mech_bay_power_console/update_icon()
- if(stat & NOPOWER)
- icon_state = "recharge_comp0"
- return
- if(stat & BROKEN)
- icon_state = "recharge_compb"
- return
+ ..()
if(!recharge_port || !recharge_port.recharging_mech || !recharge_port.recharging_mech.cell || !(recharge_port.recharging_mech.cell.charge < recharge_port.recharging_mech.cell.maxcharge))
- icon_state = "recharge_comp"
return
- icon_state = "recharge_comp_on"
+ overlays += "recharge_comp_on"
/obj/machinery/computer/mech_bay_power_console/initialize()
reconnect()
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index c9cc3e158d9..749d413b446 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -139,7 +139,7 @@
var/amount = min(res_max_amount, resources[resource])
output += "[material2name(resource)]: [amount] cm³"
if(amount>0)
- output += " - Remove \[1 \] | \[10 \] | \[All \] "
+ output += "- Remove \[1 \] | \[10 \] | \[All \] "
output += " "
return output
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index ec69ca4c4a3..682f81e557f 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -675,7 +675,8 @@
var/obj/item/mecha_parts/mecha_equipment/E = W
spawn()
if(E.can_attach(src))
- user.drop_item()
+ if(!user.drop_item())
+ return
E.attach(src)
user.visible_message("[user] attaches [W] to [src].", "You attach [W] to [src]. ")
else
@@ -739,9 +740,10 @@
else if(istype(W, /obj/item/weapon/stock_parts/cell))
if(state==4)
if(!src.cell)
+ if(!user.drop_item())
+ return
var/obj/item/weapon/stock_parts/cell/C = W
user << "You install the powercell. "
- user.drop_item()
C.forceMove(src)
C.use(C.charge * 0.8)
src.cell = C
diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm
index b8bbbc23481..adc83c8da0d 100644
--- a/code/game/mecha/mecha_control_console.dm
+++ b/code/game/mecha/mecha_control_console.dm
@@ -1,8 +1,8 @@
/obj/machinery/computer/mecha
name = "exosuit control console"
desc = "Used to remotely locate or lockdown exosuits."
- icon = 'icons/obj/computer.dmi'
- icon_state = "mecha"
+ icon_screen = "mecha"
+ icon_keyboard = "tech_key"
req_access = list(access_robotics)
circuit = "/obj/item/weapon/circuitboard/mecha_control"
var/list/located = list()
@@ -58,16 +58,6 @@
updateUsrDialog()
return
-
-/obj/machinery/computer/mecha/update_icon()
- if(stat & NOPOWER)
- icon_state = "mecha0"
- return
- if(stat & BROKEN)
- icon_state = "mechab"
- return
- icon_state = "mecha"
-
/obj/item/mecha_parts/mecha_tracking
name = "exosuit tracking beacon"
desc = "Device used to transmit exosuit data."
diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm
index 8e0343348e6..a9d3579ea9d 100644
--- a/code/game/objects/effects/aliens.dm
+++ b/code/game/objects/effects/aliens.dm
@@ -109,7 +109,6 @@
/obj/structure/alien/resin/hitby(atom/movable/AM)
..()
- visible_message("[src] was hit by [AM]. ")
var/tforce = 0
if(!isobj(AM))
tforce = 10
@@ -516,4 +515,4 @@
#undef WEED_NORTH_EDGING
#undef WEED_SOUTH_EDGING
#undef WEED_EAST_EDGING
-#undef WEED_WEST_EDGING
\ No newline at end of file
+#undef WEED_WEST_EDGING
diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm
index 2d7cba31150..c2954010ca4 100644
--- a/code/game/objects/effects/effect_system/effects_smoke.dm
+++ b/code/game/objects/effects/effect_system/effects_smoke.dm
@@ -262,7 +262,7 @@
var/mob/M = get_mob_by_key(carry.my_atom.fingerprintslast)
var/more = ""
if(M)
- more = "(? )"
+ more = "(? ) (FLW ) "
message_admins("A chemical smoke reaction has taken place in ([whereLink])[contained]. Last associated key is [carry.my_atom.fingerprintslast][more].", 0, 1)
log_game("A chemical smoke reaction has taken place in ([where])[contained]. Last associated key is [carry.my_atom.fingerprintslast].")
else
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index 538e98cb003..578fe74bade 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -24,7 +24,7 @@
loot = list(
/obj/item/weapon/gun/projectile/automatic/pistol = 8,
- /obj/item/weapon/gun/projectile/shotgun/combat = 5,
+ /obj/item/weapon/gun/projectile/shotgun/automatic/combat = 5,
/obj/item/weapon/gun/projectile/revolver/mateba,
/obj/item/weapon/gun/projectile/automatic/pistol/deagle
)
diff --git a/code/game/objects/effects/spawners/structure.dm b/code/game/objects/effects/spawners/structure.dm
new file mode 100644
index 00000000000..774b9ca799d
--- /dev/null
+++ b/code/game/objects/effects/spawners/structure.dm
@@ -0,0 +1,33 @@
+/*
+Because mapping is already tedious enough this spawner let you spawn generic
+"sets" of objects rather than having to make the same object stack again and
+again.
+*/
+
+/obj/effect/spawner/structure
+ name = "map structure spawner"
+ var/list/spawn_list
+
+/obj/effect/spawner/structure/New()
+ if(spawn_list && spawn_list.len)
+ for(var/i = 1, i <= spawn_list.len, i++)
+ var/to_spawn = spawn_list[i]
+ new to_spawn(get_turf(src))
+ qdel(src)
+
+/obj/effect/spawner/structure/window
+ icon = 'icons/obj/structures.dmi'
+ icon_state = "window_spawner"
+ name = "window spawner"
+ spawn_list = list(
+ /obj/structure/grille,
+ /obj/structure/window/fulltile
+ )
+
+/obj/effect/spawner/structure/window/reinforced
+ name = "reenforced window spawner"
+ icon_state = "rwindow_spawner"
+ spawn_list = list(
+ /obj/structure/grille,
+ /obj/structure/window/reinforced/fulltile
+ )
diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm
index 7e1fd4d977c..3a7095a29a4 100644
--- a/code/game/objects/explosion.dm
+++ b/code/game/objects/explosion.dm
@@ -126,7 +126,7 @@
var/throw_dir = get_dir(epicenter,T)
for(var/obj/item/I in T)
spawn(0) //Simultaneously not one at a time
- if(I)
+ if(I && !I.anchored)
var/throw_range = rand(throw_dist, max_range)
var/turf/throw_at = get_ranged_target_turf(I, throw_dir, throw_range)
I.throw_speed = 4 //Temporarily change their throw_speed for embedding purposes (Reset when it finishes throwing, regardless of hitting anything)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index a098fc0bf08..f0f85603f5c 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -379,8 +379,8 @@
M << "Your eyes start to bleed profusely! "
if(prob(50))
if(M.stat != 2)
- M << "You drop what you're holding and clutch at your eyes! "
- M.drop_item()
+ if(M.drop_item())
+ M << "You drop what you're holding and clutch at your eyes! "
M.eye_blurry += 10
M.Paralyse(1)
M.Weaken(2)
@@ -443,6 +443,7 @@
var/mob/living/carbon/human/H = A
if(can_embed(src))
if(prob(embed_chance) && !(PIERCEIMMUNE in H.dna.species.specflags))
+ H.throw_alert("embeddedobject")
var/obj/item/organ/limb/L = pick(H.organs)
L.embedded_objects |= src
add_blood(H)//it embedded itself in you, of course it's bloody!
diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm
index 83dcbf39f7c..53d7024076e 100644
--- a/code/game/objects/items/blueprints.dm
+++ b/code/game/objects/items/blueprints.dm
@@ -84,7 +84,7 @@
var/area/A = get_area()
if(get_area_type() == AREA_STATION)
. += "According to \the [src], you are now in \"[html_encode(A.name)]\" .
"
- . += "You may move an amendment to the drawing.
"
+ . += "You may move an amendment to the drawing.
"
var/datum/browser/popup = new(user, "blueprints", "[src]", 700, 500)
popup.set_content(.)
popup.open()
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 16f19760d7d..6ef0a3fa4f8 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -50,6 +50,8 @@ var/global/list/obj/item/device/pda/PDAs = list()
var/list/ntrclog = list() //NTRC message log
var/new_ntrc_msg = 0
+ var/image/photo = null //Scanned photo
+
var/noreturn = 0 //whether the PDA can use the Return button, used for the aiPDA chatroom
/obj/item/device/pda/medical
@@ -815,13 +817,15 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(useTC != 2) // Does our recipient have a broadcaster on their level?
U << "ERROR: Cannot reach recipient."
return
- useMS.send_pda_message("[P.owner]","[owner]","[t]")
-
- tnote += "→ To [P.owner]: [t] "
- P.tnote += "← From [owner] ([ownjob]): [t] "
+ var/msg_ref = useMS.send_pda_message("[P.owner]","[owner]","[t]",photo)
+ var/photo_ref = ""
+ if(photo)
+ photo_ref = "(Photo) "
+ tnote += "→ To [P.owner]: [t][photo_ref] "
+ P.tnote += "← From [owner] ([ownjob]): [t][photo_ref] "
for(var/mob/M in player_list)
if(isobserver(M) && M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTPDA))
- M.show_message("PDA Message - [owner] -> [P.owner] : [t] ")
+ M.show_message("PDA Message - [owner] -> [P.owner] : [t][photo_ref] ")
if (!P.silent)
playsound(P.loc, 'sound/machines/twobeep.ogg', 50, 1)
@@ -835,9 +839,10 @@ var/global/list/obj/item/device/pda/PDAs = list()
L = get(P, /mob/living/silicon)
if(L)
- L << "\icon[P] Message from [src.owner] ([ownjob]), \"[t]\" (Reply )"
+ L << "\icon[P] Message from [src.owner] ([ownjob]), \"[t]\"[photo_ref] (Reply )"
log_pda("[usr] (PDA: [src.name]) sent \"[t]\" to [P.name]")
+ photo = null
P.overlays.Cut()
P.overlays += image('icons/obj/pda.dmi', "pda-r")
else
@@ -967,6 +972,10 @@ var/global/list/obj/item/device/pda/PDAs = list()
return
C.loc = src
user << "You slide \the [C] into \the [src]. "
+ else if(istype(C, /obj/item/weapon/photo))
+ var/obj/item/weapon/photo/P = C
+ photo = P.img
+ user << "You scan \the [C]. "
return
/obj/item/device/pda/attack(mob/living/carbon/C, mob/living/user as mob)
@@ -1104,6 +1113,12 @@ var/global/list/obj/item/device/pda/PDAs = list()
return
var/selected = plist[c]
+
+ if(aicamera.aipictures.len>0)
+ var/add_photo = input(user,"Do you want to attach a photo?","Photo","No") as null|anything in list("Yes","No")
+ if(add_photo=="Yes")
+ var/datum/picture/Pic = aicamera.selectpicture(aicamera)
+ src.aiPDA.photo = Pic.fields["img"]
src.aiPDA.create_message(src, selected)
diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm
index 54996ca39bc..64196a74bd4 100644
--- a/code/game/objects/items/devices/PDA/cart.dm
+++ b/code/game/objects/items/devices/PDA/cart.dm
@@ -331,7 +331,7 @@ Code:
var/count = 0
for(var/obj/machinery/computer/monitor/pMon in powermonitors)
count++
- menu += " [pMon] "
+ menu += "[pMon] "
menu += ""
diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm
index 40a78956230..6487e340422 100644
--- a/code/game/objects/items/devices/aicard.dm
+++ b/code/game/objects/items/devices/aicard.dm
@@ -65,7 +65,7 @@
dat += " "
dat += {"[A.radio_enabled ? "Disable" : "Enable"] Subspace Radio "}
dat += " "
- dat += {" Close "}
+ dat += {"Close "}
user << browse(dat, "window=aicard")
onclose(user, "aicard")
return
diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm
index f4953c98812..b91db4b5e30 100644
--- a/code/game/objects/items/devices/camera_bug.dm
+++ b/code/game/objects/items/devices/camera_bug.dm
@@ -349,8 +349,9 @@
for(var/entry in expandables)
if(istype(W,entry))
+ if(!user.unEquip(W))
+ return
bugtype = expandables[entry]
- user.drop_item()
W.loc = src
expansion = W
user << "You add [W] to [src]. "
diff --git a/code/game/objects/items/devices/doorCharge.dm b/code/game/objects/items/devices/doorCharge.dm
new file mode 100644
index 00000000000..fe3fd7951a5
--- /dev/null
+++ b/code/game/objects/items/devices/doorCharge.dm
@@ -0,0 +1,32 @@
+/obj/item/device/doorCharge
+ name = "airlock charge"
+ desc = null //Different examine for traitors
+ item_state = "electronic"
+ icon_state = "doorCharge"
+ w_class = 2
+ throw_range = 4
+ throw_speed = 1
+ force = 3
+ attack_verb = list("blown up", "exploded", "detonated")
+ m_amt = 50
+ g_amt = 30
+
+/obj/item/device/doorCharge/ex_act(severity, target)
+ switch(severity)
+ if(1)
+ visible_message("[src] detonates! ")
+ explosion(src.loc,0,2,1,flame_range = 4)
+ qdel(src)
+ if(2)
+ if(prob(50))
+ ex_act(1)
+ if(3)
+ if(prob(25))
+ ex_act(1)
+
+/obj/item/device/doorCharge/examine(mob/user)
+ ..()
+ if(user.mind in ticker.mode.traitors) //No nuke ops because the device is excluded from nuclear
+ user << "A small explosive device that can be used to sabotage airlocks to cause an explosion upon opening. To apply, remove the airlock's maintenance panel and place it within."
+ else
+ user << "A small, suspicious object that feels lukewarm when held."
\ No newline at end of file
diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm
index c66a93aa4ad..ff6d78c41ef 100644
--- a/code/game/objects/items/devices/laserpointer.dm
+++ b/code/game/objects/items/devices/laserpointer.dm
@@ -47,7 +47,8 @@
/obj/item/device/laser_pointer/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/weapon/stock_parts/micro_laser))
if(!diode)
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
diode = W
user << "You install a [diode.name] in [src]. "
diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm
index 4580e823eba..a440715d7a7 100644
--- a/code/game/objects/items/devices/lightreplacer.dm
+++ b/code/game/objects/items/devices/lightreplacer.dm
@@ -88,9 +88,10 @@
var/obj/item/weapon/light/L = W
if(L.status == 0) // LIGHT OKAY
if(uses < max_uses)
+ if(!user.unEquip(W))
+ return
AddUses(1)
user << "You insert the [L.name] into the [src.name]. You have [uses] lights remaining. "
- user.drop_item()
qdel(L)
return
else
diff --git a/code/game/objects/items/devices/pizza_bomb.dm b/code/game/objects/items/devices/pizza_bomb.dm
index cbf2bb7d193..86a0c2bc9c5 100644
--- a/code/game/objects/items/devices/pizza_bomb.dm
+++ b/code/game/objects/items/devices/pizza_bomb.dm
@@ -11,6 +11,12 @@
var/correct_wire
var/armer //Used for admin purposes
+/obj/item/device/pizza_bomb/suicide_act(mob/user)
+ user.visible_message("[user] is opening [src]! It looks like \he's hungry and looking for pizza. ")
+ sleep(10)
+ go_boom()
+ return(BRUTELOSS)
+
/obj/item/device/pizza_bomb/attack_self(mob/user)
if(disarmed)
user << "\The [src] is disarmed. "
@@ -30,7 +36,7 @@
timer = Clamp(timer, 10, 100)
icon_state = "pizzabox1"
user << "You set the timer to [timer / 10] before activating the payload and closing \the [src]."
- message_admins("[key_name(usr)]? has set a timer on a pizza bomb to [timer/10] seconds at (JMP) .")
+ message_admins("[key_name_admin(usr)]? (FLW ) has set a timer on a pizza bomb to [timer/10] seconds at (JMP) .")
log_game("[key_name(usr)] has set the timer on a pizza bomb to [timer/10] seconds ([loc.x],[loc.y],[loc.z]).")
armer = usr
name = "pizza box"
@@ -42,8 +48,8 @@
icon_state = "pizzabox_bomb"
audible_message("\icon[src] *beep* *beep* ")
user << "That's no pizza! That's a bomb! "
- message_admins("[key_name(usr)]? has triggered a pizza bomb armed by [armer] at (JMP) .")
- log_game("[key_name(usr)] has triggered a pizza bomb armed by [armer] ([loc.x],[loc.y],[loc.z]).")
+ message_admins("[key_name_admin(usr)]? (FLW ) has triggered a pizza bomb armed by [key_name_admin(armer)] at (JMP) .")
+ log_game("[key_name(usr)] has triggered a pizza bomb armed by [key_name(armer)] ([loc.x],[loc.y],[loc.z]).")
primed = 1
sleep(timer)
return go_boom()
diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm
index 970e7550699..975a08d3a02 100644
--- a/code/game/objects/items/devices/powersink.dm
+++ b/code/game/objects/items/devices/powersink.dm
@@ -95,7 +95,7 @@
"[user] activates \the [src]!", \
"You activate \the [src]. ",
"You hear a click. ")
- message_admins("Power sink activated by [key_name(user, user.client)](? ) at ([x],[y],[z] - JMP )")
+ message_admins("Power sink activated by [key_name_admin(user)](? ) (FLW ) at ([x],[y],[z] - JMP )")
log_game("Power sink activated by [key_name(user)] at ([x],[y],[z])")
set_mode(OPERATING)
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index 92ad5697dc7..31f12619e03 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -253,12 +253,14 @@
return
if(!keyslot)
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
keyslot = W
else
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
keyslot2 = W
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 8bed318c4ad..c9cf83c17e9 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -608,7 +608,8 @@
return
if(!keyslot)
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
keyslot = W
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index c3c6a846aea..23bc0cbbc42 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -80,10 +80,10 @@ MASS SPECTROMETER
/obj/item/device/healthanalyzer/attack_self(mob/user)
if(!scanchems)
- user << "You switch the health analyzer to scan chemical contents. "
+ user << "You switch the health analyzer to scan chemical contents. "
scanchems = 1
else
- user << "You switch the health analyzer to check physical health. "
+ user << "You switch the health analyzer to check physical health. "
scanchems = 0
return
/obj/item/device/healthanalyzer/attack(mob/living/M as mob, mob/living/carbon/human/user as mob)
@@ -198,9 +198,9 @@ MASS SPECTROMETER
if(H.reagents.reagent_list.len)
user << "Subject contains the following reagents: "
for(var/datum/reagent/R in H.reagents.reagent_list)
- user << "[R.volume] units of [R.name][R.overdosed == 1 ? " - OVERDOSING " : ". "]"
+ user << "[R.volume] units of [R.name][R.overdosed == 1 ? " - OVERDOSING " : ". "]"
else
- user << "Subject contains no reagents. "
+ user << "Subject contains no reagents. "
if(H.reagents.addiction_list.len)
user << "Subject is addicted to the following reagents: "
for(var/datum/reagent/R in H.reagents.addiction_list)
diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm
index fd5cb821462..826853d049e 100644
--- a/code/game/objects/items/devices/taperecorder.dm
+++ b/code/game/objects/items/devices/taperecorder.dm
@@ -33,7 +33,8 @@
/obj/item/device/taperecorder/attackby(obj/item/I, mob/user, params)
if(!mytape && istype(I, /obj/item/device/tape))
- user.drop_item()
+ if(!user.unEquip(I))
+ return
I.loc = src
mytape = I
user << "You insert [I] into [src]. "
diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm
index 97ffc5e6307..128c6c071bd 100644
--- a/code/game/objects/items/devices/transfer_valve.dm
+++ b/code/game/objects/items/devices/transfer_valve.dm
@@ -20,15 +20,17 @@
return
if(!tank_one)
+ if(!user.unEquip(item))
+ return
tank_one = item
- user.drop_item()
item.loc = src
user << "You attach the tank to the transfer valve. "
if(item.w_class > w_class)
w_class = item.w_class
else if(!tank_two)
+ if(!user.unEquip(item))
+ return
tank_two = item
- user.drop_item()
item.loc = src
user << "You attach the tank to the transfer valve. "
if(item.w_class > w_class)
@@ -174,21 +176,21 @@
if(!attacher)
attacher_name = "Unknown"
else
- attacher_name = "[attacher.name]([attacher.ckey])"
+ attacher_name = "[key_name_admin(attacher)]"
var/log_str1 = "Bomb valve opened in "
var/log_str2 = "with [attachment] attacher: [attacher_name]"
var/log_attacher = ""
if(attacher)
- log_attacher = "(? )"
+ log_attacher = "(? ) (FLW )"
var/mob/mob = get_mob_by_key(src.fingerprintslast)
var/last_touch_info = ""
if(mob)
- last_touch_info = "(? )"
+ last_touch_info = "(? ) (FLW )"
- var/log_str3 = " Last touched by: [src.fingerprintslast]"
+ var/log_str3 = " Last touched by: [key_name_admin(mob)]"
var/bomb_message = "[log_str1] [A.name] [log_str2][log_attacher] [log_str3][last_touch_info]"
diff --git a/code/game/objects/items/holotape.dm b/code/game/objects/items/holotape.dm
index 68070972d6e..309d52c52a0 100644
--- a/code/game/objects/items/holotape.dm
+++ b/code/game/objects/items/holotape.dm
@@ -216,7 +216,6 @@
/obj/item/holotape/hitby(AM as mob|obj)
..()
- visible_message("[src] was hit by [AM]. ")
var/tforce = 0
if(ismob(AM))
tforce = 5
@@ -251,4 +250,4 @@
del(src)
return
-#undef MAX_TAPE_RANGE
\ No newline at end of file
+#undef MAX_TAPE_RANGE
diff --git a/code/game/objects/items/latexballoon.dm b/code/game/objects/items/latexballoon.dm
index 6c2c7849723..3c6bdb3b5b4 100644
--- a/code/game/objects/items/latexballoon.dm
+++ b/code/game/objects/items/latexballoon.dm
@@ -18,7 +18,7 @@
item_state = "latexballon"
user.update_inv_r_hand()
user.update_inv_l_hand()
- user << " You blow up [src] with [tank]. "
+ user << "You blow up [src] with [tank]. "
air_contents = tank.remove_air_volume(3)
/obj/item/latexballon/proc/burst()
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index 3b9868babac..ed337577622 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -102,28 +102,32 @@
return
if(istype(W, /obj/item/robot_parts/l_leg))
if(src.l_leg) return
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
src.l_leg = W
src.updateicon()
if(istype(W, /obj/item/robot_parts/r_leg))
if(src.r_leg) return
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
src.r_leg = W
src.updateicon()
if(istype(W, /obj/item/robot_parts/l_arm))
if(src.l_arm) return
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
src.l_arm = W
src.updateicon()
if(istype(W, /obj/item/robot_parts/r_arm))
if(src.r_arm) return
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
src.r_arm = W
src.updateicon()
@@ -131,7 +135,8 @@
if(istype(W, /obj/item/robot_parts/chest))
if(src.chest) return
if(W:wires && W:cell)
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
src.chest = W
src.updateicon()
@@ -143,7 +148,8 @@
if(istype(W, /obj/item/robot_parts/head))
if(src.head) return
if(W:flash2 && W:flash1)
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
src.head = W
src.updateicon()
@@ -190,7 +196,8 @@
var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc))
if(!O) return
- user.drop_item()
+ if(!user.unEquip(W))
+ return
O.invisibility = 0
//Transfer debug settings to new mob
@@ -297,7 +304,8 @@
user << "You have already inserted a cell! "
return
else
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
src.cell = W
user << "You insert the cell. "
@@ -324,7 +332,8 @@
user << "You can't use a broken flash! "
return
else
- user.drop_item()
+ if(!user.unEquip(W))
+ return
F.loc = src
if(src.flash1)
src.flash2 = F
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 00d1e1d32e7..ea9be2f7239 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -168,7 +168,7 @@
src.bullets--
user.visible_message("[user] fires [src] at [target]! ", \
"You fire [src] at [target]! ", \
- " You hear a gunshot! ")
+ "You hear a gunshot! ")
/obj/item/toy/ammo/gun
name = "capgun ammo"
@@ -533,7 +533,7 @@
s.set_up(3, 1, src)
s.start()
new /obj/effect/decal/cleanable/ash(src.loc)
- src.visible_message(" The [src.name] explodes! ","You hear a snap! ")
+ src.visible_message("The [src.name] explodes! ","You hear a snap! ")
playsound(src, 'sound/effects/snap.ogg', 50, 1)
qdel(src)
diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm
index deef2e3e927..ff828898c6a 100644
--- a/code/game/objects/items/weapons/AI_modules.dm
+++ b/code/game/objects/items/weapons/AI_modules.dm
@@ -239,11 +239,13 @@ AI MODULES
/obj/item/weapon/aiModule/reset/purge/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
..()
target.clear_inherent_laws()
+ target.clear_zeroth_law(0)
/******************* Full Core Boards *******************/
/obj/item/weapon/aiModule/core/full/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender) //These boards replace inherent laws.
target.clear_inherent_laws()
+ target.clear_zeroth_law(0)
..()
/******************** Asimov ********************/
diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm
index 07ea6047cde..5e2e050242a 100644
--- a/code/game/objects/items/weapons/RCD.dm
+++ b/code/game/objects/items/weapons/RCD.dm
@@ -112,7 +112,8 @@ RCD
if((matter + R.ammoamt) > max_matter)
user << "The RCD can't hold any more matter-units! "
return
- user.drop_item()
+ if(!user.unEquip(W))
+ return
qdel(W)
matter += R.ammoamt
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
@@ -210,7 +211,7 @@ RCD
if(3)
if(istype(A, /turf/simulated/wall))
- var/turf/simulated/wall/W
+ var/turf/simulated/wall/W = A
if(istype(W, /turf/simulated/wall/r_wall) && !canRwall)
return 0
if(checkResource(5, user))
diff --git a/code/game/objects/items/weapons/airlock_painter.dm b/code/game/objects/items/weapons/airlock_painter.dm
index 2f595b5cba0..9ebce21ee0a 100644
--- a/code/game/objects/items/weapons/airlock_painter.dm
+++ b/code/game/objects/items/weapons/airlock_painter.dm
@@ -63,7 +63,8 @@
if(ink)
user << "\the [name] already contains \a [ink]. "
return
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
user << "You install \the [W] into \the [name]. "
ink = W
diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index f3dcfbc4b6b..02114500111 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -112,7 +112,8 @@
if(C.maxcharge < paddles.revivecost)
user << "[src] requires a higher capacity cell. "
return
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
bcell = W
user << "You install a cell in [src]. "
diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm
index f1d7d6c19c4..3c119132cb2 100644
--- a/code/game/objects/items/weapons/explosives.dm
+++ b/code/game/objects/items/weapons/explosives.dm
@@ -37,7 +37,8 @@
message_say = "VIVA LA REVOLUTION!"
user.say(message_say)
target = user
- message_admins("[key_name(user, user.client)](? ) suicided with [src.name] at ([x],[y],[z] - JMP )",0,1)
+ message_admins("[key_name_admin(user)](? ) (FLW ) suicided with [src.name] at ([x],[y],[z] - JMP )",0,1)
+ message_admins("[key_name(user)] suicided with [src.name] at ([x],[y],[z])")
sleep(10)
explode(get_turf(user))
user.gib()
@@ -69,18 +70,19 @@
user << "You start planting the bomb... "
if(do_after(user, 50) && in_range(user, target))
- user.drop_item()
+ if(!user.unEquip(target))
+ return
src.target = target
loc = null
if (ismob(target))
add_logs(user, target, "planted [name] on")
user.visible_message("[user.name] finished planting an explosive on [target.name]. ", "You finish planting an explosive on [target.name]. ")
- message_admins("[key_name(user, user.client)](? ) planted [src.name] on [key_name(target)](? ) with [timer] second fuse",0,1)
+ message_admins("[key_name_admin(user)](? ) (FLW ) planted [src.name] on [key_name_admin(target)](? ) (FLW ) with [timer] second fuse",0,1)
log_game("[key_name(user)] planted [src.name] on [key_name(target)] with [timer] second fuse")
else
- message_admins("[key_name(user, user.client)](? ) planted [src.name] on [target.name] at ([target.x],[target.y],[target.z] - JMP ) with [timer] second fuse",0,1)
+ message_admins("[key_name_admin(user)](? ) (FLW ) planted [src.name] on [target.name] at ([target.x],[target.y],[target.z] - JMP ) with [timer] second fuse",0,1)
log_game("[key_name(user)] planted [src.name] on [target.name] at ([target.x],[target.y],[target.z]) with [timer] second fuse")
target.overlays += image_overlay
diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index 2f89a0d979e..8688f19167b 100644
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -65,6 +65,7 @@
var/turf/target_turf = get_turf(target)
if(target_turf)
var/turflist = getline(user, target_turf)
+ add_logs(user, target, "flamethrowered", admin=0, addition="at [target.x],[target.y],[target.z]")
flame_turf(turflist)
/obj/item/weapon/flamethrower/attackby(obj/item/W as obj, mob/user as mob, params)
@@ -94,7 +95,8 @@
var/obj/item/device/assembly/igniter/I = W
if(I.secured) return
if(igniter) return
- user.drop_item()
+ if(!user.unEquip(W))
+ return
I.loc = src
igniter = I
update_icon()
@@ -104,7 +106,8 @@
if(ptank)
user << "There appears to already be a plasma tank loaded in [src]! "
return
- user.drop_item()
+ if(!user.unEquip(W))
+ return
ptank = W
W.loc = src
update_icon()
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index ff1812883aa..2823aa83d0f 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -33,7 +33,7 @@
else if(clown_check(user))
var/turf/bombturf = get_turf(src)
var/area/A = get_area(bombturf)
- message_admins("[key_name(usr)]? has primed a [name] for detonation at [A.name] (JMP) .")
+ message_admins("[key_name_admin(usr)]? (FLW ) has primed a [name] for detonation at [A.name] (JMP) .")
log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).")
user << "You prime the [name]! [det_time / 10] second\s! "
playsound(user.loc, 'sound/weapons/armbomb.ogg', 60, 1)
@@ -68,8 +68,9 @@
return
else
if(I.reagents.total_volume)
+ if(!user.unEquip(I))
+ return
user << "You add [I] to the [initial(name)] assembly. "
- user.drop_item()
I.loc = src
beakers += I
else
@@ -79,8 +80,9 @@
var/obj/item/device/assembly_holder/A = I
if(isigniter(A.a_left) == isigniter(A.a_right)) //Check if either part of the assembly has an igniter, but if both parts are igniters, then fuck it
return
+ if(!user.unEquip(I))
+ return
- user.drop_item()
nadeassembly = A
A.master = src
A.loc = src
@@ -171,8 +173,8 @@
var/mob/last = get_mob_by_ckey(nadeassembly.fingerprintslast)
var/turf/T = get_turf(src)
var/area/A = get_area(T)
- message_admins("grenade primed by an assembly, attached by [M.key]/[M](?) and last touched by [last.key]/[last](?) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP) .")
- log_game("grenade primed by an assembly, attached by [M.key]/[M] and last touched by [last.key]/[last] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] ([T.x], [T.y], [T.z])")
+ message_admins("grenade primed by an assembly, attached by [key_name_admin(M)](?) (FLW ) and last touched by [key_name_admin(last)](?) (FLW ) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP) .")
+ log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] ([T.x], [T.y], [T.z])")
playsound(loc, 'sound/effects/bamf.ogg', 50, 1)
@@ -263,8 +265,9 @@
//make a special case you might as well do it explicitly. -Sayu
/obj/item/weapon/grenade/chem_grenade/large/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/slime_extract) && stage == WIRED)
+ if(!user.unEquip(I))
+ return
user << "You add [I] to the [initial(name)] assembly. "
- user.drop_item()
I.loc = src
beakers += I
else
diff --git a/code/game/objects/items/weapons/grenades/ghettobomb.dm b/code/game/objects/items/weapons/grenades/ghettobomb.dm
index 37459241a78..b8ce111bdbe 100644
--- a/code/game/objects/items/weapons/grenades/ghettobomb.dm
+++ b/code/game/objects/items/weapons/grenades/ghettobomb.dm
@@ -49,7 +49,7 @@
var/turf/bombturf = get_turf(src)
var/area/A = get_area(bombturf)
- message_admins("[key_name(usr)]? has primed a [name] for detonation at [A.name] (JMP) .")
+ message_admins("[key_name_admin(usr)]? (FLW ) has primed a [name] for detonation at [A.name] (JMP) .")
log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).")
if(iscarbon(user))
var/mob/living/carbon/C = user
diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm
index 51a787a0b28..85375327940 100644
--- a/code/game/objects/items/weapons/grenades/grenade.dm
+++ b/code/game/objects/items/weapons/grenades/grenade.dm
@@ -64,7 +64,7 @@
add_fingerprint(user)
var/turf/bombturf = get_turf(src)
var/area/A = get_area(bombturf)
- message_admins("[key_name(usr)]? has primed a [name] for detonation at [A.name] (JMP) .")
+ message_admins("[key_name_admin(usr)]? (FLW ) has primed a [name] for detonation at [A.name] (JMP) .")
log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).")
if(iscarbon(user))
var/mob/living/carbon/C = user
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index d43251a2e48..d5e3e66703b 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -49,7 +49,8 @@
/obj/item/weapon/restraints/handcuffs/proc/apply_cuffs(mob/living/carbon/target, mob/user)
if(!target.handcuffed)
- user.drop_item()
+ if(!user.drop_item())
+ return
//target.throw_alert("handcuffed", src) // Can't do this because escaping cuffs isn't standardized. Also zipties.
if(trashtype)
target.handcuffed = new trashtype(target)
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index 97b0a8304ad..b22b7439eae 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -174,15 +174,15 @@
/obj/item/weapon/implant/loyalty/implanted(mob/target)
..()
- if((target.mind in (ticker.mode.head_revolutionaries | ticker.mode.A_bosses | ticker.mode.B_bosses)) || is_shadow_or_thrall(target))
+ if((target.mind in ticker.mode.head_revolutionaries) || is_shadow_or_thrall(target))
target.visible_message("[target] seems to resist the implant! ", "You feel the corporate tendrils of Nanotrasen try to invade your mind! ")
return 0
- if(target.mind in (ticker.mode.A_gang | ticker.mode.B_gang))
- ticker.mode.remove_gangster(target.mind, exclude_bosses=0)
- return 0
if(target.mind in ticker.mode.revolutionaries)
ticker.mode.remove_revolutionary(target.mind)
- target << "You feel a surge of loyalty towards Nanotrasen. "
+ if(target.mind in (ticker.mode.cult| ticker.mode.A_bosses | ticker.mode.B_bosses | ticker.mode.A_gang | ticker.mode.B_gang))
+ target << "You feel the corporate tendrils of Nanotrasen try to invade your mind! "
+ else
+ target << "You feel a surge of loyalty towards Nanotrasen. "
return 1
diff --git a/code/game/objects/items/weapons/implants/implantpad.dm b/code/game/objects/items/weapons/implants/implantpad.dm
index 1720cb073e0..615d719fef3 100644
--- a/code/game/objects/items/weapons/implants/implantpad.dm
+++ b/code/game/objects/items/weapons/implants/implantpad.dm
@@ -36,7 +36,8 @@
..()
if(istype(C, /obj/item/weapon/implantcase))
if(!case)
- user.drop_item()
+ if(!user.unEquip(C))
+ return
C.loc = src
case = C
else
diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index 886ce709f86..81ac92e29f0 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -185,8 +185,5 @@
/obj/item/weapon/melee/energy/blade/dropped()
qdel(src)
-/obj/item/weapon/melee/energy/blade/proc/throw()
- qdel(src)
-
/obj/item/weapon/melee/energy/blade/attack_self(mob/user)
return
diff --git a/code/game/objects/items/weapons/paiwire.dm b/code/game/objects/items/weapons/paiwire.dm
index 83933cbf4c3..33de9fcba06 100644
--- a/code/game/objects/items/weapons/paiwire.dm
+++ b/code/game/objects/items/weapons/paiwire.dm
@@ -8,8 +8,9 @@
/obj/item/weapon/pai_cable/proc/plugin(obj/machinery/M as obj, mob/user as mob)
if(istype(M, /obj/machinery/door) || istype(M, /obj/machinery/camera))
+ if(!user.drop_item())
+ return
user.visible_message("[user] inserts [src] into a data port on [M].", "You insert [src] into a data port on [M]. ", "You hear the satisfying click of a wire jack fastening into place. ")
- user.drop_item()
src.loc = M
src.machine = M
else
diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm
index 7ccd3432491..f4af87c3f10 100644
--- a/code/game/objects/items/weapons/pneumaticCannon.dm
+++ b/code/game/objects/items/weapons/pneumaticCannon.dm
@@ -61,8 +61,9 @@
if(IW.w_class > src.w_class)
user << "\The [IW] is too large to fit into \the [src]! "
return
+ if(!user.unEquip(W))
+ return
user << "You load \the [IW] into \the [src]. "
- user.drop_item()
loadedItems.Add(IW)
loadedWeightClass += IW.w_class
IW.loc = src
@@ -127,9 +128,10 @@
if(src.tank)
user << "\The [src] already has a tank. "
return
+ if(!user.unEquip(thetank))
+ return
user << "You hook \the [thetank] up to \the [src]. "
src.tank = thetank
- user.drop_item()
thetank.loc = src
src.update_icons()
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index 778252c04f1..d8aed9fdd9d 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -35,6 +35,15 @@
max_w_class = 5
max_combined_w_class = 35
+/obj/item/weapon/storage/backpack/holding/suicide_act(mob/user)
+ user.visible_message("[user] is jumping into [src]! It looks like \he's trying to commit suicide. ")
+ user.drop_item()
+ user.Stun(5)
+ sleep(20)
+ playsound(src, "rustle", 50, 1, -5)
+ qdel(user)
+ return
+
/obj/item/weapon/storage/backpack/holding/can_be_inserted(obj/item/W, stop_messages = 0, mob/user)
if(crit_fail)
user << "The Bluespace generator isn't working. "
@@ -278,6 +287,24 @@
item_state = "duffle-syndieammo"
slowdown = 0
+/obj/item/weapon/storage/backpack/dufflebag/syndieammo/loaded
+ desc = "A large dufflebag, packed to the brim with Bulldog shotgun ammo."
+
+/obj/item/weapon/storage/backpack/dufflebag/syndieammo/loaded/New()
+ ..()
+ contents = list()
+ new /obj/item/ammo_box/magazine/m12g(src)
+ new /obj/item/ammo_box/magazine/m12g(src)
+ new /obj/item/ammo_box/magazine/m12g(src)
+ new /obj/item/ammo_box/magazine/m12g(src)
+ new /obj/item/ammo_box/magazine/m12g(src)
+ new /obj/item/ammo_box/magazine/m12g(src)
+ new /obj/item/ammo_box/magazine/m12g/buckshot(src)
+ new /obj/item/ammo_box/magazine/m12g/stun(src)
+ new /obj/item/ammo_box/magazine/m12g/dragon(src)
+ return
+
+
/obj/item/weapon/storage/backpack/dufflebag/captain
name = "captain's dufflebag"
desc = "A large dufflebag for holding extra captainly goods."
diff --git a/code/game/objects/items/weapons/storage/book.dm b/code/game/objects/items/weapons/storage/book.dm
index 5d5eb001840..1efe547141c 100644
--- a/code/game/objects/items/weapons/storage/book.dm
+++ b/code/game/objects/items/weapons/storage/book.dm
@@ -202,7 +202,7 @@ var/global/list/bibleitemstates = list("bible", "koran", "scrapbook", "bible", "
A.reagents.del_reagent("water")
A.reagents.add_reagent("holywater",water2holy)
if(A.reagents && A.reagents.has_reagent("unholywater")) //yeah yeah, copy pasted code - sue me
- user << " You purify [A]. "
+ user << "You purify [A]. "
var/unholy2clean = A.reagents.get_reagent_amount("unholywater")
A.reagents.del_reagent("unholywater")
A.reagents.add_reagent("holywater",unholy2clean)
diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index 8fc6d771551..40b1ab14670 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -71,7 +71,8 @@
if(C.maxcharge < hitcost)
user << "[src] requires a higher capacity cell. "
return
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
bcell = W
user << "You install a cell in [src]. "
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 58c98b443d8..71ab242d878 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -128,8 +128,10 @@
/obj/item/weapon/twohanded/required/attack_hand(mob/user)//Can't even pick it up without both hands empty
var/obj/item/weapon/twohanded/required/H = user.get_inactive_hand()
+ if(get_dist(src,user) > 1)
+ return 0
if(H != null)
- user.visible_message("[src.name] is too cumbersome to carry in one hand! ")
+ user << "[src.name] is too cumbersome to carry in one hand! "
return
var/obj/item/weapon/twohanded/offhand/O = new(user)
user.put_in_inactive_hand(O)
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index 9ac736d1a28..bfda5735a2b 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -16,7 +16,7 @@
/obj/item/weapon/banhammer/attack(mob/M, mob/user)
M << " You have been banned FOR NO REISIN by [user] "
- user << " You have BANNED [M] "
+ user << "You have BANNED [M] "
playsound(loc, 'sound/effects/adminhelp.ogg', 15) //keep it at 15% volume so people don't jump out of their skin too much
diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/objects/structures/ai_core.dm
similarity index 96%
rename from code/game/machinery/computer/ai_core.dm
rename to code/game/objects/structures/ai_core.dm
index 801e2f82332..1d24b6485a6 100644
--- a/code/game/machinery/computer/ai_core.dm
+++ b/code/game/objects/structures/ai_core.dm
@@ -41,11 +41,12 @@
anchored = 0
state = 0
if(istype(P, /obj/item/weapon/circuitboard/aicore) && !circuit)
+ if(!user.drop_item())
+ return
playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
user << "You place the circuit board inside the frame. "
icon_state = "1"
circuit = P
- user.drop_item()
P.loc = src
if(istype(P, /obj/item/weapon/screwdriver) && circuit)
playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
@@ -109,12 +110,14 @@
if(istype(P, /obj/item/weapon/aiModule/core/full)) //Allows any full core boards to be applied to AI cores.
var/obj/item/weapon/aiModule/core/M = P
laws.clear_inherent_laws()
+ laws.clear_zeroth_law(0)
for(var/templaw in M.laws)
laws.add_inherent_law(templaw)
usr << "Law module applied. "
if(istype(P, /obj/item/weapon/aiModule/reset/purge))
laws.clear_inherent_laws()
+ laws.clear_zeroth_law(0)
usr << "Laws cleared applied. "
@@ -150,11 +153,13 @@
user << "This MMI is mindless! "
return
+ if(!user.drop_item())
+ return
+
ticker.mode.remove_cultist(M.brainmob.mind, 1)
ticker.mode.remove_revolutionary(M.brainmob.mind, 1)
ticker.mode.remove_gangster(M.brainmob.mind, 1)
- user.drop_item()
M.loc = src
brain = M
usr << "Added a brain. "
diff --git a/code/game/objects/structures/barsigns.dm b/code/game/objects/structures/barsigns.dm
index a63de87b926..aa8e229a0bb 100644
--- a/code/game/objects/structures/barsigns.dm
+++ b/code/game/objects/structures/barsigns.dm
@@ -50,7 +50,7 @@
/obj/structure/sign/barsign/attack_hand(mob/user as mob)
if (!src.allowed(user))
- user << "Access denied. "
+ user << "Access denied. "
return
if (broken)
user << "The controls seem unresponsive. "
@@ -62,7 +62,7 @@
/obj/structure/sign/barsign/attackby(var/obj/item/I, var/mob/user)
if(!allowed(user))
- user << "Access denied. "
+ user << "Access denied. "
return
if( istype(I, /obj/item/weapon/screwdriver))
if(!panel_open)
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index 37428c37333..073ae4e2e53 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -194,7 +194,8 @@ LINEN BINS
/obj/structure/bedsheetbin/attackby(obj/item/I as obj, mob/user as mob, params)
if(istype(I, /obj/item/weapon/bedsheet))
- user.drop_item()
+ if(!user.drop_item())
+ return
I.loc = src
sheets.Add(I)
amount++
diff --git a/code/game/objects/structures/crates_lockers/bins.dm b/code/game/objects/structures/crates_lockers/bins.dm
index edabca55fb7..bbcec247b70 100644
--- a/code/game/objects/structures/crates_lockers/bins.dm
+++ b/code/game/objects/structures/crates_lockers/bins.dm
@@ -84,8 +84,7 @@
/obj/structure/closet/crate/bin/place(var/mob/user, var/obj/item/I)
if(contents.len >= storage_capacity)
return 1
- if(!opened)
- user.drop_item()
+ if(!opened && user.drop_item())
insert(I, 0, 1)
return 1
return 0
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 9de891501fa..43b887493ca 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -289,7 +289,7 @@
return
if(!toggle())
- user << "You cannot close the locker! "
+ togglelock(user)
return
// tk grab then use on self
diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
index 41786c4b092..81e2b46d4ca 100644
--- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
@@ -23,11 +23,11 @@
if (isrobot(user) || src.locked)
if(istype(O, /obj/item/device/multitool))
- user << " Resetting circuitry... "
+ user << "Resetting circuitry... "
playsound(user, 'sound/machines/lockreset.ogg', 50, 1)
if(do_after(user, 20))
src.locked = 0
- user << " You disable the locking modules. "
+ user << "You disable the locking modules. "
update_icon()
return
else if(istype(O, /obj/item/weapon))
@@ -43,7 +43,7 @@
user.do_attack_animation(src)
playsound(user, 'sound/effects/Glasshit.ogg', 100, 1) //We don't want this playing every time
if(W.force < 15)
- user << " The cabinet's protective glass glances off the hit. "
+ user << "The cabinet's protective glass glances off the hit. "
else
src.hitstaken++
if(src.hitstaken == 4)
@@ -56,12 +56,13 @@
if (istype(O, /obj/item/weapon/twohanded/fireaxe) && src.localopened)
if(!fireaxe)
if(O:wielded)
- user << " Unwield the axe first. "
+ user << "Unwield the axe first. "
+ return
+ if(!user.drop_item())
return
fireaxe = O
- user.drop_item()
src.contents += O
- user << " You place the fire axe back in the [src.name]. "
+ user << "You place the fire axe back in the [src.name]. "
update_icon()
else
if(src.smashed)
@@ -84,11 +85,11 @@
spawn(10) update_icon()
return
else
- user << " Resetting circuitry... "
+ user << "Resetting circuitry... "
playsound(user, 'sound/machines/lockenable.ogg', 50, 1)
if(do_after(user, 20))
src.locked = 1
- user << " You re-enable the locking modules. "
+ user << "You re-enable the locking modules. "
return
else
localopened = !localopened
@@ -144,13 +145,13 @@
hasaxe = 1
if(src.locked)
- user <<" The cabinet won't budge! "
+ user <<"The cabinet won't budge! "
return
if(localopened)
if(fireaxe)
user.put_in_hands(fireaxe)
fireaxe = null
- user << " You take the fire axe from the [name]. "
+ user << "You take the fire axe from the [name]. "
src.add_fingerprint(user)
update_icon()
else
@@ -177,7 +178,7 @@
/obj/structure/closet/fireaxecabinet/attack_tk(mob/user as mob)
if(localopened && fireaxe)
fireaxe.loc = loc
- user << " You telekinetically remove the fire axe. "
+ user << "You telekinetically remove the fire axe. "
fireaxe = null
update_icon()
return
@@ -221,14 +222,14 @@
/obj/structure/closet/fireaxecabinet/attack_ai(mob/user as mob)
if(src.smashed)
- user << " The security of the cabinet is compromised. "
+ user << "The security of the cabinet is compromised. "
return
else
locked = !locked
if(locked)
- user << " Cabinet locked. "
+ user << "Cabinet locked. "
else
- user << " Cabinet unlocked. "
+ user << "Cabinet unlocked. "
return
/obj/structure/closet/fireaxecabinet/update_icon() //Template: fireaxe[has fireaxe][is opened][hits taken][is smashed]. If you want the opening or closing animations, add "opening" or "closing" right after the numbers
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
index c603163c427..8d4bcdf25b9 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
@@ -18,6 +18,7 @@
/obj/structure/closet/secure_closet/quartermaster/New()
..()
+ new /obj/item/clothing/cloak/qm(src)
new /obj/item/clothing/suit/hooded/wintercoat/cargo(src)
new /obj/item/clothing/under/rank/cargo(src)
new /obj/item/clothing/shoes/sneakers/brown(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index 206eef09a91..5b50e1ba885 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -11,6 +11,7 @@
new /obj/item/weapon/storage/backpack/industrial(src)
else
new /obj/item/weapon/storage/backpack/satchel_eng(src)
+ new /obj/item/clothing/cloak/ce(src)
new /obj/item/weapon/storage/backpack/dufflebag/engineering(src)
new /obj/item/clothing/under/rank/chief_engineer(src)
new /obj/item/clothing/head/hardhat/white(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
index 6f7a5d24e61..960f31e3d99 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
@@ -71,6 +71,7 @@
new /obj/item/weapon/storage/backpack/medic(src)
else
new /obj/item/weapon/storage/backpack/satchel_med(src)
+ new /obj/item/clothing/cloak/cmo(src)
new /obj/item/weapon/storage/backpack/dufflebag/med(src)
new /obj/item/clothing/suit/bio_suit/cmo(src)
new /obj/item/clothing/head/bio_hood/cmo(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
index 3720a560df7..d71768caea0 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
@@ -24,6 +24,7 @@
/obj/structure/closet/secure_closet/RD/New()
..()
+ new /obj/item/clothing/cloak/rd(src)
new /obj/item/clothing/suit/hooded/wintercoat/science(src)
new /obj/item/clothing/suit/bio_suit/scientist(src)
new /obj/item/clothing/head/bio_hood/scientist(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 47af5875f04..425e464b384 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -10,6 +10,7 @@
new /obj/item/weapon/storage/backpack/captain(src)
else
new /obj/item/weapon/storage/backpack/satchel_cap(src)
+ new /obj/item/clothing/cloak/cap(src)
new /obj/item/weapon/storage/backpack/dufflebag/captain(src)
new /obj/item/clothing/suit/captunic(src)
new /obj/item/clothing/under/captainparade(src)
@@ -53,6 +54,7 @@
/obj/structure/closet/secure_closet/hos/New()
..()
+ new /obj/item/clothing/cloak/hos(src)
new /obj/item/clothing/suit/hooded/wintercoat/security(src)
new /obj/item/weapon/cartridge/hos(src)
new /obj/item/device/radio/headset/heads/hos(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
index 13dbc939b43..b6ad237fbba 100644
--- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm
+++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
@@ -31,7 +31,6 @@
new /obj/item/weapon/storage/box/flashbangs(src)
new /obj/item/weapon/storage/box/teargas(src)
new /obj/item/weapon/storage/backpack/dufflebag/syndiemed(src)
- new /obj/item/weapon/storage/backpack/dufflebag/syndieammo(src)
new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(src)
new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(src)
new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(src)
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index abbf7e51461..14a4fe411bd 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -286,8 +286,9 @@
return
else if(istype(W, /obj/item/device/electropack))
if(rigged)
+ if(!user.drop_item())
+ return
user << "You attach [W] to [src]. "
- user.drop_item()
W.loc = src
return
else if(istype(W, /obj/item/weapon/wirecutters))
diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm
index dcffa3e0891..4b53bb0e629 100644
--- a/code/game/objects/structures/door_assembly.dm
+++ b/code/game/objects/structures/door_assembly.dm
@@ -436,7 +436,7 @@
if(mineral && mineral != "glass")
mineral = null //I know this is stupid, but until we change glass to a boolean it's how this code works.
- user << " You change the paintjob on the airlock assembly. "
+ user << "You change the paintjob on the airlock assembly. "
else if(istype(W, /obj/item/weapon/weldingtool) && !anchored )
var/obj/item/weapon/weldingtool/WT = W
@@ -448,7 +448,7 @@
if(do_after(user, 40))
if( !WT.isOn() )
return
- user << " You disassemble the airlock assembly. "
+ user << "You disassemble the airlock assembly. "
new /obj/item/stack/sheet/metal(get_turf(src), 4)
if (mineral)
if (mineral == "glass")
@@ -480,7 +480,7 @@
if(do_after(user, 40))
if( src.anchored )
return
- user << " You secure the airlock assembly. "
+ user << "You secure the airlock assembly. "
src.name = "secured airlock assembly"
src.anchored = 1
else
@@ -494,7 +494,7 @@
if(do_after(user, 40))
if( !src.anchored )
return
- user << " You unsecure the airlock assembly. "
+ user << "You unsecure the airlock assembly. "
src.name = "airlock assembly"
src.anchored = 0
@@ -520,7 +520,7 @@
if(do_after(user, 40))
if( src.state != 1 )
return
- user << " You cut the wires from the airlock assembly. "
+ user << "You cut the wires from the airlock assembly. "
new/obj/item/stack/cable_coil(get_turf(user), 1)
src.state = 0
src.name = "secured airlock assembly"
@@ -532,10 +532,11 @@
if(do_after(user, 40))
if( src.state != 1 )
return
+ if(!user.drop_item())
+ return
- user.drop_item()
W.loc = src
- user << " You install the airlock electronics. "
+ user << "You install the airlock electronics. "
src.state = 2
src.name = "near finished airlock assembly"
src.electronics = W
@@ -549,7 +550,7 @@
if(do_after(user, 40))
if( src.state != 2 )
return
- user << " You remove the airlock electronics. "
+ user << "You remove the airlock electronics. "
src.state = 1
src.name = "wired airlock assembly"
var/obj/item/weapon/airlock_electronics/ae
@@ -614,7 +615,7 @@
if(do_after(user, 40))
if(src.loc && state == 2)
- user << " You finish the airlock. "
+ user << "You finish the airlock. "
var/obj/machinery/door/airlock/door
if(mineral == "glass")
door = new src.glass_type( src.loc )
diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm
index 06c763ffca7..e56bcd0a4ee 100644
--- a/code/game/objects/structures/extinguisher.dm
+++ b/code/game/objects/structures/extinguisher.dm
@@ -29,7 +29,8 @@
return
if(istype(O, /obj/item/weapon/extinguisher))
if(!has_extinguisher && opened)
- user.drop_item()
+ if(!user.drop_item())
+ return
contents += O
has_extinguisher = O
user << "You place [O] in [src]. "
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index 9f5415d64e0..9d6f3261467 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -238,8 +238,8 @@
/obj/structure/falsewall/plasma/attackby(obj/item/weapon/W, mob/user, params)
if(is_hot(W) > 300)
- message_admins("Plasma falsewall ignited by [key_name(user, user.client)](? ) in ([x],[y],[z] - JMP )",0,1)
- log_game("Plasma falsewall ignited by [user.ckey]([user]) in ([x],[y],[z])")
+ message_admins("Plasma falsewall ignited by [key_name_admin(user)](? ) (FLW ) in ([x],[y],[z] - JMP )",0,1)
+ log_game("Plasma falsewall ignited by [key_name(user)] in ([x],[y],[z])")
burnbabyburn()
return
..()
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index fd324892490..23df00bef19 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -201,7 +201,8 @@
else if(istype(W, /obj/item/pipe))
var/obj/item/pipe/P = W
if (P.pipe_type in list(0, 1, 5)) //simple pipes, simple bends, and simple manifolds.
- user.drop_item()
+ if(!user.drop_item())
+ return
P.loc = src.loc
user << "You fit the pipe into \the [src]. "
else
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 79fda3eda5c..df144aafd62 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -251,7 +251,6 @@
/obj/structure/grille/hitby(AM as mob|obj)
..()
- visible_message("[src] was hit by [AM]. ")
var/tforce = 0
if(ismob(AM))
tforce = 5
diff --git a/code/game/objects/structures/guncase.dm b/code/game/objects/structures/guncase.dm
index 5793006ba6f..ae8c5b4e861 100644
--- a/code/game/objects/structures/guncase.dm
+++ b/code/game/objects/structures/guncase.dm
@@ -39,7 +39,8 @@
return
if(istype(I, gun_category))
if(contents.len < capacity && open)
- user.drop_item()
+ if(!user.drop_item())
+ return
contents += I
user << "You place [I] in [src]. "
update_icon()
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index b5a265e2c76..58aebf4ca25 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -29,7 +29,8 @@
playsound(loc, 'sound/effects/slosh.ogg', 25, 1)
/obj/structure/janitorialcart/proc/put_in_cart(obj/item/I, mob/user)
- user.drop_item()
+ if(!user.drop_item())
+ return
I.loc = src
updateUsrDialog()
user << "You put [I] into [src]. "
@@ -199,8 +200,9 @@
user << "Hold [I] in one of your hands while you drive this [callme]."
else if(istype(I, /obj/item/weapon/storage/bag/trash))
if(keytype == /obj/item/key/janitor)
+ if(!user.drop_item())
+ return
user << "You hook the trashbag onto the [callme]. "
- user.drop_item()
I.loc = src
mybag = I
else if(istype(I, /obj/item/janiupgrade))
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
index 49537016514..cc7c6035e7a 100644
--- a/code/game/objects/structures/mineral_doors.dm
+++ b/code/game/objects/structures/mineral_doors.dm
@@ -219,8 +219,8 @@
/obj/structure/mineral_door/transparent/plasma/attackby(obj/item/weapon/W, mob/user, params)
if(is_hot(W))
- message_admins("Plasma mineral door ignited by [key_name(user, user.client)](? ) in ([x],[y],[z] - JMP )",0,1)
- log_game("Plasma mineral door ignited by [user.ckey]([user]) in ([x],[y],[z])")
+ message_admins("Plasma mineral door ignited by [key_name_admin(user)](? ) (FLW ) in ([x],[y],[z] - JMP )",0,1)
+ log_game("Plasma mineral door ignited by [key_name(user)] in ([x],[y],[z])")
TemperatureAct(100)
..()
diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm
index ffe58681ab0..50597091b3b 100644
--- a/code/game/objects/structures/mirror.dm
+++ b/code/game/objects/structures/mirror.dm
@@ -111,14 +111,16 @@
/obj/structure/mirror/magic/New()
if(!choosable_races.len)
- for(var/datum/species/S in typesof(/datum/species) - /datum/species)
+ for(var/speciestype in typesof(/datum/species) - /datum/species)
+ var/datum/species/S = new speciestype()
if(!(S.id in races_blacklist))
- choosable_races += S
+ choosable_races += S.id
..()
/obj/structure/mirror/magic/badmin/New()
- for(var/datum/species/S in typesof(/datum/species) - /datum/species)
- choosable_races += S
+ for(var/speciestype in typesof(/datum/species) - /datum/species)
+ var/datum/species/S = new speciestype()
+ choosable_races += S.id
..()
/obj/structure/mirror/magic/attack_hand(mob/user as mob)
@@ -163,7 +165,7 @@
var/temp_hsv = RGBtoHSV(new_mutantcolor)
if(ReadHSV(temp_hsv)[3] >= ReadHSV("#7F7F7F")[3]) // mutantcolors must be bright
- H.dna.mutant_color = sanitize_hexcolor(new_mutantcolor)
+ H.dna.features["mcolor"] = sanitize_hexcolor(new_mutantcolor)
else
H << "Invalid color. Your color is not bright enough. "
diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm
index 9a2a5da2cee..9b120060ced 100644
--- a/code/game/objects/structures/musician.dm
+++ b/code/game/objects/structures/musician.dm
@@ -348,20 +348,20 @@
if (istype(O, /obj/item/weapon/wrench))
if (!anchored && !isinspace())
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- user << " You begin to tighten \the [src] to the floor... "
+ user << "You begin to tighten \the [src] to the floor... "
if (do_after(user, 20))
user.visible_message( \
"[user] tightens \the [src]'s casters.", \
- " You tighten \the [src]'s casters. Now it can be played again. ", \
+ "You tighten \the [src]'s casters. Now it can be played again. ", \
"You hear ratchet. ")
anchored = 1
else if(anchored)
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- user << " You begin to loosen \the [src]'s casters... "
+ user << "You begin to loosen \the [src]'s casters... "
if (do_after(user, 40))
user.visible_message( \
"[user] loosens \the [src]'s casters.", \
- " You loosen \the [src]. Now it can be pulled somewhere else. ", \
+ "You loosen \the [src]. Now it can be pulled somewhere else. ", \
"You hear ratchet. ")
anchored = 0
else
diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm
index d5997adfda9..7d8591217f6 100644
--- a/code/game/objects/structures/noticeboard.dm
+++ b/code/game/objects/structures/noticeboard.dm
@@ -19,9 +19,10 @@
/obj/structure/noticeboard/attackby(var/obj/item/weapon/O as obj, var/mob/user as mob, params)
if(istype(O, /obj/item/weapon/paper))
if(notices < 5)
+ if(!user.drop_item())
+ return
O.add_fingerprint(user)
add_fingerprint(user)
- user.drop_item()
O.loc = src
notices++
icon_state = "nboard0[notices]" //update sprite
diff --git a/code/game/objects/structures/showcase.dm b/code/game/objects/structures/showcase.dm
index 3a5be7f1b01..ca3fc4ba68f 100644
--- a/code/game/objects/structures/showcase.dm
+++ b/code/game/objects/structures/showcase.dm
@@ -11,10 +11,18 @@
name = "\improper Centcom identification console"
desc = "You can use this to change ID's."
icon = 'icons/obj/computer.dmi'
- icon_state = "id"
+ icon_state = "computer"
+
+/obj/structure/showcase/fakeid/New()
+ overlays += "id"
+ overlays += "id_key"
/obj/structure/showcase/fakesec
name = "\improper Centcom security records"
desc = "Used to view and edit personnel's security records"
icon = 'icons/obj/computer.dmi'
- icon_state = "security"
\ No newline at end of file
+ icon_state = "computer"
+
+/obj/structure/showcase/fakesec/New()
+ overlays += "security"
+ overlays += "security_key"
\ No newline at end of file
diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm
index 60989279c54..74c5f66aa58 100644
--- a/code/game/objects/structures/statues.dm
+++ b/code/game/objects/structures/statues.dm
@@ -207,8 +207,8 @@
/obj/structure/statue/plasma/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(is_hot(W) > 300)//If the temperature of the object is over 300, then ignite
- message_admins("Plasma statue ignited by [key_name(user, user.client)](? ) in ([x],[y],[z] - JMP )",0,1)
- log_game("Plasma statue ignited by [user.ckey]([user]) in ([x],[y],[z])")
+ message_admins("Plasma statue ignited by [key_name_admin(user)](? ) (FLW ) in ([x],[y],[z] - JMP )",0,1)
+ log_game("Plasma statue ignited by [key_name(user)] in ([x],[y],[z])")
ignite(is_hot(W))
return
..()
diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
index 829d6a6dd44..915f56b9ac0 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
@@ -17,8 +17,9 @@
/obj/structure/stool/bed/chair/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
..()
if(istype(W, /obj/item/assembly/shock_kit))
+ if(!user.drop_item())
+ return
var/obj/item/assembly/shock_kit/SK = W
- user.drop_item()
var/obj/structure/stool/bed/chair/e_chair/E = new /obj/structure/stool/bed/chair/e_chair(src.loc)
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
E.dir = dir
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index f776ab56d7e..b25fa12dd81 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -625,8 +625,9 @@
/obj/item/weapon/rack_parts/attack_self(mob/user as mob)
user << "You start constructing rack... "
if (do_after(user, 50))
+ if(!user.drop_item())
+ return
var/obj/structure/rack/R = new /obj/structure/rack( user.loc )
R.add_fingerprint(user)
- user.drop_item()
qdel(src)
return
diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm
index da9c57601e3..3cc45f3ac5e 100644
--- a/code/game/objects/structures/tank_dispenser.dm
+++ b/code/game/objects/structures/tank_dispenser.dm
@@ -50,7 +50,8 @@
/obj/structure/dispenser/attackby(obj/item/I as obj, mob/user as mob, params)
if(istype(I, /obj/item/weapon/tank/internals/oxygen) || istype(I, /obj/item/weapon/tank/internals/air) || istype(I, /obj/item/weapon/tank/internals/anesthetic))
if(oxygentanks < 10)
- user.drop_item()
+ if(!user.drop_item())
+ return
I.loc = src
oxytanks.Add(I)
oxygentanks++
@@ -59,7 +60,8 @@
user << "[src] is full. "
if(istype(I, /obj/item/weapon/tank/internals/plasma))
if(plasmatanks < 10)
- user.drop_item()
+ if(!user.drop_item())
+ return
I.loc = src
platanks.Add(I)
plasmatanks++
diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm
index 0048a1cdb28..5e23a7f994f 100644
--- a/code/game/objects/structures/target_stake.dm
+++ b/code/game/objects/structures/target_stake.dm
@@ -23,11 +23,10 @@
/obj/structure/target_stake/attackby(obj/item/target/T, mob/user)
if(pinned_target)
return
- if(istype(T))
+ if(istype(T) && user.drop_item())
pinned_target = T
T.pinnedLoc = src
T.density = 1
- user.drop_item()
T.layer = OBJ_LAYER + 0.1
T.loc = loc
user << "You slide the target into the stake. "
diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm
index 8262201bf28..1f41f887adb 100644
--- a/code/game/objects/structures/windoor_assembly.dm
+++ b/code/game/objects/structures/windoor_assembly.dm
@@ -190,9 +190,10 @@
//Adding airlock electronics for access. Step 6 complete.
else if(istype(W, /obj/item/weapon/airlock_electronics))
+ if(!user.drop_item())
+ return
playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1)
user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly... ")
- user.drop_item()
W.loc = src
if(do_after(user, 40))
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index f773adc6714..b257a1fd941 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -93,7 +93,6 @@
/obj/structure/window/hitby(AM as mob|obj)
..()
- visible_message("[src] was hit by [AM]. ")
var/tforce = 0
if(ismob(AM))
tforce = 40
@@ -235,7 +234,7 @@
else if(istype(I, /obj/item/weapon/wrench) && !anchored)
playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
- user << " You begin to disassemble [src]... "
+ user << "You begin to disassemble [src]... "
if(do_after(user, 40))
if(disassembled)
return //Prevents multiple deconstruction attempts
@@ -256,7 +255,7 @@
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
disassembled = 1
- user << " You successfully disassemble [src]. "
+ user << "You successfully disassemble [src]. "
qdel(src)
else
@@ -456,4 +455,4 @@
maxhealth = 100
wtype = "shuttle"
fulltile = 1
- reinf = 1
\ No newline at end of file
+ reinf = 1
diff --git a/code/game/turfs/simulated/floor/light_floor.dm b/code/game/turfs/simulated/floor/light_floor.dm
index 85755fc867d..abb5c5c4fab 100644
--- a/code/game/turfs/simulated/floor/light_floor.dm
+++ b/code/game/turfs/simulated/floor/light_floor.dm
@@ -63,8 +63,7 @@
if(..())
return
if(istype(C,/obj/item/weapon/light/bulb)) //only for light tiles
- if(state)
- user.drop_item()
+ if(state && user.drop_item())
qdel(C)
state = 0 //fixing it by bashing it with a light bulb, fun eh?
update_icon()
diff --git a/code/game/turfs/simulated/floor/mineral_floor.dm b/code/game/turfs/simulated/floor/mineral_floor.dm
index ca8716d2d82..2b4d3ddc198 100644
--- a/code/game/turfs/simulated/floor/mineral_floor.dm
+++ b/code/game/turfs/simulated/floor/mineral_floor.dm
@@ -40,8 +40,8 @@
/turf/simulated/floor/mineral/plasma/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(is_hot(W) > 300)//If the temperature of the object is over 300, then ignite
- message_admins("Plasma flooring was ignited by [key_name(user, user.client)](? ) in ([x],[y],[z] - JMP )",0,1)
- log_game("Plasma flooring was ignited by [user.ckey]([user]) in ([x],[y],[z])")
+ message_admins("Plasma flooring was ignited by [key_name_admin(user)](? ) (FLW ) in ([x],[y],[z] - JMP )",0,1)
+ log_game("Plasma flooring was ignited by [key_name(user)] in ([x],[y],[z])")
ignite(is_hot(W))
return
..()
diff --git a/code/game/turfs/simulated/walls_mineral.dm b/code/game/turfs/simulated/walls_mineral.dm
index fb73c1f61c6..edc2c01fe2a 100644
--- a/code/game/turfs/simulated/walls_mineral.dm
+++ b/code/game/turfs/simulated/walls_mineral.dm
@@ -97,8 +97,8 @@
/turf/simulated/wall/mineral/plasma/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(is_hot(W) > 300)//If the temperature of the object is over 300, then ignite
- message_admins("Plasma wall ignited by [key_name(user, user.client)](? ) in ([x],[y],[z] - JMP )",0,1)
- log_game("Plasma wall ignited by [user.ckey]([user]) in ([x],[y],[z])")
+ message_admins("Plasma wall ignited by [key_name_admin(user)](? ) (FLW ) in ([x],[y],[z] - JMP )",0,1)
+ log_game("Plasma wall ignited by [key_name(user)] in ([x],[y],[z])")
ignite(is_hot(W))
return
..()
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 986a46fab05..d715ca89b8b 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -39,7 +39,7 @@ var/global/floorIsLava = 0
body += "TP - "
body += "PM - "
body += "SM - "
- body += "JMP \] "
+ body += "FLW \] "
body += "Mob type = [M.type] "
@@ -322,9 +322,9 @@ var/global/floorIsLava = 0
dat+="Criminal Name : [src.admincaster_wanted_message.criminal] "
dat+="Description : [src.admincaster_wanted_message.body] "
if(wanted_already)
- dat+="Wanted Issue created by: [news_network.wanted_issue.scannedUser] "
+ dat+="Wanted Issue created by: [news_network.wanted_issue.scannedUser] "
else
- dat+="Wanted Issue will be created under prosecutor: [src.admincaster_signature] "
+ dat+="Wanted Issue will be created under prosecutor: [src.admincaster_signature] "
dat+="[(wanted_already) ? ("Edit Issue") : ("Submit")] "
if(wanted_already)
dat+="Take down Issue "
@@ -399,91 +399,6 @@ var/global/floorIsLava = 0
usr << browse(dat, "window=admin2;size=210x180")
return
-/datum/admins/proc/Secrets()
- if(!check_rights(0)) return
-
- var/dat = "The first rule of adminbuse is: you don't talk about the adminbuse. "
-
- dat +={"
- General Secrets
-
- Show Job Debug
- Admin Log
- Show Admin List
-
- "}
-
- if(check_rights(R_ADMIN,0))
- dat += {"
- Admin Secrets
-
- Cure all diseases currently in existence
- Bombing List
- Show current traitors and objectives
- Show last [length(lastsignalers)] signalers
- Show last [length(lawchanges)] law changes
- Show AI Laws
- Show Game Mode
- Show Crew Manifest
- List DNA (Blood)
- List Fingerprints
-
- Shuttles
-
- Move Ferry
- Move Mining Shuttle
- Move Labor Shuttle
-
- "}
-
- if(check_rights(R_FUN,0))
- dat += {"
- Fun Secrets
-
- Reset Thunderdome to default state
- Trigger a Virus Outbreak
- Turn all humans into monkeys
- Change the species of all humans
- Make all areas powered
- Make all areas unpowered
- Power all SMES
- Triple AI mode (needs to be used in the lobby)
- Everyone is the traitor
- Summon Guns
- Summon Magic
- Summon Events (Toggle)
- There can only be one!
- Make all players retarded
- Egalitarian Station Mode
- Break all lights
- Fix all lights
- The floor is lava! (DANGEROUS: extremely lame)
-
- "}
-
-/* DEATH SQUADS
-Send in a strike team
-*/
- if(check_rights(R_SERVER,0))
- dat += "Toggle bomb cap "
-
- dat += " "
-
- if(check_rights(R_DEBUG,0))
- dat += {"
- Security Level Elevated
-
- Change all maintenance doors to engie/brig access only
- Change all maintenance doors to brig access only
- Remove cap on security officers
-
- "}
-
- usr << browse(dat, "window=secrets")
- return
-
-
-
/////////////////////////////////////////////////////////////////////////////////////////////////admins2.dm merge
//i.e. buttons/verbs
diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm
index 31f01164df4..543bc79d287 100644
--- a/code/modules/admin/admin_investigate.dm
+++ b/code/modules/admin/admin_investigate.dm
@@ -19,7 +19,7 @@
if(!message) return
var/F = investigate_subject2file(subject)
if(!F) return
- F << "[time2text(world.timeofday,"hh:mm")] \ref[src] ([x],[y],[z]) || [src] [message] "
+ F << "[time_stamp()] \ref[src] ([x],[y],[z]) || [src] [message] "
//ADMINVERBS
/client/proc/investigate_show( subject in list("hrefs","notes","ntsl","singulo","wires","telesci", "gravity", "records", "cargo", "supermatter", "atmos", "experimentor", "kudzu") )
diff --git a/code/modules/admin/admin_memo.dm b/code/modules/admin/admin_memo.dm
index 89f9116aeaf..5ca3ea9942f 100644
--- a/code/modules/admin/admin_memo.dm
+++ b/code/modules/admin/admin_memo.dm
@@ -37,7 +37,7 @@
var/savefile/F = new(MEMOFILE)
if(F)
for(var/ckey in F.dir)
- src << "Admin Memo by [F[ckey]] "
+ src << "Admin Memo by [F[ckey]] "
//delete your own or somebody else's memo
/client/proc/admin_memo_delete()
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 1c073505ab8..c48b54bc764 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -86,7 +86,9 @@ var/list/admin_verbs_fun = list(
/client/proc/set_ooc,
/client/proc/reset_ooc,
/client/proc/forceEvent,
- /client/proc/bluespace_artillery
+ /client/proc/bluespace_artillery,
+ /client/proc/admin_change_sec_level,
+ /client/proc/toggle_nuke
)
var/list/admin_verbs_spawn = list(
/datum/admins/proc/spawn_atom, /*allows us to spawn instances*/
@@ -198,7 +200,9 @@ var/list/admin_verbs_hideable = list(
/proc/release,
/client/proc/reload_admins,
/client/proc/reset_all_tcs,
- /client/proc/panicbunker
+ /client/proc/panicbunker,
+ /client/proc/admin_change_sec_level,
+ /client/proc/toggle_nuke
)
/client/proc/add_admin_verbs()
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index 54592390be8..f424d2cd7a9 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -81,7 +81,7 @@
body += "TP - "
body += "PM - "
body += "SM - "
- body += "JMP "
+ body += "FLW "
if(antagonist > 0)
body += "Antagonist ";
diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm
new file mode 100644
index 00000000000..4390f383d8b
--- /dev/null
+++ b/code/modules/admin/secrets.dm
@@ -0,0 +1,612 @@
+/datum/admins/proc/Secrets()
+ if(!check_rights(0)) return
+
+ var/dat = "The first rule of adminbuse is: you don't talk about the adminbuse. "
+
+ dat +={"
+ General Secrets
+
+ Show Job Debug
+ Admin Log
+ Show Admin List
+
+ "}
+
+ if(check_rights(R_ADMIN,0))
+ dat += {"
+ Admin Secrets
+
+ Cure all diseases currently in existence
+ Bombing List
+ Show current traitors and objectives
+ Show last [length(lastsignalers)] signalers
+ Show last [length(lawchanges)] law changes
+ Show AI Laws
+ Show Game Mode
+ Show Crew Manifest
+ List DNA (Blood)
+ List Fingerprints
+ Reset Thunderdome to default state
+
+ Shuttles
+
+ Move Ferry
+ Move Mining Shuttle
+ Move Labor Shuttle
+
+ "}
+
+ if(check_rights(R_FUN,0))
+ dat += {"
+ Fun Secrets
+
+
+ Trigger a Virus Outbreak
+ Turn all humans into monkeys
+ Change the species of all humans
+ Make all areas powered
+ Make all areas unpowered
+ Power all SMES
+ Triple AI mode (needs to be used in the lobby)
+ Everyone is the traitor
+ Summon Guns
+ Summon Magic
+ Summon Events (Toggle)
+ There can only be one!
+ Make all players retarded
+ Egalitarian Station Mode
+ Break all lights
+ Fix all lights
+ The floor is lava! (DANGEROUS: extremely lame)
+
+ Change bomb cap
+ "}
+
+ dat += " "
+
+ if(check_rights(R_DEBUG,0))
+ dat += {"
+ Security Level Elevated
+
+ Change all maintenance doors to engie/brig access only
+ Change all maintenance doors to brig access only
+ Remove cap on security officers
+
+ "}
+
+ usr << browse(dat, "window=secrets")
+ return
+
+
+
+
+
+/datum/admins/proc/Secrets_topic(var/item,var/href_list)
+ var/datum/round_event/E
+ var/ok = 0
+ switch(item)
+ if("admin_log")
+ var/dat = "Admin Log "
+ for(var/l in admin_log)
+ dat += "[l] "
+ if(!admin_log.len)
+ dat += "No-one has done anything this round!"
+ usr << browse(dat, "window=admin_log")
+
+ if("list_job_debug")
+ var/dat = "Job Debug info. "
+ if(SSjob)
+ for(var/line in SSjob.job_debug)
+ dat += "[line] "
+ dat+= "******* "
+ for(var/datum/job/job in SSjob.occupations)
+ if(!job) continue
+ dat += "job: [job.title], current_positions: [job.current_positions], total_positions: [job.total_positions] "
+ usr << browse(dat, "window=jobdebug;size=600x500")
+
+ if("show_admins")
+ var/dat = "Current admins: "
+ if(admin_datums)
+ for(var/ckey in admin_datums)
+ var/datum/admins/D = admin_datums[ckey]
+ dat += "[ckey] - [D.rank.name] "
+ usr << browse(dat, "window=showadmins;size=600x500")
+
+ if("tdomereset")
+ if(!check_rights(R_ADMIN))
+ return
+ var/delete_mobs = alert("Clear all mobs?","Confirm","Yes","No","Cancel")
+ if(delete_mobs == "Cancel")
+ return
+
+ log_admin("[key_name(usr)] reset the thunderdome to default with delete_mobs==[delete_mobs].", 1)
+ message_admins("[key_name_admin(usr)] reset the thunderdome to default with delete_mobs==[delete_mobs]. ")
+
+ var/area/thunderdome = locate(/area/tdome/arena)
+ if(delete_mobs == "Yes")
+ for(var/mob/living/mob in thunderdome)
+ qdel(mob) //Clear mobs
+ for(var/obj/obj in thunderdome)
+ if(!istype(obj,/obj/machinery/camera))
+ qdel(obj) //Clear objects
+
+ var/area/template = locate(/area/tdome/arena_source)
+ template.copy_contents_to(thunderdome)
+
+ if("clear_virus")
+
+ var/choice = input("Are you sure you want to cure all disease?") in list("Yes", "Cancel")
+ if(choice == "Yes")
+ message_admins("[key_name_admin(usr)] has cured all diseases.")
+ for(var/datum/disease/D in SSdisease.processing)
+ D.cure(D)
+
+ if("list_bombers")
+ if(!check_rights(R_ADMIN))
+ return
+ var/dat = "Bombing List "
+ for(var/l in bombers)
+ dat += text("[l] ")
+ usr << browse(dat, "window=bombers")
+
+ if("list_signalers")
+ if(!check_rights(R_ADMIN))
+ return
+ var/dat = "Showing last [length(lastsignalers)] signalers. "
+ for(var/sig in lastsignalers)
+ dat += "[sig] "
+ usr << browse(dat, "window=lastsignalers;size=800x500")
+
+ if("list_lawchanges")
+ if(!check_rights(R_ADMIN))
+ return
+ var/dat = "Showing last [length(lawchanges)] law changes. "
+ for(var/sig in lawchanges)
+ dat += "[sig] "
+ usr << browse(dat, "window=lawchanges;size=800x500")
+
+ if("check_antagonist")
+ if(!check_rights(R_ADMIN))
+ return
+ check_antagonists()
+
+ if("moveminingshuttle")
+ if(!check_rights(R_ADMIN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","ShM")
+ if(!SSshuttle.toggleShuttle("mining","mining_home","mining_away"))
+ message_admins("[key_name_admin(usr)] moved mining shuttle")
+ log_admin("[key_name(usr)] moved the mining shuttle")
+
+ if("movelaborshuttle")
+ if(!check_rights(R_ADMIN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","ShL")
+ if(!SSshuttle.toggleShuttle("laborcamp","laborcamp_home","laborcamp_away"))
+ message_admins("[key_name_admin(usr)] moved labor shuttle")
+ log_admin("[key_name(usr)] moved the labor shuttle")
+
+ if("moveferry")
+ if(!check_rights(R_ADMIN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","ShF")
+ if(!SSshuttle.toggleShuttle("ferry","ferry_home","ferry_away"))
+ message_admins("[key_name_admin(usr)] moved the centcom ferry")
+ log_admin("[key_name(usr)] moved the centcom ferry")
+
+ if("kick_all_from_lobby")
+ if(!check_rights(R_ADMIN))
+ return
+ if(ticker && ticker.current_state == GAME_STATE_PLAYING)
+ var/afkonly = text2num(href_list["afkonly"])
+ if(alert("Are you sure you want to kick all [afkonly ? "AFK" : ""] clients from the lobby??","Message","Yes","Cancel") != "Yes")
+ usr << "Kick clients from lobby aborted"
+ return
+ var/list/listkicked = kick_clients_in_lobby("The admin [usr.ckey] issued a 'kick all clients from lobby' command. ", afkonly)
+ var/strkicked = ""
+ for(var/name in listkicked)
+ strkicked += "[name], "
+ message_admins("[key_name_admin(usr)] has kicked [afkonly ? "all AFK" : "all"] clients from the lobby. [length(listkicked)] clients kicked: [strkicked ? strkicked : "--"]")
+ log_admin("[key_name(usr)] has kicked [afkonly ? "all AFK" : "all"] clients from the lobby. [length(listkicked)] clients kicked: [strkicked ? strkicked : "--"]")
+ else
+ usr << "You may only use this when the game is running"
+
+ if("showailaws")
+ if(!check_rights(R_ADMIN))
+ return
+ output_ai_laws()
+ if("showgm")
+ if(!check_rights(R_ADMIN))
+ return
+ if(!ticker)
+ alert("The game hasn't started yet!")
+ else if (ticker.mode)
+ alert("The game mode is [ticker.mode.name]")
+ else alert("For some reason there's a ticker, but not a game mode")
+ if("manifest")
+ if(!check_rights(R_ADMIN))
+ return
+ var/dat = "Showing Crew Manifest. "
+ dat += "Name Position "
+ for(var/datum/data/record/t in data_core.general)
+ dat += "[t.fields["name"]] [t.fields["rank"]] "
+ dat += "
"
+ usr << browse(dat, "window=manifest;size=440x410")
+ if("DNA")
+ if(!check_rights(R_ADMIN))
+ return
+ var/dat = "Showing DNA from blood. "
+ dat += "Name DNA Blood Type "
+ for(var/mob/living/carbon/human/H in mob_list)
+ if(H.dna && H.ckey)
+ dat += "[H] [H.dna.unique_enzymes] [H.blood_type] "
+ dat += "
"
+ usr << browse(dat, "window=DNA;size=440x410")
+ if("fingerprints")
+ if(!check_rights(R_ADMIN))
+ return
+ var/dat = "Showing Fingerprints. "
+ dat += "Name Fingerprints "
+ for(var/mob/living/carbon/human/H in mob_list)
+ if(H.ckey)
+ if(H.dna && H.dna.uni_identity)
+ dat += "[H] [md5(H.dna.uni_identity)] "
+ else if(H.dna && !H.dna.uni_identity)
+ dat += "[H] H.dna.uni_identity = null "
+ else if(!H.dna)
+ dat += "[H] H.dna = null "
+ dat += "
"
+ usr << browse(dat, "window=fingerprints;size=440x410")
+
+ if("monkey")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","M")
+ for(var/mob/living/carbon/human/H in mob_list)
+ spawn(0)
+ H.monkeyize()
+ ok = 1
+
+ if("allspecies")
+ if(!check_rights(R_FUN))
+ return
+ var/result = input(usr, "Please choose a new species","Species") as null|anything in species_list
+ if(result)
+ log_admin("[key_name(usr)] turned all humans into [result]", 1)
+ message_admins("\blue [key_name_admin(usr)] turned all humans into [result]")
+ var/newtype = species_list[result]
+ for(var/mob/living/carbon/human/H in mob_list)
+ hardset_dna(H, null, null, null, null, newtype)
+ H.regenerate_icons()
+
+ if("corgi")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","M")
+ for(var/mob/living/carbon/human/H in mob_list)
+ spawn(0)
+ H.corgize()
+ ok = 1
+
+ if("tripleAI")
+ if(!check_rights(R_FUN))
+ return
+ usr.client.triple_ai()
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","TriAI")
+
+ if("power")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","P")
+ log_admin("[key_name(usr)] made all areas powered", 1)
+ message_admins("[key_name_admin(usr)] made all areas powered ")
+ power_restore()
+
+ if("unpower")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","UP")
+ log_admin("[key_name(usr)] made all areas unpowered", 1)
+ message_admins("[key_name_admin(usr)] made all areas unpowered ")
+ power_failure()
+
+ if("quickpower")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","QP")
+ log_admin("[key_name(usr)] made all SMESs powered", 1)
+ message_admins("[key_name_admin(usr)] made all SMESs powered ")
+ power_restore_quick()
+
+ if("traitor_all")
+ if(!check_rights(R_FUN))
+ return
+ if(!ticker)
+ alert("The game hasn't started yet!")
+ return
+ var/objective = copytext(sanitize(input("Enter an objective")),1,MAX_MESSAGE_LEN)
+ if(!objective)
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","TA([objective])")
+ for(var/mob/living/carbon/human/H in player_list)
+ if(H.stat == 2 || !H.client || !H.mind) continue
+ if(is_special_character(H)) continue
+ //traitorize(H, objective, 0)
+ ticker.mode.traitors += H.mind
+ H.mind.special_role = "traitor"
+ var/datum/objective/new_objective = new
+ new_objective.owner = H
+ new_objective.explanation_text = objective
+ H.mind.objectives += new_objective
+ ticker.mode.greet_traitor(H.mind)
+ //ticker.mode.forge_traitor_objectives(H.mind)
+ ticker.mode.finalize_traitor(H.mind)
+ for(var/mob/living/silicon/A in player_list)
+ if(A.stat == 2 || !A.client || !A.mind) continue
+ if(ispAI(A)) continue
+ else if(is_special_character(A)) continue
+ ticker.mode.traitors += A.mind
+ A.mind.special_role = "traitor"
+ var/datum/objective/new_objective = new
+ new_objective.owner = A
+ new_objective.explanation_text = objective
+ A.mind.objectives += new_objective
+ ticker.mode.greet_traitor(A.mind)
+ ticker.mode.finalize_traitor(A.mind)
+ message_admins("[key_name_admin(usr)] used everyone is a traitor secret. Objective is [objective] ")
+ log_admin("[key_name(usr)] used everyone is a traitor secret. Objective is [objective]")
+
+ if("changebombcap")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","BC")
+
+ var/newBombCap = input(usr,"What would you like the new bomb cap to be. (entered as the light damage range (the 3rd number in common (1,2,3) notation)) Must be between 4 and 128)", "New Bomb Cap", MAX_EX_LIGHT_RANGE) as num|null
+ if (newBombCap < 4)
+ return
+ if (newBombCap > 128)
+ newBombCap = 128
+
+ MAX_EX_DEVESTATION_RANGE = round(newBombCap/4)
+ MAX_EX_HEAVY_RANGE = round(newBombCap/2)
+ MAX_EX_LIGHT_RANGE = newBombCap
+ //I don't know why these are their own variables, but fuck it, they are.
+ MAX_EX_FLASH_RANGE = newBombCap
+ MAX_EX_FLAME_RANGE = newBombCap
+
+ message_admins("[key_name_admin(usr)] changed the bomb cap to [MAX_EX_DEVESTATION_RANGE], [MAX_EX_HEAVY_RANGE], [MAX_EX_LIGHT_RANGE] ")
+ log_admin("[key_name(usr)] changed the bomb cap to [MAX_EX_DEVESTATION_RANGE], [MAX_EX_HEAVY_RANGE], [MAX_EX_LIGHT_RANGE]")
+
+
+ if("lightsout")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","LO")
+ message_admins("[key_name_admin(usr)] has broke a lot of lights")
+ E = new /datum/round_event/electrical_storm{lightsoutAmount = 2}()
+
+ if("blackout")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","BO")
+ message_admins("[key_name_admin(usr)] broke all lights")
+ for(var/obj/machinery/light/L in world)
+ L.broken()
+
+ if("whiteout")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","WO")
+ message_admins("[key_name_admin(usr)] fixed all lights")
+ for(var/obj/machinery/light/L in world)
+ L.fix()
+
+ if("floorlava")
+ if(!check_rights(R_FUN))
+ return
+ if(floorIsLava)
+ usr << "The floor is lava already."
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","LF")
+
+ //Options
+ var/length = input(usr, "How long will the lava last? (in seconds)", "Length", 180) as num
+ length = min(abs(length), 1200)
+
+ var/damage = input(usr, "How deadly will the lava be?", "Damage", 2) as num
+ damage = min(abs(damage), 100)
+
+ var/sure = alert(usr, "Are you sure you want to do this?", "Confirmation", "YES!", "Nah")
+ if(sure == "Nah")
+ return
+ floorIsLava = 1
+
+ message_admins("[key_name_admin(usr)] made the floor LAVA! It'll last [length] seconds and it will deal [damage] damage to everyone.")
+
+ for(var/turf/simulated/floor/F in world)
+ if(F.z == ZLEVEL_STATION)
+ F.name = "lava"
+ F.desc = "The floor is LAVA!"
+ F.overlays += "lava"
+ F.lava = 1
+
+ spawn(0)
+ for(var/i = i, i < length, i++) // 180 = 3 minutes
+ if(damage)
+ for(var/mob/living/carbon/L in living_mob_list)
+ if(istype(L.loc, /turf/simulated/floor)) // Are they on LAVA?!
+ var/turf/simulated/floor/F = L.loc
+ if(F.lava)
+ var/safe = 0
+ for(var/obj/structure/O in F.contents)
+ if(O.level > F.level && !istype(O, /obj/structure/window)) // Something to stand on and it isn't under the floor!
+ safe = 1
+ break
+ if(!safe)
+ L.adjustFireLoss(damage)
+
+
+ sleep(10)
+
+ for(var/turf/simulated/floor/F in world) // Reset everything.
+ if(F.z == ZLEVEL_STATION)
+ F.name = initial(F.name)
+ F.desc = initial(F.desc)
+ F.overlays.Cut()
+ F.lava = 0
+ F.update_icon()
+ floorIsLava = 0
+ return
+
+ if("virus")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","V")
+ switch(alert("Do you want this to be a random disease or do you have something in mind?",,"Make Your Own","Random","Choose"))
+ if("Make Your Own")
+ AdminCreateVirus(usr.client)
+ if("Random")
+ E = new /datum/round_event/disease_outbreak()
+ if("Choose")
+ var/virus = input("Choose the virus to spread", "BIOHAZARD") as null|anything in typesof(/datum/disease)
+ E = new /datum/round_event/disease_outbreak{}()
+ var/datum/round_event/disease_outbreak/DO = E
+ DO.virus_type = virus
+
+ if("retardify")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","RET")
+ for(var/mob/living/carbon/human/H in player_list)
+ H << "You suddenly feel stupid. "
+ H.setBrainLoss(60)
+ message_admins("[key_name_admin(usr)] made everybody retarded")
+
+ if("eagles")//SCRAW
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","EgL")
+ for(var/obj/machinery/door/airlock/W in world)
+ if(W.z == ZLEVEL_STATION && !istype(get_area(W), /area/bridge) && !istype(get_area(W), /area/crew_quarters) && !istype(get_area(W), /area/security/prison))
+ W.req_access = list()
+ message_admins("[key_name_admin(usr)] activated Egalitarian Station mode")
+ priority_announce("Centcom airlock control override activated. Please take this time to get acquainted with your coworkers.", null, 'sound/AI/commandreport.ogg')
+
+ if("guns")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","SG")
+ var/survivor_probability = 0
+ switch(alert("Do you want this to create survivors antagonists?",,"No Antags","Some Antags","All Antags!"))
+ if("Some Antags")
+ survivor_probability = 25
+ if("All Antags!")
+ survivor_probability = 100
+
+ rightandwrong(0, usr, survivor_probability)
+
+ if("magic")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","SM")
+ var/survivor_probability = 0
+ switch(alert("Do you want this to create survivors antagonists?",,"No Antags","Some Antags","All Antags!"))
+ if("Some Antags")
+ survivor_probability = 25
+ if("All Antags!")
+ survivor_probability = 100
+
+ rightandwrong(1, usr, survivor_probability)
+
+ if("events")
+ if(!check_rights(R_FUN))
+ return
+ if(!SSevent.wizardmode)
+ if(alert("Do you want to toggle summon events on?",,"Yes","No") == "Yes")
+ summonevents()
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","SE")
+
+ else
+ switch(alert("What would you like to do?",,"Intensify Summon Events","Turn Off Summon Events","Nothing"))
+ if("Intensify Summon Events")
+ summonevents()
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","SE")
+ if("Turn Off Summon Events")
+ SSevent.toggleWizardmode()
+ SSevent.resetFrequency()
+
+ if("dorf")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","DF")
+ for(var/mob/living/carbon/human/B in mob_list)
+ B.facial_hair_style = "Dward Beard"
+ B.update_hair()
+ message_admins("[key_name_admin(usr)] activated dorf mode")
+
+ if("onlyone")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","OO")
+ usr.client.only_one()
+// message_admins("[key_name_admin(usr)] has triggered a battle to the death (only one)")
+
+ if("maint_access_brig")
+ if(!check_rights(R_DEBUG))
+ return
+ for(var/obj/machinery/door/airlock/maintenance/M in world)
+ M.check_access()
+ if (access_maint_tunnels in M.req_access)
+ M.req_access = list(access_brig)
+ message_admins("[key_name_admin(usr)] made all maint doors brig access-only.")
+ if("maint_access_engiebrig")
+ if(!check_rights(R_DEBUG))
+ return
+ for(var/obj/machinery/door/airlock/maintenance/M in world)
+ M.check_access()
+ if (access_maint_tunnels in M.req_access)
+ M.req_access = list()
+ M.req_one_access = list(access_brig,access_engine)
+ message_admins("[key_name_admin(usr)] made all maint doors engineering and brig access-only.")
+ if("infinite_sec")
+ if(!check_rights(R_DEBUG))
+ return
+ var/datum/job/J = SSjob.GetJob("Security Officer")
+ if(!J) return
+ J.total_positions = -1
+ J.spawn_positions = -1
+ message_admins("[key_name_admin(usr)] has removed the cap on security officers.")
+ if(E)
+ E.processing = 0
+ if(E.announceWhen>0)
+ if(alert(usr, "Would you like to alert the crew?", "Alert", "Yes", "No") == "No")
+ E.announceWhen = -1
+ E.processing = 1
+ if (usr)
+ log_admin("[key_name(usr)] used secret [item]")
+ if (ok)
+ world << text("A secret has been activated by []! ", usr.key)
\ No newline at end of file
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 14d8693c3e5..5fe81932f7d 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1337,7 +1337,7 @@
sleep(5)
M.loc = pick(tdomeobserve)
spawn(50)
- M << " You have been sent to the Thunderdome. "
+ M << "You have been sent to the Thunderdome. "
log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Observer.)")
message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the thunderdome. (Observer.)")
@@ -1416,57 +1416,20 @@
usr.client.cmd_admin_animalize(M)
-/***************** BEFORE**************
-
- if (href_list["l_players"])
- var/dat = "Name/Real Name/Key/IP: "
- for(var/mob/M in world)
- var/foo = ""
- if (ismob(M) && M.client)
- if(!M.client.authenticated && !M.client.authenticating)
- foo += text("\[ Authorize | ", src, M)
- else
- foo += text("\[ Authorized | ")
- if(M.start)
- if(!istype(M, /mob/living/carbon/monkey))
- foo += text("Monkeyize | ", src, M)
- else
- foo += text("Monkeyized | ")
- if(istype(M, /mob/living/silicon/ai))
- foo += text("Is an AI | ")
- else
- foo += text("Make AI | ", src, M)
- if(M.z != 2)
- foo += text("Prison | ", src, M)
- foo += text("Maze | ", src, M)
- else
- foo += text("On Z = 2 | ")
- else
- foo += text("Hasn't Entered Game | ")
- foo += text("Heal/Revive | ", src, M)
-
- foo += text("Say \]", src, M)
- dat += text("N: [] R: [] (K: []) (IP: []) [] ", M.name, M.real_name, (M.client ? M.client : "No client"), M.lastKnownIP, foo)
-
- usr << browse(dat, "window=players;size=900x480")
-
-*****************AFTER******************/
-
-// Now isn't that much better? IT IS NOW A PROC, i.e. kinda like a big panel like unstable
-
else if(href_list["adminplayeropts"])
var/mob/M = locate(href_list["adminplayeropts"])
show_player_panel(M)
- else if(href_list["adminplayerobservejump"])
+ else if(href_list["adminplayerobservefollow"])
if(!isobserver(usr) && !check_rights(R_ADMIN)) return
- var/mob/M = locate(href_list["adminplayerobservejump"])
+ var/mob/M = locate(href_list["adminplayerobservefollow"])
var/client/C = usr.client
if(!isobserver(usr)) C.admin_ghost()
+ var/mob/dead/observer/A = C.mob
sleep(2)
- C.jumptomob(M)
+ A.ManualFollow(M)
else if(href_list["adminplayerobservecoodjump"])
if(!isobserver(usr) && !check_rights(R_ADMIN)) return
@@ -1531,7 +1494,7 @@
src.owner << "Name = [M.name] ; Real_name = [M.real_name]; Mind_name = [M.mind?"[M.mind.name]":""]; Key = [M.key] ;"
src.owner << "Location = [location_description];"
src.owner << "[special_role_description]"
- src.owner << "(PM ) (PP ) (VV ) (SM ) (JMP ) (CA )"
+ src.owner << "(PM ) (PP ) (VV ) (SM ) (FLW ) (CA )"
else if(href_list["addjobslot"])
if(!check_rights(R_ADMIN)) return
@@ -1812,465 +1775,8 @@
break
return
- else if(href_list["secretsfun"])
- if(!check_rights(R_FUN)) return
- var/datum/round_event/E
- var/ok = 0
- switch(href_list["secretsfun"])
- if("tdomereset")
- var/delete_mobs = alert("Clear all mobs?","Confirm","Yes","No","Cancel")
- if(delete_mobs == "Cancel")
- return
-
- log_admin("[key_name(usr)] reset the thunderdome to default with delete_mobs==[delete_mobs].", 1)
- message_admins("[key_name_admin(usr)] reset the thunderdome to default with delete_mobs==[delete_mobs]. ")
-
- var/area/thunderdome = locate(/area/tdome/arena)
- if(delete_mobs == "Yes")
- for(var/mob/living/mob in thunderdome)
- qdel(mob) //Clear mobs
- for(var/obj/obj in thunderdome)
- if(!istype(obj,/obj/machinery/camera))
- qdel(obj) //Clear objects
-
- var/area/template = locate(/area/tdome/arena_source)
- template.copy_contents_to(thunderdome)
-
- if("monkey")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","M")
- for(var/mob/living/carbon/human/H in mob_list)
- spawn(0)
- H.monkeyize()
- ok = 1
- if("allspecies")
- var/result = input(usr, "Please choose a new species","Species") as null|anything in species_list
- if(result)
- log_admin("[key_name(usr)] turned all humans into [result]", 1)
- message_admins("\blue [key_name_admin(usr)] turned all humans into [result]")
- var/newtype = species_list[result]
- for(var/mob/living/carbon/human/H in mob_list)
- hardset_dna(H, null, null, null, null, newtype)
- H.regenerate_icons()
- if("corgi")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","M")
- for(var/mob/living/carbon/human/H in mob_list)
- spawn(0)
- H.corgize()
- ok = 1
-/* DEATH SQUADS
- if("striketeam")
- if(usr.client.strike_team())
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","Strike")
-*/
- if("tripleAI")
- usr.client.triple_ai()
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","TriAI")
- if("power")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","P")
- log_admin("[key_name(usr)] made all areas powered", 1)
- message_admins("[key_name_admin(usr)] made all areas powered ")
- power_restore()
- if("unpower")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","UP")
- log_admin("[key_name(usr)] made all areas unpowered", 1)
- message_admins("[key_name_admin(usr)] made all areas unpowered ")
- power_failure()
- if("quickpower")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","QP")
- log_admin("[key_name(usr)] made all SMESs powered", 1)
- message_admins("[key_name_admin(usr)] made all SMESs powered ")
- power_restore_quick()
- if("traitor_all")
- if(!ticker)
- alert("The game hasn't started yet!")
- return
- var/objective = copytext(sanitize(input("Enter an objective")),1,MAX_MESSAGE_LEN)
- if(!objective)
- return
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","TA([objective])")
- for(var/mob/living/carbon/human/H in player_list)
- if(H.stat == 2 || !H.client || !H.mind) continue
- if(is_special_character(H)) continue
- //traitorize(H, objective, 0)
- ticker.mode.traitors += H.mind
- H.mind.special_role = "traitor"
- var/datum/objective/new_objective = new
- new_objective.owner = H
- new_objective.explanation_text = objective
- H.mind.objectives += new_objective
- ticker.mode.greet_traitor(H.mind)
- //ticker.mode.forge_traitor_objectives(H.mind)
- ticker.mode.finalize_traitor(H.mind)
- for(var/mob/living/silicon/A in player_list)
- if(A.stat == 2 || !A.client || !A.mind) continue
- if(ispAI(A)) continue
- else if(is_special_character(A)) continue
- ticker.mode.traitors += A.mind
- A.mind.special_role = "traitor"
- var/datum/objective/new_objective = new
- new_objective.owner = A
- new_objective.explanation_text = objective
- A.mind.objectives += new_objective
- ticker.mode.greet_traitor(A.mind)
- ticker.mode.finalize_traitor(A.mind)
- message_admins("[key_name_admin(usr)] used everyone is a traitor secret. Objective is [objective] ")
- log_admin("[key_name(usr)] used everyone is a traitor secret. Objective is [objective]")
- if("togglebombcap")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","BC")
- switch(MAX_EX_LIGHT_RANGE)
- if(14)
- MAX_EX_LIGHT_RANGE = 16
- MAX_EX_HEAVY_RANGE = 8
- MAX_EX_DEVESTATION_RANGE = 4
- if(16)
- MAX_EX_LIGHT_RANGE = 20
- MAX_EX_HEAVY_RANGE = 10
- MAX_EX_DEVESTATION_RANGE = 5
- if(20)
- MAX_EX_LIGHT_RANGE = 28
- MAX_EX_HEAVY_RANGE = 14
- MAX_EX_DEVESTATION_RANGE = 7
- if(28)
- MAX_EX_LIGHT_RANGE = 56
- MAX_EX_HEAVY_RANGE = 28
- MAX_EX_DEVESTATION_RANGE = 14
- if(56)
- MAX_EX_LIGHT_RANGE = 128
- MAX_EX_HEAVY_RANGE = 64
- MAX_EX_DEVESTATION_RANGE = 32
- if(128)
- MAX_EX_LIGHT_RANGE = 14
- MAX_EX_HEAVY_RANGE = 7
- MAX_EX_DEVESTATION_RANGE = 3
- message_admins("[key_name_admin(usr)] changed the bomb cap to [MAX_EX_DEVESTATION_RANGE], [MAX_EX_HEAVY_RANGE], [MAX_EX_LIGHT_RANGE] ")
- log_admin("[key_name(usr)] changed the bomb cap to [MAX_EX_DEVESTATION_RANGE], [MAX_EX_HEAVY_RANGE], [MAX_EX_LIGHT_RANGE]")
-
- if("lightsout")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","LO")
- message_admins("[key_name_admin(usr)] has broke a lot of lights")
- E = new /datum/round_event/electrical_storm{lightsoutAmount = 2}()
- if("blackout")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","BO")
- message_admins("[key_name_admin(usr)] broke all lights")
- for(var/obj/machinery/light/L in world)
- L.broken()
- if("whiteout")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","WO")
- message_admins("[key_name_admin(usr)] fixed all lights")
- for(var/obj/machinery/light/L in world)
- L.fix()
- if("floorlava")
- if(floorIsLava)
- usr << "The floor is lava already."
- return
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","LF")
-
- //Options
- var/length = input(usr, "How long will the lava last? (in seconds)", "Length", 180) as num
- length = min(abs(length), 1200)
-
- var/damage = input(usr, "How deadly will the lava be?", "Damage", 2) as num
- damage = min(abs(damage), 100)
-
- var/sure = alert(usr, "Are you sure you want to do this?", "Confirmation", "YES!", "Nah")
- if(sure == "Nah")
- return
- floorIsLava = 1
-
- message_admins("[key_name_admin(usr)] made the floor LAVA! It'll last [length] seconds and it will deal [damage] damage to everyone.")
-
- for(var/turf/simulated/floor/F in world)
- if(F.z == ZLEVEL_STATION)
- F.name = "lava"
- F.desc = "The floor is LAVA!"
- F.overlays += "lava"
- F.lava = 1
-
- spawn(0)
- for(var/i = i, i < length, i++) // 180 = 3 minutes
- if(damage)
- for(var/mob/living/carbon/L in living_mob_list)
- if(istype(L.loc, /turf/simulated/floor)) // Are they on LAVA?!
- var/turf/simulated/floor/F = L.loc
- if(F.lava)
- var/safe = 0
- for(var/obj/structure/O in F.contents)
- if(O.level > F.level && !istype(O, /obj/structure/window)) // Something to stand on and it isn't under the floor!
- safe = 1
- break
- if(!safe)
- L.adjustFireLoss(damage)
-
-
- sleep(10)
-
- for(var/turf/simulated/floor/F in world) // Reset everything.
- if(F.z == ZLEVEL_STATION)
- F.name = initial(F.name)
- F.desc = initial(F.desc)
- F.overlays.Cut()
- F.lava = 0
- F.update_icon()
- floorIsLava = 0
- return
- if("virus")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","V")
- switch(alert("Do you want this to be a random disease or do you have something in mind?",,"Make Your Own","Random","Choose"))
- if("Make Your Own")
- AdminCreateVirus(usr.client)
- if("Random")
- E = new /datum/round_event/disease_outbreak()
- if("Choose")
- var/virus = input("Choose the virus to spread", "BIOHAZARD") as null|anything in typesof(/datum/disease)
- E = new /datum/round_event/disease_outbreak{}()
- var/datum/round_event/disease_outbreak/DO = E
- DO.virus_type = virus
- if("retardify")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","RET")
- for(var/mob/living/carbon/human/H in player_list)
- H << "You suddenly feel stupid. "
- H.setBrainLoss(60)
- message_admins("[key_name_admin(usr)] made everybody retarded")
- if("eagles")//SCRAW
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","EgL")
- for(var/obj/machinery/door/airlock/W in world)
- if(W.z == ZLEVEL_STATION && !istype(get_area(W), /area/bridge) && !istype(get_area(W), /area/crew_quarters) && !istype(get_area(W), /area/security/prison))
- W.req_access = list()
- message_admins("[key_name_admin(usr)] activated Egalitarian Station mode")
- priority_announce("Centcom airlock control override activated. Please take this time to get acquainted with your coworkers.", null, 'sound/AI/commandreport.ogg')
- if("guns")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","SG")
- var/survivor_probability = 0
- switch(alert("Do you want this to create survivors antagonists?",,"No Antags","Some Antags","All Antags!"))
- if("Some Antags")
- survivor_probability = 25
- if("All Antags!")
- survivor_probability = 100
-
- rightandwrong(0, usr, survivor_probability)
- if("magic")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","SM")
- var/survivor_probability = 0
- switch(alert("Do you want this to create survivors antagonists?",,"No Antags","Some Antags","All Antags!"))
- if("Some Antags")
- survivor_probability = 25
- if("All Antags!")
- survivor_probability = 100
-
- rightandwrong(1, usr, survivor_probability)
- if("events")
- if(!SSevent.wizardmode)
- if(alert("Do you want to toggle summon events on?",,"Yes","No") == "Yes")
- summonevents()
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","SE")
-
- else
- switch(alert("What would you like to do?",,"Intensify Summon Events","Turn Off Summon Events","Nothing"))
- if("Intensify Summon Events")
- summonevents()
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","SE")
- if("Turn Off Summon Events")
- SSevent.toggleWizardmode()
- SSevent.resetFrequency()
- if("dorf")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","DF")
- for(var/mob/living/carbon/human/B in mob_list)
- B.facial_hair_style = "Dward Beard"
- B.update_hair()
- message_admins("[key_name_admin(usr)] activated dorf mode")
- if("onlyone")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","OO")
- usr.client.only_one()
-// message_admins("[key_name_admin(usr)] has triggered a battle to the death (only one)")
- if(E)
- E.processing = 0
- if(E.announceWhen>0)
- if(alert(usr, "Would you like to alert the crew?", "Alert", "Yes", "No") == "No")
- E.announceWhen = -1
- E.processing = 1
- if(usr)
- log_admin("[key_name(usr)] used secret [href_list["secretsfun"]]")
- if (ok)
- world << text("A secret has been activated by []! ", usr.key)
-
- else if(href_list["secretsadmin"])
- if(!check_rights(R_ADMIN)) return
-
- var/ok = 0
- switch(href_list["secretsadmin"])
- if("clear_virus")
- var/choice = input("Are you sure you want to cure all disease?") in list("Yes", "Cancel")
- if(choice == "Yes")
- message_admins("[key_name_admin(usr)] has cured all diseases.")
- for(var/datum/disease/D in SSdisease.processing)
- D.cure(D)
- if("list_bombers")
- var/dat = "Bombing List "
- for(var/l in bombers)
- dat += text("[l] ")
- usr << browse(dat, "window=bombers")
- if("list_signalers")
- var/dat = "Showing last [length(lastsignalers)] signalers. "
- for(var/sig in lastsignalers)
- dat += "[sig] "
- usr << browse(dat, "window=lastsignalers;size=800x500")
- if("list_lawchanges")
- var/dat = "Showing last [length(lawchanges)] law changes. "
- for(var/sig in lawchanges)
- dat += "[sig] "
- usr << browse(dat, "window=lawchanges;size=800x500")
- if("check_antagonist")
- check_antagonists()
-
- if("moveminingshuttle")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","ShM")
- if(!SSshuttle.toggleShuttle("mining","mining_home","mining_away"))
- message_admins("[key_name_admin(usr)] moved mining shuttle")
- log_admin("[key_name(usr)] moved the mining shuttle")
-
- if("movelaborshuttle")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","ShL")
- if(!SSshuttle.toggleShuttle("laborcamp","laborcamp_home","laborcamp_away"))
- message_admins("[key_name_admin(usr)] moved labor shuttle")
- log_admin("[key_name(usr)] moved the labor shuttle")
-
- if("moveferry")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","ShF")
- if(!SSshuttle.toggleShuttle("ferry","ferry_home","ferry_away"))
- message_admins("[key_name_admin(usr)] moved the centcom ferry")
- log_admin("[key_name(usr)] moved the centcom ferry")
-
- if("kick_all_from_lobby")
- if(ticker && ticker.current_state == GAME_STATE_PLAYING)
- var/afkonly = text2num(href_list["afkonly"])
- if(alert("Are you sure you want to kick all [afkonly ? "AFK" : ""] clients from the lobby??","Message","Yes","Cancel") != "Yes")
- usr << "Kick clients from lobby aborted"
- return
- var/list/listkicked = kick_clients_in_lobby("The admin [usr.ckey] issued a 'kick all clients from lobby' command. ", afkonly)
- var/strkicked = ""
- for(var/name in listkicked)
- strkicked += "[name], "
- message_admins("[key_name_admin(usr)] has kicked [afkonly ? "all AFK" : "all"] clients from the lobby. [length(listkicked)] clients kicked: [strkicked ? strkicked : "--"]")
- log_admin("[key_name(usr)] has kicked [afkonly ? "all AFK" : "all"] clients from the lobby. [length(listkicked)] clients kicked: [strkicked ? strkicked : "--"]")
- else
- usr << "You may only use this when the game is running"
- if("showailaws")
- output_ai_laws()
- if("showgm")
- if(!ticker)
- alert("The game hasn't started yet!")
- else if (ticker.mode)
- alert("The game mode is [ticker.mode.name]")
- else alert("For some reason there's a ticker, but not a game mode")
- if("manifest")
- var/dat = "Showing Crew Manifest. "
- dat += "Name Position "
- for(var/datum/data/record/t in data_core.general)
- dat += "[t.fields["name"]] [t.fields["rank"]] "
- dat += "
"
- usr << browse(dat, "window=manifest;size=440x410")
- if("DNA")
- var/dat = "Showing DNA from blood. "
- dat += "Name DNA Blood Type "
- for(var/mob/living/carbon/human/H in mob_list)
- if(H.dna && H.ckey)
- dat += "[H] [H.dna.unique_enzymes] [H.blood_type] "
- dat += "
"
- usr << browse(dat, "window=DNA;size=440x410")
- if("fingerprints")
- var/dat = "Showing Fingerprints. "
- dat += "Name Fingerprints "
- for(var/mob/living/carbon/human/H in mob_list)
- if(H.ckey)
- if(H.dna && H.dna.uni_identity)
- dat += "[H] [md5(H.dna.uni_identity)] "
- else if(H.dna && !H.dna.uni_identity)
- dat += "[H] H.dna.uni_identity = null "
- else if(!H.dna)
- dat += "[H] H.dna = null "
- dat += "
"
- usr << browse(dat, "window=fingerprints;size=440x410")
- else
- if (usr)
- log_admin("[key_name(usr)] used secret [href_list["secretsadmin"]]")
- if (ok)
- world << text("A secret has been activated by []! ", usr.key)
-
- else if(href_list["secretsgeneral"])
- switch(href_list["secretsgeneral"])
- if("spawn_objects")
- var/dat = "Admin Log "
- for(var/l in admin_log)
- dat += "[l] "
- if(!admin_log.len)
- dat += "No-one has done anything this round!"
- usr << browse(dat, "window=admin_log")
- if("list_job_debug")
- var/dat = "Job Debug info. "
- if(SSjob)
- for(var/line in SSjob.job_debug)
- dat += "[line] "
- dat+= "******* "
- for(var/datum/job/job in SSjob.occupations)
- if(!job) continue
- dat += "job: [job.title], current_positions: [job.current_positions], total_positions: [job.total_positions] "
- usr << browse(dat, "window=jobdebug;size=600x500")
- if("show_admins")
- var/dat = "Current admins: "
- if(admin_datums)
- for(var/ckey in admin_datums)
- var/datum/admins/D = admin_datums[ckey]
- dat += "[ckey] - [D.rank.name] "
- usr << browse(dat, "window=showadmins;size=600x500")
-
- else if(href_list["secretscoder"])
- if(!check_rights(R_DEBUG)) return
-
- switch(href_list["secretscoder"])
- if("maint_access_brig")
- for(var/obj/machinery/door/airlock/maintenance/M in world)
- M.check_access()
- if (access_maint_tunnels in M.req_access)
- M.req_access = list(access_brig)
- message_admins("[key_name_admin(usr)] made all maint doors brig access-only.")
- if("maint_access_engiebrig")
- for(var/obj/machinery/door/airlock/maintenance/M in world)
- M.check_access()
- if (access_maint_tunnels in M.req_access)
- M.req_access = list()
- M.req_one_access = list(access_brig,access_engine)
- message_admins("[key_name_admin(usr)] made all maint doors engineering and brig access-only.")
- if("infinite_sec")
- var/datum/job/J = SSjob.GetJob("Security Officer")
- if(!J) return
- J.total_positions = -1
- J.spawn_positions = -1
- message_admins("[key_name_admin(usr)] has removed the cap on security officers.")
+ else if(href_list["secrets"])
+ Secrets_topic(href_list["secrets"],href_list)
else if(href_list["ac_view_wanted"]) //Admin newscaster Topic() stuff be here
src.admincaster_screen = 18 //The ac_ prefix before the hrefs stands for AdminCaster.
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index d3300a758cd..a34e5dd1b15 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -78,14 +78,14 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
mobs_found += found
if(!ai_found && isAI(found))
ai_found = 1
- msg += "[original_word] (? ) "
+ msg += "[original_word] (? ) (FLW ) "
continue
msg += "[original_word] "
if(!mob) return //this doesn't happen
var/ref_mob = "\ref[mob]"
- msg = "HELP: [key_name(src, 1)] (? ) (PP ) (VV ) (SM ) (JMP ) (TP ) [ai_found ? " (CL )" : ""]: [msg] "
+ msg = "HELP: [key_name_admin(src)] (? ) (PP ) (VV ) (SM ) (FLW ) (TP ) [ai_found ? " (CL )" : ""]: [msg] "
//send this msg to all admins
diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm
index 5adb784a25d..1e077bd66e9 100644
--- a/code/modules/admin/verbs/adminsay.dm
+++ b/code/modules/admin/verbs/adminsay.dm
@@ -6,15 +6,15 @@
msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN)
if(!msg) return
-
+
log_admin("[key_name(src)] : [msg]")
-
+
if(check_rights(R_ADMIN,0))
- msg = "ADMIN: [key_name(usr, 1)] (JMP ): [msg] "
+ msg = "ADMIN: [key_name(usr, 1)] (FLW ): [msg] "
admins << msg
else
msg = "ADMIN: [key_name(usr, 1)]: [msg] "
admins << msg
-
+
feedback_add_details("admin_verb","M") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm
index 5671bd85046..beec68a598a 100644
--- a/code/modules/admin/verbs/pray.dm
+++ b/code/modules/admin/verbs/pray.dm
@@ -19,13 +19,13 @@
var/image/cross = image('icons/obj/storage.dmi',"bible")
if(usr.job == "Chaplain")
cross = image('icons/obj/storage.dmi',"kingyellow")
- msg = "\icon[cross] CHAPLAIN PRAYER: [key_name(src, 1)] (? ) (PP ) (VV ) (SM ) (JMP ) (TP ) (SC ): [msg] "
+ msg = "\icon[cross] CHAPLAIN PRAYER: [key_name_admin(src)] (? ) (PP ) (VV ) (SM ) (FLW ) (TP ) (SC ): [msg] "
else if(iscultist(usr))
cross = image('icons/obj/storage.dmi',"tome")
- msg = "\icon[cross] CULTIST PRAYER: [key_name(src, 1)] (? ) (PP ) (VV ) (SM ) (JMP ) (TP ) (SC ): [msg] "
+ msg = "\icon[cross] CULTIST PRAYER: [key_name_admin(src)] (? ) (PP ) (VV ) (SM ) (FLW ) (TP ) (SC ): [msg] "
else
cross = image('icons/obj/storage.dmi',"bible")
- msg = "\icon[cross] PRAYER: [key_name(src, 1)] (? ) (PP ) (VV ) (SM ) (JMP ) (TP ) (SC ): [msg] "
+ msg = "\icon[cross] PRAYER: [key_name_admin(src)] (? ) (PP ) (VV ) (SM ) (FLW ) (TP ) (SC ): [msg] "
for(var/client/C in admins)
if(C.prefs.chat_toggles & CHAT_PRAYER)
C << msg
@@ -39,16 +39,16 @@
/proc/Centcomm_announce(var/text , var/mob/Sender)
var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN)
- msg = " CENTCOM: [key_name(Sender, 1)] (? ) (PP ) (VV ) (SM ) (JMP ) (TP ) (BSA ) (RPLY ): [msg] "
+ msg = "CENTCOM: [key_name_admin(Sender)] (? ) (PP ) (VV ) (SM ) (FLW ) (TP ) (BSA ) (RPLY ): [msg] "
admins << msg
/proc/Syndicate_announce(var/text , var/mob/Sender)
var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN)
- msg = "SYNDICATE: [key_name(Sender, 1)] (? ) (PP ) (VV ) (SM ) (JMP ) (TP ) (BSA ) (RPLY ): [msg] "
+ msg = "SYNDICATE: [key_name_admin(Sender)] (? ) (PP ) (VV ) (SM ) (FLW ) (TP ) (BSA ) (RPLY ): [msg] "
admins << msg
/proc/Nuke_request(var/text , var/mob/Sender)
var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN)
- msg = " NUKE CODE REQUEST: [key_name(Sender, 1)] (? ) (PP ) (VV ) (SM ) (JMP ) (TP ) (BSA ) (RPLY ): [msg] "
+ msg = "NUKE CODE REQUEST: [key_name_admin(Sender)] (? ) (PP ) (VV ) (SM ) (FLW ) (TP ) (BSA ) (RPLY ): [msg] "
admins << msg
admins << "At this current time, the nuke must have the code manually set via varedit. "
\ No newline at end of file
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 87ebd141d1d..0e8b30d2768 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -298,7 +298,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
//DNA
if(record_found)//Pull up their name from database records if they did have a mind.
- hardset_dna(new_character, record_found.fields["identity"], record_found.fields["enzymes"], record_found.fields["name"], record_found.fields["blood_type"], record_found.fields["species"], record_found.fields["mcolor"])
+ hardset_dna(new_character, record_found.fields["identity"], record_found.fields["enzymes"], record_found.fields["name"], record_found.fields["blood_type"], record_found.fields["species"], record_found.fields["features"])
else//If they have no records, we just do a random DNA for them, based on their random appearance/savefile.
ready_dna(new_character)
@@ -551,67 +551,6 @@ Traitors and the like can also be revived with the previous role mostly intact.
log_admin("[key_name(usr)] used gibself.")
message_admins("[key_name_admin(usr)] used gibself. ")
feedback_add_details("admin_verb","GIBS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-/*
-/client/proc/cmd_manual_ban()
- set name = "Manual Ban"
- set category = "Special Verbs"
- if(!authenticated || !holder)
- src << "Only administrators may use this command."
- return
- var/mob/M = null
- switch(alert("How would you like to ban someone today?", "Manual Ban", "Key List", "Enter Manually", "Cancel"))
- if("Key List")
- var/list/keys = list()
- for(var/mob/M in world)
- keys += M.client
- var/selection = input("Please, select a player!", "Admin Jumping", null, null) as null|anything in keys
- if(!selection)
- return
- M = selection:mob
- if ((M.client && M.client.holder && (M.client.holder.level >= holder.level)))
- alert("You cannot perform this action. You must be of a higher administrative rank!")
- return
-
- switch(alert("Temporary Ban?",,"Yes","No"))
- if("Yes")
- var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num
- if(!mins)
- return
- if(mins >= 525600) mins = 525599
- var/reason = input(usr,"Reason?","reason","Griefer") as text
- if(!reason)
- return
- if(M)
- AddBan(M.ckey, M.computer_id, reason, usr.ckey, 1, mins)
- M << "\redYou have been banned by [usr.client.ckey].\nReason: [reason] "
- M << "\red This is a temporary ban, it will be removed in [mins] minutes."
- M << "\red To try to resolve this matter head to http://ss13.donglabs.com/forum/"
- log_admin("[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.")
- message_admins("\blue[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.")
- world.Export("http://216.38.134.132/adminlog.php?type=ban&key=[usr.client.key]&key2=[M.key]&msg=[html_decode(reason)]&time=[mins]&server=[replacetext(config.server_name, "#", "")]")
- del(M.client)
- qdel(M)
- else
-
- if("No")
- var/reason = input(usr,"Reason?","reason","Griefer") as text
- if(!reason)
- return
- AddBan(M.ckey, M.computer_id, reason, usr.ckey, 0, 0)
- M << "\redYou have been banned by [usr.client.ckey].\nReason: [reason] "
- M << "\red This is a permanent ban."
- M << "\red To try to resolve this matter head to http://ss13.donglabs.com/forum/"
- log_admin("[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban.")
- message_admins("\blue[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban.")
- world.Export("http://216.38.134.132/adminlog.php?type=ban&key=[usr.client.key]&key2=[M.key]&msg=[html_decode(reason)]&time=perma&server=[replacetext(config.server_name, "#", "")]")
- del(M.client)
- qdel(M)
-*/
-
-/client/proc/update_world()
- // If I see anyone granting powers to specific keys like the code that was here,
- // I will both remove their SVN access and permanently ban them from my servers.
- return
/client/proc/cmd_admin_check_contents(mob/living/M as mob in mob_list)
set category = "Special Verbs"
@@ -622,37 +561,6 @@ Traitors and the like can also be revived with the previous role mostly intact.
usr << "[t]"
feedback_add_details("admin_verb","CC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-/* This proc is DEFERRED. Does not do anything.
-/client/proc/cmd_admin_remove_plasma()
- set category = "Debug"
- set name = "Stabilize Atmos."
- if(!holder)
- src << "Only administrators may use this command."
- return
- feedback_add_details("admin_verb","STATM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-// DEFERRED
- spawn(0)
- for(var/turf/T in view())
- T.poison = 0
- T.oldpoison = 0
- T.tmppoison = 0
- T.oxygen = 755985
- T.oldoxy = 755985
- T.tmpoxy = 755985
- T.co2 = 14.8176
- T.oldco2 = 14.8176
- T.tmpco2 = 14.8176
- T.n2 = 2.844e+006
- T.on2 = 2.844e+006
- T.tn2 = 2.844e+006
- T.tsl_gas = 0
- T.osl_gas = 0
- T.sl_gas = 0
- T.temp = 293.15
- T.otemp = 293.15
- T.ttemp = 293.15
-*/
-
/client/proc/toggle_view_range()
set category = "Special Verbs"
set name = "Change View Range"
@@ -782,3 +690,42 @@ Traitors and the like can also be revived with the previous role mostly intact.
log_admin("[key_name(usr)] blanked all telecomms scripts.")
message_admins("[key_name_admin(usr)] blanked all telecomms scripts.")
feedback_add_details("admin_verb","RAT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/proc/admin_change_sec_level()
+ set category = "Special Verbs"
+ set name = "Set Security Level"
+ set desc = "Changes the security level. Announcement only, i.e. setting to Delta won't activate nuke"
+
+ if (!holder)
+ src << "Only administrators may use this command."
+ return
+
+ var/level = input("Select security level to change to","Set Security Level") as null|anything in list("green","blue","red","delta")
+ if(level)
+ set_security_level(level)
+
+ log_admin("[key_name(usr)] changed the security level to [level]")
+ message_admins("[key_name_admin(usr)] changed the security level to [level]")
+ feedback_add_details("admin_verb","CSL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/proc/toggle_nuke(obj/machinery/nuclearbomb/N in nuke_list)
+ set name = "Toggle Nuke"
+ set category = "Fun"
+ set popup_menu = 0
+ if(!check_rights(R_DEBUG)) return
+
+ if(!N.timing)
+ var/newtime = input(usr, "Set activation timer.", "Activate Nuke", "[N.timeleft]") as num
+ if(!newtime)
+ return
+ N.timeleft = newtime
+ N.safety = !N.safety
+ N.timing = !N.timing
+ bomb_set = !bomb_set
+ N.icon_state = (N.timing ? "nuclearbomb2" : "nuclearbomb1")
+ N.previous_level = "[get_security_level()]"
+ set_security_level((N.timing ? "delta" : "[N.previous_level]"))
+
+ log_admin("[key_name(usr)] [N.timing ? "activated" : "deactivated"] a nuke at ([N.x],[N.y],[N.z]).")
+ message_admins("[key_name_admin(usr)] (FLW ) [N.timing ? "activated" : "deactivated"] a nuke at ([N.x],[N.y],[N.z] - JMP ).")
+ feedback_add_details("admin_verb","TN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm
index b63a0feefe7..f92ef7dcf84 100644
--- a/code/modules/assembly/bomb.dm
+++ b/code/modules/assembly/bomb.dm
@@ -89,10 +89,11 @@
var/mob/M = user
if(isigniter(S.a_left) == isigniter(S.a_right)) //Check if either part of the assembly has an igniter, but if both parts are igniters, then fuck it
return
+ if(!M.drop_item()) //Remove the assembly from your hands
+ return
var/obj/item/device/onetankbomb/R = new /obj/item/device/onetankbomb(loc)
- M.drop_item() //Remove the assembly from your hands
M.remove_from_mob(src) //Remove the tank from your character,in case you were holding it
M.put_in_hands(R) //Equips the bomb if possible, or puts it on the floor.
diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm
index fee5794f977..5e6375b7e23 100644
--- a/code/modules/assembly/timer.dm
+++ b/code/modules/assembly/timer.dm
@@ -90,7 +90,7 @@
if(href_list["time"])
timing = text2num(href_list["time"])
if(timing && istype(holder, /obj/item/device/transfer_valve))
- var/timer_message = "[key_name_admin(usr)](? ) activated [src] attachment on [holder]."
+ var/timer_message = "[key_name_admin(usr)](? ) (FLW ) activated [src] attachment on [holder]."
message_admins(timer_message)
bombers += timer_message
log_game("[key_name(usr)] activated [src] attachment for [loc]")
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index 2fc40207bab..31b5332a190 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -31,6 +31,8 @@
//Admin PM
if(href_list["priv_msg"])
+ src << "message to src"
+ usr << "message to usr"
cmd_admin_pm(href_list["priv_msg"],null)
return
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 47cfb2c51db..1b737182ae9 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -61,7 +61,8 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
var/skin_tone = "caucasian1" //Skin color
var/eye_color = "000" //Eye color
var/datum/species/pref_species = new /datum/species/human() //Mutant race
- var/mutant_color = "FFF" //Mutant race skin color
+ var/list/features = list("mcolor" = "FFF", "tail" = "Smooth", "snout" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None")
+
var/list/custom_names = list("clown", "mime", "ai", "cyborg", "religion", "deity")
//Mob preview
@@ -243,7 +244,61 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
dat += "Alien Color "
- dat += " Change "
+ dat += " Change "
+
+ dat += ""
+
+ if("tail" in pref_species.mutant_bodyparts)
+ dat += " "
+
+ dat += "Tail "
+
+ dat += "[features["tail"]] "
+
+ dat += " "
+
+ if("snout" in pref_species.mutant_bodyparts)
+ dat += ""
+
+ dat += "Snout "
+
+ dat += "[features["snout"]] "
+
+ dat += " "
+
+ if("horns" in pref_species.mutant_bodyparts)
+ dat += ""
+
+ dat += "Horns "
+
+ dat += "[features["horns"]] "
+
+ dat += " "
+
+ if("frills" in pref_species.mutant_bodyparts)
+ dat += ""
+
+ dat += "Frills "
+
+ dat += "[features["frills"]] "
+
+ dat += " "
+
+ if("spines" in pref_species.mutant_bodyparts)
+ dat += ""
+
+ dat += "Spines "
+
+ dat += "[features["spines"]] "
+
+ dat += " "
+
+ if("body_markings" in pref_species.mutant_bodyparts)
+ dat += ""
+
+ dat += "Body Markings "
+
+ dat += "[features["body_markings"]] "
dat += " "
@@ -264,7 +319,7 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
dat += "Pull requests: [(chat_toggles & CHAT_PULLR) ? "Yes" : "No"] "
dat += "Midround Antagonist: [(toggles & MIDROUND_ANTAG) ? "Yes" : "No"] "
if(config.allow_Metadata)
- dat += "OOC Notes: Edit "
+ dat += "OOC Notes: Edit "
if(user.client)
if(user.client.holder)
@@ -736,19 +791,54 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
if(result)
var/newtype = roundstart_species[result]
pref_species = new newtype()
- if(mutant_color == "#000")
- mutant_color = pref_species.default_color
+ if(features["mcolor"] == "#000")
+ features["mcolor"] = pref_species.default_color
if("mutant_color")
var/new_mutantcolor = input(user, "Choose your character's alien skin color:", "Character Preference") as color|null
if(new_mutantcolor)
var/temp_hsv = RGBtoHSV(new_mutantcolor)
if(new_mutantcolor == "#000000")
- mutant_color = pref_species.default_color
+ features["mcolor"] = pref_species.default_color
else if(ReadHSV(temp_hsv)[3] >= ReadHSV("#7F7F7F")[3]) // mutantcolors must be bright
- mutant_color = sanitize_hexcolor(new_mutantcolor)
+ features["mcolor"] = sanitize_hexcolor(new_mutantcolor)
else
user << "Invalid color. Your color is not bright enough. "
+ if("tail")
+ var/new_tail
+ new_tail = input(user, "Choose your character's tail:", "Character Preference") as null|anything in tails_list
+ if(new_tail)
+ features["tail"] = new_tail
+
+ if("snout")
+ var/new_snout
+ new_snout = input(user, "Choose your character's snout:", "Character Preference") as null|anything in snouts_list
+ if(new_snout)
+ features["snout"] = new_snout
+
+ if("horns")
+ var/new_horns
+ new_horns = input(user, "Choose your character's horns:", "Character Preference") as null|anything in horns_list
+ if(new_horns)
+ features["horns"] = new_horns
+
+ if("frills")
+ var/new_frills
+ new_frills = input(user, "Choose your character's frills:", "Character Preference") as null|anything in frills_list
+ if(new_frills)
+ features["frills"] = new_frills
+
+ if("spines")
+ var/new_spines
+ new_spines = input(user, "Choose your character's spines:", "Character Preference") as null|anything in spines_list
+ if(new_spines)
+ features["spines"] = new_spines
+
+ if("body_markings")
+ var/new_body_markings
+ new_body_markings = input(user, "Choose your character's body markings:", "Character Preference") as null|anything in body_markings_list
+ if(new_body_markings)
+ features["body_markings"] = new_body_markings
if("s_tone")
var/new_s_tone = input(user, "Choose your character's skin-tone:", "Character Preference") as null|anything in skin_tones
@@ -919,10 +1009,9 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
if(character.dna)
character.dna.real_name = character.real_name
if(pref_species != /datum/species/human && config.mutant_races)
- hardset_dna(character, null, null, null, null, pref_species.type)
+ hardset_dna(character, null, null, null, null, pref_species.type, features)
else
- hardset_dna(character, null, null, null, null, /datum/species/human)
- character.dna.mutant_color = mutant_color
+ hardset_dna(character, null, null, null, null, /datum/species/human, features)
character.update_mutcolor()
character.gender = gender
@@ -940,6 +1029,8 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
character.undershirt = undershirt
character.socks = socks
+ character.features = features
+
if(backbag > 3 || backbag < 1)
backbag = 1 //Same as above
character.backbag = backbag
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index f2da84ddd52..a239561ede0 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -166,8 +166,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
else
pref_species = new /datum/species/human()
- if(!S["mutant_color"] || S["mutant_color"] == "#000")
- S["mutant_color"] << "#FFF"
+ if(!S["features["mcolor"]"] || S["features["mcolor"]"] == "#000")
+ S["features["mcolor"]"] << "#FFF"
//Character
S["OOC_Notes"] >> metadata
@@ -186,7 +186,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["undershirt"] >> undershirt
S["socks"] >> socks
S["backbag"] >> backbag
- S["mutant_color"] >> mutant_color
+ S["feature_mcolor"] >> features["mcolor"]
+ S["feature_lizard_tail"] >> features["tail"]
+ S["feature_lizard_snout"] >> features["snout"]
+ S["feature_lizard_horns"] >> features["horns"]
+ S["feature_lizard_frills"] >> features["frills"]
+ S["feature_lizard_spines"] >> features["spines"]
+ S["feature_lizard_body_markings"] >> features["body_markings"]
S["clown_name"] >> custom_names["clown"]
S["mime_name"] >> custom_names["mime"]
S["ai_name"] >> custom_names["ai"]
@@ -213,8 +219,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//Sanitize
metadata = sanitize_text(metadata, initial(metadata))
real_name = reject_bad_name(real_name)
- if(!mutant_color || mutant_color == "#000")
- mutant_color = "#FFF"
+ if(!features["mcolor"] || features["mcolor"] == "#000")
+ features["mcolor"] = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F")
if(!real_name) real_name = random_name(gender)
be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name))
be_random_body = sanitize_integer(be_random_body, 0, 1, initial(be_random_body))
@@ -238,7 +244,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
eye_color = sanitize_hexcolor(eye_color, 3, 0)
skin_tone = sanitize_inlist(skin_tone, skin_tones)
backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag))
- mutant_color = sanitize_hexcolor(mutant_color, 3, 0)
+ features["mcolor"] = sanitize_hexcolor(features["mcolor"], 3, 0)
+ features["tail"] = sanitize_inlist(features["tail"], tails_list)
+ features["snout"] = sanitize_inlist(features["snout"], snouts_list)
+ features["horns"] = sanitize_inlist(features["horns"], horns_list)
+ features["frills"] = sanitize_inlist(features["frills"], frills_list)
+ features["spines"] = sanitize_inlist(features["spines"], spines_list)
+ features["body_markings"] = sanitize_inlist(features["body_markings"], body_markings_list)
userandomjob = sanitize_integer(userandomjob, 0, 1, initial(userandomjob))
job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high))
@@ -279,7 +291,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["socks"] << socks
S["backbag"] << backbag
S["species"] << pref_species.name
- S["mutant_color"] << mutant_color
+ S["feature_mcolor"] << features["mcolor"]
+ S["feature_lizard_tail"] << features["tail"]
+ S["feature_lizard_snout"] << features["snout"]
+ S["feature_lizard_horns"] << features["horns"]
+ S["feature_lizard_frills"] << features["frills"]
+ S["feature_lizard_spines"] << features["spines"]
+ S["feature_lizard_body_markings"] << features["body_markings"]
S["clown_name"] << custom_names["clown"]
S["mime_name"] << custom_names["mime"]
S["ai_name"] << custom_names["ai"]
diff --git a/code/modules/clothing/cloaks.dm b/code/modules/clothing/cloaks.dm
new file mode 100644
index 00000000000..36459139176
--- /dev/null
+++ b/code/modules/clothing/cloaks.dm
@@ -0,0 +1,98 @@
+//Cloaks. No, not THAT kind of cloak.
+
+/obj/item/clothing/cloak
+ name = "brown cloak"
+ desc = "It's a cape that can be worn on your back."
+ icon = 'icons/obj/clothing/cloaks.dmi'
+ icon_state = "qmcloak"
+ w_class = 2
+ slot_flags = SLOT_BACK
+
+/obj/item/clothing/cloak/suicide_act(mob/user)
+ user.visible_message("[user] is strangling themself with [src]! It looks like they're trying to commit suicide. ")
+ return(OXYLOSS)
+
+/obj/item/clothing/cloak/hos
+ name = "head of security's cloak"
+ desc = "Worn by Securistan, ruling the station with an iron fist. It's slightly armored."
+ icon_state = "hoscloak"
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
+
+/obj/item/clothing/cloak/qm
+ name = "quartermaster's cloak"
+ desc = "Worn by Cargonia, supplying the station with the necessary tools for survival."
+
+/obj/item/clothing/cloak/cmo
+ name = "chief medical officer's cloak"
+ desc = "Worn by Meditopia, the valiant men and women keeping pestilence at bay. It's slightly shielded from contaminants."
+ icon_state = "cmocloak"
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 25, rad = 0)
+
+/obj/item/clothing/cloak/ce
+ name = "chief engineer's cloak"
+ desc = "Worn by Engitopia, wielders of an unlimited power. It's slightly shielded against radiation."
+ icon_state = "cecloak"
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 10)
+
+/obj/item/clothing/cloak/rd
+ name = "research director's cloak."
+ desc = "Worn by Sciencia, thaumaturges and researchers of the universe. It's slightly shielded from contaminants."
+ icon_state = "rdcloak"
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/cloak/cap
+ name = "captain's cloak"
+ desc = "Worm by the commander of Space Station 13."
+ icon_state = "capcloak"
+ armor = list(melee = 10, bullet = 10, laser = 10, energy = 10, bomb = 10, bio = 10, rad = 10)
+
+/* //wip
+/obj/item/clothing/cloak/wizard //Not actually obtainable until proper balancing can be done
+ name = "cloak of invisibility"
+ desc = "A tattered old thing that apparently gifts the wearer with near-invisibility."
+ armor = list(melee = 10, bullet = 10, laser = 10, energy = 10, bomb = 10, bio = 10, rad = 10)
+ action_button_name = "Flaunt Cloak"
+ var/invisible = 0
+
+/obj/item/clothing/cloak/wizard/ui_action_click()
+ toggleInvisibility(usr)
+ return
+
+/obj/item/clothing/cloak/wizard/proc/toggleInvisibility(mob/user)
+ if(user.slot_back != src)
+ user << "You need to be wearing the cloak first! "
+ return
+ user.visible_message("[user] flaunts [src]! ")
+ if(!invisible)
+ makeInvisible(user)
+ return
+ if(invisible)
+ breakInvisible(user)
+ return
+
+/obj/item/clothing/cloak/wizard/proc/makeInvisible(mob/user)
+ if(!invisible)
+ user.visible_message("[user] suddenly fades away! ", \
+ "You have become nearly invisible. This will require slow movement and will break upon taking damage. ")
+ flags |= NODROP //Cannot unequip while invisible
+ user.alpha = 10
+ slowdown = 2
+ invisible = 1
+
+/obj/item/clothing/cloak/wizard/proc/breakInvisible(mob/user)
+ if(invisible)
+ user.visible_message("[user] suddenly appears from thin air! ", \
+ "The enchantment has broken! You are visible again. ")
+ flags -= NODROP
+ user.alpha = 255
+ slowdown = 0
+ invisible = 0
+
+/obj/item/clothing/cloak/wizard/IsShield()
+ breakInvisible(src.loc)
+ return 0
+
+/obj/item/clothing/cloak/wizard/IsReflect()
+ breakInvisible(src.loc)
+ return 0
+*/
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index ae08ac4b5ce..b509c744000 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -234,7 +234,8 @@ BLIND // can't see anything
return 0
else
if(user)
- user.drop_item()
+ if(!user.drop_item())
+ return
hastie = I
I.loc = src
if(user && notifyAttach)
diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm
index e1d1e53e8b8..cf491f337dd 100644
--- a/code/modules/clothing/head/hardhat.dm
+++ b/code/modules/clothing/head/hardhat.dm
@@ -6,7 +6,7 @@
var/brightness_on = 4 //luminosity when on
var/on = 0
item_color = "yellow" //Determines used sprites: hardhat[on]_[item_color] and hardhat[on]_[item_color]2 (lying down sprite)
- armor = list(melee = 30, bullet = 5, laser = 20,energy = 10, bomb = 20, bio = 10, rad = 20)
+ armor = list(melee = 15, bullet = 5, laser = 20,energy = 10, bomb = 20, bio = 10, rad = 20)
flags_inv = 0
action_button_name = "Toggle Helmet Light"
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 16e472094d2..ef549cf4acb 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -4,7 +4,7 @@
icon_state = "helmet"
flags = HEADCOVERSEYES | HEADBANGPROTECT
item_state = "helmet"
- armor = list(melee = 50, bullet = 15, laser = 50,energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 25, bullet = 15, laser = 25,energy = 10, bomb = 25, bio = 0, rad = 0)
flags_inv = HIDEEARS|HIDEEYES
cold_protection = HEAD
min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT
@@ -39,7 +39,7 @@
desc = "A bulletproof combat helmet that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent."
icon_state = "helmetalt"
item_state = "helmetalt"
- armor = list(melee = 25, bullet = 80, laser = 10, energy = 10, bomb = 40, bio = 0, rad = 0)
+ armor = list(melee = 15, bullet = 40, laser = 10, energy = 10, bomb = 40, bio = 0, rad = 0)
/obj/item/clothing/head/helmet/riot
name = "riot helmet"
@@ -50,7 +50,7 @@
alt_toggle_message = "You push the visor up on"
can_toggle = 1
flags = HEADCOVERSEYES|HEADCOVERSMOUTH|HEADBANGPROTECT
- armor = list(melee = 82, bullet = 15, laser = 5,energy = 5, bomb = 5, bio = 2, rad = 0)
+ armor = list(melee = 41, bullet = 15, laser = 5,energy = 5, bomb = 5, bio = 2, rad = 0)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
strip_delay = 80
action_button_name = "Toggle Helmet Visor"
@@ -104,7 +104,7 @@
desc = "An extremely robust, space-worthy helmet with the Nanotrasen logo emblazoned on the top."
icon_state = "swat"
item_state = "swat"
- armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0)
+ armor = list(melee = 40, bullet = 30, laser = 25,energy = 25, bomb = 50, bio = 10, rad = 0)
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
heat_protection = HEAD
@@ -116,7 +116,7 @@
desc = "'Let the battle commence!' "
icon_state = "thunderdome"
item_state = "thunderdome"
- armor = list(melee = 80, bullet = 60, laser = 50,energy = 10, bomb = 25, bio = 10, rad = 0)
+ armor = list(melee = 40, bullet = 30, laser = 25,energy = 10, bomb = 25, bio = 10, rad = 0)
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
heat_protection = HEAD
@@ -152,7 +152,7 @@
icon_state = "redtaghelm"
flags = HEADCOVERSEYES
item_state = "redtaghelm"
- armor = list(melee = 30, bullet = 10, laser = 20,energy = 10, bomb = 20, bio = 0, rad = 0)
+ armor = list(melee = 15, bullet = 10, laser = 20,energy = 10, bomb = 20, bio = 0, rad = 0)
// Offer about the same protection as a hardhat.
flags_inv = HIDEEARS|HIDEEYES
@@ -162,7 +162,7 @@
icon_state = "bluetaghelm"
flags = HEADCOVERSEYES
item_state = "bluetaghelm"
- armor = list(melee = 30, bullet = 10, laser = 20,energy = 10, bomb = 20, bio = 0, rad = 0)
+ armor = list(melee = 15, bullet = 10, laser = 20,energy = 10, bomb = 20, bio = 0, rad = 0)
// Offer about the same protection as a hardhat.
flags_inv = HIDEEARS|HIDEEYES
@@ -196,7 +196,8 @@
var/obj/item/device/flashlight/seclite/S = A
if(can_flashlight)
if(!F)
- user.drop_item()
+ if(!user.unEquip(A))
+ return
user << "You click [S] into place on [src]. "
if(S.on)
SetLuminosity(0)
@@ -228,7 +229,8 @@
if(helmetCam)
user << "[src] already has a mounted camera. "
return
- user.drop_item()
+ if(!user.unEquip(A))
+ return
helmetCam = new /obj/machinery/camera/portable(src)
helmetCam.assembly = A
A.loc = helmetCam
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index 256138f8beb..d19c7b7397c 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -1,5 +1,5 @@
-//Bartender
+//Bartender //it's chef what the fuck is your problem?
/obj/item/clothing/head/chefhat
name = "chef's hat"
desc = "It's a hat used by chefs to keep hair out of your food. Judging by the food in the mess, they don't work."
@@ -9,6 +9,15 @@
strip_delay = 10
put_on_delay = 10
+/obj/item/clothing/head/chefhat/suicide_act(mob/user)
+ user.visible_message("[user] is donning [src]! It looks like they're trying to become a chef. ")
+ user.say("Bork Bork Bork!")
+ sleep(20)
+ user.visible_message("[user] climbs into an imaginary oven! ")
+ user.say("BOOORK!")
+ playsound(user, 'sound/machines/ding.ogg', 50, 1)
+ return(FIRELOSS)
+
//Captain
/obj/item/clothing/head/caphat
name = "captain's hat"
@@ -16,7 +25,7 @@
icon_state = "captain"
item_state = "that"
flags_inv = 0
- armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
strip_delay = 60
//Captain: This is no longer space-worthy
@@ -31,7 +40,7 @@
name = "head of personnel's cap"
icon_state = "hopcap"
desc = "The symbol of true bureaucratic micromanagement."
- armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
//Chaplain
/obj/item/clothing/head/nun_hood
@@ -44,7 +53,7 @@
name = "detective's fedora"
desc = "There's only one man who can sniff out the dirty stench of crime, and he's likely wearing this hat."
icon_state = "detective"
- armor = list(melee = 50, bullet = 5, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 25, bullet = 5, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
//Mime
/obj/item/clothing/head/beret
@@ -58,7 +67,7 @@
name = "head of security cap"
desc = "The robust standard-issue cap of the Head of Security. For showing the officers who's in charge."
icon_state = "hoscap"
- armor = list(melee = 80, bullet = 60, laser = 50, energy = 10, bomb = 25, bio = 10, rad = 0)
+ armor = list(melee = 40, bullet = 30, laser = 25, energy = 10, bomb = 25, bio = 10, rad = 0)
strip_delay = 80
/obj/item/clothing/head/HoS/beret
@@ -70,7 +79,7 @@
name = "warden's police hat"
desc = "It's a special armored hat issued to the Warden of a security force. Protects the head from impacts."
icon_state = "policehelm"
- armor = list(melee = 60, bullet = 5, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 5, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
strip_delay = 60
/obj/item/clothing/head/beret/sec
@@ -89,7 +98,7 @@
name = "warden's beret"
desc = "A special beret with the Warden's insignia emblazoned on it. For wardens with class."
icon_state = "wardenberet"
- armor = list(melee = 60, bullet = 5, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 5, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
strip_delay = 60
/obj/item/clothing/head/beret/sec/navyofficer
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 266bfda4689..7130556f958 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -6,7 +6,7 @@
desc = "It's good to be emperor."
item_state = "that"
flags_inv = 0
- armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0)
strip_delay = 80
/obj/item/clothing/head/powdered_wig
@@ -172,6 +172,16 @@
item_state = "fedora"
desc = "A really cool hat if you're a mobster. A really lame hat if you're not."
+/obj/item/clothing/head/fedora/suicide_act(mob/user)
+ if(user.gender == FEMALE)
+ return 0
+ var/mob/living/carbon/human/H = user
+ user.visible_message("[user] is donning [src]! It looks like they're trying to be nice to girls. ")
+ user.say("M'lady.")
+ sleep(10)
+ H.facial_hair_style = "Neckbeard"
+ return(BRUTELOSS)
+
/obj/item/clothing/head/sombrero
name = "sombrero"
icon_state = "sombrero"
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 3675ba81ded..1a0a0a4f98c 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -1,5 +1,12 @@
/obj/item/clothing/shoes/proc/step_action() //this was made to rewrite clown shoes squeaking
+/obj/item/clothing/shoes/suicide_act(mob/user)
+ user.visible_message("[user] is bashing their own head in with [src]! Ain't that a kick in the head? ")
+ for(var/i = 0, i < 3, i++)
+ sleep(3)
+ playsound(user, 'sound/weapons/genhit2.ogg', 50, 1)
+ return(BRUTELOSS)
+
/obj/item/clothing/shoes/sneakers/syndigaloshes
desc = "A pair of brown shoes."
name = "brown shoes"
@@ -19,7 +26,7 @@
desc = "High speed, low drag combat boots."
icon_state = "jackboots"
item_state = "jackboots"
- armor = list(melee = 50, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 10, rad = 0)
+ armor = list(melee = 25, bullet = 25, laser = 25, energy = 25, bomb = 50, bio = 10, rad = 0)
strip_delay = 70
/obj/item/clothing/shoes/combat/swat //overpowered boots for death squads
@@ -27,7 +34,7 @@
desc = "High speed, no drag combat boots."
permeability_coefficient = 0.01
flags = NOSLIP
- armor = list(melee = 80, bullet = 60, laser = 50, energy = 50, bomb = 50, bio = 30, rad = 30)
+ armor = list(melee = 40, bullet = 30, laser = 25, energy = 25, bomb = 50, bio = 30, rad = 30)
/obj/item/clothing/shoes/sandal
desc = "A pair of rather plain, wooden sandals."
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index e8746d637c6..4c0d46b7c43 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -135,7 +135,7 @@
icon_state = "hardsuit0-mining"
item_state = "mining_helm"
item_color = "mining"
- armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
+ armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
brightness_on = 7
@@ -144,7 +144,7 @@
name = "mining hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has reinforced plating for wildlife encounters."
item_state = "mining_hardsuit"
- armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
+ armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals,/obj/item/weapon/storage/bag/ore,/obj/item/weapon/pickaxe)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/mining
@@ -158,7 +158,7 @@
icon_state = "hardsuit1-syndi"
item_state = "syndie_helm"
item_color = "syndi"
- armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
+ armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
on = 0
var/obj/item/clothing/suit/space/hardsuit/syndi/linkedsuit = null
action_button_name = "Toggle Helmet Mode"
@@ -229,7 +229,7 @@
slowdown = 1
w_class = 3
action_button_name = "Toggle Helmet"
- armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
+ armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index cf8a9d9e5a6..9fedcc0e3a8 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -6,7 +6,7 @@
desc = "A special helmet designed for only the most fashionable of military figureheads."
flags_inv = HIDEFACE
permeability_coefficient = 0.01
- armor = list(melee = 65, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50)
+ armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50)
/obj/item/clothing/suit/space/captain
name = "captain's space suit"
@@ -16,7 +16,7 @@
w_class = 4
allowed = list(/obj/item/weapon/tank/internals, /obj/item/device/flashlight,/obj/item/weapon/gun/energy, /obj/item/weapon/gun/projectile, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs)
slowdown = 1
- armor = list(melee = 65, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50)
+ armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50)
//Death squad armored space suits, not hardsuits!
@@ -25,7 +25,7 @@
desc = "That's not red paint. That's real blood."
icon_state = "deathsquad"
item_state = "deathsquad"
- armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100)
+ armor = list(melee = 50, bullet = 40, laser = 30, energy = 50, bomb = 50, bio = 100, rad = 100)
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
unacidable = 1
@@ -40,7 +40,7 @@
icon_state = "deathsquad"
item_state = "swat_suit"
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
- armor = list(melee = 80, bullet = 80, laser = 50,energy = 50, bomb = 100, bio = 100, rad = 100)
+ armor = list(melee = 50, bullet = 40, laser = 30,energy = 50, bomb = 50, bio = 100, rad = 100)
slowdown = 1
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
@@ -53,7 +53,7 @@
icon_state = "beret_badge"
flags = STOPSPRESSUREDMAGE
flags_inv = 0
- armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100)
+ armor = list(melee = 50, bullet = 40, laser = 30, energy = 50, bomb = 50, bio = 100, rad = 100)
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
unacidable = 1
@@ -68,7 +68,7 @@
flags_inv = 0
w_class = 3
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
- armor = list(melee = 80, bullet = 80, laser = 50,energy = 50, bomb = 100, bio = 100, rad = 100)
+ armor = list(melee = 50, bullet = 40, laser = 30,energy = 50, bomb = 50, bio = 100, rad = 100)
slowdown = 1
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
@@ -114,7 +114,7 @@
desc = "Yarr."
icon_state = "pirate"
item_state = "pirate"
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
+ armor = list(melee = 30, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
flags = HEADCOVERSEYES | BLOCKHAIR | STOPSPRESSUREDMAGE
strip_delay = 40
put_on_delay = 20
@@ -128,7 +128,7 @@
flags_inv = 0
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
slowdown = 0
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
+ armor = list(melee = 30, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
strip_delay = 40
put_on_delay = 20
@@ -151,7 +151,7 @@
item_state = "ert_command"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
- armor = list(melee = 65, bullet = 50, laser = 50, energy = 50, bomb = 50, bio = 100, rad = 100)
+ armor = list(melee = 30, bullet = 50, laser = 30, energy = 50, bomb = 50, bio = 100, rad = 100)
slowdown = 0
strip_delay = 130
@@ -216,7 +216,7 @@
desc = "An advanced, space-proof helmet. It appears to be modeled after an old-world eagle."
icon_state = "griffinhat"
item_state = "griffinhat"
- armor = list(melee = 40, bullet = 40, laser = 30, energy = 25, bomb = 100, bio = 100, rad = 100)
+ armor = list(melee = 20, bullet = 40, laser = 30, energy = 25, bomb = 100, bio = 100, rad = 100)
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
unacidable = 1
@@ -227,7 +227,7 @@
icon_state = "freedom"
item_state = "freedom"
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
- armor = list(melee = 40, bullet = 40, laser = 30,energy = 25, bomb = 100, bio = 100, rad = 100)
+ armor = list(melee = 20, bullet = 40, laser = 30,energy = 25, bomb = 100, bio = 100, rad = 100)
slowdown = 1
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
diff --git a/code/modules/clothing/spacesuits/syndi.dm b/code/modules/clothing/spacesuits/syndi.dm
index 4f96b191df6..71f7a5d98ae 100644
--- a/code/modules/clothing/spacesuits/syndi.dm
+++ b/code/modules/clothing/spacesuits/syndi.dm
@@ -5,7 +5,7 @@
icon_state = "syndicate"
item_state = "syndicate"
desc = "Has a tag: Totally not property of an enemy corporation, honest."
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
+ armor = list(melee = 40, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
/obj/item/clothing/suit/space/syndicate
name = "red space suit"
@@ -15,7 +15,7 @@
w_class = 3
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
slowdown = 1
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
+ armor = list(melee = 40, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
//Green syndicate space suit
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index d65ea343015..7c350b46264 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -14,7 +14,7 @@
icon_state = "armor"
item_state = "armor"
blood_overlay_type = "armor"
- armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
/obj/item/clothing/suit/armor/hos
name = "armored greatcoat"
@@ -22,7 +22,7 @@
icon_state = "hos"
item_state = "greatcoat"
body_parts_covered = CHEST|GROIN|ARMS|LEGS
- armor = list(melee = 65, bullet = 30, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0)
flags_inv = HIDEJUMPSUIT
cold_protection = CHEST|GROIN|LEGS|ARMS
heat_protection = CHEST|GROIN|LEGS|ARMS
@@ -57,7 +57,7 @@
icon_state = "capcarapace"
item_state = "armor"
body_parts_covered = CHEST|GROIN
- armor = list(melee = 50, bullet = 30, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 50, bullet = 40, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
/obj/item/clothing/suit/armor/riot
@@ -65,11 +65,10 @@
desc = "A suit of armor with heavy padding to protect against melee attacks. Looks like it might impair movement."
icon_state = "riot"
item_state = "swat_suit"
- slowdown = 1
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- armor = list(melee = 80, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
flags_inv = HIDEJUMPSUIT
strip_delay = 80
put_on_delay = 60
@@ -80,7 +79,7 @@
icon_state = "bulletproof"
item_state = "armor"
blood_overlay_type = "armor"
- armor = list(melee = 25, bullet = 80, laser = 10, energy = 10, bomb = 40, bio = 0, rad = 0)
+ armor = list(melee = 15, bullet = 80, laser = 10, energy = 10, bomb = 40, bio = 0, rad = 0)
strip_delay = 70
put_on_delay = 50
@@ -90,7 +89,7 @@
icon_state = "armor_reflec"
item_state = "armor_reflec"
blood_overlay_type = "armor"
- armor = list(melee = 10, bullet = 10, laser = 80, energy = 50, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 10, bullet = 10, laser = 60, energy = 50, bomb = 0, bio = 0, rad = 0)
var/hit_reflect_chance = 40
/obj/item/clothing/suit/armor/laserproof/IsReflect(var/def_zone)
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index dbb82e319f8..7bad9b13400 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -82,7 +82,7 @@
blood_overlay_type = "coat"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
allowed = list(/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder)
- armor = list(melee = 50, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 25, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
cold_protection = CHEST|GROIN|LEGS|ARMS
heat_protection = CHEST|GROIN|LEGS|ARMS
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 91098d07f84..37b771b0c15 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -271,13 +271,13 @@
/obj/item/clothing/suit/hooded/wintercoat/captain
name = "captain's winter coat"
icon_state = "coatcaptain"
- armor = list(melee = 50, bullet = 30, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 25, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0)
allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite,/obj/item/weapon/melee/classic_baton/telescopic)
/obj/item/clothing/suit/hooded/wintercoat/security
name = "security winter coat"
icon_state = "coatsecurity"
- armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 25, bullet = 15, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0)
allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite,/obj/item/weapon/melee/classic_baton/telescopic)
/obj/item/clothing/suit/hooded/wintercoat/medical
diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm
index 89a5f7bc936..c32db545664 100644
--- a/code/modules/clothing/suits/utility.dm
+++ b/code/modules/clothing/suits/utility.dm
@@ -56,7 +56,7 @@
desc = "Use in case of bomb."
icon_state = "bombsuit"
flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR|THICKMATERIAL
- armor = list(melee = 40, bullet = 0, laser = 20,energy = 10, bomb = 100, bio = 0, rad = 0)
+ armor = list(melee = 20, bullet = 0, laser = 20,energy = 10, bomb = 100, bio = 0, rad = 0)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
cold_protection = HEAD
min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT
@@ -77,7 +77,7 @@
flags = THICKMATERIAL
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
slowdown = 2
- armor = list(melee = 40, bullet = 0, laser = 20,energy = 10, bomb = 100, bio = 0, rad = 0)
+ armor = list(melee = 20, bullet = 0, laser = 20,energy = 10, bomb = 100, bio = 0, rad = 0)
flags_inv = HIDEJUMPSUIT
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
diff --git a/code/modules/events/wizard/race.dm b/code/modules/events/wizard/race.dm
index 4eb0c5bf1a7..bed5d08b5f4 100644
--- a/code/modules/events/wizard/race.dm
+++ b/code/modules/events/wizard/race.dm
@@ -10,9 +10,10 @@
var/all_the_same = 0
var/all_species = list()
- for(var/datum/species/S in typesof(/datum/species) - /datum/species)
+ for(var/speciestype in typesof(/datum/species) - /datum/species)
+ var/datum/species/S = new speciestype()
if(!S.dangerous_existence)
- all_species += S
+ all_species += speciestype
var/new_species = pick(all_species)
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index e3aa865a141..388da344db4 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -22,184 +22,346 @@ Gunshots/explosions/opening doors/less rare audio (done)
/mob/living/carbon/proc/handle_hallucinations()
if(handling_hal)
return
+
+ //Least obvious
+ var/list/minor = list("sounds"=20,"bolts_minor"=10,"whispers"=15,"message"=5)
+ //Something's wrong here
+ var/list/medium = list("hudscrew"=15,"items"=15,"dangerflash"=15,"bolts"=10,"flood"=10,"husks"=10,"battle"=10)
+ //AAAAH
+ var/list/major = list("fake"=10,"death"=5,"xeno"=10,"singulo"=10,"delusion"=10)
+
+ var/grade = 0
+ var/current = list()
+ var/trip_length = 0
+
handling_hal = 1
while(hallucination > 20)
sleep(rand(200,500)/(hallucination/25))
- var/halpick = rand(1,100)
- switch(halpick)
- if(0 to 15)
- //Screwy HUD
- //src << "Screwy HUD"
- hal_screwyhud = pick(1,2,3,3,4,4)
- spawn(rand(100,250))
- hal_screwyhud = 0
- if(16 to 25)
- //Strange items
- //src << "Traitor Items"
- if(!halitem)
- halitem = new
- var/list/slots_free = list(ui_lhand,ui_rhand)
- if(l_hand) slots_free -= ui_lhand
- if(r_hand) slots_free -= ui_rhand
- if(istype(src,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = src
- if(!H.belt) slots_free += ui_belt
- if(!H.l_store) slots_free += ui_storage1
- if(!H.r_store) slots_free += ui_storage2
- if(slots_free.len)
- halitem.screen_loc = pick(slots_free)
- halitem.layer = 50
- switch(rand(1,6))
- if(1) //revolver
- halitem.icon = 'icons/obj/guns/projectile.dmi'
- halitem.icon_state = "revolver"
- halitem.name = "Revolver"
- if(2) //c4
- halitem.icon = 'icons/obj/assemblies.dmi'
- halitem.icon_state = "plastic-explosive0"
- halitem.name = "Mysterious Package"
- if(prob(25))
- halitem.icon_state = "c4small_1"
- if(3) //sword
- halitem.icon = 'icons/obj/weapons.dmi'
- halitem.icon_state = "sword1"
- halitem.name = "Sword"
- if(4) //stun baton
- halitem.icon = 'icons/obj/weapons.dmi'
- halitem.icon_state = "stunbaton"
- halitem.name = "Stun Baton"
- if(5) //emag
- halitem.icon = 'icons/obj/card.dmi'
- halitem.icon_state = "emag"
- halitem.name = "Cryptographic Sequencer"
- if(6) //flashbang
- halitem.icon = 'icons/obj/grenade.dmi'
- halitem.icon_state = "flashbang1"
- halitem.name = "Flashbang"
- if(client) client.screen += halitem
- spawn(rand(100,250))
- qdel(halitem)
- if(26 to 40)
- //Flashes of danger
- //src << "Danger Flash"
- if(!halimage)
- var/list/possible_points = list()
- for(var/turf/simulated/floor/F in view(src,world.view))
- possible_points += F
- if(possible_points.len)
- var/turf/simulated/floor/target = pick(possible_points)
+ trip_length += 1
+ if(prob(min(20,trip_length*2)))
+ grade = min(3,grade+1)
+ if(prob(20))
+ continue
+ current = list()
+ for(var/a in minor)
+ current[a] = minor[a] * (grade==0?2:1)
+ for(var/b in medium)
+ current[b] = medium[b] * (grade==1?2:1)
+ for(var/c in major)
+ current[c] = major[c] * (grade==2?2:1)
- switch(rand(1,3))
- if(1)
- //src << "Space"
- halimage = image('icons/turf/space.dmi',target,"[rand(1,25)]",TURF_LAYER)
- if(2)
- //src << "Fire"
- halimage = image('icons/effects/fire.dmi',target,"1",TURF_LAYER)
- if(3)
- //src << "C4"
- halimage = image('icons/obj/assemblies.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01)
+ var/halpick = pickweight(current)
-
- if(client) client.images += halimage
- spawn(rand(10,50)) //Only seen for a brief moment.
- if(client) client.images -= halimage
- halimage = null
-
-
- if(41 to 65)
- //Strange audio
- //src << "Strange Audio"
- switch(rand(1,14))
- if(1) src << 'sound/machines/airlock.ogg'
- if(2)
- if(prob(50))src << 'sound/effects/Explosion1.ogg'
- else src << 'sound/effects/Explosion2.ogg'
- if(3) src << 'sound/effects/explosionfar.ogg'
- if(4) src << 'sound/effects/Glassbr1.ogg'
- if(5) src << 'sound/effects/Glassbr2.ogg'
- if(6) src << 'sound/effects/Glassbr3.ogg'
- if(7) src << 'sound/machines/twobeep.ogg'
- if(8) src << 'sound/machines/windowdoor.ogg'
- if(9)
- //To make it more realistic, I added two gunshots (enough to kill)
- src << 'sound/weapons/Gunshot.ogg'
- spawn(rand(10,30))
- src << 'sound/weapons/Gunshot.ogg'
- if(10) src << 'sound/weapons/smash.ogg'
- if(11)
- //Same as above, but with tasers.
- src << 'sound/weapons/Taser.ogg'
- spawn(rand(10,30))
- src << 'sound/weapons/Taser.ogg'
- //Rare audio
- if(12)
-//These sounds are (mostly) taken from Hidden: Source
- var/list/creepyasssounds = list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/Heart Beat.ogg', 'sound/effects/screech.ogg',\
- 'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\
- 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\
- 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\
- 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg')
- src << pick(creepyasssounds)
- if(13)
- src << "You feel a tiny prick! "
- if(14)
- src << "Priority Announcement "
- src << "The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle. "
- src << sound('sound/AI/shuttledock.ogg')
- if(66 to 70)
- //Flashes of danger
- if(!halbody)
- var/list/possible_points = list()
- for(var/turf/simulated/floor/F in view(src,world.view))
- possible_points += F
- if(possible_points.len)
- var/turf/simulated/floor/target = pick(possible_points)
- switch(rand(1,4))
- if(1)
- halbody = image('icons/mob/human.dmi',target,"husk_l",TURF_LAYER)
- if(2,3)
- halbody = image('icons/mob/human.dmi',target,"husk_s",TURF_LAYER)
- if(4)
- halbody = image('icons/mob/alien.dmi',target,"alienother",TURF_LAYER)
-
- if(client) client.images += halbody
- spawn(rand(50,80)) //Only seen for a brief moment.
- if(client) client.images -= halbody
- halbody = null
- if(71 to 72)
- //Fake death
- src.sleeping = 20
- hal_crit = 1
- hal_screwyhud = 1
- spawn(rand(50,100))
- src.sleeping = 0
- hal_crit = 0
- hal_screwyhud = 0
- if(73 to 75)
- fake_attack()
+ hallucinate(halpick)
handling_hal = 0
+/obj/effect/hallucination
+ invisibility = INVISIBILITY_OBSERVER
+ var/mob/living/carbon/target = null
-/mob/living/carbon/proc/fake_attack()
-// var/list/possible_clones = new/list()
+/obj/effect/hallucination/simple
+ var/image_icon = 'icons/mob/alien.dmi'
+ var/image_state = "alienh_pounce"
+ var/px = 0
+ var/py = 0
+ var/col_mod = null
+ var/image/current_image = null
+ var/image_layer = MOB_LAYER
+ var/active = 1 //qdelery
+
+/obj/effect/hallucination/simple/New(loc,var/mob/living/carbon/T)
+ target = T
+ current_image = GetImage()
+ if(target.client) target.client.images |= current_image
+ return
+
+/obj/effect/hallucination/simple/proc/GetImage()
+ var/image/I = image(image_icon,loc,image_state,image_layer,dir=src.dir)
+ I.pixel_x = px
+ I.pixel_y = py
+ if(col_mod)
+ I.color = col_mod
+ return I
+
+/obj/effect/hallucination/simple/proc/Show(var/update=1)
+ if(active)
+ if(target.client) target.client.images.Remove(current_image)
+ if(update)
+ current_image = GetImage()
+ if(target.client) target.client.images |= current_image
+
+/obj/effect/hallucination/simple/update_icon(var/new_state,var/new_icon,var/new_px=0,var/new_py=0)
+ image_state = new_state
+ if(new_icon)
+ image_icon = new_icon
+ else
+ image_icon = initial(image_icon)
+ px = new_px
+ py = new_py
+ Show()
+
+/obj/effect/hallucination/simple/Moved(atom/OldLoc, Dir)
+ Show()
+ return
+
+/obj/effect/hallucination/simple/Destroy()
+ if(target.client) target.client.images.Remove(current_image)
+ active = 0
+
+#define FAKE_FLOOD_EXPAND_TIME 30
+#define FAKE_FLOOD_MAX_RADIUS 7
+
+/obj/effect/hallucination/fake_flood
+ //Plasma/N2O starts flooding from the nearby vent
+ var/list/flood_images = list()
+ var/list/turf/flood_turfs = list()
+ var/image_icon = 'icons/effects/tile_effects.dmi'
+ var/image_state = "plasma"
+ var/radius = 0
+ var/next_expand = 0
+
+/obj/effect/hallucination/fake_flood/New(loc,var/mob/living/carbon/T)
+ ..()
+ target = T
+ for(var/obj/machinery/atmospherics/unary/vent_pump/U in orange(7,target))
+ if(!U.welded)
+ src.loc = U.loc
+ break
+ image_state = pick("plasma","sleeping_agent")
+ flood_images += image(image_icon,src,image_state,MOB_LAYER)
+ flood_turfs += get_turf(src.loc)
+ if(target.client) target.client.images |= flood_images
+ next_expand = world.time + FAKE_FLOOD_EXPAND_TIME
+ SSobj.processing |= src
+
+/obj/effect/hallucination/fake_flood/process()
+ if(next_expand <= world.time)
+ radius++
+ if(radius > FAKE_FLOOD_MAX_RADIUS)
+ qdel(src)
+ Expand()
+ next_expand = world.time + FAKE_FLOOD_EXPAND_TIME
+ return
+
+/obj/effect/hallucination/fake_flood/proc/Expand()
+ if(!flood_turfs) //for qdel
+ return
+ for(var/turf/T in circlerangeturfs(loc,radius))
+ if((T in flood_turfs)|| T.blocks_air)
+ continue
+ flood_images += image(image_icon,T,image_state,MOB_LAYER)
+ flood_turfs += T
+ if(target.client) target.client.images |= flood_images
+ return
+
+/obj/effect/hallucination/fake_flood/Destroy()
+ SSobj.processing.Remove(src)
+ del(flood_turfs)
+ if(target.client) target.client.images.Remove(flood_images)
+ target = null
+ del(flood_images)
+ return
+
+/obj/effect/hallucination/simple/xeno
+ image_icon = 'icons/mob/alien.dmi'
+ image_state = "alienh_pounce"
+
+/obj/effect/hallucination/simple/xeno/New(loc,var/mob/living/carbon/T)
+ ..()
+ name = "alien hunter ([rand(1, 1000)])"
+ return
+
+/obj/effect/hallucination/simple/xeno/throw_at(atom/target, range, speed) // TODO : Make diagonal trhow into proc/property
+ if(!target || !src || (flags & NODROP)) return 0
+
+ src.throwing = 1
+
+ var/dist_x = abs(target.x - src.x)
+ var/dist_y = abs(target.y - src.y)
+ var/dist_travelled = 0
+ var/dist_since_sleep = 0
+
+ var/tdist_x = dist_x;
+ var/tdist_y = dist_y;
+
+ if(dist_x <= dist_y)
+ tdist_x = dist_y;
+ tdist_y = dist_x;
+
+ var/error = tdist_x/2 - tdist_y
+ while(target && (((((dist_x > dist_y) && ((src.x < target.x) || (src.x > target.x))) || ((dist_x <= dist_y) && ((src.y < target.y) || (src.y > target.y))) || (src.x > target.x)) && dist_travelled < range) || !has_gravity(src)))
+
+ if(!src.throwing) break
+ if(!istype(src.loc, /turf)) break
+
+ var/atom/step = get_step(src, get_dir(src,target))
+ if(!step)
+ break
+ src.Move(step, get_dir(src, step))
+ hit_check()
+ error += (error < 0) ? tdist_x : -tdist_y;
+ dist_travelled++
+ dist_since_sleep++
+ if(dist_since_sleep >= speed)
+ dist_since_sleep = 0
+ sleep(1)
+
+
+ src.throwing = 0
+ src.throw_impact(get_turf(src))
+
+ return 1
+
+/obj/effect/hallucination/simple/xeno/throw_impact(A)
+ update_icon("alienh_pounce")
+ if(A == target)
+ target.Weaken(5)
+ target.visible_message("[target] flails around wildly. ","[name] pounces on you! ")
+
+/obj/effect/hallucination/xeno_attack
+ //Xeno crawls from nearby vent,jumps at you, and goes back in
+ var/obj/machinery/atmospherics/unary/vent_pump/pump = null
+ var/obj/effect/hallucination/simple/xeno/xeno = null
+
+/obj/effect/hallucination/xeno_attack/New(loc,var/mob/living/carbon/T)
+ target = T
+ for(var/obj/machinery/atmospherics/unary/vent_pump/U in orange(7,target))
+ if(!U.welded)
+ pump = U
+ break
+ xeno = new(pump.loc,target)
+ sleep(10)
+ xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32)
+ xeno.throw_at(target,7,1)
+ sleep(10)
+ xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32)
+ xeno.throw_at(pump,7,1)
+ sleep(10)
+ var/xeno_name = xeno.name
+ target << "[xeno_name] begins climbing into the ventilation system... "
+ sleep(10)
+ qdel(xeno)
+ target << "[xeno_name] scrambles into the ventilation ducts! "
+ qdel(src)
+
+/obj/effect/hallucination/singularity_scare
+ //Singularity moving towards you.
+ //todo Hide where it moved with fake space images
+ var/obj/effect/hallucination/simple/singularity/s = null
+
+/obj/effect/hallucination/singularity_scare/New(loc,var/mob/living/carbon/T)
+ target = T
+ var/turf/start = T.loc
+ var/screen_border = pick(SOUTH,EAST,WEST,NORTH)
+ for(var/i = 0,i<11,i++)
+ start = get_step(start,screen_border)
+ s = new(start,target)
+ for(var/i = 0,i<11,i++)
+ sleep(5)
+ s.loc = get_step(get_turf(s),get_dir(s,target))
+ s.Show()
+ s.Eat()
+ qdel(s)
+
+/obj/effect/hallucination/simple/singularity
+ image_icon = 'icons/effects/224x224.dmi'
+ image_state = "singularity_s7"
+ image_layer = 6
+ px = -96
+ py = -96
+
+/obj/effect/hallucination/simple/singularity/proc/Eat(atom/OldLoc, Dir)
+ var/target_dist = get_dist(src,target)
+ if(target_dist<=3) //"Eaten"
+ target.sleeping = 20
+ target.hal_crit = 1
+ target.hal_screwyhud = 1
+ spawn(rand(50,100))
+ target.sleeping = 0
+ target.hal_crit = 0
+ target.hal_screwyhud = 0
+
+/obj/effect/hallucination/battle
+
+/obj/effect/hallucination/battle/New(loc,var/mob/living/carbon/T)
+ target = T
+ var/hits = rand(3,6)
+ switch(rand(1,5))
+ if(1) //Laser fight
+ for(var/i=0,i[my_target] has attacked [src]!")
src.health -= P.force
-
-
return
/obj/effect/fake_attacker/Crossed(var/mob/M, somenumber)
@@ -266,20 +425,18 @@ Gunshots/explosions/opening doors/less rare audio (done)
for(var/mob/O in oviewers(world.view , my_target))
O << "[my_target] stumbles around. "
-/obj/effect/fake_attacker/New()
+/obj/effect/fake_attacker/New(loc,var/mob/living/carbon/T)
..()
+ my_target = T
spawn(300)
- if(my_target)
- my_target.hallucinations -= src
qdel(src)
step_away(src,my_target,2)
- spawn attack_loop()
+ spawn(0)
+ attack_loop()
/obj/effect/fake_attacker/proc/updateimage()
// del src.currentimage
-
-
if(src.dir == NORTH)
del src.currentimage
src.currentimage = new /image(up,src)
@@ -356,3 +513,251 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
/obj/item/clothing/under/rank/captain, /obj/item/device/aicard,\
/obj/item/clothing/shoes/magboots, /obj/item/areaeditor/blueprints, /obj/item/weapon/disk/nuclear,\
/obj/item/clothing/suit/space/nasavoid, /obj/item/weapon/tank)
+
+/obj/effect/hallucination/bolts
+ var/list/doors = list()
+
+/obj/effect/hallucination/bolts/New(loc,var/mob/living/carbon/T,var/door_number=-1) //-1 for sever 1-2 for subtle
+ target = T
+ var/image/I = null
+ var/count = 0
+ for(var/obj/machinery/door/airlock/A in range(target,7))
+ if(count>door_number && door_number>0)
+ break
+ count++
+ I = image(A.icon,A,"door_locked",layer=A.layer+0.1)
+ doors += I
+ if(target.client)
+ target.client.images |= I
+ sleep(2)
+ sleep(100)
+ for(var/image/B in doors)
+ if(target.client)
+ target.client.images.Remove(B)
+ qdel(src)
+
+/obj/effect/hallucination/whispers
+
+/obj/effect/hallucination/whispers/New(loc,var/mob/living/carbon/T)
+ target = T
+ var/speak_messages = list("I'm watching you...","[target.name]!","Go away!","Kchck-Chkck? Kchchck!","Did you hear that?","What did you do ?","Why?","Give me that!","Honk!","HELP!!")
+ var/radio_messages = list("Xenos!","Singularity loose!","They are arming the nuke!","They butchered Ian!","H-help!","[pick(teleportlocs)]!!","Where's [target.name]?","Call the shuttle!")
+
+ var/list/mob/living/carbon/people = list()
+ var/list/mob/living/carbon/person = null
+ for(var/mob/living/carbon/H in view(target))
+ if(H == target)
+ continue
+ if(!person)
+ person = H
+ else
+ if(get_dist(target,H)The light burns you!", \
+ "You don't feel like yourself. ", \
+ "Unknown has punched [target]! ", \
+ "You hear something squeezing through the ducts... ", \
+ "You hear a distant scream. ", \
+ "You feel invincible, nothing can hurt you! ", \
+ "[target] sneezes.", \
+ "You feel faint. ", \
+ "You hear a strange, alien voice in your head... [pick("Hiss","Ssss")]", \
+ "You can see...everything! ")
+ target << chosen
+ qdel(src)
+
+/mob/living/carbon/proc/hallucinate(var/hal_type) // Todo -> proc / defines
+ switch(hal_type)
+ if("xeno")
+ new /obj/effect/hallucination/xeno_attack(src.loc,src)
+ if("singulo")
+ new /obj/effect/hallucination/singularity_scare(src.loc,src)
+ if("battle")
+ new /obj/effect/hallucination/battle(src.loc,src)
+ if("flood")
+ new /obj/effect/hallucination/fake_flood(src.loc,src)
+ if("delusion")
+ new /obj/effect/hallucination/delusion(src.loc,src)
+ if("fake")
+ new /obj/effect/hallucination/fakeattacker(src.loc,src)
+ if("bolts")
+ new /obj/effect/hallucination/bolts(src.loc,src)
+ if("bolts_minor")
+ new /obj/effect/hallucination/bolts(src.loc,src,rand(1,2))
+ if("whispers")
+ new /obj/effect/hallucination/whispers(src.loc,src)
+ if("message")
+ new /obj/effect/hallucination/message(src.loc,src)
+ if("sounds")
+ //Strange audio
+ //src << "Strange Audio"
+ switch(rand(1,18))
+ if(1) src << 'sound/machines/airlock.ogg'
+ if(2)
+ if(prob(50))src << 'sound/effects/Explosion1.ogg'
+ else src << 'sound/effects/Explosion2.ogg'
+ if(3) src << 'sound/effects/explosionfar.ogg'
+ if(4) src << 'sound/effects/Glassbr1.ogg'
+ if(5) src << 'sound/effects/Glassbr2.ogg'
+ if(6) src << 'sound/effects/Glassbr3.ogg'
+ if(7) src << 'sound/machines/twobeep.ogg'
+ if(8) src << 'sound/machines/windowdoor.ogg'
+ if(9)
+ //To make it more realistic, I added two gunshots (enough to kill)
+ src << 'sound/weapons/Gunshot.ogg'
+ spawn(rand(10,30))
+ src << 'sound/weapons/Gunshot.ogg'
+ if(10) src << 'sound/weapons/smash.ogg'
+ if(11)
+ //Same as above, but with tasers.
+ src << 'sound/weapons/Taser.ogg'
+ spawn(rand(10,30))
+ src << 'sound/weapons/Taser.ogg'
+ //Rare audio
+ if(12)
+ //These sounds are (mostly) taken from Hidden: Source
+ var/list/creepyasssounds = list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/Heart Beat.ogg', 'sound/effects/screech.ogg',\
+ 'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\
+ 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\
+ 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\
+ 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg')
+ src << pick(creepyasssounds)
+ if(13)
+ src << "You feel a tiny prick! "
+ if(14)
+ src << "Priority Announcement "
+ src << "The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle. "
+ src << sound('sound/AI/shuttledock.ogg')
+ if(15)
+ src << 'sound/items/Welder.ogg'
+ if(16)
+ src << 'sound/items/Screwdriver.ogg'
+ if(17)
+ src << 'sound/weapons/saberon.ogg'
+ if(18)
+ src << 'sound/weapons/saberoff.ogg'
+ if("hudscrew")
+ //Screwy HUD
+ //src << "Screwy HUD"
+ hal_screwyhud = pick(1,2,3,3,4,4)
+ spawn(rand(100,250))
+ hal_screwyhud = 0
+ if("items")
+ //Strange items
+ //src << "Traitor Items"
+ if(!halitem)
+ halitem = new
+ var/list/slots_free = list(ui_lhand,ui_rhand)
+ if(l_hand) slots_free -= ui_lhand
+ if(r_hand) slots_free -= ui_rhand
+ if(istype(src,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = src
+ if(!H.belt) slots_free += ui_belt
+ if(!H.l_store) slots_free += ui_storage1
+ if(!H.r_store) slots_free += ui_storage2
+ if(slots_free.len)
+ halitem.screen_loc = pick(slots_free)
+ halitem.layer = 50
+ switch(rand(1,6))
+ if(1) //revolver
+ halitem.icon = 'icons/obj/guns/projectile.dmi'
+ halitem.icon_state = "revolver"
+ halitem.name = "Revolver"
+ if(2) //c4
+ halitem.icon = 'icons/obj/assemblies.dmi'
+ halitem.icon_state = "plastic-explosive0"
+ halitem.name = "Mysterious Package"
+ if(prob(25))
+ halitem.icon_state = "c4small_1"
+ if(3) //sword
+ halitem.icon = 'icons/obj/weapons.dmi'
+ halitem.icon_state = "sword1"
+ halitem.name = "Sword"
+ if(4) //stun baton
+ halitem.icon = 'icons/obj/weapons.dmi'
+ halitem.icon_state = "stunbaton"
+ halitem.name = "Stun Baton"
+ if(5) //emag
+ halitem.icon = 'icons/obj/card.dmi'
+ halitem.icon_state = "emag"
+ halitem.name = "Cryptographic Sequencer"
+ if(6) //flashbang
+ halitem.icon = 'icons/obj/grenade.dmi'
+ halitem.icon_state = "flashbang1"
+ halitem.name = "Flashbang"
+ if(client) client.screen += halitem
+ spawn(rand(100,250))
+ qdel(halitem)
+ if("dangerflash")
+ //Flashes of danger
+ //src << "Danger Flash"
+ if(!halimage)
+ var/list/possible_points = list()
+ for(var/turf/simulated/floor/F in view(src,world.view))
+ possible_points += F
+ if(possible_points.len)
+ var/turf/simulated/floor/target = pick(possible_points)
+
+ switch(rand(1,3))
+ if(1)
+ //src << "Space"
+ halimage = image('icons/turf/space.dmi',target,"[rand(1,25)]",TURF_LAYER)
+ if(2)
+ //src << "Fire"
+ halimage = image('icons/effects/fire.dmi',target,"1",TURF_LAYER)
+ if(3)
+ //src << "C4"
+ halimage = image('icons/obj/assemblies.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01)
+
+
+ if(client) client.images += halimage
+ spawn(rand(10,50)) //Only seen for a brief moment.
+ if(client) client.images -= halimage
+ halimage = null
+ if("death")
+ //Fake death
+ src.sleeping = 20
+ hal_crit = 1
+ hal_screwyhud = 1
+ spawn(rand(50,100))
+ src.sleeping = 0
+ hal_crit = 0
+ hal_screwyhud = 0
+ if("husks")
+ if(!halbody)
+ var/list/possible_points = list()
+ for(var/turf/simulated/floor/F in view(src,world.view))
+ possible_points += F
+ if(possible_points.len)
+ var/turf/simulated/floor/target = pick(possible_points)
+ switch(rand(1,4))
+ if(1)
+ var/image/body = image('icons/mob/human.dmi',target,"husk_s",TURF_LAYER)
+ var/matrix/M = matrix()
+ M.Turn(90)
+ body.transform = M
+ halbody = body
+ if(2,3)
+ halbody = image('icons/mob/human.dmi',target,"husk_s",TURF_LAYER)
+ if(4)
+ halbody = image('icons/mob/alien.dmi',target,"alienother",TURF_LAYER)
+
+ if(client) client.images += halbody
+ spawn(rand(50,80)) //Only seen for a brief moment.
+ if(client) client.images -= halbody
+ halbody = null
\ No newline at end of file
diff --git a/code/modules/food&drinks/drinks/drinks.dm b/code/modules/food&drinks/drinks/drinks.dm
index dbcff950089..1f07766a523 100644
--- a/code/modules/food&drinks/drinks/drinks.dm
+++ b/code/modules/food&drinks/drinks/drinks.dm
@@ -81,7 +81,7 @@
return
var/refill = reagents.get_master_reagent_id()
var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
- user << " You transfer [trans] units of the solution to [target]. "
+ user << "You transfer [trans] units of the solution to [target]. "
if(isrobot(user)) //Cyborg modules that include drinks automatically refill themselves, but drain the borg's cell
var/mob/living/silicon/robot/bro = user
diff --git a/code/modules/food&drinks/food/customizables.dm b/code/modules/food&drinks/food/customizables.dm
index 7f9387b9865..c2aa2849c0a 100644
--- a/code/modules/food&drinks/food/customizables.dm
+++ b/code/modules/food&drinks/food/customizables.dm
@@ -44,7 +44,8 @@
else if((ingredients.len >= ingMax) || (reagents.total_volume >= volume))
user << "You can't add more ingredients to [src]! "
else
- user.drop_item()
+ if(!user.unEquip(I))
+ return
if(S.trash)
new S.trash(get_turf(user))
S.trash = null //we remove the plate before adding the ingredient
diff --git a/code/modules/food&drinks/kitchen machinery/food_cart.dm b/code/modules/food&drinks/kitchen machinery/food_cart.dm
index fdae544a1b9..1cff6be4b82 100644
--- a/code/modules/food&drinks/kitchen machinery/food_cart.dm
+++ b/code/modules/food&drinks/kitchen machinery/food_cart.dm
@@ -63,7 +63,8 @@
if(istype(O, /obj/item/weapon/reagent_containers/food/drinks/drinkingglass))
var/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/DG = O
if(!DG.reagents.total_volume) //glass is empty
- user.drop_item()
+ if(!user.drop_item())
+ return
qdel(DG)
glasses++
user << "The [src] accepts the drinking glass, sterilizing it. "
@@ -72,7 +73,8 @@
user << "The [src] is at full capacity. "
else
var/obj/item/weapon/reagent_containers/food/snacks/S = O
- user.drop_item()
+ if(!user.drop_item())
+ return
S.loc = src
if(stored_food[sanitize(S.name)])
stored_food[sanitize(S.name)]++
diff --git a/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm b/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm
index bb88e5ec867..fc6a899f5b0 100644
--- a/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm
+++ b/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm
@@ -60,7 +60,8 @@
if(target.stat == 0)
user << "The monkey is struggling far too much to put it in the recycler. "
else
- user.drop_item()
+ if(!user.drop_item())
+ return
qdel(target)
user << "You stuff the monkey in the machine. "
playsound(src.loc, 'sound/machines/juicer.ogg', 50, 1)
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 3722cdda67f..38c9be4e471 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -897,7 +897,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy/add_juice()
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blue/bluespace/attack_self(var/mob/user)
squish(user)
- user.drop_item()
+ user.unEquip(src)
src.visible_message("[user] squashes the [src.name].","You hear a smack. ")
qdel(src)
diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm
index df14126ae63..07ee7c17a2e 100644
--- a/code/modules/hydroponics/growninedible.dm
+++ b/code/modules/hydroponics/growninedible.dm
@@ -89,7 +89,7 @@
qdel(src)
return
else
- usr << " You must dry this first! "
+ usr << "You must dry this first! "
/obj/item/weapon/grown/log/steel
seed = /obj/item/seeds/steelmycelium
@@ -115,7 +115,7 @@
/obj/item/weapon/grown/sunflower/attack(mob/M as mob, mob/user as mob)
M << " [user] smacks you with a sunflower! FLOWER POWER "
- user << " Your sunflower's FLOWER POWER strikes [M] "
+ user << "Your sunflower's FLOWER POWER strikes [M] "
/obj/item/weapon/grown/novaflower
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index 608414b38c2..3b3b9ab28d2 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -684,25 +684,25 @@
else if(istype(O, /obj/item/device/analyzer/plant_analyzer))
if(planted && myseed)
user << "*** [myseed.plantname] ***" //Carn: now reports the plants growing, not the seeds.
- user << "-Plant Age: [age] "
- user << "-Plant Endurance: [myseed.endurance] "
- user << "-Plant Lifespan: [myseed.lifespan] "
+ user << "-Plant Age: [age] "
+ user << "-Plant Endurance: [myseed.endurance] "
+ user << "-Plant Lifespan: [myseed.lifespan] "
if(myseed.yield != -1)
- user << "-Plant Yield: [myseed.yield] "
- user << "-Plant Production: [myseed.production] "
+ user << "-Plant Yield: [myseed.yield] "
+ user << "-Plant Production: [myseed.production] "
if(myseed.potency != -1)
- user << "-Plant Potency: [myseed.potency] "
+ user << "-Plant Potency: [myseed.potency] "
var/list/text_strings = myseed.get_analyzer_text()
if(text_strings)
for(var/string in text_strings)
user << string
else
user << "No plant found. "
- user << "-Weed level: [weedlevel] / 10 "
- user << "-Pest level: [pestlevel] / 10 "
- user << "-Toxicity level: [toxic] / 100 "
- user << "-Water level: [waterlevel] / [maxwater] "
- user << "-Nutrition level: [nutrilevel] / [maxnutri] "
+ user << "-Weed level: [weedlevel] / 10 "
+ user << "-Pest level: [pestlevel] / 10 "
+ user << "-Toxicity level: [toxic] / 100 "
+ user << "-Water level: [waterlevel] / [maxwater] "
+ user << "-Nutrition level: [nutrilevel] / [maxnutri] "
user << ""
else if(istype(O, /obj/item/weapon/cultivator))
@@ -863,9 +863,9 @@
podman.ckey = ckey_holder
podman.gender = blood_gender
podman.faction |= factions
- if(!mutant_color)
- mutant_color = "#59CE00"
- hardset_dna(podman,null,null,podman.real_name,blood_type,/datum/species/plant/pod,mutant_color)//Discard SE's and UI's, podman cloning is inaccurate, and always make them a podman
+ if(!features["mcolor"])
+ features["mcolor"] = "#59CE00"
+ hardset_dna(podman,null,null,podman.real_name,blood_type,/datum/species/plant/pod,features)//Discard SE's and UI's, podman cloning is inaccurate, and always make them a podman
podman.set_cloned_appearance()
else //else, one packet of seeds. maybe two
diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm
index 05369322619..0e491e575bf 100644
--- a/code/modules/hydroponics/seeds.dm
+++ b/code/modules/hydroponics/seeds.dm
@@ -36,14 +36,14 @@
/obj/item/seeds/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
if (istype(O, /obj/item/device/analyzer/plant_analyzer))
user << "*** [plantname] ***"
- user << "-Plant Endurance: [endurance] "
- user << "-Plant Lifespan: [lifespan] "
- user << "-Species Discovery Value: [rarity] "
+ user << "-Plant Endurance: [endurance] "
+ user << "-Plant Lifespan: [lifespan] "
+ user << "-Species Discovery Value: [rarity] "
if(yield != -1)
- user << "-Plant Yield: [yield] "
- user << "-Plant Production: [production] "
+ user << "-Plant Yield: [yield] "
+ user << "-Plant Production: [production] "
if(potency != -1)
- user << "-Plant Potency: [potency] "
+ user << "-Plant Potency: [potency] "
var/list/text_strings = get_analyzer_text()
if(text_strings)
for(var/string in text_strings)
@@ -90,7 +90,7 @@
var/datum/mind/mind = null
var/blood_gender = null
var/blood_type = null
- var/mutant_color = null
+ var/list/features = null
var/factions = null
var/contains_sample = 0
@@ -104,7 +104,7 @@
realName = bloodSample.data["real_name"]
blood_gender = bloodSample.data["gender"]
blood_type = bloodSample.data["blood_type"]
- mutant_color = bloodSample.data["mutant_color"]
+ features = bloodSample.data["features"]
factions = bloodSample.data["factions"]
W.reagents.clear_reagents()
user << "You inject the contents of the syringe into the seeds. "
@@ -1348,8 +1348,8 @@
return
var/turf/T = get_turf(src)
user << "You plant the kudzu. You monster. "
- message_admins("Kudzu planted by [key_name(user, user.client)](? ) at ([T.x],[T.y],[T.z] - (JMP) )",0,1)
- investigate_log("was planted by [user.ckey]([user]) at ([T.x],[T.y],[T.z])","kudzu")
+ message_admins("Kudzu planted by [key_name_admin(user)](? ) (FLW ) at ([T.x],[T.y],[T.z] - (JMP) )",0,1)
+ investigate_log("was planted by [key_name(user)] at ([T.x],[T.y],[T.z])","kudzu")
new /obj/effect/spacevine_controller(user.loc, mutations, potency, production)
qdel(src)
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index b22c6d40087..298ebdcf61c 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -63,7 +63,8 @@
if(2)
if(is_type_in_list(I, allowed_books))
- user.drop_item()
+ if(!user.drop_item())
+ return
I.loc = src
update_icon()
else if(istype(I, /obj/item/weapon/storage/bag/books))
diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm
index 254b383c7a4..f5dc638ee49 100644
--- a/code/modules/library/lib_machines.dm
+++ b/code/modules/library/lib_machines.dm
@@ -16,8 +16,9 @@
*/
/obj/machinery/computer/libraryconsole
name = "library visitor console"
- icon = 'icons/obj/computer.dmi'
- icon_state = "library"
+ icon_state = "oldcomp"
+ icon_screen = "library"
+ icon_keyboard = null
circuit = /obj/item/weapon/circuitboard/libraryconsole
var/screenstate = 0
var/title
@@ -446,7 +447,8 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums
/obj/machinery/libraryscanner/attackby(var/obj/O as obj, var/mob/user as mob, params)
if(istype(O, /obj/item/weapon/book))
- user.drop_item()
+ if(!user.drop_item())
+ return
O.loc = src
/obj/machinery/libraryscanner/attack_hand(var/mob/user as mob)
@@ -504,7 +506,8 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums
if(busy)
user << "The book binder is busy. Please wait for completion of previous operation. "
return
- user.drop_item()
+ if(!user.drop_item())
+ return
O.loc = src
user.visible_message("[user] loads some paper into [src].", "You load some paper into [src].")
src.visible_message("[src] begins to hum as it warms up its printing drums.")
diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm
index 1dd002229be..265238f483c 100644
--- a/code/modules/mining/equipment_locker.dm
+++ b/code/modules/mining/equipment_locker.dm
@@ -89,7 +89,8 @@
if(istype(W,/obj/item/weapon/card/id))
var/obj/item/weapon/card/id/I = usr.get_active_hand()
if(istype(I) && !istype(inserted_id))
- usr.drop_item()
+ if(!user.drop_item())
+ return
I.loc = src
inserted_id = I
interact(user)
@@ -184,7 +185,8 @@
else if(href_list["choice"] == "insert")
var/obj/item/weapon/card/id/I = usr.get_active_hand()
if(istype(I))
- usr.drop_item()
+ if(!usr.drop_item())
+ return
I.loc = src
inserted_id = I
else usr << "No valid ID. "
@@ -333,7 +335,8 @@
else if(href_list["choice"] == "insert")
var/obj/item/weapon/card/id/I = usr.get_active_hand()
if(istype(I))
- usr.drop_item()
+ if(!usr.drop_item())
+ return
I.loc = src
inserted_id = I
else usr << "No valid ID. "
@@ -356,7 +359,8 @@
if(istype(I,/obj/item/weapon/card/id))
var/obj/item/weapon/card/id/C = usr.get_active_hand()
if(istype(C) && !istype(inserted_id))
- usr.drop_item()
+ if(!usr.drop_item())
+ return
C.loc = src
inserted_id = C
interact(user)
diff --git a/code/modules/mining/laborcamp/laborshuttle.dm b/code/modules/mining/laborcamp/laborshuttle.dm
index 7f0992a502f..079eaeab8dd 100644
--- a/code/modules/mining/laborcamp/laborshuttle.dm
+++ b/code/modules/mining/laborcamp/laborshuttle.dm
@@ -1,8 +1,6 @@
/obj/machinery/computer/shuttle/labor
name = "labor shuttle console"
desc = "Used to call and send the labor camp shuttle."
- icon = 'icons/obj/computer.dmi'
- icon_state = "shuttle"
circuit = /obj/item/weapon/circuitboard/labor_shuttle
shuttleId = "laborcamp"
possible_destinations = "laborcamp_home;laborcamp_away"
diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm
index e9dc6f7d14f..366ade4a6de 100644
--- a/code/modules/mining/laborcamp/laborstacker.dm
+++ b/code/modules/mining/laborcamp/laborstacker.dm
@@ -86,7 +86,8 @@
else if(href_list["choice"] == "insert")
var/obj/item/weapon/card/id/prisoner/I = usr.get_active_hand()
if(istype(I))
- usr.drop_item()
+ if(!usr.drop_item())
+ return
I.loc = src
inserted_id = I
else usr << "Invalid ID. "
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index ddfdd96ad9a..00bed34c8fd 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -256,19 +256,16 @@ var/global/list/rockTurfEdgeCache
var/turf/bombturf = get_turf(src)
var/area/A = get_area(bombturf)
- if(user)
- activated_ckey = "[user.ckey]"
- activated_name = "[user.name]"
var/notify_admins = 0
if(z != 5)
notify_admins = 1
if(!triggered_by_explosion)
- message_admins("[src.activated_ckey]/([src.activated_name])? has triggered a gibtonite deposit reaction at [A.name] (JMP) .")
+ message_admins("[key_name_admin(user)]? (FLW ) has triggered a gibtonite deposit reaction at [A.name] (JMP) .")
else
message_admins("An explosion has triggered a gibtonite deposit reaction at [A.name] (JMP) .")
if(!triggered_by_explosion)
- log_game("[src.activated_ckey] ([src.activated_name]) has triggered a gibtonite deposit reaction at [A.name] ([A.x], [A.y], [A.z]).")
+ log_game("[key_name(user)] has triggered a gibtonite deposit reaction at [A.name] ([A.x], [A.y], [A.z]).")
else
log_game("An explosion has triggered a gibtonite deposit reaction at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])")
diff --git a/code/modules/mining/money_bag.dm b/code/modules/mining/money_bag.dm
index 4f0e74aff4c..e9befa30d43 100644
--- a/code/modules/mining/money_bag.dm
+++ b/code/modules/mining/money_bag.dm
@@ -60,8 +60,9 @@
..()
if (istype(W, /obj/item/weapon/coin))
var/obj/item/weapon/coin/C = W
+ if(!user.drop_item())
+ return
user << "You add the [C.name] into the bag. "
- usr.drop_item()
contents += C
if (istype(W, /obj/item/weapon/moneybag))
var/obj/item/weapon/moneybag/C = W
diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm
index bf394e7ac21..baddbc27a53 100644
--- a/code/modules/mining/ores_coins.dm
+++ b/code/modules/mining/ores_coins.dm
@@ -177,13 +177,13 @@
if(triggered_by == 1)
message_admins("An explosion has triggered a [name] to detonate at [A.name] (JMP) .")
else if(triggered_by == 2)
- message_admins("A signal has triggered a [name] to detonate at [A.name] (JMP) . Igniter attacher: [attacher]")
+ message_admins("A signal has triggered a [name] to detonate at [A.name] (JMP) . Igniter attacher: [key_name_admin(attacher)]? (FLW )")
else
- message_admins("[key_name(user)]? has triggered a [name] to detonate at [A.name] (JMP) .")
+ message_admins("[key_name_admin(user)]? (FLW ) has triggered a [name] to detonate at [A.name] (JMP) .")
if(triggered_by == 1)
log_game("An explosion has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])")
else if(triggered_by == 2)
- log_game("A signal has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z]). Igniter attacher: [attacher].")
+ log_game("A signal has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z]). Igniter attacher: [key_name(attacher)].")
else
user.visible_message("[user] strikes \the [src], causing a chain reaction! ", "You strike \the [src], causing a chain reaction. ")
log_game("[key_name(user)] has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])")
diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm
index 211cadcdf97..edb420703b4 100644
--- a/code/modules/mining/satchel_ore_boxdm.dm
+++ b/code/modules/mining/satchel_ore_boxdm.dm
@@ -11,7 +11,8 @@
/obj/structure/ore_box/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if (istype(W, /obj/item/weapon/ore))
- user.drop_item()
+ if(!user.drop_item())
+ return
W.loc = src
if (istype(W, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = W
diff --git a/code/modules/mob/living/carbon/alien/larva/emote.dm b/code/modules/mob/living/carbon/alien/larva/emote.dm
index 57c3783ed82..cf4f18c5d07 100644
--- a/code/modules/mob/living/carbon/alien/larva/emote.dm
+++ b/code/modules/mob/living/carbon/alien/larva/emote.dm
@@ -100,7 +100,7 @@
src << "Help for larva emotes. You can use these emotes with say \"*emote\":\n\nburp, choke, collapse, dance, drool, gasp, gnarl, hiss, jump, moan, nod, roll, scratch,\nscretch, shake, shiver, sign-#, sulk, sway, tail, twitch, whimper"
else
- src << " Unusable emote '[act]'. Say *help for a list. "
+ src << "Unusable emote '[act]'. Say *help for a list. "
if ((message && src.stat == 0))
log_emote("[name]/[key] : [message]")
diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm
index 469e4023946..093c727edc5 100644
--- a/code/modules/mob/living/carbon/alien/larva/powers.dm
+++ b/code/modules/mob/living/carbon/alien/larva/powers.dm
@@ -40,9 +40,9 @@
if(L.amount_grown >= L.max_grown) //TODO ~Carn
L << "You are growing into a beautiful alien! It is time to choose a caste. "
L << "There are three to choose from:"
- L << "Hunters are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves. "
- L << "Sentinels are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters. "
- L << "Drones are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded alien queen. "
+ L << "Hunters are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves. "
+ L << "Sentinels are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters. "
+ L << "Drones are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded alien queen. "
var/alien_caste = alert(L, "Please choose which alien caste you shall belong to.",,"Hunter","Sentinel","Drone")
var/mob/living/carbon/alien/humanoid/new_xeno
diff --git a/code/modules/mob/living/carbon/alien/screen.dm b/code/modules/mob/living/carbon/alien/screen.dm
index 731fc39b4f1..43a98198a02 100644
--- a/code/modules/mob/living/carbon/alien/screen.dm
+++ b/code/modules/mob/living/carbon/alien/screen.dm
@@ -4,7 +4,7 @@
/mob/living/carbon/alien/proc/updatePlasmaDisplay()
if(hud_used) //clientless aliens
- hud_used.alien_plasma_display.maptext = " [round(storedPlasma)]
"
+ hud_used.alien_plasma_display.maptext = "[round(storedPlasma)]
"
/mob/living/carbon/alien/larva/updatePlasmaDisplay()
return
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm
index 95838e1b90d..ffb73ef359f 100644
--- a/code/modules/mob/living/carbon/brain/MMI.dm
+++ b/code/modules/mob/living/carbon/brain/MMI.dm
@@ -41,6 +41,8 @@
user << "You aren't sure where this brain came from, but you're pretty sure it's a useless brain! "
return
+ if(!user.unEquip(src))
+ return
var/mob/living/carbon/brain/B = newbrain.brainmob
if(!B.key)
var/mob/dead/observer/ghost = B.get_ghost()
@@ -58,7 +60,6 @@
dead_mob_list -= brainmob //Update dem lists
living_mob_list += brainmob
- user.drop_item()
newbrain.loc = src //P-put your brain in it
brain = newbrain
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index bae07c42c8d..030b2a74750 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -251,7 +251,7 @@
if(istype(item, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = item
- item = G.throw() //throw the person instead of the grab
+ item = G.get_mob_if_throwable() //throw the person instead of the grab
qdel(G) //We delete the grab, as it needs to stay around until it's returned.
if(ismob(item))
var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors
@@ -306,7 +306,7 @@
Left Hand: [(l_hand && !(l_hand.flags&ABSTRACT)) ? l_hand : "Nothing"]
Right Hand: [(r_hand && !(r_hand.flags&ABSTRACT)) ? r_hand : "Nothing"] "}
- dat += "Back: [back ? back : "Nothing"] "
+ dat += "Back: [back ? back : "Nothing"] "
if(istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/weapon/tank))
dat += "[internal ? "Disable Internals" : "Set Internals"] "
@@ -402,7 +402,7 @@ var/const/GALOSHES_DONT_HELP = 8
return
/mob/living/carbon/resist_buckle()
- if(handcuffed)
+ if(restrained())
changeNext_move(CLICK_CD_BREAKOUT)
last_special = world.time + CLICK_CD_BREAKOUT
visible_message("[src] attempts to unbuckle themself! ", \
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index 4026083e1ac..50a9c2c47fe 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -9,6 +9,9 @@
var/obj/item/handcuffed = null //Whether or not the mob is handcuffed
var/obj/item/legcuffed = null //Same as handcuffs but for legs. Bear traps use this.
+ var/list/features = list("mcolor" = "FFF", "tail" = "Smooth", "snout" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None")
+
+
//inventory slots
var/obj/item/back = null
var/obj/item/clothing/mask/wear_mask = null
diff --git a/code/modules/mob/living/carbon/human/blood.dm b/code/modules/mob/living/carbon/human/blood.dm
index e8b46b5ca51..289fb8e5ee8 100644
--- a/code/modules/mob/living/carbon/human/blood.dm
+++ b/code/modules/mob/living/carbon/human/blood.dm
@@ -30,7 +30,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
/mob/living/carbon/human/proc/fixblood()
for(var/datum/reagent/blood/B in vessel.reagent_list)
if(B.id == "blood")
- B.data = list("donor"=src,"viruses"=null,"blood_DNA"=dna.unique_enzymes,"blood_type"=dna.blood_type,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"mutant_color"=null, "factions"=null)
+ B.data = list("donor"=src,"viruses"=null,"blood_DNA"=dna.unique_enzymes,"blood_type"=dna.blood_type,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"features"=null, "factions"=null)
/mob/living/carbon/human/proc/suppress_bloodloss(var/amount)
if(bleedsuppress)
@@ -172,7 +172,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
B.data["blood_type"] = copytext(src.dna.blood_type,1,0)
B.data["gender"] = src.gender
B.data["real_name"] = src.real_name
- B.data["mutant_color"] = src.dna.mutant_color
+ B.data["features"] = src.dna.features
B.data["factions"] = src.faction
return B
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 1fda3b351f4..9a718fb01bc 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -355,7 +355,9 @@
return
if("tail" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "tail"
+ dna.species.mutant_bodyparts -= "spines"
dna.species.mutant_bodyparts |= "waggingtail"
+ dna.species.mutant_bodyparts |= "waggingspines"
update_body()
@@ -364,5 +366,8 @@
return
if("waggingtail" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "waggingtail"
+ dna.species.mutant_bodyparts -= "waggingspines"
dna.species.mutant_bodyparts |= "tail"
+ dna.species.mutant_bodyparts |= "spines"
+
update_body()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index b51e729b8d0..696c9a3b5a4 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -272,7 +272,7 @@
if(perpname)
var/datum/data/record/R = find_record("name", perpname, data_core.general)
if(R)
- msg += "Rank: [R.fields["rank"]] "
+ msg += "Rank: [R.fields["rank"]] "
msg += "\[Front photo\] "
msg += "\[Side photo\] "
if(istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(CIH,/obj/item/cybernetic_implant/eyes/hud/medical))
@@ -300,8 +300,8 @@
if(R)
criminal = R.fields["criminal"]
- msg += "Criminal status: \[[criminal]\] \n"
- msg += "Security record: \[View\] "
+ msg += "Criminal status: \[[criminal]\] \n"
+ msg += "Security record: \[View\] "
msg += "\[Add crime\] "
msg += "\[View comment log\] "
msg += "\[Add comment\] \n"
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 620d251ed54..16be6a0f49e 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -166,7 +166,7 @@
/mob/living/carbon/human/blob_act()
if(stat == DEAD) return
- show_message(" The blob attacks you! ")
+ show_message("The blob attacks you! ")
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
var/obj/item/organ/limb/affecting = get_organ(ran_zone(dam_zone))
apply_damage(5, BRUTE, affecting, run_armor_check(affecting, "melee"))
@@ -291,6 +291,8 @@
usr.put_in_hands(I)
usr.emote("scream")
usr.visible_message("[usr] successfully rips [I] out of their [L.getDisplayName()]!","You successfully remove [I] from your [L.getDisplayName()]. ")
+ if(!has_embedded_objects())
+ clear_alert("embeddedobject")
return
if(href_list["item"])
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 7d29d7a3bdc..c99b39e3995 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -79,7 +79,7 @@
if(2)
say(pick("FUS RO DAH","fucking 4rries!", "stat me", ">my face", "roll it easy!", "waaaaaagh!!!", "red wonz go fasta", "FOR TEH EMPRAH", "lol2cat", "dem dwarfs man, dem dwarfs", "SPESS MAHREENS", "hwee did eet fhor khayosss", "lifelike texture ;_;", "luv can bloooom", "PACKETS!!!", "port ba[pick("y", "i", "e")] med!!!!", "REVIRT GON CHEM!!!!!!!!", "youed call her a toeugh bithc", "closd for merbegging", "pray can u [pick("spawn", "MAke me", "creat")] [pick("zenomorfs", "ayleins", "treaitors", "sheadow linkgs", "ubdoocters")]???"))
if(3)
- say(pick("GEY AWAY FROM ME U GREIFING PRICK!!!!", "ur a fuckeing autist!", ";HELP SHITECIRTY MURDERIN MEE!!!", "hwat dose tha [pick("g", "squid", "r")] mean?????", "CAL; TEH SHUTTLE!!!!!", "wearnig siNGUARLTY IS .... FIne xDDDDDDDDD", "AI laW 22 Open door", "this SI mY stATIon......", "who the HELL do u thenk u r?!!!!", "geT THE FUCK OUTTTT", "H U G B O X", ";;CRAGING THIS STTAYTION WITH NIO SURVIVROS", "[pick("bager", "syebl")] is down11!!!!!!!!!!!!!!!!!"))
+ say(pick("GEY AWAY FROM ME U GREIFING PRICK!!!!", "ur a fuckeing autist!", ";HELP SHITECIRTY MURDERIN MEE!!!", "hwat dose tha [pick("g", "squid", "r")] mean?????", "CAL; TEH SHUTTLE!!!!!", "wearnig siNGUARLTY IS .... FIne xDDDDDDDDD", "AI laW 22 Open door", "this SI mY stATIon......", "who the HELL do u thenk u r?!!!!", "geT THE FUCK OUTTTT", "H U G B O X", ";;CRAGING THIS STTAYTION WITH NIO SURVIVROS", "[pick("bager", "syebl")] is down11!!!!!!!!!!!!!!!!!", "PSHOOOM"))
if(4)
emote("drool")
@@ -308,7 +308,7 @@
if(mind.changeling)
mind.changeling.regenerate()
hud_used.lingchemdisplay.invisibility = 0
- hud_used.lingchemdisplay.maptext = " [round(mind.changeling.chem_charges)]
"
+ hud_used.lingchemdisplay.maptext = "[round(mind.changeling.chem_charges)]
"
else
hud_used.lingchemdisplay.invisibility = 101
@@ -335,6 +335,8 @@
L.embedded_objects -= I
I.loc = get_turf(src)
visible_message("\the [I] falls out of [name]'s [L.getDisplayName()]! ","\the [I] falls out of your [L.getDisplayName()]! ")
+ if(!has_embedded_objects())
+ clear_alert("embeddedobject")
/mob/living/carbon/human/handle_heart()
if(!heart_attack)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index caa356eb117..ae6d8824d95 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -113,7 +113,7 @@
spec_base = image("icon" = 'icons/mob/human.dmi', "icon_state" = icon_state_string, "layer" = -SPECIES_LAYER)
- spec_base.color = "#[H.dna.mutant_color]"
+ spec_base.color = "#[H.dna.features["mcolor"]]"
standing = spec_base
if(standing)
@@ -136,7 +136,7 @@
if(hair_color)
if(hair_color == "mutcolor")
- img_facial_s.color = "#" + H.dna.mutant_color
+ img_facial_s.color = "#" + H.dna.features["mcolor"]
else
img_facial_s.color = "#" + hair_color
else
@@ -164,7 +164,7 @@
if(hair_color)
if(hair_color == "mutcolor")
- img_hair_s.color = "#" + H.dna.mutant_color
+ img_hair_s.color = "#" + H.dna.features["mcolor"]
else
img_hair_s.color = "#" + hair_color
else
@@ -240,33 +240,75 @@
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
bodyparts_to_add -= "tail"
+
if("waggingtail" in mutant_bodyparts)
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
bodyparts_to_add -= "waggingtail"
else if ("tail" in mutant_bodyparts)
bodyparts_to_add -= "waggingtail"
+ if("spines" in mutant_bodyparts)
+ if(!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
+ bodyparts_to_add -= "spines"
+
+ if("waggingspines" in mutant_bodyparts)
+ if(!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
+ bodyparts_to_add -= "waggingspines"
+ else if ("tail" in mutant_bodyparts)
+ bodyparts_to_add -= "waggingspines"
+
if("snout" in mutant_bodyparts) //Take a closer look at that snout!
if(H.wear_mask && (H.wear_mask.flags_inv & HIDEFACE))
bodyparts_to_add -= "snout"
+ if("frills" in mutant_bodyparts)
+ if(!H.dna.features["frills"] || H.dna.features["frills"] == "None" || H.head && (H.head.flags_inv & HIDEEARS))
+ bodyparts_to_add -= "frills"
+
+ if("horns" in mutant_bodyparts)
+ if(!H.dna.features["horns"] || H.dna.features["horns"] == "None" || H.head && (H.head.flags & BLOCKHAIR) || (H.wear_mask && (H.wear_mask.flags & BLOCKHAIR)))
+ bodyparts_to_add -= "horns"
+
if(!bodyparts_to_add)
return
- var/icon_state_string = "[id]_"
var/g = (H.gender == FEMALE) ? "f" : "m"
- var/image/I
- if(sexes)
- icon_state_string += "[g]_s"
- else
- icon_state_string += "_s"
+ var/image/I
for(var/layer in relevent_layers)
for(var/bodypart in bodyparts_to_add)
- I = image("icon" = 'icons/mob/mutant_bodyparts.dmi', "icon_state" = "[icon_state_string]_[bodypart]_[layer]", "layer" =- layer)
+ var/datum/sprite_accessory/S
+ switch(bodypart)
+ if("tail")
+ S = tails_list[H.dna.features["tail"]]
+ if("waggingtail")
+ S.= animated_tails_list[H.dna.features["tail"]]
+ if("spines")
+ S = spines_list[H.dna.features["spines"]]
+ if("waggingspines")
+ S.= animated_spines_list[H.dna.features["spines"]]
+ if("snout")
+ S = snouts_list[H.dna.features["snout"]]
+ if("frills")
+ S = frills_list[H.dna.features["frills"]]
+ if("horns")
+ S = horns_list[H.dna.features["horns"]]
+ if("body_markings")
+ S = body_markings_list[H.dna.features["body_markings"]]
+
+ if(!S || S.icon_state == "none")
+ continue
+ var/icon_string
+ if(S.gender_specific)
+ icon_string = "[id]_[g]_[bodypart]_[S.icon_state]_[layer]"
+ else
+ icon_string = "[id]_m_[bodypart]_[S.icon_state]_[layer]"
+
+ I = image("icon" = 'icons/mob/mutant_bodyparts.dmi', "icon_state" = icon_string, "layer" =- layer)
+
if(!(H.disabilities & HUSK))
- I.color = "#[H.dna.mutant_color]"
+ I.color = "#[H.dna.features["mcolor"]]"
standing += I
H.overlays_standing[layer] = standing.Copy()
standing = list()
@@ -558,8 +600,12 @@
H.client.screen += global_hud.darkMask
if(H.blind)
- if(H.eye_blind) H.blind.layer = 18
- else H.blind.layer = 0
+ if(H.eye_blind)
+ H.throw_alert("blind")
+ H.blind.layer = 18
+ else
+ H.clear_alert("blind")
+ H.blind.layer = 0
if(!H.client)//no client, no screen to update
return 1
@@ -567,7 +613,11 @@
if( H.disabilities & NEARSIGHT && !istype(H.glasses, /obj/item/clothing/glasses/regular) )
H.client.screen += global_hud.vimpaired
if(H.eye_blurry) H.client.screen += global_hud.blurry
- if(H.druggy) H.client.screen += global_hud.druggy
+ if(H.druggy)
+ H.client.screen += global_hud.druggy
+ H.throw_alert("high")
+ else
+ H.clear_alert("high")
if(H.eye_stat > 20)
diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm
index dd01e5a0420..79f84797b28 100644
--- a/code/modules/mob/living/carbon/human/species_types.dm
+++ b/code/modules/mob/living/carbon/human/species_types.dm
@@ -30,7 +30,7 @@
default_color = "00FF00"
roundstart = 1
specflags = list(MUTCOLORS,EYECOLOR,LIPS)
- mutant_bodyparts = list("tail", "snout")
+ mutant_bodyparts = list("tail", "snout", "spines", "horns", "frills", "body_markings")
attack_verb = "slash"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 120e7da4350..9ac7837148a 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -293,12 +293,16 @@
CheckStamina()
if(sleeping)
+ throw_alert("asleep")
handle_dreams()
adjustStaminaLoss(-10)
sleeping = max(sleeping-1, 0)
if( prob(10) && health && !hal_crit )
spawn(0)
emote("snore")
+ else
+ clear_alert("asleep")
+
var/restingpwr = 1 + 4 * resting
@@ -371,10 +375,6 @@
else
hallucination -= 2
- else
- for(var/atom/a in hallucinations)
- qdel(a)
-
//this handles hud updates. Calls update_vision() and handle_hud_icons()
/mob/living/carbon/handle_regular_hud_updates()
if(!client) return 0
diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm
index 1005cf6f2fc..bec6d68d0ae 100644
--- a/code/modules/mob/living/carbon/monkey/life.dm
+++ b/code/modules/mob/living/carbon/monkey/life.dm
@@ -145,7 +145,7 @@
if(mind.changeling)
mind.changeling.regenerate()
hud_used.lingchemdisplay.invisibility = 0
- hud_used.lingchemdisplay.maptext = " [round(mind.changeling.chem_charges)]
"
+ hud_used.lingchemdisplay.maptext = "[round(mind.changeling.chem_charges)]
"
else
hud_used.lingchemdisplay.invisibility = 101
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index af02c55f543..5beeeb3a847 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -170,8 +170,10 @@
if(blind)
if(eye_blind)
blind.layer = 18
+ throw_alert("blind")
else
blind.layer = 0
+ clear_alert("blind")
if (disabilities & NEARSIGHT)
client.screen += global_hud.vimpaired
@@ -181,6 +183,9 @@
if (druggy)
client.screen += global_hud.druggy
+ throw_alert("high")
+ else
+ clear_alert("high")
if(eye_stat > 20)
if(eye_stat > 30)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 855ecf423c4..d23dcbabcc0 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -664,6 +664,10 @@ Sorry Giacom. Please don't be mad :(
/mob/living/update_gravity(has_gravity)
if(!ticker)
return
+ if(has_gravity)
+ clear_alert("weightless")
+ else
+ throw_alert("weightless")
float(!has_gravity)
/mob/living/proc/float(on)
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 59436c1028b..6509db4ac67 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -17,8 +17,6 @@
var/hallucination = 0 //Directly affects how long a mob will hallucinate for
- var/list/atom/hallucinations = list() //A list of hallucinated people that try to attack the mob. See /obj/effect/fake_attacker in hallucinations.dm
-
var/last_special = 0 //Used by the resist verb, likely used to prevent players from bypassing next_move by logging in/out.
diff --git a/code/modules/mob/living/silicon/ai/freelook/chunk.dm b/code/modules/mob/living/silicon/ai/freelook/chunk.dm
index 48adee0e407..62edcd7bd03 100644
--- a/code/modules/mob/living/silicon/ai/freelook/chunk.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/chunk.dm
@@ -114,7 +114,7 @@
var/turf/t = turf
if(obscuredTurfs[t])
if(!t.obscured)
- t.obscured = image('icons/effects/cameravis.dmi', t, "black", 15)
+ t.obscured = image('icons/effects/cameravis.dmi', t, "black", 16)
obscured += t.obscured
for(var/eye in seenby)
@@ -169,7 +169,7 @@
for(var/turf in obscuredTurfs)
var/turf/t = turf
if(!t.obscured)
- t.obscured = image('icons/effects/cameravis.dmi', t, "black", 15)
+ t.obscured = image('icons/effects/cameravis.dmi', t, "black", 16)
obscured += t.obscured
#undef UPDATE_BUFFER
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/laws.dm b/code/modules/mob/living/silicon/laws.dm
index aed6b5c06a4..d78b2448e28 100644
--- a/code/modules/mob/living/silicon/laws.dm
+++ b/code/modules/mob/living/silicon/laws.dm
@@ -6,30 +6,37 @@
make_laws()
/mob/living/silicon/proc/set_zeroth_law(var/law, var/law_borg)
+ throw_alert("newlaw")
src.laws_sanity_check()
src.laws.set_zeroth_law(law, law_borg)
/mob/living/silicon/proc/add_inherent_law(var/law)
+ throw_alert("newlaw")
laws_sanity_check()
laws.add_inherent_law(law)
/mob/living/silicon/proc/clear_inherent_laws()
+ throw_alert("newlaw")
laws_sanity_check()
laws.clear_inherent_laws()
/mob/living/silicon/proc/add_supplied_law(var/number, var/law)
+ throw_alert("newlaw")
laws_sanity_check()
laws.add_supplied_law(number, law)
/mob/living/silicon/proc/clear_supplied_laws()
+ throw_alert("newlaw")
laws_sanity_check()
laws.clear_supplied_laws()
/mob/living/silicon/proc/add_ion_law(var/law)
+ throw_alert("newlaw")
laws_sanity_check()
laws.add_ion_law(law)
/mob/living/silicon/proc/clear_ion_laws()
+ throw_alert("newlaw")
laws_sanity_check()
laws.clear_ion_laws()
@@ -40,3 +47,8 @@
if(2)
var/datum/ai_laws/lawtype = pick(typesof(/datum/ai_laws/default) - /datum/ai_laws/default)
laws = new lawtype()
+ laws.associate(src)
+
+/mob/living/silicon/proc/clear_zeroth_law(var/force)
+ laws_sanity_check()
+ laws.clear_zeroth_law(force)
diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm
index 4144a3a3ef2..5655b34bc97 100644
--- a/code/modules/mob/living/silicon/pai/software.dm
+++ b/code/modules/mob/living/silicon/pai/software.dm
@@ -632,9 +632,9 @@
var/dat = "Digital Messenger "
dat += {"Signal/Receiver Status:
- [(pda.toff) ? " \[Off\] " : " \[On\] "]
+ [(pda.toff) ? "\[Off\] " : "\[On\] "]
Ringer Status:
- [(pda.silent) ? " \[Off\] " : " \[On\] "] "}
+ [(pda.silent) ? "\[Off\] " : "\[On\] "] "}
dat += ""
if(!pda.toff)
for (var/obj/item/device/pda/P in sortNames(get_viewable_pdas()))
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index c016f818fbd..e37ac76c526 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -450,7 +450,8 @@
else if(cell)
user << "There is a power cell already installed! "
else
- user.drop_item()
+ if(!user.drop_item())
+ return
W.loc = src
cell = W
user << "You insert the power cell. "
@@ -525,27 +526,29 @@
else if(istype(W, /obj/item/borg/upgrade/))
var/obj/item/borg/upgrade/U = W
if(!opened)
- usr << "You must access the borgs internals! "
+ user << "You must access the borgs internals! "
else if(!src.module && U.require_module)
- usr << "The borg must choose a module before it can be upgraded! "
+ user << "The borg must choose a module before it can be upgraded! "
else if(U.locked)
- usr << "The upgrade is locked and cannot be used yet! "
+ user << "The upgrade is locked and cannot be used yet! "
else
+ if(!user.drop_item())
+ return
if(U.action(src))
- usr << "You apply the upgrade to [src]. "
- usr.drop_item()
+ user << "You apply the upgrade to [src]. "
U.loc = src
else
- usr << "Upgrade error. "
+ user << "Upgrade error. "
else if(istype(W, /obj/item/device/toner))
if(toner >= tonermax)
- usr << "The toner level of [src] is at it's highest level possible! "
+ user << "The toner level of [src] is at it's highest level possible! "
else
+ if(!user.drop_item())
+ return
toner = 40
- usr.drop_item()
qdel(W)
- usr << "You fill the toner level of [src] to its max capacity. "
+ user << "You fill the toner level of [src] to its max capacity. "
else
if(W.force && W.damtype != STAMINA) //only sparks if real damage is dealt.
@@ -577,6 +580,7 @@
log_game("[key_name(user)] emagged cyborg [key_name(src)]. Laws overridden.")
clear_supplied_laws()
clear_inherent_laws()
+ clear_zeroth_law(0)
laws = new /datum/ai_laws/syndicate_override
var/time = time2text(world.realtime,"hh:mm:ss")
lawchanges.Add("[time] : [user.name]([user.key]) emagged [name]([key])")
@@ -939,6 +943,10 @@
// They stay locked down if their wire is cut.
if(wires.LockedCut())
state = 1
+ if(state)
+ throw_alert("locked")
+ else
+ clear_alert("locked")
lockcharge = state
update_canmove()
@@ -953,6 +961,10 @@
if(hud_used)
hud_used.update_robot_modules_display() //Shows/hides the emag item if the inventory screen is already open.
update_icons()
+ if(emagged)
+ throw_alert("hacked")
+ else
+ clear_alert("hacked")
/mob/living/silicon/robot/verb/outputlaws()
set category = "Robot Commands"
diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm
index a04e155095f..c73a3443b09 100644
--- a/code/modules/mob/living/simple_animal/friendly/corgi.dm
+++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm
@@ -68,7 +68,7 @@
if( istype(inventory_head,/obj/item/clothing/head/helmet) && istype(inventory_back,/obj/item/clothing/suit/armor) )
if( O.force )
user << "[src] is wearing too much armor! You can't cause \him any damage. "
- visible_message(" [user] hits [src] with [O], however [src] is too armored. ")
+ visible_message("[user] hits [src] with [O], however [src] is too armored. ")
else
user << "[src] is wearing too much armor! You can't reach \his skin."
visible_message("[user] gently taps [src] with [O].")
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm
index 3ee98de3c03..c835c1c4e79 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm
@@ -112,4 +112,29 @@
/mob/living/simple_animal/drone/stripPanelEquip(obj/item/what, mob/who, where)
- ..(what, who, where, 1)
\ No newline at end of file
+ ..(what, who, where, 1)
+
+/mob/living/simple_animal/drone/verb/quick_equip()
+ set name = "quick-equip"
+ set hidden = 1
+ var/obj/item/I = get_active_hand()
+ var/obj/item/weapon/storage/S = get_inactive_hand()
+ var/obj/item/weapon/storage/T = internal_storage
+ if (!I)
+ usr << "You are not holding anything to equip! "
+ return
+ if(equip_to_appropriate_slot(I))
+ if(hand)
+ update_inv_l_hand(0)
+ else
+ update_inv_r_hand(0)
+ else if(s_active && s_active.can_be_inserted(I,1)) //if storage active insert there
+ s_active.handle_item_insertion(I)
+ else if(istype(S, /obj/item/weapon/storage) && S.can_be_inserted(I,1)) //see if we have box in other hand
+ S.handle_item_insertion(I)
+ else if (istype(T) && T.can_be_inserted(I,1)) // If carrying storage item like toolbox
+ T.handle_item_insertion(I)
+ else if(!internal_storage)
+ equip_to_slot(I, "drone_storage_slot")
+ else
+ usr << "You are unable to equip that! "
diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
index ab816782d26..1d3e90fb8e5 100644
--- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
+++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
@@ -155,8 +155,8 @@
var/T = src.loc
- if(!stat)
- return 0
+ if(stat == DEAD)
+ return
if(busy != SPINNING_WEB)
busy = SPINNING_WEB
src.visible_message("\the [src] begins to secrete a sticky substance. ")
@@ -173,8 +173,8 @@
set category = "Spider"
set desc = "Wrap up prey to feast upon and objects for safe keeping."
- if(!stat)
- return 0
+ if(stat == DEAD)
+ return
if(!cocoon_target)
var/list/choices = list()
for(var/mob/living/L in view(1,src))
@@ -232,8 +232,8 @@
set desc = "Lay a clutch of eggs, but you must wrap a creature for feeding first."
var/obj/effect/spider/eggcluster/E = locate() in get_turf(src)
- if(!stat)
- return 0
+ if(stat == DEAD)
+ return
if(E)
src << "There is already a cluster of eggs here! "
else if(!fed)
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 4c2abe52a30..f7f81ef7c41 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -346,16 +346,16 @@
MED.amount -= 1
if(MED.amount <= 0)
qdel(MED)
- visible_message(" [user] applies [MED] on [src]. ")
+ visible_message("[user] applies [MED] on [src]. ")
return
else
- user << " [MED] won't help at all. "
+ user << "[MED] won't help at all. "
return
else
- user << " [src] is at full health. "
+ user << "[src] is at full health. "
return
else
- user << " [src] is dead, medical items won't bring it back to life. "
+ user << "[src] is dead, medical items won't bring it back to life. "
return
if((butcher_results) && (stat == DEAD))
@@ -494,11 +494,11 @@
/mob/living/simple_animal/update_transform()
var/matrix/ntransform = matrix(transform) //aka transform.Copy()
var/changed = 0
-
+
if(resize != RESIZE_DEFAULT_SIZE)
changed++
ntransform.Scale(resize)
resize = RESIZE_DEFAULT_SIZE
-
+
if(changed)
- animate(src, transform = ntransform, time = 2, easing = EASE_IN|EASE_OUT)
+ animate(src, transform = ntransform, time = 2, easing = EASE_IN|EASE_OUT)
diff --git a/code/modules/mob/living/simple_animal/slaughter/slaughter.dm b/code/modules/mob/living/simple_animal/slaughter/slaughter.dm
new file mode 100644
index 00000000000..267af8c2dd7
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/slaughter/slaughter.dm
@@ -0,0 +1,173 @@
+//////////////////The Monster
+
+/mob/living/simple_animal/slaughter
+ name = "Slaughter Demon"
+ real_name = "Slaughter Demon"
+ desc = "You should run."
+ speak_emote = list("gurgles")
+ emote_hear = list("wails","screeches")
+ response_help = "thinks better of touching"
+ response_disarm = "flails at"
+ response_harm = "punches"
+ icon = 'icons/mob/mob.dmi'
+ icon_state = "daemon"
+ speed = 0
+ a_intent = "harm"
+ stop_automated_movement = 1
+ status_flags = CANPUSH
+ attack_sound = 'sound/magic/demon_attack1.ogg'
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ minbodytemp = 0
+ faction = list("slaughter")
+ attacktext = "wildly tears into"
+ maxHealth = 250
+ health = 250
+ environment_smash = 1
+ melee_damage_lower = 30
+ melee_damage_upper = 30
+ see_in_dark = 8
+ see_invisible = SEE_INVISIBLE_MINIMUM
+ var/devoured = 0
+ var/phased = FALSE
+ var/holder = null
+ var/eating = FALSE
+ var/mob/living/kidnapped = null
+ var/playstyle_string = "You are the Slaughter Demon, a terible creature from another existence. You have a single desire: To kill. \
+ You may Ctrl+Click on blood pools to travel through them, appearing and dissaapearing from the station at will. \
+ Pulling a dead or critical mob while you enter a pool will pull them in with you, allowing you to feast. "
+
+
+/mob/living/simple_animal/slaughter/death()
+ ..(1)
+ new /obj/effect/decal/cleanable/blood (src.loc)
+ new /obj/item/weapon/demonheart (src.loc)
+ playsound(get_turf(src),'sound/magic/demon_dies.ogg', 200, 1)
+ visible_message("The [src] screams in anger as its form collapes into a pool of viscera. ")
+ ghostize()
+ qdel(src)
+ return
+
+
+
+////////////////////The Powers
+
+/mob/living/simple_animal/slaughter/proc/phaseout(var/obj/effect/decal/cleanable/B)
+ var/turf/mobloc = get_turf(src.loc)
+ var/turf/bloodloc = get_turf(B.loc)
+ if(Adjacent(bloodloc))
+ src.notransform = TRUE
+ spawn(0)
+ src.visible_message("The [src] sinks into the pool of blood.")
+ playsound(get_turf(src), 'sound/magic/enter_blood.ogg', 100, 1, -1)
+ var/obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter( mobloc )
+ src.ExtinguishMob()
+ if(src.buckled)
+ src.buckled.unbuckle_mob()
+ if(src.pulling)
+ if(istype(src.pulling, /mob/living))
+ var/mob/living/victim = src.pulling
+ if(victim.stat == CONSCIOUS)
+ src.visible_message("[victim] kicks free of the [src] at the last second!")
+ else
+ victim.loc = holder
+ src.visible_message("The [src] drags [victim] into the pool of blood! ")
+ src.kidnapped = victim
+ src.loc = holder
+ src.phased = TRUE
+ src.holder = holder
+ if(src.kidnapped)
+ src << "You being to feast on [kidnapped]. You can not move while you are doing this. "
+ src.eating = TRUE
+ playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
+ sleep(30)
+ playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
+ sleep(30)
+ playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
+ sleep(30)
+ src << "You devour [kidnapped]. Your health is fully restored. "
+ src.adjustBruteLoss(-1000)
+ kidnapped.ghostize()
+ qdel(kidnapped)
+ src.devoured++
+ src.kidnapped = null
+ src.eating = FALSE
+ src.notransform = 0
+
+/mob/living/simple_animal/slaughter/proc/phasein(var/obj/effect/decal/cleanable/B)
+ if(src.eating)
+ src << "Finish eating first! "
+ else
+ src.loc = B.loc
+ src.phased = FALSE
+ src.client.eye = src
+ src.visible_message("The [src] rises out of the pool of blood! ")
+ playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1)
+ qdel(src.holder)
+
+/obj/effect/decal/cleanable/blood/CtrlClick(var/mob/user)
+ ..()
+ if(istype(user, /mob/living/simple_animal/slaughter))
+ var/mob/living/simple_animal/slaughter/S = user
+ if(S.phased)
+ S.phasein(src)
+ else
+ S.phaseout(src)
+
+
+/obj/effect/decal/cleanable/trail_holder/CtrlClick(var/mob/user)
+ ..()
+ if(istype(user, /mob/living/simple_animal/slaughter))
+ var/mob/living/simple_animal/slaughter/S = user
+ if(S.phased)
+ S.phasein(src)
+ else
+ S.phaseout(src)
+
+
+
+/turf/CtrlClick(var/mob/user)
+ ..()
+ if(istype(user, /mob/living/simple_animal/slaughter))
+ var/mob/living/simple_animal/slaughter/S = user
+ for(var/obj/effect/decal/cleanable/B in src.contents)
+ if(istype(B, /obj/effect/decal/cleanable/blood) || istype(B, /obj/effect/decal/cleanable/trail_holder))
+ if(S.phased)
+ S.phasein(B)
+ break
+ else
+ S.phaseout(B)
+ break
+
+/obj/effect/dummy/slaughter //Can't use the wizard one, blocked by jaunt/slow
+ name = "water"
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "nothing"
+ var/canmove = 1
+ density = 0
+ anchored = 1
+
+obj/effect/dummy/slaughter/relaymove(var/mob/user, direction)
+ if (!src.canmove || !direction) return
+ var/turf/newLoc = get_step(src,direction)
+ loc = newLoc
+ src.canmove = 0
+ spawn(1)
+ src.canmove = 1
+
+/obj/effect/dummy/slaughter/ex_act(blah)
+ return
+/obj/effect/dummy/slaughter/bullet_act(blah)
+ return
+
+/obj/effect/dummy/slaughter/singularity_act(blah)
+ return
+
+
+//////////The Loot
+
+/obj/item/weapon/demonheart
+ name = "demon's heart"
+ desc = "It's still faintly beating with rage"
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "heart-on"
+ origin_tech = "combat=5;biotech=8"
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/slaughter/slaughterevent.dm b/code/modules/mob/living/simple_animal/slaughter/slaughterevent.dm
new file mode 100644
index 00000000000..3db4b52bcfd
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/slaughter/slaughterevent.dm
@@ -0,0 +1,67 @@
+
+/datum/round_event_control/slaughter
+ name = "Spawn Slaughter Demon"
+ typepath = /datum/round_event/slaughter
+ weight = 0 //Admin only
+ max_occurrences = 1
+ earliest_start = 30 //Spawn later with more blood, hopefully
+
+
+
+/datum/round_event/slaughter
+ var/key_of_slaughter
+
+
+/datum/round_event/slaughter/proc/get_slaughter(var/end_if_fail = 0)
+ key_of_slaughter = null
+ if(!key_of_slaughter)
+ var/list/candidates = get_candidates(BE_ALIEN)
+ if(!candidates.len)
+ if(end_if_fail)
+ return 0
+ return find_slaughter()
+ var/client/C = pick(candidates)
+ key_of_slaughter = C.key
+ if(!key_of_slaughter)
+ if(end_if_fail)
+ return 0
+ return find_slaughter()
+ var/datum/mind/player_mind = new /datum/mind(key_of_slaughter)
+ player_mind.active = 1
+ var/list/spawn_locs = list()
+ for(var/obj/effect/landmark/L in landmarks_list)
+ if(isturf(L.loc))
+ switch(L.name)
+ if("carpspawn")
+ spawn_locs += L.loc
+ if(!spawn_locs)
+ return find_slaughter()
+ var /obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(pick(spawn_locs))
+ var/mob/living/simple_animal/slaughter/S = new /mob/living/simple_animal/slaughter/(holder)
+ S.phased = TRUE
+ player_mind.transfer_to(S)
+ player_mind.assigned_role = "Slaughter Demon"
+ player_mind.special_role = "Slaughter Demon"
+ ticker.mode.traitors |= player_mind
+ S << S.playstyle_string
+ S << "You are currently not currently in the same plane of existence as the station. Ctrl+Click a blood pool to manifest. "
+ message_admins("[key_of_slaughter] has been made into a Slaughter Demon by an event.")
+ log_game("[key_of_slaughter] was spawned as a Slaughter Demon by an event.")
+ return 1
+
+
+
+/datum/round_event/slaughter/start()
+ get_slaughter()
+
+
+
+/datum/round_event/slaughter/proc/find_slaughter()
+ message_admins("Attempted to spawn a Slaughter Demon but there was no players available. Will try again momentarily.")
+ spawn(50)
+ if(get_slaughter(1))
+ message_admins("Situation has been resolved, [key_of_slaughter] has been spawned as a Slaughter Demon.")
+ log_game("[key_of_slaughter] was spawned as a Slaughter Demon by an event.")
+ return 0
+ message_admins("Unfortunately, no candidates were available for becoming a Slaugter Demon. Shutting down.")
+ return kill()
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm
index e3a8d4fcdef..d638788ed1d 100644
--- a/code/modules/mob/living/simple_animal/slime/slime.dm
+++ b/code/modules/mob/living/simple_animal/slime/slime.dm
@@ -235,7 +235,7 @@
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
else
- visible_message(" [M] manages to wrestle \the [name] off! ")
+ visible_message("[M] manages to wrestle \the [name] off! ")
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
discipline_slime(M)
@@ -247,7 +247,7 @@
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
else
- visible_message(" [M] manages to wrestle \the [name] off of [Victim]! ")
+ visible_message("[M] manages to wrestle \the [name] off of [Victim]! ")
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
discipline_slime(M)
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index 233fcd4f485..45f84087221 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -47,7 +47,7 @@
..()
//Used by throw code to hand over the mob, instead of throwing the grab. The grab is then deleted by the throw code.
-/obj/item/weapon/grab/proc/throw()
+/obj/item/weapon/grab/proc/get_mob_if_throwable()
if(affecting)
if(affecting.buckled)
return null
diff --git a/code/modules/mob/new_player/poll.dm b/code/modules/mob/new_player/poll.dm
index 8fd5ba2d93f..08b9a8939b2 100644
--- a/code/modules/mob/new_player/poll.dm
+++ b/code/modules/mob/new_player/poll.dm
@@ -149,7 +149,7 @@
else
output += "[O.optiontext] "
else
- output += " [O.optiontext] "
+ output += " [O.optiontext] "
output += ""
if(!voted) //Only make this a form if we have not voted yet
@@ -324,7 +324,7 @@
else
output += "[O.optiontext] "
else
- output += " [O.optiontext] "
+ output += " [O.optiontext] "
output += ""
if(!voted) //Only make this a form if we have not voted yet
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index 5415474439d..e28dcc3adab 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -14,8 +14,10 @@
hair_color = random_short_color()
facial_hair_color = hair_color
eye_color = random_eye_color()
- pref_species = new /datum/species/human()
+ if(!pref_species)
+ pref_species = new /datum/species/human()
backbag = 2
+ features = random_features()
age = rand(AGE_MIN,AGE_MAX)
/datum/preferences/proc/update_preview_icon() //seriously. This is horrendous.
@@ -45,24 +47,9 @@
preview_icon = new /icon('icons/mob/human.dmi', "[skin_tone]_[g]_s")
else
preview_icon = new /icon('icons/mob/human.dmi', "[pref_species.id]_[g]_s")
- preview_icon.Blend("#[mutant_color]", ICON_MULTIPLY)
+ preview_icon.Blend("#[features["mcolor"]]", ICON_MULTIPLY)
var/datum/sprite_accessory/S
- if(underwear)
- S = underwear_list[underwear]
- if(S)
- preview_icon.Blend(new /icon(S.icon, "[S.icon_state]_s"), ICON_OVERLAY)
-
- if(undershirt)
- S = undershirt_list[undershirt]
- if(S)
- preview_icon.Blend(new /icon(S.icon, "[S.icon_state]_s"), ICON_OVERLAY)
-
- if(socks)
- S = socks_list[socks]
- if(S)
- preview_icon.Blend(new /icon(S.icon, "[S.icon_state]_s"), ICON_OVERLAY)
-
var/icon/eyes_s = new/icon()
if(EYECOLOR in pref_species.specflags)
eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "[pref_species.eyes]_s")
@@ -90,10 +77,47 @@
for(var/layer in relevent_layers)
for(var/bodypart in pref_species.mutant_bodyparts)
- var/icon/part = new/icon("icon" = 'icons/mob/mutant_bodyparts.dmi', "icon_state" = "[icon_state_string]_[bodypart]_[layer]")
- part.Blend("#[mutant_color]", ICON_MULTIPLY)
+ switch(bodypart)
+ if("tail")
+ S = tails_list[features["tail"]]
+ if("spines")
+ S = spines_list[features["spines"]]
+ if("snout")
+ S = snouts_list[features["snout"]]
+ if("frills")
+ S = frills_list[features["frills"]]
+ if("horns")
+ S = horns_list[features["horns"]]
+ if("body_markings")
+ S = body_markings_list[features["body_markings"]]
+
+ if(!S || S.icon_state == "none")
+ continue
+ var/icon_string
+ if(S.gender_specific)
+ icon_string = "[pref_species.id]_[g]_[bodypart]_[S.icon_state]_[layer]"
+ else
+ icon_string = "[pref_species.id]_m_[bodypart]_[S.icon_state]_[layer]"
+ var/icon/part = new/icon("icon" = 'icons/mob/mutant_bodyparts.dmi', "icon_state" = icon_string)
+
+ part.Blend("#[features["mcolor"]]", ICON_MULTIPLY)
preview_icon.Blend(part, ICON_OVERLAY)
+ if(underwear)
+ S = underwear_list[underwear]
+ if(S)
+ preview_icon.Blend(new /icon(S.icon, "[S.icon_state]_s"), ICON_OVERLAY)
+
+ if(undershirt)
+ S = undershirt_list[undershirt]
+ if(S)
+ preview_icon.Blend(new /icon(S.icon, "[S.icon_state]_s"), ICON_OVERLAY)
+
+ if(socks)
+ S = socks_list[socks]
+ if(S)
+ preview_icon.Blend(new /icon(S.icon, "[S.icon_state]_s"), ICON_OVERLAY)
+
var/icon/clothes_s = null
if(job_civilian_low & ASSISTANT)//This gives the preview icon clothes depending on which job(if any) is set to 'high'
clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s")
diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm
index 8b42ef1bcb8..c28d4fd705c 100644
--- a/code/modules/mob/new_player/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories.dm
@@ -41,6 +41,7 @@
var/icon_state //the icon_state of the accessory
var/name //the preview name of the accessory
var/gender = NEUTER //Determines if the accessory will be skipped or included in random hair generations
+ var/gender_specific //Something that can be worn by either gender, but looks different on each
//////////////////////
// Hair Definitions //
@@ -1046,3 +1047,232 @@
name = "Pantyhose"
icon_state = "pantyhose"
gender = FEMALE
+
+//////////.//////////////////
+// MutantParts Definitions //
+/////////////////////////////
+
+/datum/sprite_accessory/body_markings
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/body_markings/none
+ name = "None"
+ icon_state = "none"
+
+/datum/sprite_accessory/body_markings/dstripe
+ name = "Dark Stripe"
+ icon_state = "dstripe"
+
+/datum/sprite_accessory/body_markings/lstripe
+ name = "Light Stripe"
+ icon_state = "lstripe"
+
+/datum/sprite_accessory/body_markings/dtiger
+ name = "Dark Tiger Body"
+ icon_state = "dtiger"
+
+/datum/sprite_accessory/body_markings/dtigerhead
+ name = "Dark Tiger Body + Head"
+ icon_state = "dtigerhead"
+
+/datum/sprite_accessory/body_markings/ltiger
+ name = "Light Tiger Body"
+ icon_state = "ltiger"
+
+/datum/sprite_accessory/body_markings/ltigerhead
+ name = "Light Tiger Body + Head"
+ icon_state = "ltigerhead"
+
+/datum/sprite_accessory/body_markings/lbelly
+ name = "Light Belly"
+ icon_state = "lbelly"
+ gender_specific = 1
+
+/datum/sprite_accessory/tails
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/tails_animated
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/tails/smooth
+ name = "Smooth"
+ icon_state = "smooth"
+
+/datum/sprite_accessory/tails_animated/smooth
+ name = "Smooth"
+ icon_state = "smooth"
+
+/datum/sprite_accessory/tails/light
+ name = "Light"
+ icon_state = "light"
+
+/datum/sprite_accessory/tails_animated/light
+ name = "Light"
+ icon_state = "light"
+
+/datum/sprite_accessory/tails/dstripe
+ name = "Dark Stripe"
+ icon_state = "dstripe"
+
+/datum/sprite_accessory/tails_animated/dstripe
+ name = "Dark Stripe"
+ icon_state = "dstripe"
+
+/datum/sprite_accessory/tails/lstripe
+ name = "Light Stripe"
+ icon_state = "lstripe"
+
+/datum/sprite_accessory/tails_animated/lstripe
+ name = "Light Stripe"
+ icon_state = "lstripe"
+
+/datum/sprite_accessory/tails/dtiger
+ name = "Dark Tiger"
+ icon_state = "dtiger"
+
+/datum/sprite_accessory/tails_animated/dtiger
+ name = "Dark Tiger"
+ icon_state = "dtiger"
+
+/datum/sprite_accessory/tails/ltiger
+ name = "Light Tiger"
+ icon_state = "ltiger"
+
+/datum/sprite_accessory/tails_animated/ltiger
+ name = "Light Tiger"
+ icon_state = "ltiger"
+
+/datum/sprite_accessory/tails/club
+ name = "Club"
+ icon_state = "club"
+
+/datum/sprite_accessory/tails_animated/club
+ name = "Club"
+ icon_state = "club"
+
+/datum/sprite_accessory/tails/aqua
+ name = "Aquatic"
+ icon_state = "aqua"
+
+/datum/sprite_accessory/tails_animated/aqua
+ name = "Aquatic"
+ icon_state = "aqua"
+
+/datum/sprite_accessory/snouts
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/snouts/sharp
+ name = "Sharp"
+ icon_state = "sharp"
+
+/datum/sprite_accessory/snouts/round
+ name = "Round"
+ icon_state = "round"
+
+/datum/sprite_accessory/snouts/sharplight
+ name = "Sharp + Light"
+ icon_state = "sharplight"
+
+/datum/sprite_accessory/snouts/roundlight
+ name = "Round + Light"
+ icon_state = "roundlight"
+
+/datum/sprite_accessory/horns
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/horns/none
+ name = "None"
+ icon_state = "none"
+
+/datum/sprite_accessory/horns/simple
+ name = "Simple"
+ icon_state = "simple"
+
+/datum/sprite_accessory/horns/short
+ name = "Short"
+ icon_state = "short"
+
+/datum/sprite_accessory/horns/curled
+ name = "Curled"
+ icon_state = "curled"
+
+/datum/sprite_accessory/horns/ram
+ name = "Ram"
+ icon_state = "ram"
+
+/datum/sprite_accessory/horns/angler
+ name = "Angeler"
+ icon_state = "angler"
+
+/datum/sprite_accessory/frills
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/frills/none
+ name = "None"
+ icon_state = "none"
+
+/datum/sprite_accessory/frills/simple
+ name = "Simple"
+ icon_state = "simple"
+
+/datum/sprite_accessory/frills/short
+ name = "Short"
+ icon_state = "short"
+
+/datum/sprite_accessory/frills/aquatic
+ name = "Aquatic"
+ icon_state = "aqua"
+
+/datum/sprite_accessory/spines
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/spines_animated
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/spines/none
+ name = "None"
+ icon_state = "none"
+
+/datum/sprite_accessory/spines_animated/none
+ name = "None"
+ icon_state = "none"
+
+/datum/sprite_accessory/spines/short
+ name = "Short"
+ icon_state = "short"
+
+/datum/sprite_accessory/spines_animated/short
+ name = "Short"
+ icon_state = "short"
+
+/datum/sprite_accessory/spines/shortmeme
+ name = "Short + Membrane"
+ icon_state = "shortmeme"
+
+/datum/sprite_accessory/spines_animated/shortmeme
+ name = "Short + Membrane"
+ icon_state = "shortmeme"
+
+/datum/sprite_accessory/spines/long
+ name = "Long"
+ icon_state = "long"
+
+/datum/sprite_accessory/spines_animated/long
+ name = "Long"
+ icon_state = "long"
+
+/datum/sprite_accessory/spines/longmeme
+ name = "Long + Membrane"
+ icon_state = "longmeme"
+
+/datum/sprite_accessory/spines_animated/longmeme
+ name = "Long + Membrane"
+ icon_state = "longmeme"
+
+/datum/sprite_accessory/spines/aqautic
+ name = "Aquatic"
+ icon_state = "aqua"
+
+/datum/sprite_accessory/spines_animated/aqautic
+ name = "Aquatic"
+ icon_state = "aqua"
diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm
index 6b67a64ac3f..5bebfcb8682 100644
--- a/code/modules/nano/nanoui.dm
+++ b/code/modules/nano/nanoui.dm
@@ -261,7 +261,7 @@ nanoui is used to open and update nano browser uis
head_content += " "
for (var/filename in stylesheets)
- head_content += " "
+ head_content += " "
var/templatel_data[0]
for (var/key in templates)
diff --git a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
index f664c87a8b9..9b2fb90596d 100644
--- a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
@@ -124,7 +124,6 @@ It is possible to destroy the net by the occupant or someone else.
/obj/effect/energy_net/hitby(AM as mob|obj)
..()
- visible_message("[src] was hit by [AM]. ")
var/tforce = 0
if(ismob(AM))
tforce = 10
diff --git a/code/modules/ninja/suit/suit_initialisation.dm b/code/modules/ninja/suit/suit_initialisation.dm
index ef1e10ba35e..621ee154caa 100644
--- a/code/modules/ninja/suit/suit_initialisation.dm
+++ b/code/modules/ninja/suit/suit_initialisation.dm
@@ -40,7 +40,7 @@
break
lock_suit(U,1)//Check for icons.
U.regenerate_icons()
- U << " Linking neural-net interface...\nPattern \green GREEN , continuing operation. "
+ U << "Linking neural-net interface...\nPattern \green GREEN , continuing operation. "
if(4)
U << "VOID-shift device status: ONLINE .\nCLOAK-tech device status: ONLINE . "
if(5)
diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm
index ac8e32ecf63..8ae11c8f83c 100644
--- a/code/modules/paperwork/clipboard.dm
+++ b/code/modules/paperwork/clipboard.dm
@@ -28,7 +28,8 @@
/obj/item/weapon/clipboard/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/paper))
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
toppaper = W
user << "You clip the paper onto \the [src]. "
@@ -76,7 +77,8 @@
if(!haspen)
if(istype(usr.get_active_hand(), /obj/item/weapon/pen))
var/obj/item/weapon/pen/W = usr.get_active_hand()
- usr.drop_item()
+ if(!usr.unEquip(W))
+ return
W.loc = src
haspen = W
usr << "You slot [W] into [src]. "
diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm
index 351443ec5bb..4d071708fb3 100644
--- a/code/modules/paperwork/filingcabinet.dm
+++ b/code/modules/paperwork/filingcabinet.dm
@@ -43,8 +43,9 @@
/obj/structure/filingcabinet/attackby(obj/item/P, mob/user, params)
if(istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/folder) || istype(P, /obj/item/weapon/photo) || istype(P, /obj/item/documents))
+ if(!user.drop_item())
+ return
user << "You put [P] in [src]. "
- user.drop_item()
P.loc = src
icon_state = "[initial(icon_state)]-open"
sleep(5)
diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm
index b75140b9c43..6f725e04187 100644
--- a/code/modules/paperwork/folders.dm
+++ b/code/modules/paperwork/folders.dm
@@ -31,7 +31,8 @@
/obj/item/weapon/folder/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/paper) || istype(W, /obj/item/weapon/photo) || istype(W, /obj/item/documents))
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
user << "You put [W] into [src]. "
update_icon()
diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm
index 96c8f83e2b0..bd947c4b7a3 100644
--- a/code/modules/paperwork/handlabeler.dm
+++ b/code/modules/paperwork/handlabeler.dm
@@ -55,8 +55,9 @@
/obj/item/weapon/hand_labeler/attackby(obj/item/I as obj, mob/user as mob, params)
..()
if(istype(I, /obj/item/hand_labeler_refill))
+ if(!user.unEquip(I))
+ return
user << "You insert [I] into [src]. "
- user.drop_item()
qdel(I)
labels_left = initial(labels_left)
return
diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm
index fbad5ce1f85..dd672a6d11c 100644
--- a/code/modules/paperwork/paperbin.dm
+++ b/code/modules/paperwork/paperbin.dm
@@ -71,7 +71,8 @@
if(!istype(i))
return ..()
- user.drop_item()
+ if(!user.unEquip(i))
+ return
i.loc = src
user << "You put [i] in [src]. "
papers.Add(i)
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index 341155a3721..d5efcbe8dd4 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -24,6 +24,9 @@
pressure_resistance = 2
var/colour = "black" //what colour the ink is!
+/obj/item/weapon/pen/suicide_act(mob/user)
+ user.visible_message("[user] is scribbling numbers all over themself with [src]! It looks like they're trying to commit sudoku! ")
+ return(BRUTELOSS)
/obj/item/weapon/pen/blue
desc = "It's a normal blue ink pen."
@@ -93,26 +96,30 @@
if(M.client)
M.mind_initialize() //give them a mind datum if they don't have one.
if(user.mind in ticker.mode.A_bosses)
- if(ticker.mode.add_gangster(M.mind,"A"))
- M.Paralyse(5)
- cooldown(ticker.mode.A_gang.len, )
- else
- user << "This mind is resistant to recruitment! "
+ var/recruitable = ticker.mode.add_gangster(M.mind,"A")
+ switch(recruitable)
+ if(2)
+ M.Paralyse(5)
+ cooldown(max(0,ticker.mode.B_gang.len - ticker.mode.A_gang.len))
+ if(1)
+ user << "This mind has already been recruited by another gang! "
+ else
+ user << "This mind is resistant to recruitment! "
else if(user.mind in ticker.mode.B_bosses)
- if(ticker.mode.add_gangster(M.mind,"B"))
- M.Paralyse(5)
- cooldown(ticker.mode.B_gang.len)
- else
- user << "This mind is resistant to recruitment! "
- else
- user << "This mind is so vacant that it is not susceptible to influence! "
+ var/recruitable = ticker.mode.add_gangster(M.mind,"B")
+ switch(recruitable)
+ if(2)
+ M.Paralyse(5)
+ cooldown(max(0,ticker.mode.A_gang.len - ticker.mode.B_gang.len))
+ if(1)
+ user << "This mind has already been recruited by another gang! "
+ else
+ user << "This mind is resistant to recruitment! "
/obj/item/weapon/pen/gang/proc/cooldown(modifier)
- if(!modifier)
- return
cooldown = 1
icon_state = "pen_blink"
- spawn(600)
+ spawn(max(50,1200-(modifier*100)))
cooldown = 0
icon_state = "pen"
var/mob/M = get(src, /mob)
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index 92f82705db9..35e87edada7 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -223,7 +223,8 @@
/obj/machinery/photocopier/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/weapon/paper))
if(copier_empty())
- user.drop_item()
+ if(!user.drop_item())
+ return
copy = O
O.loc = src
user << "You insert [O] into [src]. "
@@ -234,7 +235,8 @@
else if(istype(O, /obj/item/weapon/photo))
if(copier_empty())
- user.drop_item()
+ if(!user.drop_item())
+ return
photocopy = O
O.loc = src
user << "You insert [O] into [src]. "
@@ -245,7 +247,8 @@
else if(istype(O, /obj/item/device/toner))
if(toner <= 0)
- user.drop_item()
+ if(!user.drop_item())
+ return
qdel(O)
toner = 40
user << "You insert [O] into [src]. "
diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm
index 378ec945f85..0832ab226f3 100644
--- a/code/modules/paperwork/photography.dm
+++ b/code/modules/paperwork/photography.dm
@@ -140,8 +140,9 @@
if(pictures_left)
user << "[src] still has some film in it! "
return
+ if(!user.unEquip(I))
+ return
user << "You insert [I] into [src]. "
- user.drop_item()
qdel(I)
pictures_left = pictures_max
return
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index de17516ede9..c57cd9b9875 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -413,7 +413,8 @@
if (stat & MAINT)
user << "There is no connector for your power cell! "
return
- user.drop_item()
+ if(!user.drop_item())
+ return
W.loc = src
cell = W
user.visible_message(\
@@ -580,14 +581,10 @@
user << "Nothing happens! "
else
flick("apc-spark", src)
- if (do_after(user,6))
- if(prob(50))
- emagged = 1
- locked = 0
- user << "You emag the APC interface. "
- update_icon()
- else
- user << "You fail to [ locked ? "unlock" : "lock"] the APC interface! "
+ emagged = 1
+ locked = 0
+ user << "You emag the APC interface. "
+ update_icon()
// attack with hand - remove cell (if cover open) or interact with the APC
@@ -1251,4 +1248,4 @@
/obj/item/weapon/module/power_control
name = "power control module"
icon_state = "power_mod"
- desc = "Heavy-duty switching circuits for power control."
\ No newline at end of file
+ desc = "Heavy-duty switching circuits for power control."
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 00eb9f8c827..3608dde2b80 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -347,6 +347,8 @@
src.add_fingerprint(user)
var/obj/item/weapon/light/L = W
if(istype(L, light_type))
+ if(!user.drop_item())
+ return
status = L.status
user << "You insert the [L.name]. "
switchcount = L.switchcount
@@ -355,7 +357,6 @@
on = has_power()
update()
- user.drop_item() //drop the item to update overlays and such
qdel(L)
if(on && rigged)
diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm
index 3202414ffb7..82c2955ad09 100644
--- a/code/modules/power/singularity/collector.dm
+++ b/code/modules/power/singularity/collector.dm
@@ -64,7 +64,8 @@ var/global/list/rad_collectors = list()
if(src.P)
user << "There's already a plasma tank loaded! "
return 1
- user.drop_item()
+ if(!user.drop_item())
+ return 1
src.P = W
W.loc = src
update_icons()
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index 92d7b8105c1..1ab4c078d11 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -89,15 +89,15 @@
if(src.active==1)
src.active = 0
user << "You turn off \the [src]. "
- message_admins("Emitter turned off by [key_name(user, user.client)](? ) in ([x],[y],[z] - JMP )",0,1)
- log_game("Emitter turned off by [user.ckey]([user]) in ([x],[y],[z])")
- investigate_log("turned off by [user.key]","singulo")
+ message_admins("Emitter turned off by [key_name_admin(user)](? ) (FLW ) in ([x],[y],[z] - JMP )",0,1)
+ log_game("Emitter turned off by [key_name(user)] in ([x],[y],[z])")
+ investigate_log("turned off by [key_name(user)]","singulo")
else
src.active = 1
user << "You turn on \the [src]. "
src.shot_number = 0
src.fire_delay = maximum_fire_delay
- investigate_log("turned on by [user.key]","singulo")
+ investigate_log("turned on by [key_name(user)]","singulo")
update_icon()
else
user << "The controls are locked! "
diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm
index da304074573..c5fe52da089 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_control.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm
@@ -119,9 +119,9 @@
if(strength > strength_upper_limit)
strength = strength_upper_limit
else
- message_admins("PA Control Computer increased to [strength] by [key_name(usr, usr.client)](? ) in ([x],[y],[z] - JMP )",0,1)
- log_game("PA Control Computer increased to [strength] by [usr.ckey]([usr]) in ([x],[y],[z])")
- investigate_log("increased to [strength] by [usr.key]","singulo")
+ message_admins("PA Control Computer increased to [strength] by [key_name_admin(usr)](? ) (FLW ) in ([x],[y],[z] - JMP )",0,1)
+ log_game("PA Control Computer increased to [strength] by [key_name(usr)] in ([x],[y],[z])")
+ investigate_log("increased to [strength] by [key_name(usr)]","singulo")
strength_change()
/obj/machinery/particle_accelerator/control_box/proc/remove_strength(var/s)
@@ -130,9 +130,9 @@
if(strength < 0)
strength = 0
else
- message_admins("PA Control Computer decreased to [strength] by [key_name(usr, usr.client)](? ) in ([x],[y],[z] - JMP )",0,1)
- log_game("PA Control Computer decreased to [strength] by [usr.ckey]([usr]) in ([x],[y],[z])")
- investigate_log("decreased to [strength] by [usr.key]","singulo")
+ message_admins("PA Control Computer decreased to [strength] by [key_name_admin(usr)](? ) (FLW ) in ([x],[y],[z] - JMP )",0,1)
+ log_game("PA Control Computer decreased to [strength] by [key_name(usr)] in ([x],[y],[z])")
+ investigate_log("decreased to [strength] by [key_name(usr)]","singulo")
strength_change()
/obj/machinery/particle_accelerator/control_box/power_change()
@@ -210,9 +210,9 @@
/obj/machinery/particle_accelerator/control_box/proc/toggle_power()
src.active = !src.active
- investigate_log("turned [active?"ON ":"OFF "] by [usr ? usr.key : "outside forces"]","singulo")
- message_admins("PA Control Computer turned [active ?"ON":"OFF"] by [usr ? key_name(usr, usr.client) : "outside forces"](? ) in ([x],[y],[z] - JMP )",0,1)
- log_game("PA Control Computer turned [active ?"ON":"OFF"] by [usr ? "[usr.ckey]([usr])" : "outside forces"] in ([x],[y],[z])")
+ investigate_log("turned [active?"ON ":"OFF "] by [usr ? key_name(usr) : "outside forces"]","singulo")
+ message_admins("PA Control Computer turned [active ?"ON":"OFF"] by [usr ? key_name_admin(usr) : "outside forces"](? ) (FLW ) in ([x],[y],[z] - JMP )",0,1)
+ log_game("PA Control Computer turned [active ?"ON":"OFF"] by [usr ? "[key_name(usr)]" : "outside forces"] in ([x],[y],[z])")
if(src.active)
src.use_power = 2
for(var/obj/structure/particle_accelerator/part in connected_parts)
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index 85d8089d926..9a30df83891 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -25,6 +25,7 @@
var/target = null //its target. moves towards the target if it has one
var/last_failed_movement = 0//Will not move in the same dir if it couldnt before, will help with the getting stuck on fields thing
var/last_warning
+ var/consumedSupermatter = 0 //If the singularity has eaten a supermatter shard and can go to stage six
allow_spin = 0
/obj/singularity/New(loc, var/starting_energy = 50, var/temp = 0)
//CARN: admin-alert for chuckle-fuckery.
@@ -129,6 +130,8 @@
var/temp_allowed_size = src.allowed_size
if(force_size)
temp_allowed_size = force_size
+ if(temp_allowed_size >= STAGE_SIX && !consumedSupermatter)
+ temp_allowed_size = STAGE_FIVE
switch(temp_allowed_size)
if(STAGE_ONE)
current_size = STAGE_ONE
@@ -185,6 +188,15 @@
grav_pull = 10
consume_range = 4
dissipate = 0 //It cant go smaller due to e loss
+ if(STAGE_SIX) //This only happens if a stage 5 singulo consumes a supermatter shard.
+ current_size = STAGE_SIX
+ icon = 'icons/effects/352x352.dmi'
+ icon_state = "singularity_s11"
+ pixel_x = -160
+ pixel_y = -160
+ grav_pull = 15
+ consume_range = 5
+ dissipate = 0
if(current_size == allowed_size)
investigate_log("grew to size [current_size] ","singulo")
return 1
@@ -199,6 +211,8 @@
investigate_log("collapsed.","singulo")
qdel(src)
return 0
+ if(energy > 2999 && !consumedSupermatter)
+ energy = 2000
switch(energy)//Some of these numbers might need to be changed up later -Mport
if(1 to 199)
allowed_size = STAGE_ONE
@@ -208,8 +222,10 @@
allowed_size = STAGE_THREE
if(1000 to 1999)
allowed_size = STAGE_FOUR
- if(2000 to INFINITY)
+ if(2000 to 2999)
allowed_size = STAGE_FIVE
+ if(3000 to INFINITY)
+ allowed_size = STAGE_SIX
if(current_size != allowed_size)
expand()
return 1
@@ -230,6 +246,11 @@
/obj/singularity/proc/consume(var/atom/A)
var/gain = A.singularity_act(current_size)
src.energy += gain
+ if(istype(A, /obj/machinery/power/supermatter_shard) && !consumedSupermatter)
+ desc = "[initial(desc)] It glows fiercely with inner fire."
+ name = "supermatter-charged [initial(name)]"
+ consumedSupermatter = 1
+ luminosity = 10
return
@@ -326,6 +347,10 @@
toxmob()
if(4)//Stun mobs who lack optic scanners
mezzer()
+ if(5,6) //Sets all nearby mobs on fire
+ if(current_size < STAGE_SIX)
+ return 0
+ combust_mobs()
else
return 0
return 1
@@ -347,6 +372,15 @@
return
+/obj/singularity/proc/combust_mobs()
+ for(var/mob/living/carbon/C in orange(20, src))
+ C.visible_message("[C]'s skin bursts into flame! ", \
+ "You feel an inner fire as your skin is suddenly covered in fire! ")
+ C.adjust_fire_stacks(5)
+ C.IgniteMob()
+ return
+
+
/obj/singularity/proc/mezzer()
for(var/mob/living/carbon/M in oviewers(8, src))
if(istype(M, /mob/living/carbon/brain)) //Ignore brains
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index 77c4aa75751..38bf1d6c869 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -253,8 +253,9 @@
if(!tracker)
if(istype(W, /obj/item/weapon/tracker_electronics))
+ if(!user.drop_item())
+ return
tracker = 1
- user.drop_item()
qdel(W)
user.visible_message("[user] inserts the electronics into the solar assembly.", "You insert the electronics into the solar assembly. ")
return 1
@@ -274,11 +275,13 @@
name = "solar panel control"
desc = "A controller for solar panel arrays."
icon = 'icons/obj/computer.dmi'
- icon_state = "solar"
+ icon_state = "computer"
anchored = 1
density = 1
use_power = 1
idle_power_usage = 250
+ var/icon_screen = "solar"
+ var/icon_keyboard = "power_key"
var/id = 0
var/cdir = 0
var/targetdir = 0 // target angle in manual tracking (since it updates every game minute)
@@ -351,19 +354,17 @@
set_panels(cdir)
/obj/machinery/power/solar_control/update_icon()
- if(stat & BROKEN)
- icon_state = "broken"
- overlays.Cut()
- return
- if(stat & NOPOWER)
- icon_state = "c_unpowered"
- overlays.Cut()
- return
- icon_state = "solar"
overlays.Cut()
+ if(stat & NOPOWER)
+ overlays += "[icon_keyboard]_off"
+ return
+ overlays += icon_keyboard
+ if(stat & BROKEN)
+ overlays += "[icon_state]_broken"
+ else
+ overlays += icon_screen
if(cdir > -1)
overlays += image('icons/obj/computer.dmi', "solcon-o", FLY_LAYER, angle2dir(cdir))
- return
/obj/machinery/power/solar_control/attack_hand(mob/user)
if(!..())
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index a04bf8dda44..8520b330ec3 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -18,7 +18,7 @@
/obj/machinery/power/supermatter_shard
name = "supermatter shard"
- desc = "A strangely translucent and iridescent crystal that looks like it used to be part of a larger structure. You get headaches just from looking at it. "
+ desc = "A strangely translucent and iridescent crystal that looks like it used to be part of a larger structure. You get headaches just from looking at it. "
icon = 'icons/obj/supermatter.dmi'
icon_state = "darkmatter_shard"
density = 1
@@ -187,6 +187,7 @@
return 1
+/obj/machinery/power/supermatter_shard
/obj/machinery/power/supermatter_shard/bullet_act(var/obj/item/projectile/Proj)
var/turf/L = loc
@@ -205,6 +206,16 @@
damage += Proj.damage * config_bullet_energy
return 0
+/obj/machinery/power/supermatter_shard/singularity_act()
+ var/gain = 100
+ investigate_log("Supermatter shard consumed by singularity.","singulo")
+ message_admins("Singularity has consumed a supermatter shard and can now become stage six.")
+ visible_message("[src] is consumed by the singularity! ")
+ for(var/mob/M in mob_list)
+ M << 'sound/effects/supermatter.ogg' //everyone goan know bout this
+ M << "A horrible screeching fills your ears, and a wave of dread washes over you... "
+ qdel(src)
+ return(gain)
/obj/machinery/power/supermatter_shard/attack_paw(mob/user as mob)
return attack_hand(user)
@@ -214,11 +225,11 @@
if(Adjacent(user))
return attack_hand(user)
else
- user << "You attempt to interface with the control circuits but find they are not connected to your network. Maybe in a future firmware update. "
+ user << "You attempt to interface with the control circuits but find they are not connected to your network. Maybe in a future firmware update. "
return
/obj/machinery/power/supermatter_shard/attack_ai(mob/user as mob)
- user << "You attempt to interface with the control circuits but find they are not connected to your network. Maybe in a future firmware update. "
+ user << "You attempt to interface with the control circuits but find they are not connected to your network. Maybe in a future firmware update. "
/obj/machinery/power/supermatter_shard/attack_hand(mob/living/user as mob)
if(!istype(user))
@@ -272,12 +283,12 @@
var/mob/living/user = AM
user.dust()
power += 200
- message_admins("[src] has consumed [key_name(user)]? (JMP) .")
+ message_admins("[src] has consumed [key_name_admin(user)]? (FLW ) (JMP) .")
+ investigate_log("has consumed [key_name(user)].", "supermatter")
else if(isobj(AM) && !istype(AM, /obj/effect))
+ investigate_log("has consumed [AM].", "supermatter")
qdel(AM)
- investigate_log("has consumed [AM].", "supermatter")
-
power += 200
//Some poor sod got eaten, go ahead and irradiate people nearby.
diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm
index 86e3930b58a..405880f4249 100644
--- a/code/modules/power/turbine.dm
+++ b/code/modules/power/turbine.dm
@@ -56,10 +56,8 @@
/obj/machinery/computer/turbine_computer
name = "gas turbine control computer"
desc = "A computer to remotely control a gas turbine"
- icon = 'icons/obj/computer.dmi'
- icon_state = "turbinecomp"
- anchored = 1
- density = 1
+ icon_screen = "turbinecomp"
+ icon_keyboard = "tech_key"
circuit = /obj/item/weapon/circuitboard/turbine_computer
var/obj/machinery/power/compressor/compressor
var/id = 0
diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm
index 48f4b74cd9c..5afe311cb22 100644
--- a/code/modules/projectiles/ammunition/ammo_casings.dm
+++ b/code/modules/projectiles/ammunition/ammo_casings.dm
@@ -31,7 +31,6 @@
caliber = ".45"
projectile_type = /obj/item/projectile/bullet/midbullet
-
/obj/item/ammo_casing/shotgun
name = "shotgun slug"
desc = "A 12 gauge lead slug."
@@ -161,6 +160,18 @@
/obj/item/ammo_casing/shotgun/dart/attackby()
return
+/obj/item/ammo_casing/shotgun/dart/bioterror
+ desc = "A shotgun dart filled with deadly toxins."
+
+/obj/item/ammo_casing/shotgun/dart/bioterror/New()
+ ..()
+ reagents.add_reagent("neurotoxin", 5)
+ reagents.add_reagent("morphine", 5)
+ reagents.add_reagent("spore", 5)
+ reagents.add_reagent("mutetoxin", 5) //;HELP OPS IN MAINT
+ reagents.add_reagent("initropidril", 5)
+ reagents.add_reagent("sodium_thiopental", 5)
+
/obj/item/ammo_casing/a762
desc = "A 7.62mm bullet casing."
icon_state = "762-casing"
@@ -233,7 +244,8 @@
desc = "Its nerf or nothing! ... Although, this one doesn't look too safe."
user << "You pop the safety cap off of [src]. "
else if ((istype(A, /obj/item/weapon/pen)) && modified && !BB.contents.len)
- user.drop_item()
+ if(!user.unEquip(A))
+ return
A.loc = BB
BB.damage = 5
BB.nodamage = 0
diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm
index b1296f8b2cf..3f66bc2b997 100644
--- a/code/modules/projectiles/ammunition/magazines.dm
+++ b/code/modules/projectiles/ammunition/magazines.dm
@@ -53,7 +53,7 @@
desc = "Oh god, this shouldn't be here"
ammo_type = /obj/item/ammo_casing/shotgun/buckshot
caliber = "shotgun"
- max_ammo = 8
+ max_ammo = 6
multiload = 0
/obj/item/ammo_box/magazine/internal/cylinder/dualshot
@@ -134,6 +134,17 @@
..()
icon_state = "45-[ammo_count() ? "8" : "0"]"
+/obj/item/ammo_box/magazine/uzim9mm
+ name = "uzi magazine (9mm)"
+ icon_state = "uzi9mm-32"
+ ammo_type = /obj/item/ammo_casing/c9mm
+ caliber = "9mm"
+ max_ammo = 32
+
+/obj/item/ammo_box/magazine/uzim9mm/update_icon()
+ ..()
+ icon_state = "uzi9mm-[round(ammo_count(),4)]"
+
/obj/item/ammo_box/magazine/smgm9mm
name = "SMG magazine (9mm)"
icon_state = "smg9mm-20"
@@ -203,10 +214,11 @@ obj/item/ammo_box/magazine/tommygunm45
icon_state = "a762-[round(ammo_count(),10)]"
+
/obj/item/ammo_box/magazine/m12g
- name = "shotgun magazine (12g buckshot)"
+ name = "shotgun magazine (12g slugs)"
icon_state = "m12gb"
- ammo_type = /obj/item/ammo_casing/shotgun/buckshot
+ ammo_type = /obj/item/ammo_casing/shotgun
origin_tech = "combat=3;syndicate=1"
caliber = "shotgun"
max_ammo = 8
@@ -215,6 +227,11 @@ obj/item/ammo_box/magazine/tommygunm45
..()
icon_state = "[initial(icon_state)]-[Ceiling(ammo_count(0)/8)*8]"
+/obj/item/ammo_box/magazine/m12g/buckshot
+ name = "shotgun magazine (12g buckshot slugs)"
+ icon_state = "m12gb"
+ ammo_type = /obj/item/ammo_casing/shotgun/buckshot
+
/obj/item/ammo_box/magazine/m12g/stun
name = "shotgun magazine (12g taser slugs)"
icon_state = "m12gs"
@@ -225,6 +242,11 @@ obj/item/ammo_box/magazine/tommygunm45
icon_state = "m12gf"
ammo_type = /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath
+/obj/item/ammo_box/magazine/m12g/bioterror
+ name = "shotgun magazine (12g bioterror)"
+ icon_state = "m12gt"
+ ammo_type = /obj/item/ammo_casing/shotgun/dart/bioterror
+
/obj/item/ammo_box/magazine/toy
name = "foam force META magazine"
ammo_type = /obj/item/ammo_casing/caseless/foam_dart
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 9b1666fd2f0..dd9c381e2d6 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -98,8 +98,8 @@
if(heavy_weapon)
if(user.get_inactive_hand())
if(prob(15))
- user.visible_message("[src] flies out of [user]'s hands! ", "[src] kicks out of your grip! ")
- user.drop_item()
+ if(user.drop_item())
+ user.visible_message("[src] flies out of [user]'s hands! ", "[src] kicks out of your grip! ")
/obj/item/weapon/gun/emp_act(severity)
for(var/obj/O in contents)
@@ -235,7 +235,8 @@
if(user.l_hand != src && user.r_hand != src)
user << "You'll need [src] in your hands to do that! "
return
- user.drop_item()
+ if(!user.unEquip(A))
+ return
user << "You click [S] into place on [src]. "
if(S.on)
SetLuminosity(0)
diff --git a/code/modules/projectiles/guns/grenade_launcher.dm b/code/modules/projectiles/guns/grenade_launcher.dm
index 9ae8b1e8c6f..2075ebeaa60 100644
--- a/code/modules/projectiles/guns/grenade_launcher.dm
+++ b/code/modules/projectiles/guns/grenade_launcher.dm
@@ -20,7 +20,8 @@
if((istype(I, /obj/item/weapon/grenade)))
if(grenades.len < max_grenades)
- user.drop_item()
+ if(!user.unEquip(I))
+ return
I.loc = src
grenades += I
user << "You put the grenade in the grenade launcher. "
diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm
index 66184119b45..7bea46b2f96 100644
--- a/code/modules/projectiles/guns/projectile.dm
+++ b/code/modules/projectiles/guns/projectile.dm
@@ -68,7 +68,8 @@
if(user.l_hand != src && user.r_hand != src)
user << "You'll need [src] in your hands to do that. "
return
- user.drop_item()
+ if(!user.unEquip(A))
+ return
user << "You screw [S] onto [src]. "
suppressed = A
S.oldsound = fire_sound
diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm
index 8a6ffca294b..19545232181 100644
--- a/code/modules/projectiles/guns/projectile/automatic.dm
+++ b/code/modules/projectiles/guns/projectile/automatic.dm
@@ -106,7 +106,13 @@
icon_state = "c20r[magazine ? "-[Ceiling(get_ammo(0)/4)*4]" : ""][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]"
return
-
+/obj/item/weapon/gun/projectile/automatic/mini_uzi
+ name = "uzi"
+ desc = "A lightweight, burst-fire submachine gun, for when you really want someone dead. Uses 9mm rounds."
+ icon_state = "mini-uzi"
+ origin_tech = "combat=5;materials=2;syndicate=8"
+ mag_type = /obj/item/ammo_box/magazine/uzim9mm
+ burst_size = 2
/obj/item/weapon/gun/projectile/automatic/l6_saw
name = "syndicate LMG"
@@ -231,7 +237,7 @@
/obj/item/weapon/gun/projectile/automatic/tommygun
name = "thompson SMG"
- desc = "A genuine 'Chicago Typewriter'."
+ desc = "Based on the classic 'Chicago Typewriter'."
icon_state = "tommygun"
item_state = "shotgun"
w_class = 5
diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm
index 471b5401196..9e1dc22e592 100644
--- a/code/modules/projectiles/guns/projectile/revolver.dm
+++ b/code/modules/projectiles/guns/projectile/revolver.dm
@@ -37,7 +37,7 @@
CB.update_icon()
num_unloaded++
if (num_unloaded)
- user << "You unload [num_unloaded] shell\s from [src]. "
+ user << "You unload [num_unloaded] shell\s from [src]. "
else
user << "[src] is empty! "
@@ -79,7 +79,7 @@
playsound(user, fire_sound, 50, 1)
user << "[src] blows up in your face! "
user.take_organ_damage(0,20)
- user.drop_item()
+ user.unEquip(src)
qdel(src)
return 0
..()
@@ -170,7 +170,7 @@
CB.update_icon()
num_unloaded++
if (num_unloaded)
- user << "You unload [num_unloaded] shell\s from [src]. "
+ user << "You unload [num_unloaded] shell\s from [src]. "
else
user << "[src] is empty. "
diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm
index e5d5b462c6d..56a312e9c19 100644
--- a/code/modules/projectiles/guns/projectile/shotgun.dm
+++ b/code/modules/projectiles/guns/projectile/shotgun.dm
@@ -62,16 +62,6 @@
if (chambered)
user << "A [chambered.BB ? "live" : "spent"] one is in the chamber."
-// COMBAT SHOTGUN //
-
-/obj/item/weapon/gun/projectile/shotgun/combat
- name = "combat shotgun"
- desc = "A traditional shotgun with tactical furniture and an eight-shell capacity underneath."
- icon_state = "cshotgun"
- origin_tech = "combat=5;materials=2"
- mag_type = /obj/item/ammo_box/magazine/internal/shotcom
- w_class = 5
-
// RIOT SHOTGUN //
/obj/item/weapon/gun/projectile/shotgun/riot //for spawn in the armory
@@ -173,7 +163,7 @@
CB.update_icon()
num_unloaded++
if (num_unloaded)
- user << "You break open \the [src] and unload [num_unloaded] shell\s. "
+ user << "You break open \the [src] and unload [num_unloaded] shell\s. "
else
user << "[src] is empty! "
@@ -293,3 +283,17 @@
..()
empty_alarm()
return
+
+/obj/item/weapon/gun/projectile/shotgun/automatic/shoot_live_shot(mob/living/user as mob|obj)
+ ..()
+ src.pump(user)
+
+// COMBAT SHOTGUN //
+
+/obj/item/weapon/gun/projectile/shotgun/automatic/combat
+ name = "combat shotgun"
+ desc = "A semi automatic shotgun with tactical furniture and a six-shell capacity underneath."
+ icon_state = "cshotgun"
+ origin_tech = "combat=5;materials=2"
+ mag_type = /obj/item/ammo_box/magazine/internal/shotcom
+ w_class = 5
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/syringe_gun.dm b/code/modules/projectiles/guns/syringe_gun.dm
index 2fb641d6c56..6ed12b01b64 100644
--- a/code/modules/projectiles/guns/syringe_gun.dm
+++ b/code/modules/projectiles/guns/syringe_gun.dm
@@ -56,14 +56,15 @@
S.loc = user.loc
syringes.Remove(S)
- user << "You unload [S] from \the [src]. "
+ user << "You unload [S] from \the [src]. "
return 1
/obj/item/weapon/gun/syringe/attackby(var/obj/item/A as obj, mob/user as mob, params, var/show_msg = 1)
if(istype(A, /obj/item/weapon/reagent_containers/syringe))
if(syringes.len < max_syringes)
- user.drop_item()
+ if(!user.unEquip(A))
+ return
user << "You load [A] into \the [src]. "
syringes.Add(A)
A.loc = src
diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm
index acc5f311420..123e35a2fd8 100644
--- a/code/modules/projectiles/pins.dm
+++ b/code/modules/projectiles/pins.dm
@@ -30,7 +30,8 @@
user << "You remove [G]'s old pin. "
if(!G.pin)
- user.drop_item()
+ if(!user.unEquip(src))
+ return
gun_insert(user, G)
user << "You insert [src] into [G]. "
else
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 9542c6a289d..8fc1a4622f9 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -16,7 +16,7 @@
var/atom/original = null // the original target clicked
var/turf/starting = null // the projectile's starting turf
var/list/permutated = list() // we've passed through these atoms, don't try to hit them again
-
+ var/paused = FALSE //for suspending the projectile midair
var/p_x = 16
var/p_y = 16 // the pixel location of the tile that the player clicked. Default is the center
@@ -108,7 +108,6 @@
loc = target_turf
if(A)
permutated.Add(A)
- Range()
return 0
else
if(A && A.density && !ismob(A) && !(A.flags & ON_BORDER)) //if we hit a dense non-border obj or dense turf then we also hit one of the mobs on that tile.
@@ -130,17 +129,19 @@
if(kill_count < 1)
qdel(src)
return
- kill_count--
- if((!( current ) || loc == current))
- current = locate(Clamp(x+xo,1,world.maxx),Clamp(y+yo,1,world.maxy),z)
- step_towards(src, current)
- if((original && original.layer>=2.75) || ismob(original))
- if(loc == get_turf(original))
- if(!(original in permutated))
- Bump(original, 1)
+ if(!paused)
+ kill_count--
+ if((!( current ) || loc == current))
+ current = locate(Clamp(x+xo,1,world.maxx),Clamp(y+yo,1,world.maxy),z)
+ step_towards(src, current)
+ if((original && original.layer>=2.75) || ismob(original))
+ if(loc == get_turf(original))
+ if(!(original in permutated))
+ Bump(original, 1)
Range()
sleep(1)
+
/obj/item/projectile/Crossed(atom/movable/AM as mob) //A mob moving on a tile with a projectile is hit by it.
..()
if(isliving(AM) && AM.density && !checkpass(PASSMOB))
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index e87808254e6..00cd2fc1a42 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -30,6 +30,7 @@
icon_state = "xray"
damage = 15
irradiate = 30
+ range = 15
forcedodge = 1
/obj/item/projectile/beam/disabler
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index d2f5b3bcc38..efc20cedfd7 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -227,9 +227,10 @@
ready_dna(H)
if(H.dna && prob(50))
var/list/all_species = list()
- for(var/datum/species/S in typesof(/datum/species) - /datum/species)
+ for(var/speciestype in typesof(/datum/species) - /datum/species)
+ var/datum/species/S = new speciestype()
if(!S.dangerous_existence)
- all_species += S
+ all_species += speciestype
hardset_dna(H, null, null, null, null, pick(all_species))
H.update_icons()
else
@@ -268,7 +269,7 @@
S.icon = change.icon
if(H.mind)
H.mind.transfer_to(S)
- S << "You are an animate statue. You cannot move when monitored, but are nearly invincible and deadly when unobserved! Do not harm [firer.name], your creator. "
+ S << "You are an animate statue. You cannot move when monitored, but are nearly invincible and deadly when unobserved! Do not harm [firer.name], your creator. "
H = change
H.loc = S
qdel(src)
diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm
index 49461bfc6fc..94e40614ab8 100644
--- a/code/modules/reagents/Chemistry-Holder.dm
+++ b/code/modules/reagents/Chemistry-Holder.dm
@@ -260,7 +260,7 @@ var/const/INGEST = 2
R.addiction_act_stage4(M)
R.addiction_stage++
if(R.addiction_stage > 40)
- M << "You feel like you've gotten over your need for [R.name]. "
+ M << "You feel like you've gotten over your need for [R.name]. "
addiction_list.Remove(R)
addiction_tick++
update_total()
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index 3dab9a3442a..0fbb8ee12b3 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -155,9 +155,10 @@
if(src.beaker)
user << "A beaker is already loaded into the machine! "
return
+ if(!user.drop_item())
+ return
src.beaker = B
- user.drop_item()
B.loc = src
user << "You add the beaker to the machine. "
SSnano.update_uis(src) // update all UIs attached to src
@@ -290,8 +291,10 @@
if(src.beaker)
user << "A beaker is already loaded into the machine! "
return
+ if(!user.drop_item())
+ return
+
src.beaker = B
- user.drop_item()
B.loc = src
user << "You add the beaker to the machine. "
src.updateUsrDialog()
@@ -301,8 +304,10 @@
if(src.loaded_pill_bottle)
user << "A pill bottle is already loaded into the machine! "
return
+ if(!user.drop_item())
+ return
+
src.loaded_pill_bottle = B
- user.drop_item()
B.loc = src
user << "You add the pill bottle into the dispenser slot. "
src.updateUsrDialog()
@@ -619,8 +624,10 @@
if(src.beaker)
user << "A beaker is already loaded into the machine! "
return
+ if(!user.drop_item())
+ return
+
src.beaker = B
- user.drop_item()
B.loc = src
user << "You add the beaker to the machine. "
src.updateUsrDialog()
@@ -630,8 +637,10 @@
if(src.loaded_pill_bottle)
user << "A pill bottle is already loaded into the machine! "
return
+ if(!user.drop_item())
+ return
+
src.loaded_pill_bottle = B
- user.drop_item()
B.loc = src
user << "You add the pill bottle into the dispenser slot. "
src.updateUsrDialog()
@@ -919,9 +928,10 @@
if(src.beaker)
user << "A beaker is already loaded into the machine! "
return
+ if(!user.drop_item())
+ return
src.beaker = I
- user.drop_item()
I.loc = src
user << "You add the beaker to the machine. "
src.updateUsrDialog()
@@ -1053,8 +1063,9 @@
if (beaker)
return 1
else
+ if(!user.drop_item())
+ return 1
src.beaker = O
- user.drop_item()
O.loc = src
update_icon()
src.updateUsrDialog()
@@ -1548,8 +1559,9 @@
if (beaker)
return 1
else
+ if(!user.drop_item())
+ return 1
src.beaker = O
- user.drop_item()
O.loc = src
update_icon()
src.updateUsrDialog()
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index 2dede1c153d..2934c57a3c0 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -115,26 +115,26 @@
return
/datum/reagent/proc/overdose_start(var/mob/living/M as mob)
- M << "You feel like you took too much of [name]! "
+ M << "You feel like you took too much of [name]! "
return
/datum/reagent/proc/addiction_act_stage1(var/mob/living/M as mob)
if(prob(30))
- M << "You feel like some [name] right about now. "
+ M << "You feel like some [name] right about now. "
return
/datum/reagent/proc/addiction_act_stage2(var/mob/living/M as mob)
if(prob(30))
- M << "You feel like you need [name]. You just can't get enough. "
+ M << "You feel like you need [name]. You just can't get enough. "
return
/datum/reagent/proc/addiction_act_stage3(var/mob/living/M as mob)
if(prob(30))
- M << "You have an intense craving for [name]. "
+ M << "You have an intense craving for [name]. "
return
/datum/reagent/proc/addiction_act_stage4(var/mob/living/M as mob)
if(prob(30))
- M << "You're not feeling good at all! You really need some [name]. "
+ M << "You're not feeling good at all! You really need some [name]. "
return
diff --git a/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm
index a764dc654bf..c9ade32e68b 100644
--- a/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm
@@ -211,4 +211,4 @@
if(message_living && !issilicon(M))
totalmessage += message_living
totalmessage += "!"
- M << "[totalmessage] "
\ No newline at end of file
+ M << "[totalmessage] "
\ No newline at end of file
diff --git a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm
index 1ea2c600caa..7fd49928443 100644
--- a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm
@@ -57,7 +57,7 @@
overdose_threshold = 200 // Hyperglycaemic shock
/datum/reagent/consumable/sugar/overdose_start(var/mob/living/M as mob)
- M << "You go into hyperglycaemic shock! Lay off the twinkies! "
+ M << "You go into hyperglycaemic shock! Lay off the twinkies! "
M.sleeping += 30
return
diff --git a/code/modules/reagents/Chemistry-Reagents/Drug-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Drug-Reagents.dm
index 0b9f8c70847..579caddc98a 100644
--- a/code/modules/reagents/Chemistry-Reagents/Drug-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Drug-Reagents.dm
@@ -172,7 +172,7 @@
if(prob(20))
M.emote("laugh")
if(prob(33))
- M.visible_message("[M]'s hands flip out and flail everywhere! ")
+ M.visible_message("[M]'s hands flip out and flail everywhere! ")
var/obj/item/I = M.get_active_hand()
if(I)
M.drop_item()
diff --git a/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm
index e65a5e81de4..bbb31522bbb 100644
--- a/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm
@@ -494,7 +494,7 @@
if(3)
var/mob/living/carbon/human/H = M
if(!H.heart_attack)
- H.visible_message("[H] clutches at their chest as if their heart stopped! ")
+ H.visible_message("[H] clutches at their chest as if their heart stopped! ")
H.heart_attack = 1 // rip in pepperoni
else
H.losebreath += 10
diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm
index 7cdb73ae78a..9555c8a126a 100644
--- a/code/modules/reagents/Chemistry-Recipes.dm
+++ b/code/modules/reagents/Chemistry-Recipes.dm
@@ -59,7 +59,7 @@
var/mob/M = get(A, /mob)
if(M)
- message += " - Carried By: [M.real_name] ([M.key]) (PP ) (? )"
+ message += " - Carried By: [key_name_admin(M)](? ) (FLW )"
else
message += " - Last Fingerprint: [(A.fingerprintslast ? A.fingerprintslast : "N/A")]"
diff --git a/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm b/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm
index fedbc5d0904..4b265fae1b9 100644
--- a/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm
+++ b/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm
@@ -59,7 +59,7 @@
required_reagents = list("blackpowder" = 1)
result_amount = 1
required_temp = 474
- mix_message = "Sparks start flying around the black powder! "
+ mix_message = "Sparks start flying around the black powder! "
/datum/chemical_reaction/blackpowder_explosion/on_reaction(var/datum/reagents/holder, var/created_volume)
sleep(rand(50,100))
diff --git a/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm b/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm
index be029b2220a..7c26d80e4c2 100644
--- a/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm
+++ b/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm
@@ -533,11 +533,29 @@
P.loc = get_turf(holder.my_atom)
//Sepia
+/datum/chemical_reaction/slimestop
+ name = "Slime Stop"
+ id = "m_stop"
+ result = null
+ required_reagents = list("plasma" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/sepia
+ required_other = 1
+
+/datum/chemical_reaction/slimestop/on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ var/mob/mob = get_mob_by_key(holder.my_atom.fingerprintslast)
+ var/obj/effect/timestop/T = new /obj/effect/timestop
+ T.loc = get_turf(holder.my_atom)
+ T.immune = mob
+ T.timestop()
+
+
/datum/chemical_reaction/slimecamera
name = "Slime Camera"
id = "m_camera"
result = null
- required_reagents = list("plasma" = 1)
+ required_reagents = list("blood" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/sepia
required_other = 1
@@ -551,7 +569,7 @@
name = "Slime Film"
id = "m_film"
result = null
- required_reagents = list("blood" = 1)
+ required_reagents = list("water" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/sepia
required_other = 1
@@ -561,7 +579,10 @@
var/obj/item/device/camera_film/P = new /obj/item/device/camera_film
P.loc = get_turf(holder.my_atom)
+
//Pyrite
+
+
/datum/chemical_reaction/slimepaint
name = "Slime Paint"
id = "s_paint"
@@ -577,4 +598,4 @@
var/chosen = pick(paints)
var/obj/P = new chosen
if(P)
- P.loc = get_turf(holder.my_atom)
\ No newline at end of file
+ P.loc = get_turf(holder.my_atom)
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index 4ef5f0d72ed..553f6c9cfbc 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -157,7 +157,8 @@
/obj/structure/reagent_dispensers/water_cooler/attackby(var/obj/item/I, var/mob/user, params)
if(istype(I, /obj/item/weapon/paper))
- user.drop_item()
+ if(!user.drop_item())
+ return
qdel(I)
cups++
return
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index c17ab572aca..74f51bf24e2 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -110,7 +110,7 @@
if(istype(I, /obj/item/weapon/storage/bag/trash))
var/obj/item/weapon/storage/bag/trash/T = I
- user << " You empty the bag. "
+ user << "You empty the bag. "
for(var/obj/item/O in T.contents)
T.remove_from_storage(O,src)
T.update_icon()
@@ -123,9 +123,9 @@
stuff_mob_in(G.affecting, user)
return
- if(!I || I.flags & NODROP) return
+ if(!user.drop_item())
+ return
- user.drop_item()
I.loc = src
user.visible_message("[user.name] places \the [I] into \the [src].", \
"You place \the [I] into \the [src]. ")
@@ -345,7 +345,8 @@
src.updateDialog()
if(flush && air_contents.return_pressure() >= SEND_PRESSURE ) // flush can happen even without power
- flush()
+ spawn(0)
+ flush()
if(stat & NOPOWER) // won't charge if no power
return
@@ -378,39 +379,32 @@
update()
return
-// perform a flush
/obj/machinery/disposal/proc/flush()
-
flushing = 1
- flick("[icon_state]-flush", src)
-
- var/wrapcheck = 0
- var/obj/structure/disposalholder/H = new() // virtual holder object which actually
- // travels through the pipes.
- for(var/obj/item/smallDelivery/O in src)
- wrapcheck = 1
-
- if(wrapcheck == 1)
- H.tomail = 1
-
+ flushAnimation()
+ var/obj/structure/disposalholder/H = new()
+ newHolderDestination(H)
sleep(10)
if(last_sound < world.time + 1)
playsound(src, 'sound/machines/disposalflush.ogg', 50, 0, 0)
last_sound = world.time
- sleep(5) // wait for animation to finish
-
- H.init(src) // copy the contents of disposer to holder
- air_contents = new() // new empty gas resv.
-
- H.start(src) // start the holder processing movement
+ sleep(5)
+ H.init(src)
+ air_contents = new()
+ H.start(src)
flushing = 0
- // now reset disposal state
flush = 0
- if(mode == 2) // if was ready,
- mode = 1 // switch to charging
+ if(mode == 2)
+ mode = 1
update()
- return
+/obj/machinery/disposal/proc/newHolderDestination(obj/structure/disposalholder/H)
+ for(var/obj/item/smallDelivery/O in src)
+ H.tomail = 1
+ return
+
+/obj/machinery/disposal/proc/flushAnimation()
+ flick("[icon_state]-flush", src)
// called when area power changes
/obj/machinery/disposal/power_change()
@@ -490,6 +484,8 @@
//hasmob effects whether the package goes to cargo or its tagged destination.
for(var/mob/living/M in D)
if(M && M.stat != DEAD)
+ if(M.client)
+ M.client.eye = src
hasmob = 1
//Checks 1 contents level deep. This means that players can be sent through disposals...
@@ -498,6 +494,8 @@
if(O.contents)
for(var/mob/living/M in O.contents)
if(M && M.stat != DEAD)
+ if(M.client)
+ M.client.eye = src
hasmob = 1
// now everything inside the disposal gets put into the holder
@@ -542,8 +540,6 @@
active = 0
return
-
-
// find the turf which should contain the next pipe
/obj/structure/disposalholder/proc/nextloc()
return get_step(loc,dir)
@@ -979,7 +975,7 @@
sortType = O.currTag
playsound(src.loc, 'sound/machines/twobeep.ogg', 100, 1)
var/tag = uppertext(TAGGERLOCATIONS[O.currTag])
- user << " Changed filter to [tag]. "
+ user << "Changed filter to [tag]. "
updatedesc()
@@ -1327,4 +1323,4 @@
else
dirs = alldirs.Copy()
- src.streak(dirs)
+ src.streak(dirs)
\ No newline at end of file
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index de834c2d80f..f4495358aed 100644
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -234,8 +234,6 @@
desc = "A chute for big and small packages alike!"
density = 1
icon_state = "intake"
-
- var/start_flush = 0
var/c_mode = 0
/obj/machinery/disposal/deliveryChute/New(loc,var/obj/structure/disposalconstruct/make_from)
@@ -287,40 +285,11 @@
/obj/mecha/disposalEnterTry()
return
-/obj/machinery/disposal/deliveryChute/flush()
- flushing = 1
+/obj/machinery/disposal/deliveryChute/flushAnimation()
flick("intake-closing", src)
- var/deliveryCheck = 0
- var/obj/structure/disposalholder/H = new() // virtual holder object which actually
- // travels through the pipes.
-/* for(var/obj/structure/bigDelivery/O in src)
- deliveryCheck = 1
- if(O.sortTag == 0) //This auto-sorts package wrapped objects to disposals
- O.sortTag = 1 //Cargo techs can do this themselves with their taggers
- for(var/obj/item/smallDelivery/O in src) //With this disabled packages will loop back round and come out the mail chute
- deliveryCheck = 1
- if(O.sortTag == 0)
- O.sortTag = 1 */
- if(deliveryCheck == 0)
- H.destinationTag = 1
- sleep(10)
- if((start_flush + 15) < world.time)
- start_flush = world.time
- playsound(src, 'sound/machines/disposalflush.ogg', 50, 0, 0)
- sleep(5) // wait for animation to finish
-
- H.init(src) // copy the contents of disposer to holder
- air_contents = new() // new empty gas resv.
-
- H.start(src) // start the holder processing movement
- flushing = 0
- // now reset disposal state
- flush = 0
- if(mode == 2) // if was ready,
- mode = 1 // switch to charging
- update()
- return
+/obj/machinery/disposal/deliveryChute/newHolderDestination(obj/structure/disposalholder/H)
+ H.destinationTag = 1
/obj/machinery/disposal/deliveryChute/attackby(var/obj/item/I, var/mob/user, params)
if(!I || !user)
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index be722fe8fb0..1eeb4731c18 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -152,9 +152,10 @@
if(O.reliability < 90 && O.crit_fail == 0)
usr << "Item is neither reliable enough or broken enough to learn from. "
return
+ if(!user.drop_item())
+ return
busy = 1
loaded_item = O
- user.drop_item()
O.loc = src
user << "You add the [O.name] to the machine. "
flick("h_lathe_load", src)
@@ -589,8 +590,8 @@
//~~~~~~~~Admin logging proc, aka the Powergamer Alarm~~~~~~~~
/obj/machinery/r_n_d/experimentor/proc/warn_admins(var/mob/user, var/ReactionName)
var/turf/T = get_turf(src)
- message_admins("Experimentor reaction: [ReactionName] generated by [key_name(user, user.client)](? ) at ([T.x],[T.y],[T.z] - JMP )",0,1)
- log_game("Experimentor reaction: [ReactionName] generated by [user.ckey]([user]) in ([T.x],[T.y],[T.z])")
+ message_admins("Experimentor reaction: [ReactionName] generated by [key_name_admin(user)](? ) (FLW ) at ([T.x],[T.y],[T.z] - JMP )",0,1)
+ log_game("Experimentor reaction: [ReactionName] generated by [key_name(user)] in ([T.x],[T.y],[T.z])")
#undef SCANTYPE_POKE
#undef SCANTYPE_IRRADIATE
@@ -733,8 +734,8 @@
//Admin Warning proc for relics
/obj/item/weapon/relic/proc/warn_admins(var/mob/user, var/RelicType, var/priority = 1)
var/turf/T = get_turf(src)
- var/log_msg = "[RelicType] relic used by [user.ckey]([user]) in ([T.x],[T.y],[T.z])"
+ var/log_msg = "[RelicType] relic used by [key_name(user)] in ([T.x],[T.y],[T.z])"
if(priority) //For truly dangerous relics that may need an admin's attention. BWOINK!
- message_admins("[RelicType] relic activated by [key_name(user, user.client)](? ) in ([T.x],[T.y],[T.z] - JMP )",0,1)
+ message_admins("[RelicType] relic activated by [key_name_admin(user)](? ) (FLW ) in ([T.x],[T.y],[T.z] - JMP )",0,1)
log_game(log_msg)
investigate_log(log_msg, "experimentor")
diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm
index 2df53886ab3..6c584bc1a15 100644
--- a/code/modules/research/message_server.dm
+++ b/code/modules/research/message_server.dm
@@ -17,8 +17,9 @@ var/global/list/obj/machinery/message_server/message_servers = list()
var/recipient = "Unspecified" //name of the person
var/sender = "Unspecified" //name of the sender
var/message = "Blank" //transferred message
+ var/image/photo = null //Attached photo
-/datum/data_pda_msg/New(var/param_rec = "",var/param_sender = "",var/param_message = "")
+/datum/data_pda_msg/New(var/param_rec = "",var/param_sender = "",var/param_message = "",var/param_photo=null)
if(param_rec)
recipient = param_rec
@@ -26,6 +27,19 @@ var/global/list/obj/machinery/message_server/message_servers = list()
sender = param_sender
if(param_message)
message = param_message
+ if(param_photo)
+ photo = param_photo
+
+/datum/data_pda_msg/Topic(href,href_list)
+ ..()
+ if(href_list["photo"])
+ var/mob/M = usr
+ M << browse_rsc(photo, "pda_photo.png")
+ M << browse("PDA Photo " \
+ + "" \
+ + " " \
+ + "", "window=book;size=192x192")
+ onclose(M, "PDA Photo")
/datum/data_rc_msg
var/rec_dpt = "Unspecified" //name of the person
@@ -105,8 +119,9 @@ var/global/list/obj/machinery/message_server/message_servers = list()
/obj/machinery/message_server/proc/send_chat_message(var/sender = "", var/channel = "", var/message = "")
chat_msgs += new/datum/data_chat_msg(sender,channel,message)
-/obj/machinery/message_server/proc/send_pda_message(var/recipient = "",var/sender = "",var/message = "")
- pda_msgs += new/datum/data_pda_msg(recipient,sender,message)
+/obj/machinery/message_server/proc/send_pda_message(var/recipient = "",var/sender = "",var/message = "",var/photo=null)
+ . = new/datum/data_pda_msg(recipient,sender,message,photo)
+ pda_msgs += .
/obj/machinery/message_server/proc/send_rc_message(var/recipient = "",var/sender = "",var/message = "",var/stamp = "", var/id_auth = "", var/priority = 1)
rc_msgs += new/datum/data_rc_msg(recipient,sender,message,stamp,id_auth)
diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm
index 9322e7c9286..b616d036397 100644
--- a/code/modules/research/protolathe.dm
+++ b/code/modules/research/protolathe.dm
@@ -145,7 +145,7 @@ Note: Must be placed west/left of and R&D console to function.
if (disabled)
return
if (!linked_console)
- user << " The [src.name] must be linked to an R&D console first! "
+ user << "The [src.name] must be linked to an R&D console first! "
return 1
if (busy)
user << "The [src.name] is busy! Please wait for completion of previous operation. "
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index 1bc794782c6..a194ed5327f 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -31,7 +31,8 @@ won't update every console in existence) but it's more of a hassle to do. Also,
/obj/machinery/computer/rdconsole
name = "R&D Console"
- icon_state = "rdcomp"
+ icon_screen = "rdcomp"
+ icon_keyboard = "rd_key"
circuit = /obj/item/weapon/circuitboard/rdconsole
var/datum/research/files //Stores all the collected research data.
var/obj/item/weapon/disk/tech_disk/t_disk = null //Stores the technology disk.
@@ -154,11 +155,12 @@ won't update every console in existence) but it's more of a hassle to do. Also,
if(istype(D, /obj/item/weapon/disk/tech_disk)) t_disk = D
else if (istype(D, /obj/item/weapon/disk/design_disk)) d_disk = D
else
- user << " Machine cannot accept disks in that format. "
+ user << "Machine cannot accept disks in that format. "
+ return
+ if(!user.drop_item())
return
- user.drop_item()
D.loc = src
- user << " You add the disk to the machine! "
+ user << "You add the disk to the machine! "
else
..()
src.updateUsrDialog()
@@ -168,7 +170,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
if(!emagged)
playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1)
emagged = 1
- user << " You disable the security protocols "
+ user << "You disable the security protocols "
/obj/machinery/computer/rdconsole/Topic(href, href_list)
if(..())
@@ -237,7 +239,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
else if(href_list["eject_item"]) //Eject the item inside the destructive analyzer.
if(linked_destroy)
if(linked_destroy.busy)
- usr << " The destructive analyzer is busy at the moment. "
+ usr << "The destructive analyzer is busy at the moment. "
else if(linked_destroy.loaded_item)
linked_destroy.loaded_item.loc = linked_destroy.loc
@@ -248,7 +250,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
else if(href_list["deconstruct"]) //Deconstruct the item in the destructive analyzer and update the research holder.
if(linked_destroy)
if(linked_destroy.busy)
- usr << " The destructive analyzer is busy at the moment. "
+ usr << "The destructive analyzer is busy at the moment. "
else
var/choice = input("Proceeding will destroy loaded item.") in list("Proceed", "Cancel")
if(choice == "Cancel" || !linked_destroy) return
@@ -261,7 +263,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
linked_destroy.busy = 0
if(!linked_destroy.hacked)
if(!linked_destroy.loaded_item)
- usr <<" The destructive analyzer appears to be empty. "
+ usr <<"The destructive analyzer appears to be empty. "
screen = 1.0
return
if((linked_destroy.loaded_item.reliability >= 99 - (linked_destroy.decon_mod * 3)) || linked_destroy.loaded_item.crit_fail)
@@ -307,7 +309,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
else if(href_list["sync"]) //Sync the research holder with all the R&D consoles in the game that aren't sync protected.
screen = 0.0
if(!sync)
- usr << " You must connect to the network first! "
+ usr << "You must connect to the network first! "
else
griefProtection() //Putting this here because I dont trust the sync process
spawn(30)
@@ -753,7 +755,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
if(1.7) //R&D device linkage
dat += "Main Menu "
- dat += "Settings Menu "
+ dat += "
Settings Menu "
dat += "
R&D Console Device Linkage Menu: "
dat += "
Re-sync with Nearby Devices "
dat += "
Linked Devices: "
@@ -809,12 +811,12 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "
Material Amount: [linked_lathe.TotalMaterials()] / [linked_lathe.max_material_storage]
"
dat += "
Chemical Volume: [linked_lathe.reagents.total_volume] / [linked_lathe.reagents.maximum_volume]
"
- dat += "
"
dat += list_categories(linked_lathe.categories, 3.15)
@@ -963,12 +965,12 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "Material Amount: [linked_imprinter.TotalMaterials()]
"
dat += "Chemical Volume: [linked_imprinter.reagents.total_volume]
"
- dat += "
"
dat += list_categories(linked_imprinter.categories, 4.15)
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index 62dd6e45bac..fb56e869fe8 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -177,7 +177,8 @@
/obj/machinery/computer/rdservercontrol
name = "R&D Server Controller"
desc = "Used to manage access to research and manufacturing databases."
- icon_state = "rdcomp"
+ icon_screen = "rdcomp"
+ icon_keyboard = "rd_key"
var/screen = 0
var/obj/machinery/r_n_d/server/temp_server
var/list/servers = list()
@@ -192,7 +193,7 @@
add_fingerprint(usr)
usr.set_machine(src)
if(!src.allowed(usr) && !emagged)
- usr << "
You do not have the required access level. "
+ usr << "
You do not have the required access level. "
return
if(href_list["main"])
@@ -269,7 +270,7 @@
if(istype(S, /obj/machinery/r_n_d/server/centcom) && !badmin)
continue
dat += "[S.name] || "
- dat += "
Access Rights | "
+ dat += "
Access Rights | "
dat += "
Data Management "
if(badmin) dat += " |
Server-to-Server Transfer "
dat += "
"
@@ -310,7 +311,7 @@
dat += "[temp_server.name] Server to Server Transfer
"
dat += "Send Data to what server?
"
for(var/obj/machinery/r_n_d/server/S in servers)
- dat += "[S.name]
(Transfer) "
+ dat += "[S.name]
(Transfer) "
dat += "
Main Menu "
user << browse("
R&D Server Control [dat]", "window=server_control;size=575x400")
onclose(user, "server_control")
@@ -325,7 +326,7 @@
if(!emagged)
playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1)
emagged = 1
- user << "
You you disable the security protocols. "
+ user << "
You you disable the security protocols. "
/obj/machinery/r_n_d/server/robotics
name = "Robotics R&D Server"
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index f6693492790..fd4c133308f 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -18,10 +18,10 @@
/obj/item/slime_extract/attackby(obj/item/O as obj, mob/user as mob)
if(istype(O, /obj/item/weapon/slimesteroid2))
if(enhanced == 1)
- user << "
This extract has already been enhanced! "
+ user << "
This extract has already been enhanced! "
return ..()
if(Uses == 0)
- user << "
You can't enhance a used extract! "
+ user << "
You can't enhance a used extract! "
return ..()
user <<"
You apply the enhancer. It now has triple the amount of uses. "
Uses = 3
@@ -138,8 +138,8 @@
M.docile = 1
M.nutrition = 700
- M <<"
You absorb the potion and feel your intense desire to feed melt away. "
- user <<"
You feed the slime the potion, removing it's hunger and calming it. "
+ M <<"
You absorb the potion and feel your intense desire to feed melt away. "
+ user <<"
You feed the slime the potion, removing it's hunger and calming it. "
var/newname = copytext(sanitize(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text),1,MAX_NAME_LEN)
if (!newname)
@@ -220,16 +220,16 @@
/obj/item/weapon/slimesteroid/attack(mob/living/simple_animal/slime/M as mob, mob/user as mob)
if(!isslime(M))//If target is not a slime.
- user << "
The steroid only works on baby slimes! "
+ user << "
The steroid only works on baby slimes! "
return ..()
if(M.is_adult) //Can't tame adults
- user << "
Only baby slimes can use the steroid! "
+ user << "
Only baby slimes can use the steroid! "
return..()
if(M.stat)
- user << "
The slime is dead! "
+ user << "
The slime is dead! "
return..()
if(M.cores == 3)
- user <<"
The slime already has the maximum amount of extract! "
+ user <<"
The slime already has the maximum amount of extract! "
return..()
user <<"
You feed the slime the steroid. It now has triple the amount of extract. "
@@ -252,10 +252,10 @@
/*afterattack(obj/target, mob/user , flag)
if(istype(target, /obj/item/slime_extract))
if(target.enhanced == 1)
- user << "
This extract has already been enhanced! "
+ user << "
This extract has already been enhanced! "
return ..()
if(target.Uses == 0)
- user << "
You can't enhance a used extract! "
+ user << "
You can't enhance a used extract! "
return ..()
user <<"You apply the enhancer. It now has triple the amount of uses."
target.Uses = 3
@@ -271,13 +271,13 @@
/obj/item/weapon/slimestabilizer/attack(mob/living/simple_animal/slime/M as mob, mob/user as mob)
if(!isslime(M))
- user << "
The stabilizer only works on slimes! "
+ user << "
The stabilizer only works on slimes! "
return ..()
if(M.stat)
- user << "
The slime is dead! "
+ user << "
The slime is dead! "
return..()
if(M.mutation_chance == 0)
- user <<"
The slime already has no chance of mutating! "
+ user <<"
The slime already has no chance of mutating! "
return..()
user <<"
You feed the slime the stabilizer. It is now less likely to mutate. "
@@ -292,16 +292,16 @@
/obj/item/weapon/slimemutator/attack(mob/living/simple_animal/slime/M as mob, mob/user as mob)
if(!isslime(M))
- user << "
The mutator only works on slimes! "
+ user << "
The mutator only works on slimes! "
return ..()
if(M.stat)
- user << "
The slime is dead! "
+ user << "
The slime is dead! "
return..()
if(M.mutator_used)
- user << "
This slime has already consumed a mutator, any more would be far too unstable! "
+ user << "
This slime has already consumed a mutator, any more would be far too unstable! "
return..()
if(M.mutation_chance == 100)
- user <<"
The slime is already guaranteed to mutate! "
+ user <<"
The slime is already guaranteed to mutate! "
return..()
user <<"
You feed the slime the mutator. It is now more likely to mutate. "
@@ -418,3 +418,57 @@
G.key = ghost.key
G << "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist them in completing their goals at any cost."
qdel(src)
+
+
+
+
+/obj/effect/timestop
+ anchored = 1
+ name = "chronofield"
+ desc = "ZA WARUDO"
+ icon = 'icons/effects/160x160.dmi'
+ icon_state = "time"
+ layer = FLY_LAYER
+ pixel_x = -64
+ pixel_y = -64
+ unacidable = 1
+ var/mob/living/immune = null // the one who creates the timestop is immune
+ var/freezerange = 2
+ var/duration = 140
+ alpha = 125
+
+/obj/effect/timestop/New()
+ ..()
+ timestop()
+
+
+/obj/effect/timestop/proc/timestop()
+ playsound(get_turf(src), 'sound/magic/TIMEPARADOX2.ogg', 100, 1, -1)
+ while(loc)
+ if(duration)
+ for(var/mob/living/M in orange (freezerange, src.loc))
+ if(M == immune)
+ continue
+ M.stunned = 10
+ M.anchored = 1
+ if(istype(M, /mob/living/simple_animal/hostile))
+ var/mob/living/simple_animal/hostile/H = M
+ H.AIStatus = AI_OFF
+ H.LoseTarget()
+ continue
+ for(var/obj/item/projectile/P in orange (freezerange, src.loc))
+ P.paused = TRUE
+ duration --
+ else
+ for(var/mob/living/M in orange (freezerange+2, src.loc)) //longer range incase they lag out of it or something
+ M.stunned = 0
+ M.anchored = 0
+ if(istype(M, /mob/living/simple_animal/hostile))
+ var/mob/living/simple_animal/hostile/H = M
+ H.AIStatus = initial(H.AIStatus)
+ continue
+ for(var/obj/item/projectile/P in orange(freezerange+2, src.loc))
+ P.paused = FALSE
+ qdel(src)
+ return
+ sleep(1)
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index b60a0d7bfe5..673e7176eaa 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -482,8 +482,8 @@
/obj/machinery/computer/shuttle
name = "Shuttle Console"
- icon = 'icons/obj/computer.dmi'
- icon_state = "shuttle"
+ icon_screen = "shuttle"
+ icon_keyboard = "tech_key"
req_access = list( )
circuit = /obj/item/weapon/circuitboard/shuttle
var/shuttleId
@@ -544,7 +544,7 @@
if(!emagged)
src.req_access = list()
emagged = 1
- user << "
You fried the consoles ID checking system. "
+ user << "
You fried the consoles ID checking system. "
/obj/machinery/computer/shuttle/ferry
name = "transport ferry console"
@@ -567,7 +567,7 @@
return
cooldown = 1
usr << "
Your request has been recieved by Centcom. "
- admins << "
FERRY: [key_name(usr)] (? ) (JMP ) (Move Ferry ) is requesting to move the transport ferry to Centcom."
+ admins << "
FERRY: [key_name_admin(usr)] (? ) (FLW ) (Move Ferry ) is requesting to move the transport ferry to Centcom."
spawn(600) //One minute cooldown
cooldown = 0
diff --git a/code/modules/surgery/cybernetic_implants.dm b/code/modules/surgery/cybernetic_implants.dm
index 3f4dcb5210c..ced4776f535 100644
--- a/code/modules/surgery/cybernetic_implants.dm
+++ b/code/modules/surgery/cybernetic_implants.dm
@@ -70,9 +70,10 @@
if(full)
user << "
You can't seem to implant anything else into the [target]'s [target_zone]! "
else
+ if(!user.drop_item())
+ return
user.visible_message("[user] inserts [implant] into the [target]'s [target_zone == "head" ? "brain" : target_zone]!", "
You insert [implant] into the [target]'s [target_zone == "head" ? "brain" : target_zone]. ")
implant.owner = target
implant.function()
- user.drop_item()
target.internal_organs |= implant
implant.loc = target
\ No newline at end of file
diff --git a/code/modules/surgery/limb augmentation.dm b/code/modules/surgery/limb augmentation.dm
index 950c4a536b0..22d168044c0 100644
--- a/code/modules/surgery/limb augmentation.dm
+++ b/code/modules/surgery/limb augmentation.dm
@@ -71,6 +71,8 @@
user << "
That is the wrong robotic limb for this body part. "
return 0
+ if(!user.drop_item())
+ return 0
var/mob/living/carbon/human/H = target
user.visible_message("[user] successfully augments [target]'s [parse_zone(target_zone)]!", "
You successfully augment [target]'s [parse_zone(target_zone)]. ")
L.loc = get_turf(target)
@@ -92,7 +94,6 @@
H.organs += new /obj/item/organ/limb/robot/chest(src)
for(var/datum/disease/appendicitis/A in H.viruses) //If they already have Appendicitis, Remove it
A.cure(1)
- user.drop_item()
qdel(tool)
H.update_damage_overlays(0)
H.update_augments() //Gives them the Cyber limb overlay
diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm
index df88239994d..2025f3c155b 100644
--- a/code/modules/surgery/organs/organ.dm
+++ b/code/modules/surgery/organs/organ.dm
@@ -188,4 +188,12 @@
for(var/obj/item/organ/limb/L in organs)
for(var/obj/item/I in L.embedded_objects)
L.embedded_objects -= I
- I.loc = T
\ No newline at end of file
+ I.loc = T
+
+ clear_alert("embeddedobject")
+
+/mob/living/carbon/human/proc/has_embedded_objects()
+ . = 0
+ for(var/obj/item/organ/limb/L in organs)
+ for(var/obj/item/I in L.embedded_objects)
+ return 1
\ No newline at end of file
diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm
index 33968dd8968..f8e7de333d9 100644
--- a/code/modules/surgery/remove_embedded_object.dm
+++ b/code/modules/surgery/remove_embedded_object.dm
@@ -33,6 +33,9 @@
I.loc = get_turf(H)
L.embedded_objects -= I
+ if(!H.has_embedded_objects())
+ H.clear_alert("embeddedobject")
+
if(objects > 0)
user.visible_message("[user] sucessfully removes [objects] objects from [H]'s [L.getDisplayName()]!", "
You sucessfully remove [objects] objects from [H]'s [L.getDisplayName()]. ")
else
diff --git a/code/modules/telesci/bscrystal.dm b/code/modules/telesci/bscrystal.dm
index c006939d876..74b9807dade 100644
--- a/code/modules/telesci/bscrystal.dm
+++ b/code/modules/telesci/bscrystal.dm
@@ -21,7 +21,7 @@
PoolOrNew(/obj/effect/effect/sparks, loc)
playsound(src.loc, "sparks", 50, 1)
blink_mob(user)
- user.drop_item()
+ user.unEquip(src)
qdel(src)
/obj/item/bluespace_crystal/proc/blink_mob(var/mob/living/L)
diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm
index 7949dcfba88..e1f4a37d288 100644
--- a/code/modules/telesci/telepad.dm
+++ b/code/modules/telesci/telepad.dm
@@ -35,7 +35,7 @@
if(istype(I, /obj/item/device/multitool))
var/obj/item/device/multitool/M = I
M.buffer = src
- user << "
You save the data in the [I.name]'s buffer. "
+ user << "
You save the data in the [I.name]'s buffer. "
if(exchange_parts(user, I))
return
@@ -60,22 +60,22 @@
playsound(src, 'sound/items/Ratchet.ogg', 50, 1)
if(anchored)
anchored = 0
- user << "
\The [src] can now be moved. "
+ user << "
\The [src] can now be moved. "
else if(!anchored)
anchored = 1
- user << "
\The [src] is now secured. "
+ user << "
\The [src] is now secured. "
if(istype(W, /obj/item/weapon/screwdriver))
if(stage == 0)
playsound(src, 'sound/items/Screwdriver.ogg', 50, 1)
- user << "
You unscrew the telepad's tracking beacon. "
+ user << "
You unscrew the telepad's tracking beacon. "
stage = 1
else if(stage == 1)
playsound(src, 'sound/items/Screwdriver.ogg', 50, 1)
- user << "
You screw in the telepad's tracking beacon. "
+ user << "
You screw in the telepad's tracking beacon. "
stage = 0
if(istype(W, /obj/item/weapon/weldingtool) && stage == 1)
playsound(src, 'sound/items/Welder.ogg', 50, 1)
- user << "
You disassemble the telepad. "
+ user << "
You disassemble the telepad. "
new /obj/item/stack/sheet/metal(get_turf(src))
new /obj/item/stack/sheet/glass(get_turf(src))
qdel(src)
@@ -91,7 +91,7 @@
/obj/item/device/telepad_beacon/attack_self(mob/user as mob)
if(user)
- user << "
Locked In "
+ user << "
Locked In "
new /obj/machinery/telepad_cargo(user.loc)
playsound(src, 'sound/effects/pop.ogg', 100, 1, 1)
qdel(src)
@@ -142,11 +142,11 @@
if(mode == 0)
mode = 1
playsound(src.loc, 'sound/effects/pop.ogg', 50, 0)
- user << "
The telepad locator has become uncalibrated. "
+ user << "
The telepad locator has become uncalibrated. "
else
mode = 0
playsound(src.loc, 'sound/effects/pop.ogg', 50, 0)
- user << "
You calibrate the telepad locator. "
+ user << "
You calibrate the telepad locator. "
/obj/item/weapon/rcs/emag_act(mob/user as mob)
if(!emagged)
@@ -154,4 +154,4 @@
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(5, 1, src)
s.start()
- user << "
You emag the RCS. Click on it to toggle between modes. "
+ user << "
You emag the RCS. Click on it to toggle between modes. "
diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm
index 6d602467fa1..0450b8109c1 100644
--- a/code/modules/telesci/telesci_computer.dm
+++ b/code/modules/telesci/telesci_computer.dm
@@ -58,7 +58,8 @@
if(crystals.len >= max_crystals)
user << "
There are not enough crystal slots. "
return
- user.drop_item()
+ if(!user.drop_item())
+ return
crystals += W
W.loc = null
user.visible_message("[user] inserts [W] into \the [src]'s crystal slot.", "
You insert [W] into \the [src]'s crystal slot. ")
@@ -74,7 +75,7 @@
if(M.buffer && istype(M.buffer, /obj/machinery/telepad))
telepad = M.buffer
M.buffer = null
- user << "
You upload the data from the [W.name]'s buffer. "
+ user << "
You upload the data from the [W.name]'s buffer. "
else
..()
diff --git a/config/game_options.txt b/config/game_options.txt
index ed44c926e10..9c62544f085 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -280,3 +280,18 @@ MIDROUND_ANTAG_LIFE_CHECK 0.7
//Uncomment for explosions that react to doors and walls
REACTIONARY_EXPLOSIONS
+### Configure the bomb cap
+## This caps all explosions to the specified range. Used for both balance reasons and to prevent overloading the server and lagging the game out.
+## This is given as the 3rd number(light damage) in the standard (1,2,3) explosion notation. The other numbers are derived by dividing by 2 and 4.
+## eg: If you give the number 20. The bomb cap will be 5,10,20.
+## Can be any number between 4 and 128, some examples are provided below.
+
+## Default (3,7,14)
+BOMBCAP 14
+## One 'step' up (4,8,16) (recommended if you enable REACTIONARY_EXPLOSIONS above)
+#BOMBCAP 16
+## LagHell (7,14,28)
+#BOMBCAP 28
+
+
+
diff --git a/config/tips.txt b/config/tips.txt
index dd6b2f23f85..04ea4ab50d0 100644
--- a/config/tips.txt
+++ b/config/tips.txt
@@ -85,3 +85,6 @@ You can use . or # instead of : for radio channels. Building this habit reduces
While pulling something, clicking on a tile with an empty hand will move it to that tile. No more getting stuck in maint while dragging something!
Things that override clicks like decks of cards or paper bins can still be picked up by dragging them to your character. Equipped things that override click can be unequipped by dragging it to an empty hand.
In the job selection menu, from the lobby, you can use right click on the "Low/Medium/High" priority button to make it cycle backwards.
+If you stay out of camera range for 10 seconds, the AI's track on you will break.
+You can shoot cameras with bullets to disable them remotely.
+Disabling a camera with wirecutters will not cause a camera alarm, but bludgeoning it will.
diff --git a/html/changelog.html b/html/changelog.html
index 69c3bf7818a..457de93df40 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,59 @@
-->
+
18 June 2015
+
AnturK updated:
+
+ Added new photo-over-pda function. Apply the photo to PDA to send it with your next message!
+
+
Ikarrus updated:
+
+ Department Management consoles have been added to Head of Staff offices. These will enable heads to modify ID's access to their department, as well as preform demotions.
+
+
Miauw updated:
+
+ Bullets can now damage cameras.
+ Camera alarms now trigger 90 seconds after the first EMP pulse, instead of when all EMP pulses run out.
+ Makes the force required to damage cameras greater than or equal to ten instead of greater than ten.
+ Camera alarms now trigger when cameras are disabled with brute force or bullets.
+
+
Xhuis updated:
+
+ Nanotrasen scientists have determined that a delaminating supermatter shard combining with a gravitational singularity is an extremely bad idea. They advise keeping the two as far apart as possible.
+
+
phil235 updated:
+
+ Nerfed the xray gun. Its range is now 15 tiles.
+
+
+
15 June 2015
+
Incoming5643 updated:
+
+ Lizards can now choose from a wide varity of physical appearances in character creation! Sprites made by WJohn. Hiss Responsibly.
+
+
Kor updated:
+
+ A terrible new creature stalks the halls of SS13.
+ The wizard has a new artefact related to said creature.
+ Added a new sepia slime plasma reaction. Try it out!
+
+
spasticVerbalizer updated:
+
+ Drones can now properly quick-equip.
+
+
+
14 June 2015
+
Ikarrus updated:
+
+ White suits added to gang outfits
+ Gang outfits are now free, but are now limited in stock (that replenishes over time)
+ While attempting a Hostile Takeover, gangs do not gain influence. Instead, the takeover timer will be reduced by how many territories they control.
+ Spraycan cost reduced to 5 influence.
+ Recruitment Pen cooldown increased to 2 minutes, but is reduced if the enemy gang has more members than yours.
+ Tommy guns no longer deal stamina damage.
+ Gangtools can no longer recall the shuttle if the game mode is not Gang War
+
+
12 June 2015
Ikarrus updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index e7f6df25d6e..bd40cc75ed7 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -2751,3 +2751,48 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
RemieRichards:
- rscadd: New optional explosion effect ported from /vg/'s DeityLink, Explosions
that are affected by Walls and Doors
+2015-06-14:
+ Ikarrus:
+ - rscadd: White suits added to gang outfits
+ - tweak: Gang outfits are now free, but are now limited in stock (that replenishes
+ over time)
+ - tweak: While attempting a Hostile Takeover, gangs do not gain influence. Instead,
+ the takeover timer will be reduced by how many territories they control.
+ - tweak: Spraycan cost reduced to 5 influence.
+ - tweak: Recruitment Pen cooldown increased to 2 minutes, but is reduced if the
+ enemy gang has more members than yours.
+ - tweak: Tommy guns no longer deal stamina damage.
+ - rscdel: Gangtools can no longer recall the shuttle if the game mode is not Gang
+ War
+2015-06-15:
+ Incoming5643:
+ - rscadd: Lizards can now choose from a wide varity of physical appearances in character
+ creation! Sprites made by WJohn. Hiss Responsibly.
+ Kor:
+ - rscadd: A terrible new creature stalks the halls of SS13.
+ - rscadd: The wizard has a new artefact related to said creature.
+ - rscadd: Added a new sepia slime plasma reaction. Try it out!
+ spasticVerbalizer:
+ - rscfix: Drones can now properly quick-equip.
+2015-06-18:
+ AnturK:
+ - rscadd: Added new photo-over-pda function. Apply the photo to PDA to send it with
+ your next message!
+ Ikarrus:
+ - rscadd: Department Management consoles have been added to Head of Staff offices.
+ These will enable heads to modify ID's access to their department, as well as
+ preform demotions.
+ Miauw:
+ - tweak: Bullets can now damage cameras.
+ - tweak: Camera alarms now trigger 90 seconds after the first EMP pulse, instead
+ of when all EMP pulses run out.
+ - tweak: Makes the force required to damage cameras greater than or equal to ten
+ instead of greater than ten.
+ - tweak: Camera alarms now trigger when cameras are disabled with brute force or
+ bullets.
+ Xhuis:
+ - rscadd: Nanotrasen scientists have determined that a delaminating supermatter
+ shard combining with a gravitational singularity is an extremely bad idea. They
+ advise keeping the two as far apart as possible.
+ phil235:
+ - rscdel: Nerfed the xray gun. Its range is now 15 tiles.
diff --git a/html/changelogs/Dorsisdwarf-9800-nukeops.yml b/html/changelogs/Dorsisdwarf-9800-nukeops.yml
new file mode 100644
index 00000000000..e7d2d895ab2
--- /dev/null
+++ b/html/changelogs/Dorsisdwarf-9800-nukeops.yml
@@ -0,0 +1,15 @@
+
+# Your name.
+author: Dorsisdwarf
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit.
+# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - tweak: "Syndicate Bulldog Shotguns now use slug ammo instead of buckshot by default"
+ - rscadd: "Nuke Ops can now buy team grab-bags of bulldog ammo at a discount."
diff --git a/html/changelogs/Ikarrus-gangimplants.yml b/html/changelogs/Ikarrus-gangimplants.yml
new file mode 100644
index 00000000000..000f9bd487f
--- /dev/null
+++ b/html/changelogs/Ikarrus-gangimplants.yml
@@ -0,0 +1,37 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# spellcheck (typo fixes)
+# experiment
+# tgs (TG-ported fixes?)
+#################################
+
+# Your name.
+author: Ikarrus
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit.
+# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscdel: "Loyalty implants now treat gangs as it treats cultis. Implants can no longer deconvert gangsters, but it can still prevent recruitments."
+ - tweak: "Replaced tommy guns with 9mm 2-burst 32 mag uzis that costs 40 influence. Unlike tommy guns gangs will be able to purchase ammo for uzis."
\ No newline at end of file
diff --git a/html/changelogs/Thunder12345-PR-10019.yml b/html/changelogs/Thunder12345-PR-10019.yml
new file mode 100644
index 00000000000..3a8e974e08c
--- /dev/null
+++ b/html/changelogs/Thunder12345-PR-10019.yml
@@ -0,0 +1,7 @@
+author: Thunder12345
+
+delete-after: True
+
+changes:
+ - rscadd: "Combat shotguns are now semi automatic, and will be pumped automatically after firing."
+ - tweak: "Combat shotgun capacity has been reduced to six shells."
\ No newline at end of file
diff --git a/html/changelogs/Xhuis-SummerThaw.yml b/html/changelogs/Xhuis-SummerThaw.yml
new file mode 100644
index 00000000000..0a55acf9e06
--- /dev/null
+++ b/html/changelogs/Xhuis-SummerThaw.yml
@@ -0,0 +1,11 @@
+author: Xhuis
+delete-after: True
+
+changes:
+ - rscadd: "You will now trip over securitrons if you run over them whilst they are chasing a target."
+ - rscadd: "An admin-spawnable drone dispenser has been added that will automatically create drone shells when supplied with materials."
+ - rscadd: "Airlock charges are available to traitors and will cause a lethal explosion on the next person to open the door."
+ - rscadd: "Nuclear operatives can now buy drum magazines for their Bulldog shotguns filled with lethal poison-filled darts."
+ - rscadd: "When a malfunctioning AI declares Delta, all blue tiles in its core will begin flashing red."
+ - rscadd: "Back-worn cloaks have been added for all heads except the HoP. LARPers rejoice!"
+ - rscadd: "More suicide messages have been added for a few items."
diff --git a/html/changelogs/jordie adminstuff.yml b/html/changelogs/jordie adminstuff.yml
new file mode 100644
index 00000000000..a9d4ef9d62a
--- /dev/null
+++ b/html/changelogs/jordie adminstuff.yml
@@ -0,0 +1,9 @@
+author: Jordie0608
+
+delete-after: True
+
+changes:
+ - tweak: "For Admins: Jump-to-Mob (JMP) notification command replaced with Follow (FLW)."
+ - rscadd: "Message and Follow links added to many notifications."
+ - rscadd: "New buttons to toggle nuke and set security level."
+ - spellcheck: "Flamethrowers are logged in attack_log."
\ No newline at end of file
diff --git a/icons/effects/160x160.dmi b/icons/effects/160x160.dmi
index 57e3a81edf1..8c733232f93 100644
Binary files a/icons/effects/160x160.dmi and b/icons/effects/160x160.dmi differ
diff --git a/icons/effects/352x352.dmi b/icons/effects/352x352.dmi
new file mode 100644
index 00000000000..86b40959d56
Binary files /dev/null and b/icons/effects/352x352.dmi differ
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index c59228819bb..0e417793b0c 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/human.dmi b/icons/mob/human.dmi
index 7b47bec0962..8f924ee6632 100644
Binary files a/icons/mob/human.dmi and b/icons/mob/human.dmi differ
diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi
index 4347cde3677..3bbd054bce7 100644
Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ
diff --git a/icons/mob/mutant_bodyparts.dmi b/icons/mob/mutant_bodyparts.dmi
index 6221fbad9e7..94acba1cbc5 100644
Binary files a/icons/mob/mutant_bodyparts.dmi and b/icons/mob/mutant_bodyparts.dmi differ
diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi
index 7a0c7a6599a..0ed43592376 100644
Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ
diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi
index 3258cb936d1..1c9beb6551c 100644
Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ
diff --git a/icons/obj/clothing/cloaks.dmi b/icons/obj/clothing/cloaks.dmi
new file mode 100644
index 00000000000..3677fa15258
Binary files /dev/null and b/icons/obj/clothing/cloaks.dmi differ
diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi
index 4a7846286da..6c8fd8bc903 100644
Binary files a/icons/obj/computer.dmi and b/icons/obj/computer.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 5a3e80c66f7..092eb92a6ce 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi
index c613bee4949..61e622a2135 100644
Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ
diff --git a/icons/obj/machines/droneDispenser.dmi b/icons/obj/machines/droneDispenser.dmi
new file mode 100644
index 00000000000..a78990d8a1a
Binary files /dev/null and b/icons/obj/machines/droneDispenser.dmi differ
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index 682103c7dcb..f7d418e6fcb 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ
diff --git a/icons/obj/wizard.dmi b/icons/obj/wizard.dmi
index e3eec0a88ac..3624a9b4bff 100644
Binary files a/icons/obj/wizard.dmi and b/icons/obj/wizard.dmi differ
diff --git a/sound/magic/Demon_consume.ogg b/sound/magic/Demon_consume.ogg
new file mode 100644
index 00000000000..ef9276e74c0
Binary files /dev/null and b/sound/magic/Demon_consume.ogg differ
diff --git a/sound/magic/TIMEPARADOX2.ogg b/sound/magic/TIMEPARADOX2.ogg
new file mode 100644
index 00000000000..d35aeb389f6
Binary files /dev/null and b/sound/magic/TIMEPARADOX2.ogg differ
diff --git a/sound/magic/demon_attack1.ogg b/sound/magic/demon_attack1.ogg
new file mode 100644
index 00000000000..e3c765afd0c
Binary files /dev/null and b/sound/magic/demon_attack1.ogg differ
diff --git a/sound/magic/demon_dies.ogg b/sound/magic/demon_dies.ogg
new file mode 100644
index 00000000000..ad2a95f397d
Binary files /dev/null and b/sound/magic/demon_dies.ogg differ
diff --git a/sound/magic/enter_blood.ogg b/sound/magic/enter_blood.ogg
new file mode 100644
index 00000000000..4deba11b465
Binary files /dev/null and b/sound/magic/enter_blood.ogg differ
diff --git a/sound/magic/exit_blood.ogg b/sound/magic/exit_blood.ogg
new file mode 100644
index 00000000000..c4399a2ecc6
Binary files /dev/null and b/sound/magic/exit_blood.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index e448e1b78bd..befe563aa7b 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -381,6 +381,7 @@
#include "code\game\machinery\deployable.dm"
#include "code\game\machinery\door_control.dm"
#include "code\game\machinery\doppler_array.dm"
+#include "code\game\machinery\droneDispenser.dm"
#include "code\game\machinery\flasher.dm"
#include "code\game\machinery\Freezer.dm"
#include "code\game\machinery\hologram.dm"
@@ -433,7 +434,6 @@
#include "code\game\machinery\camera\motion.dm"
#include "code\game\machinery\camera\presets.dm"
#include "code\game\machinery\camera\tracking.dm"
-#include "code\game\machinery\computer\ai_core.dm"
#include "code\game\machinery\computer\aifixer.dm"
#include "code\game\machinery\computer\arcade.dm"
#include "code\game\machinery\computer\atmos_alert.dm"
@@ -553,6 +553,7 @@
#include "code\game\objects\effects\spawners\bombspawner.dm"
#include "code\game\objects\effects\spawners\gibspawner.dm"
#include "code\game\objects\effects\spawners\lootdrop.dm"
+#include "code\game\objects\effects\spawners\structure.dm"
#include "code\game\objects\effects\spawners\vaultspawner.dm"
#include "code\game\objects\items\apc_frame.dm"
#include "code\game\objects\items\blueprints.dm"
@@ -570,6 +571,7 @@
#include "code\game\objects\items\devices\aicard.dm"
#include "code\game\objects\items\devices\camera_bug.dm"
#include "code\game\objects\items\devices\chameleonproj.dm"
+#include "code\game\objects\items\devices\doorCharge.dm"
#include "code\game\objects\items\devices\flash.dm"
#include "code\game\objects\items\devices\flashlight.dm"
#include "code\game\objects\items\devices\instruments.dm"
@@ -686,6 +688,7 @@
#include "code\game\objects\items\weapons\tanks\tank_types.dm"
#include "code\game\objects\items\weapons\tanks\tanks.dm"
#include "code\game\objects\items\weapons\tanks\watertank.dm"
+#include "code\game\objects\structures\ai_core.dm"
#include "code\game\objects\structures\artstuff.dm"
#include "code\game\objects\structures\barsigns.dm"
#include "code\game\objects\structures\bedsheet_bin.dm"
@@ -802,6 +805,7 @@
#include "code\modules\admin\newbanjob.dm"
#include "code\modules\admin\player_notes.dm"
#include "code\modules\admin\player_panel.dm"
+#include "code\modules\admin\secrets.dm"
#include "code\modules\admin\topic.dm"
#include "code\modules\admin\DB ban\functions.dm"
#include "code\modules\admin\permissionverbs\permissionedit.dm"
@@ -869,6 +873,7 @@
#include "code\modules\client\preferences.dm"
#include "code\modules\client\preferences_savefile.dm"
#include "code\modules\client\preferences_toggles.dm"
+#include "code\modules\clothing\cloaks.dm"
#include "code\modules\clothing\clothing.dm"
#include "code\modules\clothing\glasses\engine_goggles.dm"
#include "code\modules\clothing\glasses\glasses.dm"
@@ -1242,6 +1247,8 @@
#include "code\modules\mob\living\simple_animal\revenant\revenant.dm"
#include "code\modules\mob\living\simple_animal\revenant\revenant_abilities.dm"
#include "code\modules\mob\living\simple_animal\revenant\revenant_spawn_event.dm"
+#include "code\modules\mob\living\simple_animal\slaughter\slaughter.dm"
+#include "code\modules\mob\living\simple_animal\slaughter\slaughterevent.dm"
#include "code\modules\mob\living\simple_animal\slime\death.dm"
#include "code\modules\mob\living\simple_animal\slime\emote.dm"
#include "code\modules\mob\living\simple_animal\slime\life.dm"