diff --git a/.gitignore b/.gitignore
index 68a10788fcd..683e98071d3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,13 +1,10 @@
-#Files and folders specified here will never be tracked.
+###Files and folders specified here will never be tracked.
-*.ban
-*.bdb
-*.log
-*.sav
+#Ignore everything in datafolder and subdirectories
+/data/**/*
-#Compiled files and other files generated during compilation.
+#Ignore compiled files and other files generated during compilation.
*.dmb
*.rsc
*.lk
-*.int
-/data/mode.txt
+*.int
\ No newline at end of file
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index bdfd2504ed0..ac1a9c2dd01 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -88,6 +88,8 @@ There is no strict process when it comes to merging pull requests, pull requests
* You are going to be expected to document all your changes in the pull request, failing to do so will mean delaying it as we will have to question why you made the change. On the other hand you can speed up the process by making the pull request readable and easy to understand, with diagrams or before/after data.
+* We ask that you use the changelog system to document your change, this prevents our players from being caught unaware by changes - you can find more information about this here http://tgstation13.org/wiki/Guide_to_Changelogs
+
* If you are proposing multiple changes, which change many different aspects of the code, you are expected to section them off into different pull requests in order to make it easier to review them and to deny/accept the changes that are deemed acceptable.
* If your pull request is accepted, the code you add is no longer exclusively yours but everyones, everyone is free to work on it but you are also free to object to any changes being made, which will be noted by a Project Lead or Project Manager. It is a shame this has to be explicitly told but there have been cases where this would've saved some trouble.
diff --git a/_maps/RandomZLevels/fileList.txt b/_maps/RandomZLevels/fileList.txt
index 8b4138a1c7e..c2e08523502 100644
--- a/_maps/RandomZLevels/fileList.txt
+++ b/_maps/RandomZLevels/fileList.txt
@@ -17,4 +17,5 @@
#_maps/RandomZLevels/challenge.dmm
#_maps/RandomZLevels/listeningpost.dmm
#_maps/RandomZLevels/spacehotel.dmm
-#_maps/RandomZLevels/centcomAway.dmm
\ No newline at end of file
+#_maps/RandomZLevels/centcomAway.dmm
+#_maps/RandomZLevels/moonoutpost19.dmm
\ No newline at end of file
diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm
new file mode 100644
index 00000000000..555e2d190f9
--- /dev/null
+++ b/_maps/RandomZLevels/moonoutpost19.dmm
@@ -0,0 +1,916 @@
+"aa" = (/turf/unsimulated/wall{icon_state = "rock"},/area/mine/explored)
+"ab" = (/turf/simulated/mineral/random,/area/mine/explored)
+"ac" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/structure/alien/resin/wall,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"ad" = (/obj/structure/alien/weeds,/obj/structure/alien/resin/wall,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"ae" = (/turf/simulated/mineral/random/low_chance,/area/mine/explored)
+"af" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/structure/alien/resin/wall,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"ag" = (/obj/structure/alien/weeds,/obj/structure/alien/weeds{desc = "A large mottled egg."; health = 100; icon_state = "egg_hatched"; name = "egg"},/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"ah" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/structure/alien/weeds{desc = "A large mottled egg."; health = 100; icon_state = "egg_hatched"; name = "egg"},/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"ai" = (/obj/structure/alien/weeds,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"aj" = (/obj/structure/alien/weeds,/obj/structure/stool/bed/nest,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"ak" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/mob/living/simple_animal/hostile/alien,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"al" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/structure/alien/weeds{desc = "A large mottled egg."; health = 100; icon_state = "egg_hatched"; name = "egg"},/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"am" = (/obj/structure/alien/weeds/node,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"an" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/structure/stool/bed/nest,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"ao" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/structure/stool/bed/nest,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"ap" = (/obj/structure/alien/weeds,/obj/structure/stool/bed/nest,/obj/item/clothing/mask/facehugger{icon_state = "facehugger_impregnated"; item_state = "facehugger_impregnated"; stat = 1},/obj/effect/decal/cleanable/blood/gibs,/obj/item/weapon/gun/projectile/automatic/pistol,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"aq" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"ar" = (/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"as" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/structure/alien/resin/wall,/obj/structure/alien/resin/wall,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"at" = (/turf/simulated/wall/r_wall,/area/awaycontent/a4{name = "Syndicate Outpost"})
+"au" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"av" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/mob/living/simple_animal/hostile/alien/sentinel,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"aw" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/effect/decal/cleanable/blood/gibs,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"ax" = (/obj/structure/alien/weeds/node,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"ay" = (/obj/structure/alien/weeds,/obj/effect/decal/cleanable/blood/gibs,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"az" = (/turf/simulated/floor{dir = 9; heat_capacity = 1e+006; icon_state = "darkred"; tag = "icon-darkred (NORTHWEST)"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"aA" = (/turf/simulated/floor{dir = 1; heat_capacity = 1e+006; icon_state = "darkredcorners"; tag = "icon-darkredcorners (NORTH)"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"aB" = (/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "dark"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"aC" = (/turf/simulated/floor{dir = 4; heat_capacity = 1e+006; icon_state = "darkredcorners"; tag = "icon-darkredcorners (EAST)"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"aD" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{dir = 5; heat_capacity = 1e+006; icon_state = "darkred"; tag = "icon-darkred (NORTHEAST)"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"aE" = (/obj/structure/alien/weeds/node,/obj/structure/alien/resin/wall,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"aF" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/structure/stool/bed/nest,/obj/item/clothing/mask/facehugger{icon_state = "facehugger_impregnated"; item_state = "facehugger_impregnated"; stat = 1},/obj/effect/decal/cleanable/blood/gibs,/obj/item/clothing/under/rank/security/science,/obj/item/clothing/suit/armor/vest,/obj/item/weapon/melee/baton/loaded,/obj/item/clothing/head/helmet,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"aG" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{dir = 1; heat_capacity = 1e+006; icon_state = "darkredcorners"; tag = "icon-darkredcorners (NORTH)"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"aH" = (/obj/machinery/gateway{dir = 9},/turf/simulated/floor{dir = 1; heat_capacity = 1e+006; icon_state = "vault"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"aI" = (/obj/machinery/gateway{dir = 1},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "vault"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"aJ" = (/obj/machinery/gateway{dir = 5},/turf/simulated/floor{dir = 4; heat_capacity = 1e+006; icon_state = "vault"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"aK" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/structure/alien/weeds{desc = "A large mottled egg."; health = 100; icon_state = "egg_hatched"; name = "egg"},/obj/effect/decal/cleanable/blood/gibs,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"aL" = (/obj/structure/alien/weeds,/obj/structure/alien/weeds{desc = "A large mottled egg."; health = 100; icon_state = "egg_hatched"; name = "egg"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"aM" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/effect/decal/cleanable/blood/gibs,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"aN" = (/obj/structure/alien/weeds,/mob/living/simple_animal/hostile/alien/drone,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"aO" = (/obj/machinery/light{dir = 8},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "dark"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"aP" = (/obj/machinery/gateway{dir = 8},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "vault"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"aQ" = (/obj/machinery/gateway/centeraway{calibrated = 0},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "dark"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"aR" = (/obj/machinery/gateway{dir = 4},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "vault"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"aS" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "dark"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"aT" = (/obj/item/weapon/ore/iron{pixel_x = 7; pixel_y = -6},/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"aU" = (/obj/structure/alien/weeds,/mob/living/simple_animal/hostile/alien/queen/large{desc = "A gigantic alien who is in charge of the hive and all of its loyal servants."; name = "alien queen"; pixel_x = -16},/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"aV" = (/turf/simulated/wall,/area/awaycontent/a4{name = "Syndicate Outpost"})
+"aW" = (/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "darkredcorners"; tag = "icon-darkredcorners (WEST)"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"aX" = (/obj/machinery/gateway{dir = 10},/turf/simulated/floor{dir = 4; heat_capacity = 1e+006; icon_state = "vault"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"aY" = (/obj/machinery/gateway,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "vault"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"aZ" = (/obj/machinery/gateway{dir = 6},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{dir = 1; heat_capacity = 1e+006; icon_state = "vault"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"ba" = (/turf/simulated/floor{dir = 2; heat_capacity = 1e+006; icon_state = "darkredcorners"; tag = "icon-darkredcorners"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bb" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/mob/living/simple_animal/hostile/alien/drone,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"bc" = (/obj/structure/alien/weeds,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"bd" = (/mob/living/simple_animal/hostile/alien/drone,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"be" = (/obj/machinery/vending/cola,/turf/simulated/floor{icon_state = "dark"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bf" = (/obj/machinery/vending/cigarette,/obj/structure/sign/poster{icon_state = "poster7"; pixel_y = 32; serial_number = 7; subtype = 0},/turf/simulated/floor{icon_state = "dark"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bg" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{dir = 10; heat_capacity = 1e+006; icon_state = "darkred"; tag = "icon-darkred (SOUTHWEST)"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "dark"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bi" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{dir = 2; heat_capacity = 1e+006; icon_state = "darkredcorners"; tag = "icon-darkredcorners"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bj" = (/turf/simulated/floor{dir = 6; heat_capacity = 1e+006; icon_state = "darkred"; tag = "icon-darkred (SOUTHEAST)"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bk" = (/obj/structure/alien/weeds,/obj/structure/stool/bed/nest,/obj/item/clothing/mask/facehugger{icon_state = "facehugger_impregnated"; item_state = "facehugger_impregnated"; stat = 1},/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood,/obj/item/clothing/under/syndicate/combat,/obj/item/clothing/glasses/night,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"bl" = (/obj/structure/alien/weeds,/mob/living/simple_animal/hostile/alien/sentinel,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"bm" = (/turf/simulated/mineral/random/high_chance,/area/mine/explored)
+"bn" = (/obj/machinery/light/small{dir = 8},/obj/structure/sign/poster{icon_state = "poster17"; pixel_x = -32; pixel_y = 0; serial_number = 17; subtype = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bo" = (/obj/item/weapon/cigbutt,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bp" = (/obj/machinery/alarm{frequency = 1439; locked = 1; pixel_y = 23; req_access = "150"},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bq" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/obj/machinery/light/small{dir = 4},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"br" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/item/device/radio/off{pixel_x = -4; pixel_y = 4},/obj/item/device/radio/off{pixel_x = 2},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bs" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/item/weapon/paper{info = "Log 1:
We got our promised supply drop today. We were only meant to get it, what, a week ago? This bloody gateway keeps desyncing itself, and that means subsisting off recycled water and carb packs. No clue where the damn thing connects to on its off days, and HQ say we are 'not to touch it if it isn't linking to command.' We dumped off the assload of crates Jim filled, got our boxes of oxygen, food and drink, and closed the portal.
Log 2:
Damn thing is acting up again. Three days no contact this time. I thought I heard clanking noises from it yesterday. Jim is going on about the NT base or some shit. We've been over this before - They don't know we're here, that engineer was too drunk to recognise his suit, especially since I had it painted orange. He's starting to get annoying. We're safe.
Log 3:
Gateway synced itself up automatically today. I opened it for an instant to spy through it, got a glimpse of the inside of a transport container. Either HQ's redecorating or something, or there's more than two of these things."; name = "Personal Log"},/turf/simulated/floor{dir = 6; heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bt" = (/obj/machinery/door/window{dir = 1; name = "Gateway Access"; req_access_txt = "150"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor{dir = 1; heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bu" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{dir = 10; heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bv" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bw" = (/obj/structure/sink{pixel_y = 28},/obj/machinery/light/small{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bx" = (/obj/machinery/door/airlock{name = "Unisex Restrooms"; req_access_txt = "0"},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"by" = (/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bz" = (/obj/structure/stool,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bA" = (/obj/structure/table,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32; pixel_y = 0},/obj/item/trash/plate,/obj/item/weapon/cigbutt,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bB" = (/obj/machinery/light{dir = 8},/obj/structure/stool,/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bC" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bE" = (/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bF" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/alarm{dir = 8; frequency = 1439; locked = 1; pixel_x = 23; pixel_y = 0; req_access = "150"},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bG" = (/obj/structure/toilet{dir = 1},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bH" = (/obj/structure/closet/crate/bin,/obj/item/trash/syndi_cakes,/obj/item/trash/sosjerky,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bI" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bJ" = (/obj/structure/stool,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bK" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bL" = (/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bM" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bN" = (/obj/structure/closet/emcloset,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bO" = (/obj/structure/closet/l3closet/general,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bP" = (/obj/machinery/door/airlock/glass{name = "Break Room"},/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bQ" = (/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},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/highsecurity{icon_state = "door_locked"; locked = 1; name = "Gateway"; req_access_txt = "150"},/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bS" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/device/multitool,/turf/simulated/floor/plating{dir = 9; heat_capacity = 1e+006; icon_state = "warnplate"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bT" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/computer/monitor,/turf/simulated/floor/plating{dir = 5; heat_capacity = 1e+006; icon_state = "warnplate"; tag = "icon-warnplate (NORTHEAST)"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bU" = (/obj/machinery/power/smes{charge = 0; input_level = 10000; inputting = 0; output_level = 15000; outputting = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bV" = (/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/alarm{frequency = 1439; locked = 1; pixel_y = 23; req_access = "150"},/turf/simulated/floor/plating{dir = 9; heat_capacity = 1e+006; icon_state = "warnplate"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bW" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating{dir = 5; heat_capacity = 1e+006; icon_state = "warnplate"; tag = "icon-warnplate (NORTHEAST)"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bX" = (/obj/structure/alien/weeds/node,/mob/living/simple_animal/hostile/alien,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"bY" = (/obj/machinery/conveyor{dir = 2; id = "awaysyndie"},/turf/simulated/floor/plating{carbon_dioxide = 48.7; dir = 4; heat_capacity = 1e+006; icon_state = "warnplate"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"bZ" = (/obj/machinery/mineral/unloading_machine{dir = 1; icon_state = "unloader-corner"; input_dir = 4; output_dir = 8},/turf/simulated/floor/plating{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"ca" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/structure/sign/poster{icon_state = "poster5"; pixel_x = 0; pixel_y = 32; serial_number = 5; subtype = 0},/turf/simulated/floor{carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "loadingarea"; nitrogen = 13.2; oxygen = 32.4; tag = "loading"; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cb" = (/turf/simulated/floor{carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-floorgrime (WEST)"; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cc" = (/obj/effect/decal/cleanable/dirt,/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor{carbon_dioxide = 48.7; dir = 4; heat_capacity = 1e+006; icon_state = "red"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cd" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "red"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"ce" = (/obj/machinery/alarm{frequency = 1439; locked = 0; pixel_y = 23; req_access = "150"},/turf/simulated/floor{burnt = 1; carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched2"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-floorscorched2 (WEST)"; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cf" = (/obj/structure/sign/biohazard{pixel_y = 32},/obj/structure/alien/weeds/node,/turf/simulated/floor{carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "warningcorner"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{carbon_dioxide = 48.7; dir = 1; heat_capacity = 1e+006; icon_state = "warning"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"ch" = (/obj/structure/sign/securearea{pixel_x = 0; pixel_y = 32},/turf/simulated/floor{carbon_dioxide = 48.7; dir = 4; heat_capacity = 1e+006; icon_state = "warningcorner"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"ci" = (/obj/machinery/light/small{active_power_usage = 0; dir = 4; icon_state = "bulb-broken"; status = 2},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{carbon_dioxide = 48.7; dir = 4; heat_capacity = 1e+006; icon_state = "red"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/table,/obj/machinery/cell_charger,/obj/machinery/light/small{dir = 8},/obj/item/weapon/stock_parts/cell/high,/obj/item/weapon/paper{info = "Alright, listen up. If you're reading this, I'm either taking a shit or I've been recalled back to Command. Either way, you'll need to know how to restore power. We've stolen this stuff from Nanotrasen, so all the equipment is jury-rigged. We have generators that work on both plasma and uranium, about 50 sheets should power the outpost for quite a while. If the generators aren't working, which is very likely, take the power cell on the desk and put it into the APC in the hallway. That should get the place running, at least for a little while."; name = "Engineering Instructions"},/turf/simulated/floor/plating{dir = 8; heat_capacity = 1e+006; icon_state = "warnplate"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"ck" = (/obj/structure/stool,/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cl" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating{dir = 1; heat_capacity = 1e+006; icon_state = "warnplate"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cm" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{dir = 4; heat_capacity = 1e+006; icon_state = "warnplatecorner"; tag = "icon-warnplatecorner (EAST)"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cn" = (/obj/machinery/light/small{dir = 4},/obj/structure/sign/poster{icon_state = "poster10"; pixel_x = 32; pixel_y = 0; serial_number = 10; subtype = 0},/turf/simulated/floor/plating{dir = 4; heat_capacity = 1e+006; icon_state = "warnplate"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"co" = (/turf/simulated/floor{carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "warning"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cp" = (/turf/simulated/floor{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cq" = (/turf/simulated/floor{carbon_dioxide = 48.7; dir = 4; heat_capacity = 1e+006; icon_state = "red"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cr" = (/obj/machinery/door/airlock/glass{density = 0; emagged = 1; icon_state = "door_open"; locked = 1; name = "Dormitories"},/obj/item/stack/rods,/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cs" = (/turf/simulated/floor{carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "red"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"ct" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-floorgrime (WEST)"; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{carbon_dioxide = 48.7; dir = 4; heat_capacity = 1e+006; icon_state = "red"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/airlock/engineering{name = "Power Maintenance"; req_access_txt = "150"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cx" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cy" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cA" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating{burnt = 1; heat_capacity = 1e+006; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cB" = (/obj/machinery/space_heater,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{dir = 4; heat_capacity = 1e+006; icon_state = "warnplate"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cC" = (/obj/machinery/mineral/processing_unit{dir = 1; output_dir = 2},/turf/simulated/floor/plating{carbon_dioxide = 48.7; dir = 4; heat_capacity = 1e+006; icon_state = "warnplate"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cD" = (/obj/machinery/mineral/processing_unit_console{machinedir = 8},/turf/simulated/wall,/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cE" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "warning"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cF" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{carbon_dioxide = 48.7; dir = 4; heat_capacity = 1e+006; icon_state = "red"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cG" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/grille{density = 0; destroyed = 1; icon_state = "brokengrille"},/obj/item/stack/rods,/obj/item/stack/rods,/obj/item/weapon/shard,/turf/simulated/floor/plating{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cH" = (/turf/simulated/floor{carbon_dioxide = 48.7; dir = 10; heat_capacity = 1e+006; icon_state = "red"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cI" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_state = "red"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cJ" = (/turf/simulated/floor{carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_state = "red"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cK" = (/obj/structure/cable,/obj/machinery/power/apc{cell_type = 15000; dir = 2; locked = 1; name = "Worn-out APC"; pixel_x = 0; pixel_y = -25; req_access = "150"; start_charge = 0},/turf/simulated/floor{carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_state = "red"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cL" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor{carbon_dioxide = 48.7; dir = 6; heat_capacity = 1e+006; icon_state = "red"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cM" = (/obj/item/weapon/storage/box/lights/mixed,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{dir = 10; heat_capacity = 1e+006; icon_state = "warnplate"; tag = "icon-warnplate (SOUTHWEST)"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cN" = (/obj/structure/cable,/obj/machinery/power/port_gen/pacman{desc = "A portable generator for emergency backup power. This one looks old and the knobs are rusted shut."; name = "Broken-down P.A.C.M.A.N.-type portable generator"},/turf/simulated/floor/plating{dir = 2; heat_capacity = 1e+006; icon_state = "warnplate"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cO" = (/obj/structure/cable,/obj/effect/decal/cleanable/dirt,/obj/machinery/power/port_gen/pacman/super{desc = "A portable generator for emergency backup power. This one looks old and the knobs are rusted shut."; name = "Broken-down S.U.P.E.R.P.A.C.M.A.N.-type portable generator"},/turf/simulated/floor/plating{dir = 2; heat_capacity = 1e+006; icon_state = "warnplate"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cP" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating{dir = 6; heat_capacity = 1e+006; icon_state = "warnplate"; tag = "icon-warnplate (SOUTHEAST)"},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cR" = (/obj/machinery/conveyor_switch/oneway{id = "awaysyndie"; layer = 3.1; name = "mining conveyor"},/turf/simulated/floor{carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "warning"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cS" = (/turf/simulated/floor{broken = 1; carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "damaged4"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-damaged4 (WEST)"; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cT" = (/obj/machinery/alarm{dir = 8; frequency = 1439; locked = 1; pixel_x = 23; pixel_y = 0; req_access = "150"},/obj/machinery/light{active_power_usage = 0; dir = 4; icon_state = "tube-broken"; status = 2},/turf/simulated/floor{carbon_dioxide = 48.7; dir = 4; heat_capacity = 1e+006; icon_state = "red"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cU" = (/obj/machinery/door/airlock{density = 0; emagged = 1; icon_state = "door_open"; id_tag = "awaydorm4"; locked = 1; name = "Dorm 1"; opacity = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/wood{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cV" = (/obj/machinery/door/airlock{id_tag = "awaydorm5"; name = "Dorm 2"},/turf/simulated/floor/wood{heat_capacity = 1e+006},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cX" = (/obj/structure/alien/weeds/node,/turf/simulated/floor{carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "warning"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cY" = (/turf/simulated/floor{broken = 1; carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "damaged2"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-damaged2 (WEST)"; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"cZ" = (/turf/simulated/floor{broken = 1; carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "damaged3"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-damaged3 (WEST)"; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"da" = (/obj/structure/closet/crate,/obj/item/stack/sheet/metal{amount = 12},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{carbon_dioxide = 48.7; dir = 1; heat_capacity = 1e+006; icon_state = "bot"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"db" = (/obj/machinery/door_control{id = "awaydorm4"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = 25; req_access_txt = "0"; specialfunctions = 4},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/syndie,/turf/simulated/floor/wood{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"dc" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/wood{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"dd" = (/turf/simulated/floor/wood{heat_capacity = 1e+006},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"de" = (/obj/machinery/door_control{id = "awaydorm5"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = 25; req_access_txt = "0"; specialfunctions = 4},/obj/structure/dresser,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/wood{heat_capacity = 1e+006},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"df" = (/obj/structure/alien/weeds/node,/mob/living/simple_animal/hostile/alien/drone,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"dg" = (/obj/machinery/mineral/stacking_machine{dir = 1; input_dir = 1; output_dir = 2},/turf/simulated/floor/plating{carbon_dioxide = 48.7; dir = 4; heat_capacity = 1e+006; icon_state = "warnplate"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"dh" = (/obj/machinery/mineral/stacking_unit_console{machinedir = 8},/turf/simulated/wall,/area/awaycontent/a4{name = "Syndicate Outpost"})
+"di" = (/obj/structure/closet/crate,/obj/item/stack/sheet/glass{amount = 10},/turf/simulated/floor{carbon_dioxide = 48.7; dir = 1; heat_capacity = 1e+006; icon_state = "bot"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"dj" = (/obj/structure/stool/bed/chair/wood/normal,/obj/machinery/alarm{dir = 4; frequency = 1439; locked = 1; pixel_x = -23; pixel_y = 0; req_access = "150"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/wood{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"dk" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/wood{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"dl" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/wood{heat_capacity = 1e+006},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"dm" = (/obj/machinery/alarm{dir = 8; frequency = 1439; locked = 1; pixel_x = 23; pixel_y = 0; req_access = "150"},/turf/simulated/floor/wood{heat_capacity = 1e+006},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"dn" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_state = "loadingarea"; nitrogen = 13.2; oxygen = 32.4; tag = "loading"; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"do" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{carbon_dioxide = 48.7; dir = 1; heat_capacity = 1e+006; icon_state = "warning"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"dp" = (/turf/simulated/floor{carbon_dioxide = 48.7; dir = 4; heat_capacity = 1e+006; icon_state = "warningcorner"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"dq" = (/turf/simulated/floor{broken = 1; carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "damaged1"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-damaged1 (WEST)"; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"dr" = (/obj/structure/closet/crate,/obj/item/weapon/storage/bag/ore,/obj/item/weapon/shovel,/obj/item/weapon/pickaxe,/turf/simulated/floor/plating{broken = 1; carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_state = "platingdmg3"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-platingdmg3"; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"ds" = (/obj/structure/table/woodentable,/obj/structure/sign/poster{icon_state = "poster24"; pixel_x = 0; pixel_y = -32; serial_number = 24; subtype = 0},/obj/item/weapon/pen,/obj/item/weapon/paper{info = "Log 1:
While mining today I noticed the NT station was finished with its renovations. They placed some huge reinforced tumor on the station, looks so ugly. I wouldn't be surprised if those pigs decided to turn that little astronomy outpost into a prison with that thing, it'd be pretty typical of them.
Log 2:
Really dumb of me but I just waved at an engineer in the outpost, and he waved back. I hope to god he was too dumb or drunk to recognize the suit, because if he isn't then we might have to pull out before they come looking for us.
Log 3:
That huge reinforced tumor in their science section has been making a lot of noise lately. I've been hearing some banging and scratching from the other side and I'm kind of glad now that they reinforced this thing so much. I'll be sleeping with my gun under my pillow from now on."; name = "Personal Log"},/turf/simulated/floor/wood{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"dt" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective_locked"; locked = 1; name = "personal closet"; req_access_txt = "150"},/obj/item/ammo_box/magazine/m10mm,/turf/simulated/floor/wood{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"du" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/syndie,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/wood{heat_capacity = 1e+006},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"dv" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "150"},/obj/item/weapon/spacecash/c50,/turf/simulated/floor/wood{heat_capacity = 1e+006},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"dw" = (/obj/machinery/door/airlock/external{density = 0; emagged = 1; icon_state = "door_open"; locked = 1; opacity = 0; req_access_txt = "150"},/turf/simulated/floor/plating{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"dx" = (/obj/item/weapon/ore/iron,/obj/item/weapon/ore/iron{pixel_x = -7; pixel_y = -4},/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"dy" = (/obj/structure/dispenser/oxygen{oxygentanks = 9},/obj/machinery/light/small{active_power_usage = 0; dir = 1; icon_state = "bulb-broken"; status = 2},/turf/simulated/floor/plating{carbon_dioxide = 48.7; dir = 9; heat_capacity = 1e+006; icon_state = "warnplate"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"dz" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"dA" = (/obj/structure/rack,/obj/item/clothing/suit/space/syndicate/orange,/obj/item/clothing/mask/gas,/obj/item/weapon/pickaxe/drill,/obj/item/clothing/head/helmet/space/syndicate/orange,/turf/simulated/floor/plating{carbon_dioxide = 48.7; dir = 5; heat_capacity = 1e+006; icon_state = "warnplate"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-warnplate (NORTHEAST)"; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"dB" = (/obj/item/weapon/ore/iron{pixel_x = -3; pixel_y = 9},/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"dC" = (/turf/simulated/mineral,/area/mine/explored)
+"dD" = (/obj/structure/sign/vacuum{desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'"; name = "\improper HOSTILE ATMOSPHERE AHEAD"; pixel_x = 0; pixel_y = -32},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating{carbon_dioxide = 48.7; dir = 10; heat_capacity = 1e+006; icon_state = "warnplate"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-warnplate (SOUTHWEST)"; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"dE" = (/turf/simulated/floor/plating{broken = 1; carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_state = "platingdmg1"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-platingdmg1"; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"dF" = (/obj/structure/rack,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{carbon_dioxide = 48.7; dir = 6; heat_capacity = 1e+006; icon_state = "warnplate"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-warnplate (SOUTHEAST)"; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"dG" = (/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; dir = 8; icon_state = "ltrails_1"},/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"dH" = (/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; dir = 8; icon_state = "ltrails_2"},/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"dI" = (/obj/item/device/flashlight/lantern{icon_state = "lantern-on"; on = 1},/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"dJ" = (/obj/machinery/door/airlock/external{density = 0; emagged = 1; icon_state = "door_open"; locked = 1; opacity = 0; req_access_txt = "150"},/turf/simulated/floor/plating{carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_plating = "asteroidplating"; icon_state = "asteroidplating"; nitrogen = 13.2; oxygen = 32.45; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"dK" = (/obj/item/weapon/storage/bag/ore,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"dL" = (/obj/item/weapon/pickaxe/drill,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"dM" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating{carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_plating = "asteroidplating"; icon_state = "asteroidplating"; nitrogen = 13.2; oxygen = 32.45; temperature = 251},/area/awaycontent/a4{name = "Syndicate Outpost"})
+"dN" = (/turf/simulated/floor/plating{carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_plating = "asteroidplating"; icon_state = "asteroidplating"; nitrogen = 13.2; oxygen = 32.45; temperature = 251},/area/mine/explored)
+"dO" = (/obj/item/weapon/ore/iron{pixel_x = -7; pixel_y = -4},/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"dP" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/structure/stool/bed/nest,/obj/effect/decal/cleanable/blood/gibs,/obj/item/weapon/tank/oxygen,/obj/item/clothing/suit/space/syndicate/orange,/obj/item/clothing/mask/gas,/obj/item/clothing/head/helmet/space/syndicate/orange,/obj/item/clothing/mask/facehugger{icon_state = "facehugger_impregnated"; item_state = "facehugger_impregnated"; stat = 1},/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"dQ" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/effect/decal/cleanable/blood,/mob/living/simple_animal/hostile/alien/drone,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"dR" = (/obj/machinery/light/small,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"dS" = (/turf/simulated/wall/r_wall/rust,/area/awaycontent/a2{name = "MO19 Research"})
+"dT" = (/turf/simulated/wall/r_wall,/area/awaycontent/a2{name = "MO19 Research"})
+"dU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/poddoor/preopen{desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; id = "Awaybiohazard"; name = "Acid-Proof biohazard containment door"; unacidable = 1},/obj/machinery/door/poddoor{desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; id = "Awaybiohazard"; layer = 2.9; name = "Acid-Proof biohazard containment door"; unacidable = 1},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"dV" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/poddoor/preopen{desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; id = "Awaybiohazard"; name = "Acid-Proof biohazard containment door"; unacidable = 1},/obj/machinery/door/poddoor{desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; id = "Awaybiohazard"; layer = 2.9; name = "Acid-Proof biohazard containment door"; unacidable = 1},/obj/structure/window/reinforced{dir = 4; layer = 3.2},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"dW" = (/obj/structure/sign/biohazard,/turf/simulated/wall/r_wall,/area/awaycontent/a2{name = "MO19 Research"})
+"dX" = (/obj/machinery/vending/snack,/turf/simulated/floor{icon_state = "dark"},/area/awaycontent/a2{name = "MO19 Research"})
+"dY" = (/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{name = "MO19 Research"})
+"dZ" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"ea" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"eb" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor{dir = 4; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaycontent/a2{name = "MO19 Research"})
+"ec" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 10},/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor{icon_state = "white"},/area/awaycontent/a2{name = "MO19 Research"})
+"ed" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a2{name = "MO19 Research"})
+"ee" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/shieldwallgen{locked = 0; req_access = null},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"ef" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/structure/stool/bed/nest,/obj/effect/decal/cleanable/blood/gibs,/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"eg" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/effect/decal/cleanable/blood/gibs,/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"eh" = (/obj/structure/alien/weeds,/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"ei" = (/obj/machinery/light{active_power_usage = 0; dir = 1; icon_state = "tube-broken"; status = 2},/obj/structure/alien/weeds,/obj/structure/alien/weeds{desc = "A large mottled egg."; health = 100; icon_state = "egg_hatched"; name = "egg"},/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"ej" = (/obj/machinery/sparker{desc = "A wall-mounted ignition device. This one has been applied with an acid-proof coating."; id = "awayxenobio"; name = "Acid-Proof mounted igniter"; pixel_x = 0; pixel_y = 25; unacidable = 1},/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/structure/alien/resin/wall,/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"ek" = (/obj/structure/alien/weeds,/obj/structure/alien/resin/wall,/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"el" = (/obj/structure/alien/weeds,/obj/structure/stool/bed/nest,/obj/effect/decal/cleanable/blood/gibs,/obj/item/clothing/mask/facehugger{icon_state = "facehugger_impregnated"; item_state = "facehugger_impregnated"; stat = 1},/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"em" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/structure/stool/bed/nest,/obj/effect/decal/cleanable/blood/gibs,/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"en" = (/obj/machinery/vending/coffee,/turf/simulated/floor{icon_state = "dark"},/area/awaycontent/a2{name = "MO19 Research"})
+"eo" = (/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"ep" = (/obj/machinery/light/small{active_power_usage = 0; dir = 4; icon_state = "bulb-broken"; status = 2},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{name = "MO19 Research"})
+"eq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold{dir = 4; icon_state = "manifold"; level = 2},/turf/simulated/floor{icon_state = "white"},/area/awaycontent/a2{name = "MO19 Research"})
+"er" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a2{name = "MO19 Research"})
+"es" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4; layer = 2.9},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/poddoor/preopen{desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; id = "Awaylab"; name = "Acid-Proof containment chamber blast door"; unacidable = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"et" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall/r_wall,/area/awaycontent/a2{name = "MO19 Research"})
+"eu" = (/obj/structure/alien/weeds/node,/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"ev" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"ew" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/structure/alien/resin/wall,/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"ex" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/structure/alien/resin/wall,/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"ey" = (/obj/structure/alien/weeds,/obj/structure/stool/bed/nest,/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"ez" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/effect/decal/cleanable/blood/gibs,/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"eA" = (/obj/structure/alien/weeds,/obj/structure/alien/weeds{desc = "A large mottled egg."; health = 100; icon_state = "egg_hatched"; name = "egg"},/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"eB" = (/turf/simulated/wall,/area/awaycontent/a2{name = "MO19 Research"})
+"eC" = (/turf/simulated/wall/rust,/area/awaycontent/a2{name = "MO19 Research"})
+"eD" = (/turf/simulated/floor{dir = 2; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaycontent/a2{name = "MO19 Research"})
+"eE" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor{dir = 2; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaycontent/a2{name = "MO19 Research"})
+"eF" = (/obj/machinery/light/small{active_power_usage = 0; dir = 8; icon_state = "bulb-broken"; status = 2},/turf/simulated/floor{dir = 6; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaycontent/a2{name = "MO19 Research"})
+"eG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/general/visible,/obj/structure/stool/bed/chair/office/light{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/awaycontent/a2{name = "MO19 Research"})
+"eH" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "Awaylab"; name = "Containment Chamber Blast Doors"; pixel_x = 4; pixel_y = -2; req_access_txt = "201"},/obj/machinery/ignition_switch{id = "awayxenobio"; pixel_x = 4; pixel_y = 8},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a2{name = "MO19 Research"})
+"eI" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4; layer = 2.9},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor/preopen{desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; id = "Awaylab"; name = "Acid-Proof containment chamber blast door"; unacidable = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"eJ" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/structure/alien/weeds{desc = "A large mottled egg."; health = 100; icon_state = "egg_hatched"; name = "egg"},/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"eK" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"eL" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"eM" = (/obj/machinery/power/port_gen/pacman{desc = "A portable generator for emergency backup power. This one looks old and the knobs are rusted shut."; name = "Broken-down P.A.C.M.A.N.-type portable generator"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"eN" = (/obj/machinery/power/port_gen/pacman/super{desc = "A portable generator for emergency backup power. This one looks old and the knobs are rusted shut."; name = "Broken-down S.U.P.E.R.P.A.C.M.A.N.-type portable generator"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaycontent/a2{name = "MO19 Research"})
+"eO" = (/obj/machinery/space_heater,/obj/machinery/light/small{dir = 1},/obj/structure/sign/poster{icon_state = "poster5_legit"; pixel_x = 0; pixel_y = 32; serial_number = 21; subtype = 1},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"eP" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/alarm{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"eQ" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/smes{charge = 1.5e+006; input_level = 10000; inputting = 0; output_level = 15000; outputting = 1},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"eR" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"eS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/item/weapon/newspaper,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"eT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a2{name = "MO19 Research"})
+"eU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; dir = 8; icon_state = "ltrails_1"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"eV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"eW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "201"; req_one_access_txt = "0"},/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; dir = 8; icon_state = "ltrails_1"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"eX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; dir = 5; icon_state = "ltrails_1"},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaycontent/a2{name = "MO19 Research"})
+"eY" = (/obj/structure/sign/securearea{pixel_x = 32},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor{dir = 2; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaycontent/a2{name = "MO19 Research"})
+"eZ" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{name = "MO19 Research"})
+"fa" = (/obj/structure/table,/obj/item/stack/sheet/mineral/plasma{layer = 2.9},/obj/machinery/light/small{active_power_usage = 0; dir = 1; icon_state = "bulb-broken"; status = 2},/obj/machinery/alarm{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"fb" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/table,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/syringes,/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"fc" = (/obj/structure/closet/crate/freezer,/obj/item/alien_embryo,/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{name = "MO19 Research"})
+"fd" = (/obj/machinery/door/firedoor,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{dir = 4; heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a2{name = "MO19 Research"})
+"fe" = (/turf/simulated/floor{icon_state = "white"},/area/awaycontent/a2{name = "MO19 Research"})
+"ff" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/general/visible,/turf/simulated/floor{icon_state = "white"},/area/awaycontent/a2{name = "MO19 Research"})
+"fg" = (/obj/structure/closet/l3closet/scientist,/obj/structure/window/reinforced,/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a2{name = "MO19 Research"})
+"fh" = (/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4; layer = 2.9},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/poddoor/preopen{desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; id = "Awaylab"; name = "Acid-Proof containment chamber blast door"; unacidable = 1},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"fi" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/structure/alien/weeds{desc = "A large mottled egg."; health = 100; icon_state = "egg_hatched"; name = "egg"},/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"fj" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/structure/stool/bed/nest,/obj/item/clothing/mask/facehugger{icon_state = "facehugger_impregnated"; item_state = "facehugger_impregnated"; stat = 1},/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"fk" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"fl" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/generic,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"fm" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"fn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a2{name = "MO19 Research"})
+"fo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"fp" = (/obj/structure/extinguisher_cabinet{pixel_x = -26},/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; icon_state = "ltrails_2"},/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaycontent/a2{name = "MO19 Research"})
+"fq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/alien/weeds,/turf/simulated/floor{dir = 2; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaycontent/a2{name = "MO19 Research"})
+"fr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{density = 0; emagged = 1; icon_state = "door_open"; locked = 1; name = "Xenobiology Lab"; opacity = 0; req_access_txt = "202"},/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"fs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{name = "MO19 Research"})
+"ft" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"fu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor{dir = 4; heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a2{name = "MO19 Research"})
+"fv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/alien/weeds/node,/turf/simulated/floor{icon_state = "white"},/area/awaycontent/a2{name = "MO19 Research"})
+"fw" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 5},/turf/simulated/floor{icon_state = "white"},/area/awaycontent/a2{name = "MO19 Research"})
+"fx" = (/obj/machinery/atmospherics/pipe/simple/general/visible{desc = "A one meter section of pipe. This one has been applied with an acid-proof coating."; dir = 4; name = "Acid-Proof Pipe"; unacidable = 1},/obj/item/stack/rods,/obj/item/stack/cable_coil{amount = 5},/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a2{name = "MO19 Research"})
+"fy" = (/obj/machinery/door/poddoor/preopen{desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; id = "Awaylab"; name = "Acid-Proof containment chamber blast door"; unacidable = 1},/obj/machinery/atmospherics/pipe/simple/general/visible{desc = "A one meter section of pipe. This one has been applied with an acid-proof coating."; dir = 4; name = "Acid-Proof Pipe"; unacidable = 1},/obj/item/stack/rods,/obj/item/stack/cable_coil{amount = 5},/obj/item/weapon/shard{icon_state = "medium"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"fz" = (/obj/machinery/atmospherics/pipe/simple/general/visible{desc = "A one meter section of pipe. This one has been applied with an acid-proof coating."; dir = 4; name = "Acid-Proof Pipe"; unacidable = 1},/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"fA" = (/obj/machinery/atmospherics/pipe/simple/general/visible{desc = "A one meter section of pipe. This one has been applied with an acid-proof coating."; dir = 4; name = "Acid-Proof Pipe"; unacidable = 1},/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"fB" = (/obj/machinery/atmospherics/pipe/simple/general/visible{desc = "A one meter section of pipe. This one has been applied with an acid-proof coating."; dir = 4; name = "Acid-Proof Pipe"; unacidable = 1},/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/structure/alien/resin/wall,/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"fC" = (/obj/machinery/atmospherics/pipe/simple/general/visible{desc = "A one meter section of pipe. This one has been applied with an acid-proof coating."; dir = 4; name = "Acid-Proof Pipe"; unacidable = 1},/obj/structure/alien/weeds,/obj/structure/alien/resin/wall,/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"fD" = (/obj/machinery/atmospherics/unary/outlet_injector{desc = "Has a valve and pump attached to it. This one has been applied with an acid-proof coating."; dir = 8; icon_state = "on"; name = "Acid-Proof Air Injector"; on = 1; unacidable = 1},/obj/structure/alien/weeds,/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"fE" = (/obj/machinery/light{active_power_usage = 0; dir = 4; icon_state = "tube-broken"; status = 2},/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"fF" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"fG" = (/obj/item/weapon/cigbutt,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"fH" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"fI" = (/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"fJ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"fK" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "0"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"fL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/effect/decal/cleanable/oil,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"fM" = (/obj/structure/filingcabinet,/obj/item/weapon/paper{info = "Entry One - 27/05/2554:
I just arrived, and already I hate my job. I'm stuck on this shithole of an outpost, trying to avoid these damn eggheads running all over the place preparing for god knows what. There's no crimes to stop, no syndies to kill, and I'm not even allowed to beat the fuckin' assistant senseless! They said I was transferred from Space Station 13 for 'good behavior', but this feels more like a punishment than a reward. All I know is that if I don't get some action soon, I'm going to go insane.
Entry Two - 03/06/2554:
Okay, so get this: we got a fuckin' deathsquad coming in today! I thought the day I saw one of them would be the day my employment was 'terminated', if you get my drift. They're escorting some sort of weird alien creature for the eggheads to study. I heard one of the docs telling the chef that this thing killed a whole security force before it was captured. I sure as hell hope that I don't have to fight it.
Entry Three - 08/06/2554:
My first real bit of 'action' today, if you could call it that. Crazy Ivan got in a fight with Kuester today about his Booze-O-Mat. Apparently one of the crewmembers had stolen a couple bottles of booze from the machine after Ivan disabled the ID lock. Tell you the truth, I don't blame the thief. Everyone is going a little stir-crazy in here, and the bartender is being damn stingy with the alcohol. Either way, once they started to pick a fight, I had to take them down. It's a damn shame that we don't have a brig, though. I had to lock Ivan in a fuckin' freezer, for god's sake. Let's hope that we can keep our sanity together, at least for a while.
Entry Four - 10/06/2554:
Jesus fucking Christ riding on a motorbike. These things the scientists are studying are terrifying! Fucking great huge purple bug things as tall as the ceiling, with blades for arms and drooling at the mouth. I don't think my taser will do jack shit against these damn things, but the eggheads say that they're safely contained. If they do, I have a feeling that it's only a matter of time before we're all screwed. These bastards look like walking death.
Entry Five - 18/06/2554:
Finally caught who stole the booze from Kuester. It was that fuckin' loser assistant Steve! He was in the dorms, chugging his worries away. I took one of the bottles back to the barkeep, but no one has to know about this second one. I think I'm gonna enjoy this while watching tomorrow's Thunderdome match.
Entry Six - 19/06/2554:
Oh, great. The chef is still sleeping, so we get Ivan's gruel for breakfast today. I overheard Sano and Douglas saying something about the aliens being restless, so we might get some action today. As long as it happens after the big game, I'm fine with it. I still got one beer to drink before I'm ready to die."; name = "Personal Log - Kenneth Cunningham"},/turf/simulated/floor{dir = 9; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a2{name = "MO19 Research"})
+"fN" = (/obj/structure/closet/secure_closet{icon_broken = "secbroken"; icon_closed = "sec"; icon_locked = "sec1"; icon_off = "secoff"; icon_opened = "secopen"; icon_state = "sec1"; locked = 1; name = "scientist's locker"; req_access_txt = "201"},/obj/item/clothing/suit/armor/vest,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/grenade/flashbang,/obj/item/weapon/storage/belt/security,/obj/item/weapon/reagent_containers/food/drinks/beer{pixel_x = -3; pixel_y = -2},/obj/machinery/alarm{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/turf/simulated/floor{dir = 1; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a2{name = "MO19 Research"})
+"fO" = (/obj/structure/sign/poster{icon_state = "poster21_legit"; pixel_y = 32; serial_number = 21; subtype = 1},/turf/simulated/floor{dir = 5; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a2{name = "MO19 Research"})
+"fP" = (/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{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"fQ" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaycontent/a2{name = "MO19 Research"})
+"fR" = (/obj/structure/sign/biohazard{pixel_x = 32},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor{dir = 2; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaycontent/a2{name = "MO19 Research"})
+"fS" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"fT" = (/obj/machinery/door/firedoor,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -29},/turf/simulated/floor{dir = 4; heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a2{name = "MO19 Research"})
+"fU" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/closet/l3closet/scientist,/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a2{name = "MO19 Research"})
+"fV" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/poddoor/preopen{desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; id = "Awaylab"; name = "Acid-Proof containment chamber blast door"; unacidable = 1},/obj/item/stack/cable_coil{amount = 1; icon_state = "coil_red1"; item_state = "coil_red1"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"fW" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/effect/decal/cleanable/blood,/obj/item/stack/rods,/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"fX" = (/obj/structure/alien/weeds,/obj/structure/stool/bed/nest,/obj/effect/decal/cleanable/blood/gibs,/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"fY" = (/obj/structure/alien/weeds,/obj/structure/stool/bed/nest,/obj/item/clothing/mask/facehugger{icon_state = "facehugger_impregnated"; item_state = "facehugger_impregnated"; stat = 1},/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"fZ" = (/obj/structure/stool,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"ga" = (/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a2{name = "MO19 Research"})
+"gb" = (/obj/effect/decal/cleanable/oil,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"gc" = (/obj/structure/reagent_dispensers/peppertank{pixel_x = -30; pixel_y = 0},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a2{name = "MO19 Research"})
+"gd" = (/turf/simulated/floor{dir = 4; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a2{name = "MO19 Research"})
+"ge" = (/obj/machinery/door/airlock/glass_security{name = "Security Post"; req_access_txt = "202"},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "white"},/area/awaycontent/a2{name = "MO19 Research"})
+"gf" = (/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; icon_state = "ltrails_1"},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaycontent/a2{name = "MO19 Research"})
+"gg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/firealarm{dir = 4; pixel_x = 28},/obj/structure/alien/weeds,/turf/simulated/floor{dir = 2; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaycontent/a2{name = "MO19 Research"})
+"gh" = (/obj/structure/table,/obj/item/weapon/scalpel{pixel_y = 12},/obj/item/weapon/circular_saw,/obj/item/weapon/razor{pixel_y = 5},/turf/simulated/floor{dir = 1; heat_capacity = 1e+006; icon_state = "warnwhite"},/area/awaycontent/a2{name = "MO19 Research"})
+"gi" = (/obj/structure/alien/weeds/node,/turf/simulated/floor{dir = 1; heat_capacity = 1e+006; icon_state = "warnwhite"},/area/awaycontent/a2{name = "MO19 Research"})
+"gj" = (/turf/simulated/floor{dir = 1; heat_capacity = 1e+006; icon_state = "warnwhite"},/area/awaycontent/a2{name = "MO19 Research"})
+"gk" = (/obj/structure/table,/obj/item/device/mmi,/obj/item/device/mmi,/obj/item/device/mmi,/turf/simulated/floor{dir = 1; heat_capacity = 1e+006; icon_state = "warnwhite"},/area/awaycontent/a2{name = "MO19 Research"})
+"gl" = (/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; pixel_y = 2},/turf/simulated/floor{icon_state = "white"},/area/awaycontent/a2{name = "MO19 Research"})
+"gm" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; dir = 4; name = "Acid-Proof disposal pipe"; unacidable = 1},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a2{name = "MO19 Research"})
+"gn" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4; layer = 2.9},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; dir = 4; name = "Acid-Proof disposal pipe"; unacidable = 1},/obj/machinery/door/poddoor/preopen{desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; id = "Awaylab"; name = "Acid-Proof containment chamber blast door"; unacidable = 1},/obj/structure/cable,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"go" = (/obj/structure/disposalpipe/segment{desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; dir = 4; name = "Acid-Proof disposal pipe"; unacidable = 1},/obj/structure/alien/weeds,/obj/structure/alien/resin/wall,/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"gp" = (/obj/structure/disposalpipe/segment{desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; dir = 2; icon_state = "pipe-c"; name = "Acid-Proof disposal pipe"; unacidable = 1},/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"gq" = (/obj/structure/table,/obj/effect/decal/cleanable/dirt,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high,/obj/item/device/radio/off,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"gr" = (/obj/structure/table,/obj/item/weapon/paper{info = "Ivan Volodin Stories:
Entry Won - 28/05/2554:
Hello. I am Crazy Ivan. Boss say I must write. I do good job fixing outpost. Is very good job. Much better than mines. Many nice people. I cause no trouble.
Entry Too - 05/06/2554:
I am finding problem with Booze-O-Mat. Is not problem. I solve very easy. Use yellow tool to make purple light go off. I am good engineer! Bartender will be very happy.
Entry Tree - 08/06/2554:
Bartender is not happy. Security man is not happy. Cannot feel legs, is very cold in freezer. Is not good. Table is jammed into door, have no tools. Is very not good. But, on bright side, found meat! Shall chew to keep spirits up.
Entry Fore - 12/06/2554:
Big nasty purple bug looked at me today. Make nervous. Blue wall wire can be broken, then bad thing happens. Very very bad thing. Man in orange spacesuit wave at me today too. He seem nice. Wonder who was?
Entry Fiv - 15/06/2554:
I eat cornflakes today. Is good day. Sun shine for a while. Was nice. I also take ride on disposals chute. Was fun, but tiny. Get clog out of pipes, was vodka bottle. Is empty. This make many sads.
Entry Sex: 19/06/2554:
Purple bugs jumpy today. When waved, get hiss. Maybe very bad. Maybe just ill. Do not know. Is science problem, is not engineer problem. I eat sandwich. Is glorious job. Wish to never end."; name = "Personal Log - Ivan Volodin"},/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a2{name = "MO19 Research"})
+"gs" = (/obj/machinery/light/small,/obj/structure/closet/toolcloset,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"gt" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"gu" = (/obj/machinery/computer/monitor,/obj/structure/cable,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"gv" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/newscaster/security_unit{pixel_x = -30; pixel_y = 0},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a2{name = "MO19 Research"})
+"gw" = (/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"gx" = (/obj/item/stack/rods,/obj/item/weapon/shard{icon_state = "small"},/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; dir = 8; icon_state = "ltrails_1"},/turf/simulated/floor{dir = 4; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a2{name = "MO19 Research"})
+"gy" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/grille{density = 0; destroyed = 1; icon_state = "brokengrille"},/obj/item/stack/rods,/obj/item/stack/rods,/obj/item/weapon/shard,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"gz" = (/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; dir = 6; icon_state = "ltrails_1"},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaycontent/a2{name = "MO19 Research"})
+"gA" = (/obj/structure/cable,/obj/machinery/power/apc{cell_type = 15000; dir = 4; locked = 0; name = "Worn-out APC"; pixel_x = 25; req_access = null; start_charge = 100},/turf/simulated/floor{dir = 2; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaycontent/a2{name = "MO19 Research"})
+"gB" = (/obj/structure/table,/obj/item/weapon/retractor,/obj/item/weapon/hemostat,/turf/simulated/floor{icon_state = "white"},/area/awaycontent/a2{name = "MO19 Research"})
+"gC" = (/obj/structure/table,/obj/item/weapon/surgical_drapes,/obj/machinery/light/small{active_power_usage = 0; dir = 4; icon_state = "bulb-broken"; status = 2},/turf/simulated/floor{icon_state = "white"},/area/awaycontent/a2{name = "MO19 Research"})
+"gD" = (/obj/structure/filingcabinet/filingcabinet,/obj/machinery/light/small{active_power_usage = 0; dir = 8; icon_state = "bulb-broken"; status = 2},/obj/item/weapon/paper{info = "Researcher: Dr. Sakuma Sano
Date: 04/06/2554
Report:
As expected, all that is left of the monkeys we sent in earlier is a group of xenomorph larvae. It is quite clear that the facehuggers are not selective in their hosts, and so far the gestation process has been shown to have a 100% success rate.
The larvae themselves have been behaving very differently from the lone larva we first observed, and despite shying away from humans they are clearly comfortable with others of their kind. Our previous suspicions on larvae have been confirmed with their demonstration of playfulness: they are not nearly as aggressive or violent when young, before molting to adulthood.
The majority of the play we observed involved a sort of hide-and-seek, and occasionally wrestling by tangling themselves and struggling out of it. While normally we would write these off as instinctual play for honing their skills when they molt, their growth period is so incredibly fast and they are still such adept killers that it would serve no practical purpose. The only explanation for this is perhaps to create bonds and friendships with each other, if that is even possible for such an incredibly hostile race. It may be that they are much more reasonable with each other than other life forms.
It had become clear that now was the best time to extract a xenomorph for dissecting, as these were all still larvae and the queen was still attached to its ovipositor and would be immobile. With the approval of the research director, we sent in our medical robot that had been dubbed 'Head Surgeon' into the containment pen, dropping the shields for only a fraction of a second to allow it entry. The larvae were cautious, but the curiosity of one had him within grabbing range of our robot. It was brought out and quickly euthanized through lethal injection, courtesy of our mechanical doctor."; name = "Larva Xenomorph Social Interactions & Capturing Procedure"},/obj/item/weapon/paper{info = "Researcher: Dr. Sakuma Sano
Date: 04/06/2554
Report:
I have studied many interesting and diverse life-forms as a xenobiologist ranging from creatures as large as cows, to specimens too small see with the naked eye. This is by far the largest alien I have ever seen. The alien we were previously studying has molted and has become an absolutely enormous creature. Standing at over 15 feet tall and weighing in at likely two tons or more, the xenomorph queen is an absolutely breathtakingly large and cruel monster. Its behavior has changed drastically from when it was a drone, having become far more comfortable with sitting and staring at us, rather than smashing at the windows.
The queen, physiologically speaking, is fairly similar to the other xenomorphs, with a few key differences. Its enormous size demands large legs, while the back seems to be always hunched forward. The dorsal tubes on the back have changed to several large spikes, and we observed the alien now sports a second pair of smaller arms on its chest. The purpose of these secondary arms is still unknown. Finally, the queen's crown has become incredibly large, with what seems to be a retractable slot to hide its head in. The dome appears to be extremely thick near the front, and will likely be able to resist a lot of trauma. Despite the enormous size it has grown to, it is not that much slower than it used to be.
After two hours of doing relatively nothing but staring, the queen began to produce an unusually large amount of resin and weeds, quickly shaping up a large nest that it then hid behind. It then proceeded to smash out all the lights, leaving us with very little to see with our cameras. When we looked through the back cameras, we had discovered that it had grown a large ovipositor, and was releasing large eggs onto the ground. This had us all in agreement that this stage of the life cycle was the queen.
Over the next few hours, the eggs grew to their full sizes, and we provided the subject with new monkey hosts. When they approached the eggs, they opened to release more facehuggers. It seems that we have observed the full cycle of reproduction for this species. We can expect more larvae in the next few hours."; name = "Queen Xenomorph Physiology & Behavior Observation"},/obj/item/weapon/paper{info = "Researcher: Dr. Sakuma Sano
Date: 03/06/2554
Report:
The other scientists and I can hardly believe our eyes. The snake-like larva has molted into a 7 foot tall insectoid nightmare in just a few hours. It's obvious now as to why such heavy duty containment was needed. It immediately tried to escape however by flinging itself at the window in a flurry of swipes and stabs. It seems its behavior has returned to a state that is very similar to the facehugger, though I doubt with the same intent! Thankfully, our glass and shields have shown to be more than sturdy enough for such a violent creature, and so far, any attempts at the creature escaping have been in vain.
As for its physiology, the creature has an elongated head with what appears to be have an exoskeleton resembling an external rib-cage on the torso. The alien is also fairly skinny with a lean body. The little amount of meat on the alien appears to be entirely muscle. We assume this makes it deceptively strong, while remaining agile at the same time. One of the most interesting things we have seen is its pharyngeal jaw. It has some what of an inner mouth capable of being fired externally at extremely high speeds. It has already caused many dents in the walls and a few small cracks in the window with it. The alien also has a couple of dorsal tubes on its back, their purpose unknown. Finally, this monster sports a long ridged tail, complete with a large and extremely sharp blade at the tip.
Normally I would be absolutely terrified of something like this, but I'm putting my trust in Nanotrasen with the containment. After all, they wouldn't build a cell that could fail to contain its subject, would they?"; name = "Adult Xenomorph Physiology & Behavior Observation"},/obj/item/weapon/paper{info = "Researcher: Dr. Sakuma Sano
Date: 03/06/2554
Report:
When the larva first emerged from the chest of the monkey, it seemed very curious. It would wander around aimlessly for awhile and then sit still. We are unable to determine the gender of the larva, or even determine if it has a gender. After some time had passed, it seemed to lose interest in its surroundings and sat mostly still while occasionally wagging its tail. We decided to throw in a live mouse to see if it would consume it. The larva quickly attacked and ate the mouse and seemed to get larger very suddenly, this suggests that the larvae are capable of metabolizing and directing all the energy towards growth at previously thought impossible speeds. It is a shame that we cannot observe the process more closely, as we do not currently know how dangerous or violent this creature is or will become as it matures fully.
It is tempting to imagine the possibilities of utilizing such a mechanism. The capability of skipping years of growth time for children, repairing bodily damage in a matter of moments, even its usage in existing cloning technology."; name = "Larva Xenomorph Physiology & Behavior Observation"},/obj/item/weapon/paper{info = "Researcher: Dr. Sakuma Sano
Date: 03/06/2554
Report:
The test subject we were provided with truly is alien. It is a small spider-like creature with bony legs leading to a smooth body. It has a long tail connected to it, and it has shown extremely aggressive behavior by flinging its entire body at the glass and shields to no avail. While doing so, we noticed there was a small pink hole in the middle of the body.
When we sent in a monkey through the crude but effective disposal tube, the alien immediately jumped at its face and latched on. The monkey was quickly suffocated by its constricting tail, unable to pry off the fingers. The monkey at first seemed to be dead, but was observed to be breathing. The recently named alien 'facehugger' fell off dead and curled its legs up like a spider moments after it had finished with the monkey's body.
While the monkey appeared to be unharmed, we kept it in the cell for a couple more hours until we were horrified to discover it screaming out in pain as a snake-like creature erupted from the monkey's chest! It appears that the 'facehugger' is only the start of this life cycle. The impregnation cycle involving the creatures growing inside the chests of their hosts seems to only be the beginning."; name = "'Facehugger' Xenomorph Physiology & Behavior Observation"},/turf/simulated/floor{icon_state = "white"},/area/awaycontent/a2{name = "MO19 Research"})
+"gE" = (/obj/structure/table/reinforced,/obj/item/device/radio/off,/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a2{name = "MO19 Research"})
+"gF" = (/obj/structure/cable,/obj/structure/grille,/obj/structure/window/reinforced{dir = 4; layer = 2.9},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/poddoor/preopen{desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; id = "Awaylab"; name = "Acid-Proof containment chamber blast door"; unacidable = 1},/obj/structure/cable,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"gG" = (/obj/structure/disposalpipe/segment{desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; name = "Acid-Proof disposal pipe"; unacidable = 1},/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"gH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/item/stack/rods,/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a2{name = "MO19 Research"})
+"gI" = (/obj/machinery/door_control{id = "Awaybiohazard"; name = "Biohazard Shutter Control"; pixel_x = -25; pixel_y = 0; req_access_txt = "201"},/obj/machinery/light/small{dir = 8},/obj/structure/table,/obj/item/device/radio/off,/obj/item/weapon/screwdriver{pixel_y = 10},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a2{name = "MO19 Research"})
+"gJ" = (/obj/structure/stool/bed/chair/office/dark,/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"gK" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor{dir = 4; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a2{name = "MO19 Research"})
+"gL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"gM" = (/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaycontent/a2{name = "MO19 Research"})
+"gN" = (/obj/machinery/light{active_power_usage = 0; dir = 4; icon_state = "tube-broken"; status = 2},/obj/machinery/alarm{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/turf/simulated/floor{dir = 2; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaycontent/a2{name = "MO19 Research"})
+"gO" = (/obj/structure/optable,/turf/simulated/floor{dir = 1; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaycontent/a2{name = "MO19 Research"})
+"gP" = (/obj/machinery/computer/operating,/turf/simulated/floor{dir = 1; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaycontent/a2{name = "MO19 Research"})
+"gQ" = (/obj/structure/table,/obj/item/clothing/gloves/latex,/obj/item/clothing/mask/surgical,/obj/item/clothing/suit/apron/surgical,/turf/simulated/floor{dir = 1; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaycontent/a2{name = "MO19 Research"})
+"gR" = (/obj/structure/filingcabinet/filingcabinet,/obj/item/weapon/paper{info = "Researcher: Dr. Mark Douglas
Date: 17/06/2554
Report:
Earlier today we have observed a new phenomenon with our subjects. While feeding them our last monkey subject and throwing out the box, the aliens merely looked at us instead of infecting the monkey right away. They looked to be collectively distressed as they would no longer be given hosts, where instead we would move to the next phase of the experiment. When I glanced at the gas tanks and piping leading to their cell, I looked back to see all of them were up against the glass, even the queen! It was as if they all understood what was going to happen, even though we knew only the queen had the cognitive capability to do so.
The only explanation for this is a form of communication between the aliens, but we have seen no such action take place anywhere in the cell until now. We also know that regular drone and hunter xenomorphs have no personality or instinct to survive by themselves. Perhaps the queen has a direct link to them? A form of a commander or overseer that controls their every move? A hivemind?"; name = "The Hivemind Hypothesis"},/obj/item/weapon/paper{info = "Researcher: Dr. Sakuma Sano
Date: 08/06/2554
Report:
The xenomorphs we have come to study here are a remarkable species. They are almost universally aggressive across all castes, showing no remorse or guilt or pause before or after acts of violence. They appear to be a species entirely designed to kill. Oddly enough, even their method of reproduction is a brutal two-for-one method of birthing a new xenomorph and killing its host.
The lone xenomorph we studied only five days ago showed little sign of intelligence. Only a simple drone that flung itself at the safety glass and shields repeatedly and thankfully without success. Once the drone molted into a queen, it became much more calm and calculating, merely looking at us and waiting while building its nest. As the hive grew in size and in numbers, so too did the intelligence of the common hunter and drone. We are still researching how they can communicate with one another and the relationship between the different castes and the queen. We will continue to update our research as we learn more about the species."; name = "A Preliminary Study of Alien Behavior"},/obj/item/weapon/paper{info = "Researcher: Dr. Mark Douglas
Date: 06/06/2554
Report:
While observing the growing number of aliens in the containment cell, we began to notice subtle differences that were consistently repeating. Like ants, these creatures clearly have different specialized variations that determine their roles in the hive. We have dubbed the three currently observed castes as Hunters, Drones, and Sentinels.
Hunters have been observed to be by far the most aggressive and agile of the three, constantly running on every surface and frequently swiping at the windows. They are also remarkably good at camouflaging themselves in darkness and on their resin structures, appearing almost invisible to the unwary observer. They are always the first to reach the monkeys we send in leading us to believe that this caste is primarily used for finding and retrieving hosts.
Drones on the other hand are much more docile and seem more shy by comparison, though not any less aggressive than the other castes. They have been observed to have a much wider head and lack dorsal tubes. They have shown to be less agile and visibly more fragile than any other caste. The drone however has never been observed to interact with the monkeys directly and instead preferring maintenance of the hive by building walls of resin and moving eggs around the nest. As far as we know, we have only ever observed a drone become a queen, and we have no way of knowing if the other castes have that capability.
Lastly, we have the Sentinels, which appear at first glance to be the guards of the hive. They have so far been only observed to remain near the queen and the eggs, frequently curled up against the walls. We have only observed one instance where they have interacted with a monkey who strayed too closely to the queen, and was pounced and held down immediately until it was applied with a facehugger. Their lack of movement makes it difficult to determine their exact purpose as guards, sentries, or other role."; name = "The Xenomorph 'Castes'"},/obj/item/weapon/paper{info = "Researcher: Dr. Mark Douglas
Date: 04/06/2554
Report:
After an extremely dangerous, time consuming and costly dissection, we have managed to record and identify several of the organs inside of the first stage of the xenomorph cycle: the larva. This procedure took an extensive amount of time because these creatures have incredibly, almost-comically acidic blood that can melt through almost anything in a few moments. We had to use over a dozen scalpels and retractors to complete the autopsy.
The larva seems to possess far fewer and quite different organs than that of a human. There is a stomach, with no digestive tract, a heart, which seems to lack any blood-oxygen circulation purpose, and an elongated brain, even though its as dumb as any large cat. It also lacks any liver, kidneys, or other basic organs.
We can't determine the exact nature of how these creatures grow, nor if they gain organs as they become adults. The larger breeds of xenomorph are too dangerous to kill and capture to give us an accurate answer to these questions. All that we can conclude is that being able to function with so little and yet be so deadly means that these creatures are highly evolved and likely to be extremely durable to various hazards that would otherwise be lethal to humans."; name = "Larva Xenomorph Autopsy Report"},/turf/simulated/floor{icon_state = "white"},/area/awaycontent/a2{name = "MO19 Research"})
+"gS" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor{icon_state = "white"},/area/awaycontent/a2{name = "MO19 Research"})
+"gT" = (/obj/effect/decal/cleanable/dirt,/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a2{name = "MO19 Research"})
+"gU" = (/obj/machinery/shieldwallgen{locked = 0; req_access = null},/obj/structure/cable,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"gV" = (/obj/structure/disposaloutlet{desc = "An outlet for the pneumatic disposal system. This one has been applied with an acid-proof coating."; dir = 1; name = "Acid-Proof disposal outlet"; unacidable = 1},/obj/structure/disposalpipe/trunk{desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; dir = 1; name = "Acid-Proof disposal pipe"; unacidable = 1},/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"gW" = (/obj/machinery/light{active_power_usage = 0; dir = 2; icon_state = "tube-broken"; status = 2},/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"gX" = (/obj/machinery/sparker{desc = "A wall-mounted ignition device. This one has been applied with an acid-proof coating."; id = "awayxenobio"; name = "Acid-Proof mounted igniter"; pixel_x = 0; pixel_y = -25; unacidable = 1},/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/structure/alien/resin/wall,/turf/simulated/floor/engine,/area/awaycontent/a2{name = "MO19 Research"})
+"gY" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"gZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"ha" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"hb" = (/obj/structure/table,/obj/item/weapon/book/manual/wiki/security_space_law,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = -32; pixel_y = 0},/turf/simulated/floor{dir = 10; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a2{name = "MO19 Research"})
+"hc" = (/obj/structure/table,/obj/item/weapon/folder/red,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a2{name = "MO19 Research"})
+"hd" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor{dir = 6; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a2{name = "MO19 Research"})
+"he" = (/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "white"},/area/awaycontent/a2{name = "MO19 Research"})
+"hf" = (/obj/structure/closet/secure_closet{icon_broken = "secureresbroken"; icon_closed = "secureres"; icon_locked = "secureres1"; icon_off = "secureresoff"; icon_opened = "secureresopen"; icon_state = "secureres"; locked = 0; name = "scientist's locker"; req_access_txt = "201"},/obj/item/clothing/suit/labcoat,/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"hg" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"hh" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"hi" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"hj" = (/obj/structure/window/reinforced,/obj/structure/closet/secure_closet{icon_broken = "secureresbroken"; icon_closed = "secureres"; icon_locked = "secureres1"; icon_off = "secureresoff"; icon_opened = "secureresopen"; icon_state = "secureres1"; locked = 1; name = "scientist's locker"; req_access_txt = "201"},/obj/item/clothing/suit/labcoat,/obj/item/weapon/tank/air,/obj/item/clothing/mask/gas,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"hk" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"hl" = (/obj/machinery/vending/medical{req_access_txt = "201"},/turf/simulated/floor{dir = 2; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaycontent/a2{name = "MO19 Research"})
+"hm" = (/obj/structure/closet/crate/bin,/obj/item/clothing/gloves/latex,/obj/item/trash/chips,/obj/effect/decal/cleanable/dirt,/obj/machinery/light/small{active_power_usage = 0; dir = 1; icon_state = "bulb-broken"; status = 2},/turf/simulated/floor{dir = 2; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaycontent/a2{name = "MO19 Research"})
+"hn" = (/obj/structure/table,/obj/item/weapon/storage/box/gloves{pixel_x = 0; pixel_y = 0},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "whitecorner"},/area/awaycontent/a2{name = "MO19 Research"})
+"ho" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/effect/decal/cleanable/oil,/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a2{name = "MO19 Research"})
+"hp" = (/obj/structure/closet/secure_closet{icon_broken = "rdsecurebroken"; icon_closed = "rdsecure"; icon_locked = "rdsecure1"; icon_off = "rdsecureoff"; icon_opened = "rdsecureopen"; icon_state = "rdsecure1"; locked = 1; name = "\proper research director's locker"; req_access_txt = "201"},/obj/item/weapon/storage/backpack/satchel_tox,/obj/item/clothing/gloves/latex,/obj/item/clothing/suit/labcoat/science,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{name = "MO19 Research"})
+"hq" = (/obj/structure/table,/obj/item/weapon/cartridge/signal/toxins,/obj/item/weapon/cartridge/signal/toxins{pixel_x = -4; pixel_y = 2},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{name = "MO19 Research"})
+"hr" = (/obj/structure/filingcabinet/chestdrawer,/obj/machinery/light/small{active_power_usage = 0; dir = 1; icon_state = "bulb-broken"; status = 2},/obj/machinery/alarm{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/item/weapon/paper{info = "Personal Log for Research Director Gerald Rosswell
Entry One - 17/05/2554:
You know, I can't believe I took this position so suddenly. I saw that corporate needed a research director for one of it's outposts and thought it would be a cakewalk, there isn't going to be a lot of research to be done on a tiny outpost. Mainly just running scans on the gas giant we are orbiting or some basic RnD. However, they conveniently forgot to tell me that me and my science staff would have to pull double duty as medical staff and that there is no one higher up on the chain of command here, so I get to pull triple duty as acting captain as well! This shit is probably allowed in some 3 point fine print buried underneath the literally thousands of pages of contracts. Well, at least the research will be easy work.
Entry Two - 25/05/2554:
Well, we all expected it at the outpost, CentComm has decided to completely change what research we are doing. They've decided that we should be research the species known as 'xenomporphs'. They announced this change 4 days ago and along with it, sadly, the termination of our current science staff barring me. Not to mention the constant noise made by the construction detail they sent to staple on an xenobiology lab ensuring no one has been able to sleep decently ever since they announced the shift. To make matters worse our current security guard actually died of a heart attack today. Just goes to show that 75 year old men shouldn't be security guards. Still can't believe that they decided to do this major change less than a month after the outpost was established.
Entry Three - 27/05/2554:
The new security guard arrived today. Apparently transferred here from the research station that also is orbiting the gas giant. He seems to be rather angry about his transfer. Considering the rumors I've heard about the research station he's probably caught off guard by the fact that Steve hasn't tried to force an IED down his throat.
Entry Four - 06/06/2554:
My requests for additional security and containment measures for the 'xenomorph' has been denied. Does Central Command not notice how dangerous these creatures are? The only thing keeping them in is a force field, a minor problem with the power grid and the entire hive is loose. What would stop them then, the lone security guard with a dinky little taser? Kenneth can barely handle a short-tempered engineer. We are under equipped and under staffed, we are inevitably going to be destroyed unless we get the equipment and staff we need.
Entry Five - 10/06/2554:
Cunningham got a good look at the xenomorph in containment. He was frightened for the rest of the day, rather amusing if it wasn't for the fact that we are all trapped on this scrap heap with naught but a force field keeping those xenomorphs in.
Entry Six - 17/06/2554:
The reactions from the specimens today has shown that they possess strange mental properties. Mark hypothesizes that they possibly have a sort of hive mind, while nothing is certain this would explain how xenomorphs seem to have vastly increased intellect when a 'queen' is present. Of course, to test this hypothesis would require many complicated procedures which we will not be able to undertake. But we do not know the full extend of the xenomorph mind, it may or may not be able to find a way to circumvent our containment system. I will resend my request for additional security measures along with this new found information."; name = "Personal Log - Gerald Rosswell"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{name = "MO19 Research"})
+"hs" = (/obj/structure/closet/crate/bin,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{name = "MO19 Research"})
+"ht" = (/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/door/poddoor{id = "AwayRD"; layer = 2.9; name = "privacy shutter"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"hu" = (/turf/simulated/floor{dir = 1; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaycontent/a2{name = "MO19 Research"})
+"hv" = (/turf/simulated/floor{dir = 2; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaycontent/a2{name = "MO19 Research"})
+"hw" = (/obj/structure/window/reinforced,/obj/structure/grille{density = 0; destroyed = 1; icon_state = "brokengrille"},/obj/item/stack/rods,/obj/item/stack/rods,/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"hx" = (/obj/item/stack/rods,/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "white"},/area/awaycontent/a2{name = "MO19 Research"})
+"hy" = (/obj/effect/decal/cleanable/robot_debris,/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/device/healthanalyzer{pixel_x = 6; pixel_y = -5},/obj/item/device/assembly/prox_sensor{pixel_x = -5; pixel_y = -2},/obj/item/robot_parts/l_arm,/obj/effect/decal/cleanable/oil,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "white"},/area/awaycontent/a2{name = "MO19 Research"})
+"hz" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire{pixel_x = 0; pixel_y = 0},/obj/machinery/firealarm{dir = 4; pixel_x = 28},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaycontent/a2{name = "MO19 Research"})
+"hA" = (/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{name = "MO19 Research"})
+"hB" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{name = "MO19 Research"})
+"hC" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{density = 0; emagged = 1; icon_state = "door_open"; locked = 1; name = "Research Director's Office"; opacity = 0; req_access_txt = "201"; req_one_access_txt = "0"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{name = "MO19 Research"})
+"hD" = (/obj/structure/noticeboard{dir = 1; pixel_y = -32},/obj/machinery/light/small{active_power_usage = 0; dir = 2; icon_state = "bulb-broken"; status = 2},/obj/item/weapon/paper{info = "
In The Event of Xenobiology Breach: Evacuate staff, Lock down Xenobiology, Notify on-site superiors and/or Central Command immediatly.
Current Xenobiology Containment Level:Secure RUN
"; name = "Evacuation Procedure"},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaycontent/a2{name = "MO19 Research"})
+"hE" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "white"},/area/awaycontent/a2{name = "MO19 Research"})
+"hF" = (/obj/machinery/door/airlock/glass_research{name = "Research Storage"; req_access_txt = "201"},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "white"},/area/awaycontent/a2{name = "MO19 Research"})
+"hG" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 0; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/obj/machinery/alarm{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaycontent/a2{name = "MO19 Research"})
+"hH" = (/turf/simulated/wall/rust,/area/awaycontent/a1{name = "MO19 Arrivals"})
+"hI" = (/turf/simulated/wall,/area/awaycontent/a1{name = "MO19 Arrivals"})
+"hJ" = (/obj/structure/closet/crate,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a2{name = "MO19 Research"})
+"hK" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"hL" = (/obj/structure/stool/bed/chair,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{name = "MO19 Research"})
+"hM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/poddoor{id = "AwayRD"; layer = 2.9; name = "privacy shutter"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"hN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/poddoor{id = "AwayRD"; layer = 2.9; name = "privacy shutter"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"hO" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/poddoor{id = "AwayRD"; layer = 2.9; name = "privacy shutter"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"hP" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; id = "Awaybiohazard"; layer = 2.9; name = "Acid-Proof biohazard containment door"; unacidable = 1},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "delivery"; name = "floor"},/area/awaycontent/a2{name = "MO19 Research"})
+"hQ" = (/obj/structure/table,/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaycontent/a2{name = "MO19 Research"})
+"hR" = (/obj/structure/toilet{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"hS" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"hT" = (/obj/structure/urinal{pixel_y = 29},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"hU" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/urinal{pixel_y = 29},/obj/structure/mirror{pixel_x = 28},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"hV" = (/obj/machinery/shower{pixel_y = 16},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"hW" = (/obj/machinery/shower{pixel_y = 16},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"hX" = (/obj/machinery/light/small,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"hY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating{burnt = 1; heat_capacity = 1e+006; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a2{name = "MO19 Research"})
+"hZ" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/folder/white,/obj/item/weapon/stamp/rd{pixel_x = 3; pixel_y = -2},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{name = "MO19 Research"})
+"ia" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{name = "MO19 Research"})
+"ib" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/item/device/laser_pointer,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{name = "MO19 Research"})
+"ic" = (/obj/machinery/computer/aifixer,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{name = "MO19 Research"})
+"id" = (/obj/structure/rack,/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/circuitboard/teleporter,/turf/simulated/floor{dir = 9; heat_capacity = 1e+006; icon_state = "warnwhite"},/area/awaycontent/a2{name = "MO19 Research"})
+"ie" = (/obj/structure/rack,/obj/item/device/paicard{pixel_x = 4},/turf/simulated/floor{dir = 1; heat_capacity = 1e+006; icon_state = "warnwhite"},/area/awaycontent/a2{name = "MO19 Research"})
+"if" = (/obj/structure/rack,/turf/simulated/floor{dir = 5; heat_capacity = 1e+006; icon_state = "warnwhite"},/area/awaycontent/a2{name = "MO19 Research"})
+"ig" = (/obj/machinery/door/airlock/glass_medical{glass = 0; icon = 'icons/obj/doors/Doorresearch.dmi'; id_tag = ""; name = "Research Division"; opacity = 1; req_access_txt = "201"; req_one_access_txt = "0"},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "white"},/area/awaycontent/a2{name = "MO19 Research"})
+"ih" = (/obj/structure/closet/l3closet/general,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{dir = 1; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaycontent/a2{name = "MO19 Research"})
+"ii" = (/obj/structure/closet/l3closet/general,/obj/machinery/light/small{active_power_usage = 0; dir = 2; icon_state = "bulb-broken"; status = 2},/turf/simulated/floor{dir = 1; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaycontent/a2{name = "MO19 Research"})
+"ij" = (/obj/structure/table,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/machinery/newscaster{pixel_x = 0; pixel_y = -30},/turf/simulated/floor{dir = 1; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaycontent/a2{name = "MO19 Research"})
+"ik" = (/obj/structure/table,/turf/simulated/floor{dir = 1; heat_capacity = 1e+006; icon_state = "whitecorner"},/area/awaycontent/a2{name = "MO19 Research"})
+"il" = (/obj/machinery/alarm{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"im" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{desc = "Oh no, seven years of bad luck!"; icon_state = "mirror_broke"; pixel_x = 28; shattered = 1},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"in" = (/obj/item/weapon/soap/nanotrasen,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"io" = (/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ip" = (/obj/machinery/shower{dir = 8},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"iq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ir" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"is" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4; layer = 2.9},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"it" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door_control{id = "Awaybiohazard"; name = "Biohazard Shutter Control"; pixel_x = 0; pixel_y = 8; req_access_txt = "201"},/obj/machinery/door_control{id = "AwayRD"; name = "Privacy Shutter Control"; pixel_x = 0; pixel_y = -2; req_access_txt = "201"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{name = "MO19 Research"})
+"iu" = (/obj/structure/stool/bed/chair/office/light{dir = 1; pixel_y = 3},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{name = "MO19 Research"})
+"iv" = (/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/awaycontent/a2{name = "MO19 Research"})
+"iw" = (/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; dir = 8; icon_state = "ltrails_1"},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "white"},/area/awaycontent/a2{name = "MO19 Research"})
+"ix" = (/obj/item/weapon/storage/secure/safe{pixel_x = 32; pixel_y = 0},/obj/effect/decal/cleanable/blood/splatter,/obj/item/weapon/pen,/obj/item/weapon/paper/crumpled{info = "19 06 2554
I fucking knew it. There was a major breach, that idiotic force field failed and the xenomorphs rushed out and took out the scientists. I've managed to make it to my office and closed the blast doors. I can hear them trying to pry open the doors. Probably don't have long. I have no clue what has happened to the rest of the crew, for all I know they've been killed to produce more of the fucks."; name = "Hastily Written Note"},/turf/simulated/floor{dir = 4; heat_capacity = 1e+006; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/awaycontent/a2{name = "MO19 Research"})
+"iy" = (/obj/structure/sign/securearea{pixel_y = 32},/obj/machinery/shower{dir = 4; icon_state = "shower"; name = "emergency shower"; tag = "icon-shower (EAST)"},/turf/simulated/floor{dir = 9; heat_capacity = 1e+006; icon_state = "warnwhite"},/area/awaycontent/a2{name = "MO19 Research"})
+"iz" = (/obj/structure/closet/firecloset,/turf/simulated/floor{dir = 5; heat_capacity = 1e+006; icon_state = "warnwhite"},/area/awaycontent/a2{name = "MO19 Research"})
+"iA" = (/obj/structure/toilet{dir = 4},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"iB" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"iC" = (/obj/machinery/door/airlock{name = "Unisex Showers"},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"iD" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"iE" = (/obj/machinery/shower{dir = 8},/obj/item/weapon/bikehorn/rubberducky,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"iF" = (/obj/structure/table,/obj/item/trash/plate,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"iG" = (/obj/structure/table,/obj/item/weapon/cigbutt,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"iH" = (/obj/structure/table,/obj/item/trash/raisins,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"iI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"iJ" = (/obj/machinery/light/small{dir = 8},/obj/structure/sink{pixel_y = 28},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaycontent/a2{name = "MO19 Research"})
+"iK" = (/obj/machinery/door/airlock{name = "Private Restroom"},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaycontent/a2{name = "MO19 Research"})
+"iL" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = -32},/obj/machinery/light/small{active_power_usage = 0; dir = 2; icon_state = "bulb-broken"; status = 2},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{name = "MO19 Research"})
+"iM" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = -30},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{name = "MO19 Research"})
+"iN" = (/obj/structure/table,/obj/item/device/radio/off,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{name = "MO19 Research"})
+"iO" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{dir = 10; heat_capacity = 1e+006; icon_state = "warnwhite"},/area/awaycontent/a2{name = "MO19 Research"})
+"iP" = (/obj/machinery/light/small,/turf/simulated/floor{dir = 2; heat_capacity = 1e+006; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/awaycontent/a2{name = "MO19 Research"})
+"iQ" = (/obj/structure/table,/obj/item/weapon/storage/secure/briefcase,/obj/item/device/taperecorder{pixel_x = -3},/turf/simulated/floor{dir = 6; heat_capacity = 1e+006; icon_state = "warnwhite"},/area/awaycontent/a2{name = "MO19 Research"})
+"iR" = (/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; pixel_y = 2},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{dir = 10; heat_capacity = 1e+006; icon_state = "warnwhite"},/area/awaycontent/a2{name = "MO19 Research"})
+"iS" = (/obj/structure/closet/emcloset,/obj/machinery/light/small,/turf/simulated/floor{dir = 6; heat_capacity = 1e+006; icon_state = "warnwhite"},/area/awaycontent/a2{name = "MO19 Research"})
+"iT" = (/obj/machinery/shower{dir = 1; pixel_y = 0},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"iU" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"iV" = (/obj/structure/stool/bed/chair{dir = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"iW" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/light/small{dir = 4},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"iX" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 0},/turf/simulated/wall/rust,/area/awaycontent/a1{name = "MO19 Arrivals"})
+"iY" = (/obj/machinery/vending/boozeomat{req_access_txt = "0"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"iZ" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor{burnt = 1; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ja" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor{burnt = 1; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jb" = (/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jc" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jd" = (/obj/structure/toilet{dir = 1},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaycontent/a2{name = "MO19 Research"})
+"je" = (/obj/item/stack/rods,/obj/item/weapon/shard,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"jf" = (/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jg" = (/obj/structure/table,/obj/item/weapon/book/manual/detective,/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jh" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ji" = (/turf/simulated/floor{burnt = 1; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jj" = (/obj/machinery/vending/cola,/turf/simulated/floor{icon_state = "dark"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jk" = (/obj/machinery/vending/coffee,/turf/simulated/floor{icon_state = "dark"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jl" = (/obj/machinery/door/airlock{name = "Unisex Restrooms"; req_access_txt = "0"},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jm" = (/obj/structure/closet/crate/bin,/obj/machinery/light/small{dir = 8},/obj/item/trash/cheesie,/obj/item/trash/can,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jn" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jo" = (/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jp" = (/obj/structure/stool,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jq" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/machinery/door/poddoor/shutters{id = "awaykitchen"; name = "Serving Hatch"},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jr" = (/obj/effect/decal/cleanable/flour,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"js" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/table,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/effect/decal/cleanable/oil,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{name = "MO19 Research"})
+"ju" = (/obj/structure/flora/kirbyplants{desc = "A plastic potted plant."; layer = 4.1; pixel_y = 3},/turf/simulated/floor{burnt = 1; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jv" = (/obj/structure/stool/bed/chair,/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jw" = (/obj/structure/stool/bed/chair,/obj/effect/decal/cleanable/generic,/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jx" = (/obj/structure/table,/obj/item/weapon/newspaper,/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jy" = (/obj/structure/stool/bed/chair,/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jz" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 30},/turf/simulated/floor{burnt = 1; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jA" = (/obj/machinery/vending/snack,/obj/structure/sign/poster{icon_state = "poster14"; pixel_x = 0; pixel_y = 32; serial_number = 14; subtype = 0},/turf/simulated/floor{burnt = 1; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jB" = (/obj/structure/sign/science{pixel_x = 0; pixel_y = 32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{dir = 9; heat_capacity = 1e+006; icon_state = "purple"; tag = "icon-purple (NORTHWEST)"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jC" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{dir = 1; heat_capacity = 1e+006; icon_state = "purple"; tag = "icon-purple (NORTH)"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jD" = (/turf/simulated/floor{dir = 5; heat_capacity = 1e+006; icon_state = "purple"; tag = "icon-purple (NORTHEAST)"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{broken = 1; carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_state = "platingdmg1"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-platingdmg1"; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jF" = (/obj/structure/grille,/obj/structure/window/reinforced,/turf/simulated/floor/plating{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4; layer = 2.9},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jH" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jI" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jJ" = (/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jK" = (/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jL" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc{cell_type = 15000; dir = 1; locked = 0; name = "Worn-out APC"; pixel_x = 0; pixel_y = 25; req_access = null; start_charge = 100},/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jM" = (/obj/machinery/alarm{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jN" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 30},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jO" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jP" = (/obj/structure/noticeboard{pixel_y = 32},/obj/item/weapon/paper{info = "I Can't Believe It's Not Pasta: Half off on Wednesdays
Burger night every Friday 6PM-10PM, free drinks with purchase of meal!
Premiering Tonight: The comedy stylings of Shoe Snatching Willy! 11AM-7PM
"; name = "Specials This Week"},/turf/simulated/floor{burnt = 1; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4; layer = 2.9},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jR" = (/obj/item/weapon/cigbutt,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jS" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{id = "awaykitchen"; name = "Serving Hatch"},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jT" = (/obj/structure/table,/obj/item/weapon/book/manual/barman_recipes{pixel_y = 5},/obj/item/weapon/reagent_containers/food/drinks/shaker,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jU" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jV" = (/obj/machinery/vending/dinnerware,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jW" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a2{name = "MO19 Research"})
+"jX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light/small{dir = 1},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"jZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ka" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/item/weapon/cigbutt,/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kc" = (/obj/machinery/light/small{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/alarm{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/turf/simulated/floor{dir = 4; heat_capacity = 1e+006; icon_state = "purplecorner"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{dir = 1; heat_capacity = 1e+006; icon_state = "purplecorner"; tag = "icon-purplecorner (NORTH)"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ke" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{dir = 4; heat_capacity = 1e+006; icon_state = "purplecorner"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kf" = (/obj/machinery/door/firedoor{density = 1; icon_state = "door_closed"; opacity = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{burnt = 1; carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched2"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-floorscorched2 (WEST)"; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{broken = 1; carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "damaged1"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-damaged1 (WEST)"; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ki" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-floorgrime (WEST)"; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kj" = (/obj/machinery/light/small{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-floorgrime (WEST)"; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{burnt = 1; carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched1"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-floorscorched1 (WEST)"; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating{broken = 1; carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_state = "platingdmg1"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-platingdmg1"; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"km" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{broken = 1; carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "damaged3"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-damaged3 (WEST)"; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor{density = 1; icon_state = "door_closed"; opacity = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ko" = (/obj/machinery/light/small,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kp" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kq" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Diner"},/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kr" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/item/weapon/reagent_containers/glass/rag{pixel_y = 5},/obj/machinery/door/poddoor/shutters{id = "awaykitchen"; name = "Serving Hatch"},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ks" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kt" = (/obj/structure/table,/obj/item/weapon/kitchen/rollingpin,/obj/item/weapon/kitchenknife,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ku" = (/obj/structure/table,/obj/item/weapon/book/manual/chef_recipes{pixel_x = 2; pixel_y = 6},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kv" = (/obj/effect/decal/cleanable/egg_smudge,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kw" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/processor,/obj/machinery/alarm{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kx" = (/obj/structure/closet/crate/bin,/obj/item/trash/candy,/obj/item/trash/can,/turf/simulated/floor{dir = 2; heat_capacity = 1e+006; icon_state = "arrival"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ky" = (/turf/simulated/floor{dir = 2; heat_capacity = 1e+006; icon_state = "arrival"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kz" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{dir = 2; heat_capacity = 1e+006; icon_state = "arrival"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kA" = (/obj/machinery/light/small,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = -32},/turf/simulated/floor{dir = 2; heat_capacity = 1e+006; icon_state = "arrival"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kB" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = -32; serial_number = 2; subtype = 1},/turf/simulated/floor{dir = 2; heat_capacity = 1e+006; icon_state = "arrival"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kC" = (/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "whitecorner"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kD" = (/obj/machinery/light/small,/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kE" = (/obj/machinery/door/firedoor{density = 1; icon_state = "door_closed"; opacity = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kF" = (/turf/simulated/floor{broken = 1; carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "damaged2"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-damaged2 (WEST)"; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kG" = (/turf/simulated/floor/plating{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kH" = (/obj/effect/decal/cleanable/generic,/obj/effect/decal/remains/human{desc = "They look like human remains. The skeleton is curled up in fetal position with the hands placed near the throat."},/turf/simulated/floor{broken = 1; carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "damaged4"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-damaged4 (WEST)"; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kI" = (/turf/simulated/floor{carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-floorgrime (WEST)"; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kJ" = (/turf/simulated/floor{broken = 1; carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "damaged5"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-damaged5 (WEST)"; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kK" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-floorgrime (WEST)"; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kL" = (/obj/machinery/door/firedoor{density = 1; icon_state = "door_closed"; opacity = 1},/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kM" = (/obj/effect/decal/cleanable/generic,/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kN" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kO" = (/obj/effect/decal/cleanable/xenoblood,/obj/effect/decal/cleanable/xenoblood/xgibs,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kP" = (/obj/effect/decal/cleanable/xenoblood,/obj/effect/decal/remains/xeno{desc = "They look like the remains of something... alien. The front of skull appears to have been completely obliterated."},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kQ" = (/obj/structure/closet/crate/bin,/obj/item/trash/plate,/obj/item/weapon/reagent_containers/food/snacks/badrecipe,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kR" = (/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "arrival"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kS" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kU" = (/obj/structure/window/reinforced,/obj/item/stack/rods,/obj/structure/grille{density = 0; destroyed = 1; icon_state = "brokengrille"},/obj/item/stack/rods,/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kV" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/grille{density = 0; destroyed = 1; icon_state = "brokengrille"},/obj/structure/window/reinforced{dir = 4; layer = 2.9},/obj/item/stack/rods,/turf/simulated/floor/plating{broken = 1; carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_state = "platingdmg3"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-platingdmg3"; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kW" = (/obj/machinery/door/firedoor{density = 1; icon_state = "door_closed"; opacity = 1},/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "neutralcorner"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kX" = (/obj/machinery/door/firedoor{density = 1; icon_state = "door_closed"; opacity = 1},/turf/simulated/floor{dir = 2; heat_capacity = 1e+006; icon_state = "neutralcorner"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kY" = (/obj/machinery/door_control{id = "awaydorm1"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = -25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"kZ" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "201"},/obj/item/clothing/under/suit_jacket/navy,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"la" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "0"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lb" = (/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 0; heat_capacity = 1e+006; icon_state = "blue"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lc" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/device/multitool,/turf/simulated/floor{dir = 0; heat_capacity = 1e+006; icon_state = "blue"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ld" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor{dir = 0; heat_capacity = 1e+006; icon_state = "blue"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"le" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{dir = 0; heat_capacity = 1e+006; icon_state = "blue"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lf" = (/obj/structure/stool/bed/chair,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lg" = (/obj/structure/extinguisher_cabinet{pixel_x = 26; pixel_y = 0},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lh" = (/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"li" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lj" = (/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/turf/simulated/shuttle/wall{dir = 3; icon_state = "swall_f10"; layer = 2},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lk" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "arrival"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ll" = (/obj/item/weapon/cigbutt,/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lm" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor{dir = 2; heat_capacity = 1e+006; icon_state = "warningcorner"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ln" = (/obj/item/stack/rods,/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"lo" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lp" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor{carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "neutralcorner"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lq" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{carbon_dioxide = 48.7; dir = 4; heat_capacity = 1e+006; icon_state = "neutral"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lr" = (/obj/machinery/door/airlock{id_tag = "awaydorm1"; name = "Dorm 1"},/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ls" = (/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lt" = (/obj/machinery/light/small{dir = 4},/obj/structure/stool/bed/chair/wood/normal,/obj/machinery/alarm{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lu" = (/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lv" = (/obj/machinery/light/small{dir = 8},/obj/structure/table,/obj/item/weapon/storage/box,/obj/machinery/alarm{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lw" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lx" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ly" = (/obj/machinery/door_control{id = "awaykitchen"; name = "Kitchen Shutters Control"; pixel_x = -25; pixel_y = 0; req_access_txt = "0"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lz" = (/obj/machinery/door/airlock{name = "Kitchen Cold Room"; req_access_txt = "201"},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "showroomfloor"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lA" = (/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lB" = (/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lC" = (/obj/structure/closet/crate{desc = "It's a storage unit for kitchen clothes and equipment."; name = "Kitchen Crate"},/obj/item/weapon/storage/box/mousetraps,/obj/item/clothing/under/waiter,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lD" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lE" = (/turf/simulated/shuttle/wall{icon_state = "swall8"; dir = 2},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lF" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lG" = (/turf/simulated/shuttle/wall{icon_state = "swall4"; dir = 2},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lH" = (/turf/simulated/shuttle/wall{icon_state = "swall1"; dir = 2},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lI" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/shuttle/engine/heater{tag = "icon-heater (EAST)"; icon_state = "heater"; dir = 4},/turf/simulated/shuttle/plating{carbon_dioxide = 48.7; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lJ" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_r (WEST)"; icon_state = "burst_r"; dir = 8},/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lK" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4; layer = 2.9},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lL" = (/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lM" = (/turf/simulated/floor{dir = 2; heat_capacity = 1e+006; icon_state = "warningcorner"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lN" = (/obj/structure/table,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/turf/simulated/floor{dir = 6; heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lO" = (/turf/simulated/floor{carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "neutralcorner"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lP" = (/turf/simulated/floor{carbon_dioxide = 48.7; dir = 4; heat_capacity = 1e+006; icon_state = "neutralcorner"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lQ" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lR" = (/obj/structure/table/woodentable,/obj/item/weapon/lighter/zippo,/obj/machinery/newscaster{pixel_x = 30; pixel_y = 0},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lS" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lT" = (/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lU" = (/obj/effect/decal/cleanable/oil,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lV" = (/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lW" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Kitchen"; req_access_txt = "201"},/turf/simulated/floor{icon_state = "dark"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lX" = (/turf/simulated/floor{icon_state = "dark"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lY" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{icon_state = "dark"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"lZ" = (/obj/structure/table,/obj/effect/decal/cleanable/dirt,/obj/item/clothing/suit/chaplain_hoodie,/turf/simulated/floor{icon_state = "dark"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ma" = (/obj/machinery/light/small{dir = 4},/obj/effect/decal/remains/human{desc = "They look like human remains. The skeleton is sitting upright with its legs tucked in and hands still holding onto its arms."},/obj/item/weapon/gun/projectile/shotgun/sc_pump,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mb" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mc" = (/obj/structure/table,/obj/item/weapon/storage/lockbox,/turf/simulated/shuttle/floor,/area/awaycontent/a1{name = "MO19 Arrivals"})
+"md" = (/obj/structure/table,/obj/item/device/radio/off,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"me" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mf" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = -32; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mg" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/light/small{dir = 1},/turf/simulated/shuttle/floor,/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mh" = (/turf/simulated/shuttle/floor,/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mi" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mj" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = 30},/obj/machinery/light/small{dir = 1},/turf/simulated/shuttle/floor,/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mk" = (/obj/structure/closet/emcloset,/turf/simulated/shuttle/floor,/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ml" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_l (WEST)"; icon_state = "burst_l"; dir = 8},/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mm" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4; layer = 2.9},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mn" = (/turf/simulated/floor{dir = 4; heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mo" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mp" = (/turf/simulated/floor{carbon_dioxide = 48.7; dir = 2; heat_capacity = 1e+006; icon_state = "neutralcorner"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mq" = (/obj/machinery/portable_atmospherics/canister/air,/obj/structure/window/reinforced{dir = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mr" = (/obj/structure/stool,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ms" = (/obj/machinery/light/small,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mt" = (/obj/structure/table,/obj/item/weapon/storage/backpack/satchel/withwallet,/turf/simulated/floor{icon_state = "dark"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mu" = (/obj/structure/closet/secure_closet{icon_state = "secure"; locked = 0; name = "kitchen Cabinet"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/drinks/flour,/obj/item/weapon/reagent_containers/food/drinks/flour,/obj/item/weapon/reagent_containers/food/condiment/sugar,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mv" = (/obj/structure/closet/secure_closet{icon_broken = "fridgebroken"; icon_closed = "fridge"; icon_locked = "fridge1"; icon_off = "fridgeoff"; icon_opened = "fridgeopen"; icon_state = "fridge"; locked = 0; name = "meat fridge"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mw" = (/obj/structure/closet/secure_closet{icon_broken = "fridgebroken"; icon_closed = "fridge"; icon_locked = "fridge1"; icon_off = "fridgeoff"; icon_opened = "fridgeopen"; icon_state = "fridge"; locked = 0; name = "refrigerator"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/drinks/milk,/obj/item/weapon/reagent_containers/food/drinks/milk,/obj/item/weapon/reagent_containers/food/drinks/milk,/obj/item/weapon/storage/fancy/egg_box,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mx" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/awaycontent/a1{name = "MO19 Arrivals"})
+"my" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/shuttle/floor,/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mz" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/light/small{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mA" = (/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mB" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/shuttle/floor,/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mC" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/landmark{name = "awaystart"},/turf/simulated/shuttle/floor,/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mD" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/light/small{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/sign/vacuum{desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'"; name = "\improper HOSTILE ATMOSPHERE AHEAD"; pixel_x = 0},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4; layer = 2.9},/obj/structure/window/reinforced,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mH" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{dir = 4; heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4; layer = 2.9},/obj/structure/window/reinforced,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mJ" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{carbon_dioxide = 48.7; dir = 2; heat_capacity = 1e+006; icon_state = "neutralcorner"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mK" = (/obj/structure/table/woodentable,/obj/machinery/door_control{id = "awaydorm2"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = -25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mL" = (/obj/structure/stool/bed/chair/wood/normal{dir = 8},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mM" = (/obj/structure/closet/emcloset,/obj/structure/window/reinforced,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mN" = (/obj/machinery/computer/arcade,/turf/simulated/floor{icon_state = "dark"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mO" = (/obj/machinery/vending/cigarette,/obj/structure/sign/poster{icon_state = "poster7"; pixel_y = -32; serial_number = 7; subtype = 0},/turf/simulated/floor{icon_state = "dark"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mP" = (/obj/machinery/light/small{dir = 8},/obj/structure/stool/bed/chair/comfy/beige,/turf/simulated/floor{icon_state = "dark"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mQ" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey{pixel_x = -6; pixel_y = 6},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 6; pixel_y = 8},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 3; pixel_y = 0},/turf/simulated/floor{icon_state = "dark"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mR" = (/obj/structure/stool/bed/chair/comfy/beige,/turf/simulated/floor{icon_state = "dark"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mT" = (/obj/machinery/computer/shuttle,/turf/simulated/shuttle/floor,/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mU" = (/obj/machinery/door/airlock/shuttle{name = "Shuttle Cockpit"},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mV" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mW" = (/obj/structure/sign/vacuum{desc = "A beacon used by a teleporter."; icon = 'icons/obj/radio.dmi'; icon_state = "beacon"; name = "tracking beacon"},/obj/effect/landmark{name = "awaystart"},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mX" = (/obj/machinery/door/airlock/shuttle{name = "Shuttle Airlock"},/turf/simulated/shuttle/floor,/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mY" = (/obj/machinery/door/airlock/external,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"mZ" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"na" = (/obj/machinery/light/small{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/structure/noticeboard{dir = 8; pixel_x = 32; pixel_y = 0},/obj/item/weapon/paper{info = "Welcome to Moon Outpost 19! Property of Nanotrasen Inc.
Staff Roster:
-Dr. Gerald Rosswell: Research Director & Acting Captain
-Dr. Sakuma Sano: Xenobiologist
-Dr. Mark Douglas: Xenobiologist
-Kenneth Cunningham: Security Officer-Ivan Volodin: Engineer
-Mathias Kuester: Bartender
-Sven Edling: Chef
-Steve: Assistant
Please enjoy your stay, and report any abnormalities to an officer."; name = "Welcome Notice"},/turf/simulated/floor{dir = 4; heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nb" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nc" = (/obj/machinery/light/small{dir = 8},/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; dir = 9; icon_state = "ltrails_1"},/turf/simulated/floor{carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "neutralcorner"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nd" = (/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; dir = 8; icon_state = "ltrails_1"},/turf/simulated/floor{burnt = 1; carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched2"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-floorscorched2 (WEST)"; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ne" = (/obj/machinery/door/airlock{id_tag = "awaydorm2"; name = "Dorm 2"},/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; dir = 8; icon_state = "ltrails_1"},/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nf" = (/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; dir = 5; icon_state = "ltrails_1"},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ng" = (/obj/machinery/light/small{dir = 4},/obj/machinery/alarm{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nh" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ni" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nj" = (/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/pen,/turf/simulated/shuttle/floor,/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nk" = (/obj/structure/stool/bed/chair,/obj/machinery/light/small{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nl" = (/turf/simulated/shuttle/wall{icon_state = "swall2"; dir = 2},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nm" = (/obj/structure/window/reinforced,/obj/machinery/light/small{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"no" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4; layer = 2.9},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"np" = (/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; icon_state = "ltrails_1"},/turf/simulated/floor{carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "neutralcorner"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nq" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nr" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "201"},/obj/item/clothing/under/assistantformal,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ns" = (/obj/structure/window/reinforced,/obj/machinery/space_heater,/obj/effect/decal/cleanable/generic,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nt" = (/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nu" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nv" = (/obj/structure/filingcabinet,/turf/simulated/shuttle/floor,/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nw" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/light/small,/turf/simulated/shuttle/floor,/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nx" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = -30},/obj/machinery/light/small,/turf/simulated/shuttle/floor,/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ny" = (/turf/simulated/floor{burnt = 1; carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched2"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-floorscorched2 (WEST)"; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nz" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor{broken = 1; carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "damaged2"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-damaged2 (WEST)"; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nA" = (/obj/effect/decal/cleanable/dirt,/obj/item/trash/candy,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nB" = (/obj/item/weapon/cigbutt,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nC" = (/obj/structure/sign/vacuum{desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'"; name = "\improper HOSTILE ATMOSPHERE AHEAD"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nD" = (/turf/simulated/shuttle/wall{icon_state = "swall13"; dir = 2},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nE" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nF" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nG" = (/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; icon_state = "ltrails_2"},/turf/simulated/floor{broken = 1; carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "damaged1"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-damaged1 (WEST)"; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nH" = (/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nI" = (/obj/structure/grille{density = 0; destroyed = 1; icon_state = "brokengrille"},/obj/item/stack/rods,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nJ" = (/obj/structure/grille,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nK" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating{carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_plating = "asteroidplating"; icon_state = "asteroidplating"; nitrogen = 13.2; oxygen = 32.45; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nL" = (/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4; layer = 2.9},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nN" = (/obj/machinery/washing_machine,/turf/simulated/floor{carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_state = "barber"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nO" = (/obj/machinery/light/small{dir = 1},/obj/structure/window/reinforced{dir = 4; layer = 2.9},/obj/structure/table,/obj/structure/bedsheetbin,/obj/item/clothing/tie/black,/obj/item/clothing/under/lawyer/blacksuit,/turf/simulated/floor{carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_state = "barber"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nP" = (/obj/machinery/alarm{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/turf/simulated/floor{carbon_dioxide = 48.7; dir = 2; heat_capacity = 1e+006; icon_state = "neutralcorner"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nQ" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "201"; req_one_access_txt = "0"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nR" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nS" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nT" = (/obj/item/stack/rods,/obj/item/weapon/shard{icon_state = "small"},/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; dir = 9; icon_state = "ltrails_1"},/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"nU" = (/obj/structure/grille{density = 0; destroyed = 1; icon_state = "brokengrille"},/obj/item/stack/rods,/obj/item/weapon/shard,/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; dir = 8; icon_state = "ltrails_2"},/turf/simulated/floor/plating{broken = 1; carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_state = "platingdmg1"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-platingdmg1"; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nV" = (/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; dir = 8; icon_state = "ltrails_2"},/turf/simulated/floor/plating{broken = 1; carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_state = "platingdmg3"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-platingdmg3"; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nW" = (/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; dir = 8; icon_state = "ltrails_1"},/turf/simulated/floor{carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-floorgrime (WEST)"; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nX" = (/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; dir = 6; icon_state = "ltrails_1"},/turf/simulated/floor{carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-floorgrime (WEST)"; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nY" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/obj/machinery/door_control{id = "awaydorm3"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = -25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/obj/effect/decal/remains/human{desc = "They look like human remains. The skeleton is laid out on its side and there seems to have been no sign of struggle."; layer = 4.1},/obj/item/weapon/paper{info = "Bugs break out. I run to here and lock door. I hear door next to me break open and screams. All nice people here dead now. I no want to be eaten, and bottle always said to be coward way out, but person who say that is stupid. Mira, there is no escape for me, tell Alexis and Elena that father will never come home, and that I love you all."; name = "Note"},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"nZ" = (/obj/structure/dresser,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"oa" = (/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ob" = (/obj/structure/sign/vacuum{desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'"; name = "\improper HOSTILE ATMOSPHERE AHEAD"; pixel_x = -32},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"oc" = (/obj/machinery/suit_storage_unit/standard_unit,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"od" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4; layer = 2.9},/turf/simulated/floor/plating{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"oe" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "neutralcorner"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"of" = (/turf/simulated/floor{carbon_dioxide = 48.7; dir = 4; heat_capacity = 1e+006; icon_state = "neutral"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"og" = (/obj/machinery/door/airlock{icon_state = "door_locked"; id_tag = "awaydorm3"; locked = 1; name = "Dorm 3"},/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"oh" = (/obj/item/weapon/pen,/obj/item/weapon/storage/pill_bottle{pixel_y = 6},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"oi" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"oj" = (/obj/structure/closet,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ok" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4; layer = 2.9},/turf/simulated/floor/plating{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ol" = (/obj/structure/table,/obj/item/toy/cards/deck,/turf/simulated/floor{broken = 1; carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "damaged1"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-damaged1 (WEST)"; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"om" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "201"},/obj/item/clothing/under/suit_jacket/burgundy,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"on" = (/obj/machinery/newscaster{pixel_x = 30; pixel_y = 0},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"oo" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4; layer = 2.9},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"op" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating{carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_plating = "asteroidplating"; icon_state = "asteroidplating"; nitrogen = 13.2; oxygen = 32.45; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"oq" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/turf/simulated/floor{burnt = 1; carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched2"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-floorscorched2 (WEST)"; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"or" = (/obj/machinery/light/small{dir = 4},/obj/effect/decal/cleanable/generic,/turf/simulated/floor{carbon_dioxide = 48.7; dir = 2; heat_capacity = 1e+006; icon_state = "neutralcorner"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"os" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_plating = "asteroidplating"; icon_state = "asteroidplating"; nitrogen = 13.2; oxygen = 32.45; temperature = 251},/area/mine/explored)
+"ot" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ou" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ov" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4; layer = 2.9},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ow" = (/obj/structure/stool/bed/chair/comfy/black,/turf/simulated/floor/plating{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"ox" = (/obj/structure/flora/kirbyplants{desc = "A plastic potted plant."; layer = 4.1; pixel_y = 3},/turf/simulated/floor{carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_state = "neutral"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{name = "MO19 Arrivals"})
+"oy" = (/obj/structure/disposaloutlet,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plating{carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_plating = "asteroidplating"; icon_state = "asteroidplating"; nitrogen = 13.2; oxygen = 32.45; temperature = 251},/area/mine/explored)
+"oz" = (/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"oA" = (/obj/item/trash/candy,/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"oB" = (/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a3{name = "MO19 Maintenance"})
+"oC" = (/obj/machinery/gravity_generator/main/station/admin,/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a3{name = "MO19 Maintenance"})
+"oD" = (/obj/item/weapon/shard,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/mine/explored)
+"oE" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/mine/explored)
+"oF" = (/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/mine/explored)
+"oG" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/mine/explored)
+"oH" = (/obj/machinery/power/apc{cell_type = 5e+006; dir = 8; name = "Worn-out APC"; pixel_x = -27; pixel_y = 0; req_access = list(0); start_charge = 100},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a3{name = "MO19 Maintenance"})
+"oI" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a3{name = "MO19 Maintenance"})
+"oJ" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes/magical,/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a3{name = "MO19 Maintenance"})
+"oK" = (/obj/structure/grille{density = 0; destroyed = 1; icon_state = "brokengrille"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/mine/explored)
+"oL" = (/obj/item/stack/rods,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/mine/explored)
+"oM" = (/obj/item/stack/cable_coil,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/mine/explored)
+"oN" = (/obj/item/stack/cable_coil{amount = 5},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/mine/explored)
+"oO" = (/obj/item/stack/cable_coil{amount = 2; icon_state = "coil_red2"; item_state = "coil_red2"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/mine/explored)
+"oP" = (/obj/item/stack/cable_coil{amount = 1; icon_state = "coil_red1"; item_state = "coil_red1"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/mine/explored)
+"oQ" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/turf/simulated/floor{heat_capacity = 1e+006},/area/awaycontent/a3{name = "MO19 Maintenance"})
+"oR" = (/turf/simulated/floor{heat_capacity = 1e+006},/area/mine/explored)
+"oS" = (/turf/simulated/floor{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/mine/explored)
+"oT" = (/turf/simulated/floor{broken = 1; dir = 8; heat_capacity = 1e+006; icon_state = "damaged1"; tag = "icon-damaged1 (WEST)"},/area/mine/explored)
+"oU" = (/turf/simulated/floor{broken = 1; dir = 8; heat_capacity = 1e+006; icon_state = "damaged2"; tag = "icon-damaged2 (WEST)"},/area/mine/explored)
+"oV" = (/turf/simulated/floor{broken = 1; dir = 8; heat_capacity = 1e+006; icon_state = "damaged3"; tag = "icon-damaged3 (WEST)"},/area/mine/explored)
+"oW" = (/turf/simulated/floor{broken = 1; dir = 8; heat_capacity = 1e+006; icon_state = "damaged4"; tag = "icon-damaged4 (WEST)"},/area/mine/explored)
+"oX" = (/turf/simulated/floor{broken = 1; dir = 8; heat_capacity = 1e+006; icon_state = "damaged5"; tag = "icon-damaged5 (WEST)"},/area/mine/explored)
+"oY" = (/turf/simulated/floor{burnt = 1; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/mine/explored)
+"oZ" = (/turf/simulated/floor{burnt = 1; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/mine/explored)
+"pa" = (/turf/simulated/shuttle/floor,/area/mine/explored)
+"pb" = (/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/mine/explored)
+"pc" = (/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/mine/explored)
+"pd" = (/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/mine/explored)
+"pe" = (/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/mine/explored)
+"pf" = (/turf/simulated/floor/plating{burnt = 1; heat_capacity = 1e+006; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/mine/explored)
+"pg" = (/turf/simulated/floor{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"ph" = (/turf/simulated/floor{carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-floorgrime (WEST)"; temperature = 251},/area/mine/explored)
+"pi" = (/turf/simulated/floor{broken = 1; carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "damaged1"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-damaged1 (WEST)"; temperature = 251},/area/mine/explored)
+"pj" = (/turf/simulated/floor{broken = 1; carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "damaged2"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-damaged2 (WEST)"; temperature = 251},/area/mine/explored)
+"pk" = (/turf/simulated/floor{broken = 1; carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "damaged3"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-damaged3 (WEST)"; temperature = 251},/area/mine/explored)
+"pl" = (/turf/simulated/floor{broken = 1; carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "damaged4"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-damaged4 (WEST)"; temperature = 251},/area/mine/explored)
+"pm" = (/turf/simulated/floor{broken = 1; carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "damaged5"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-damaged5 (WEST)"; temperature = 251},/area/mine/explored)
+"pn" = (/turf/simulated/floor{burnt = 1; carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched1"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-floorscorched1 (WEST)"; temperature = 251},/area/mine/explored)
+"po" = (/turf/simulated/floor{burnt = 1; carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched2"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-floorscorched2 (WEST)"; temperature = 251},/area/mine/explored)
+"pp" = (/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/mine/explored)
+"pq" = (/turf/simulated/floor/plating{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/mine/explored)
+"pr" = (/turf/simulated/floor/plating{broken = 1; carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_state = "platingdmg1"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-platingdmg1"; temperature = 251},/area/mine/explored)
+"ps" = (/turf/simulated/floor/plating{broken = 1; carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_state = "platingdmg2"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-platingdmg2"; temperature = 251},/area/mine/explored)
+"pt" = (/turf/simulated/floor/plating{broken = 1; carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_state = "platingdmg3"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-platingdmg3"; temperature = 251},/area/mine/explored)
+"pu" = (/turf/simulated/floor/plating{burnt = 1; carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_state = "panelscorched"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-panelscorched"; temperature = 251},/area/mine/explored)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababacadacadabababababababababababababababababababababababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababacafagahafabababababababababababababababababababababababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababafahaiaiafadababababababababababababababababababababababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababadajakalajafabababababababababababababababababababababababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababadafacadafacadacababababababababacadaiamanafabababababababababababababababababababababababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabacadafaiaiahaoapaqafadafabababababababafacaracadabababababababababababababababafadasabababababababaeaeaeaeaeaeaeaeatatatatatatataeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabacaialaqauavawaxayauagadafababababababadafarafabababacafafadabababababababacadafagafabababababababaeaeaeaeaeaeaeaeatazaAaBaCaDataeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaafafahaqaEanaiaqauafaiaqauadafadafacadabacararadababacadaFajacababababababacafanahauadabababababababaeaeaeaeaeaeaeaeataGaHaIaJaCataeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaadagalaianauaqaiaqaqauaiaqaiauacararadacadarafacababafaKaLaMafadacadafadafafauaNauaiafabababababababaeaeaeaeaeaeaeaeataOaPaQaRaSataeaeaeaeaeaeaeaeaeaeaeaeaeaeaTaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacahaialaqaUauamaqaiaiaqamauaqadarararafafaradacafafadaiakaqaiaqaramarararaqaiaqamaoacabababababababaeaeaeaVaVaVaVaeataWaXaYaZbaataeaeaeaeaeaeaeaeaeaeaeaeaeararaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaadafalbbauawbcauauaiauaiauaqafadacarararararararbdararauaiaoafadafacadafadafalaiaianadabababababababaeaeaeaVbebfaVaVatbgaWbhbibjataeaeaeaeaeaeaeaeaeaeaeaeaeaearaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabacaiauaEbkawblalaEauauaiadafabadafaramararafacafararamaganafabbmababbmabacadauagafafabababababababaeaVaVaVbnbobpbqatbrbsbtbubvataeaeaeaeaeaeaeaeaeaeaeaeaeaearaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabacafahaibcaualaqagaqaqafacabababafafarararadbmadadafaganafadababababababadafaqafacabababababababaeaeaVbwbxbybybzbAatbBbCbDbEbFataeaeaeaeaeaeaeaeaeaeaeaeaeaearaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababacafacadafadafacafadafabababacadarararafafababbmacadafacabababababababafararadababababababababaeaeaVbGaVbHbIbJbKatbLbMbDbNbOatatatatatatataeaeaeaeaeaeaeaearaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababadarararadacabababababababababbmabababbmabafaracafababababababababaeaeaVaVaVaVbPbQaVatatatbRatatatbSbTbUbVbWataeaeaeaeaeaeaeaearararararaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababafararafacababbmabababbmabababababababababacbXafabababababababababaeaeaVbYbZcacbccbQcdcecfcgchciatcjckclcmcnataeaeaeaeaeaeaeaearaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababadararadababababababababababbmabababbmabacafaradabababababababababaeaeaVbYbQcocpcqcrcscbcbctcucvcwcxcyczcAcBataeaeaeaeaeaeaeaearaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababafararafabbmababbmababacadafacadadababafadararafababababababababaeaeaeaVcCcDcEcbcFcGcHcIcJcKcIcLatcMcNcOcNcPataeaeaeaearaeaeararaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababacararadacadafafacadafafararararafacafadararafadababababababababaeaeaeaVbYcQcRcScTaVaVaVcUaVcVaVatatatatatatataeaeaeaearaeaeararaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababadaramarafarararararafararadafaramararararadacabababababababababaeaeaeaVbYcWcXcYcZdaaVdbdcaVdddeaVaeaeaeaeaeaeaeaeaeaearaeararaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababadafarararararardfarararafafacadafadafadacafabababababababababaeaeaeaeaVdgdhcEcbcFdiaVdjdkaVdldmaVaeaeaeaeaeaeaeaeaeaearararaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababadafacararararafafacararadadababababababababababababababababababaeaeaeaeaVdndodpcbdqdraVdsdtaVdudvaVaeaeaeaeaeaeaeaeaeaeararaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababacadarararadafadacabafararafacababababababababababababababababababaeaeaeaeaVaVaVaVdwaVaVaVaVaVaVaVaVaVaeaeaeaeaeaeaeaeaeararaeaeaeaeaeaeaeaearardxaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababadauarafacacababababacafararafadababababababababababababababababaeaeaeaeaeaeaeaVdydzdAaVaeaeaeaeaeaeaeaeaeaeaeaeaeaeararararaeaeaearararararararardBaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababacafafakadadabababababababadarararafabababababababdCdCdCdCdCdCdCdCdCdCdCdCdCdCaeaeaVdDdEdFaVaeaeaeaeaeaeaeaeaeaeaeaeaeararaeaeararararardGdHarardGardGdIaraeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababadadajaqaiafababababababababafacararacababdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCaVaVdJaVaVdCaeaeaeaeaeaeaeaeaeaeaeararaeaeaeaeaeaeaeaeaeaeararararardKdLaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababafacagauaiahacabababababababababafaramafdCdCdCdCdCdCdCdCarararararararararararardCdCdCdCdMdNdCdCdCdCdCdCaeaeaeaeaeaeaeararaeaeaeaeaeaeaeaeaeaeaeaedOararararaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababaddPaMamauadadabababababababdCdCadafacafdCdCafafarararararararararararararararararardCdCararardCdCdCdCdCdCdCdCdCaearararaeaeaeaeaeaeaeaeaeaeaeaeaeaeararararaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababacajdQaiajafabababababababdCdCdCafaiauaEafadafarararararararararararararararararararararararararararardCdCdCdCarararaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababadafauahadacababababababdCdCdCacaEaqaqauaiaqauararararararararararararararararararararararararararararararararardCdCdCdCaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababadafacacabababababdCdCdCdCafadaiauaiaqauaiararararararararararararararararararararararararararararararararararardCdCdCdCdCaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababdCdCdCdCdCauaiauaqauauararararararararararararararararararararararararararararararararararararararardCdCdCdCdCaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeababababababababababababababdCdCdCdCdCarararararararararararararararararararararararararararararararararararararararararararararararararardCdCdCdCdCaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaeabababababababababdCdCdCdCararararararararararararararararararararararararararararararararararararararararararararararararararararardCdCdCdCdCaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeababababababdCdCdCararararararararararararararararararararararararararararararararararararararararararararararararararararararararardCdCdCdCaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaedCdCdCararararararararararararararararararararararararararararararararararararararararararararararararararararararararararardCdCdCdCdCdCaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaedCdCdCarararararararararararararararararararararararararararararararararararararararararararararararararararararararararararararardCdCdCdCaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaedCdCdCararararararararararararararararararararararararararararararararararararararararararararararararararararararararararararararararardCdCdCdCdCaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaedCdCararararararararararararararararararararararararararararararararararararararararararararararararararararararararararararararararararardCdCdCdCaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaedCdCdCararararararararararararararararararararararararararardRarararararararararararararararararararararararararararararararararararararararardCdCdCdCaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaedCdCarararararararararararararararararararararararardSdTdUdVdTararardSdTdSdSdTdSdTdTdTdTdWdTdTdTdTdTarararararararararararararararararararararardCdCdCaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaedCdCdCarararararararararararararararararararararararardSdXdYdZdTararardSeaebecedeedTefegeheiejekelemdTararararararararararararararararararararararardCdCaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaedCdCararararararararararararararararararararararararardTeneoepdSararardTeaebeqereseteleuevewexeyezeAdTararararararararararararararararararararararardCdCaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaedCdCdCarararararararararararararareBeBeCeCeCeBeCeBeBeBeCdTdTeDeEdTdTdTdSdTeBeFeGeHeIekexezeJekeJeKeLeudTararararararararararararararararararararararardCdCdCaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaeaedCdCdCararararararararararararararareBeMeNeOePeQeBeReSeTeUeVeWeXeYdTeZfafbfcfdfefffgfheweheLexekewfiehfjdTarararararararararararararararararararararararardCdCaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaeaedCdCdCararararararararararararararareBfkfleVfmfneCfodTdTdSdTdTfpfqfrfsfsftftfufvfwfxfyfzfAfBfCfDeweveKfEdWarararararararararararararararararararararararardCdCaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaedCdCdCarararararararararararararararareCfFfGfHfIfJfKfLdTfMfNfOfPfQfRdSeoeofSdYfTfefefUfVfWezfXexexexfYeveAdTarararararararararararararararararararararararardCdCaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaedCdCdCarararararararararararararararareBfFfZfHgagbeCfodTgceogdgegfggdTghgigjgkeCglfegmgngogpevewekekekeLfidTarararararararararararararararararararararararardCdCaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaedCdCararararararararararararararararareCgqgrgsgtgueCfodSgvgwgxgygzgAdSgBfefegCeBgDfegEgFetgGeueveheKeheuewdTarararararararararararararararararararararararardCdCaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaedCdCararararararararararararararararareCeCeBeBeBeCeBgHdSgIgJgKgLgMgNdSdSgOgPgQeCgRgSgTgUdTgVexekgWgXekekekdTarararararararararararararararararararararararardCdCdCaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaedCdCdCarararararararararararararararararareBgYeVeVgZeVhadThbhchdgLgMhehfdTdTdSdTdTdTdSdSdTdTdTdTdTdWdTdTdTdTdTararararararararararararararararararararararararardCdCaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaedCdCdCarararararararararararararararararareCfodTdTdTdTdSdThghhhhhigMhehjhkhlhmeDhndSarararararararararararararararararararararararararararararararararararararardCdCaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaedCdCararararararararararararararararararareBhodThphqhrhshthuhuhuhufehehvhwhxhehyhzdTarararararararararararararararararararararararararararararararararararararardCdCaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaedCdCararararararararararararararararareBeCeBfndShAhAhAhBhCgMgMgMhDhehEhvhFhehehehGdTararararararararhHhHhIhHhHhHhHhHhHararararararararararararararararararararardCdCaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaedCdCararararararararararararararararareChJhKfodShAhBhLhAhMhNhNhOeBhPhPhPeBhehehEhQdTararararararararhHhRhShThUhHhVhWhHhHarararhXarararararararararararararararardCdCaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaedCdCararararararararararararararararareCeRhYhadThAhZiaibicidieifdTdTigdTdSihiiijikdSararararararararhIhIhHilimhHinioiphIiqirishIarararararararararararararararardCdCaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaedCdCararararararararararararararararareCfodTdSdThAitiuhBhAiviwixdSiyheizdTdSdSdTdTdTararararhXarararhIiAiBioioiCiDioiEhIiFiGiHhIhIhIhHhHhIhHhIararararararararardCdCaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaedCdCararararararararararararararararareBiIdTiJiKhBhAiLiMiNiOiPiQdSiRheiSdTararararararararhIhIiqishIhIhIhIiDiohIiTiThHhIiUiViWiXhIiYiZjajbjchIararararararararardCdCaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaedCdCararararararararararararararararareBfodSjddSdTdSdTdTdTdSdTdTdTeBigeBdTararararhXarjearhHjfjgjhjijjjkhHjlhIhHhHhHhHjmjnjnjojpjqjbjrjbjbjshHararararararararardCdCaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaedCdCararararararararararararararararareBjtdSdSdTjujvjwjxjyjvjzjAhIjBjCjDhHhIiqirishHjEjFjGhHjHjIjJjKjJjJjLjJjMjNjOjPjQjojojojRjpjSjbjTjUjrjVjQararararararararardCdCaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaedCdCararararararararararararararararareCjWeVfKjXjYjYjZjZjYkajZkbkckdjYkekdkfkgkhkikjkkklkmknjYjZjYjYjYkokpjKjKjKjJjJkqjojojojojpkrksktkukvkwhIararararararararardCdCaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaedCdCararararararararararararararararareBeBeCeCkxkykzkykAkykzkzkykBkCjIjJkDkEkFkGkHkIkIkJkKkLjJjKhHhIhHhHkMkNjJjKjJjKkqjojokOkPjpjSjbjbksjbkQhIararararararararardCdCaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaedCdCararararararararararararararararararararhHhHiqirishHiqirishHhHkRjKkShIhHkTkUkVhHiqirishIkWkXhHkYkZhIlahIlblcldlejQlfjRjojojpjSjbjbjblghIhIhHhHhIarararararardCdCaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaedCdCarararararararararararararararararararararararararlhliljararhHlklllmhIarararlnloarararhIlplqlrlslthIluhIhIhHhIhIhIlvlwjolxhIhIlyjbjbjblzlAlBlChIarararararardCdCaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaedCdCarararararararararararararararlhlililDlilElFlGlElFlHlIlJararlKlLlMlNhIararararararararhIlOlPhIlQlRhHlSlTlUlSlVlTlajojnjojolWlXlXlYlXlZhIlAlAmahIararararardCdCdCaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaedCdCararararararararararararararlhmbmcmdmemfmgmhmimjmimklImlararmmlLmnmoisararararararararhHlOmphHhIhIhHlTmqhHhHhHhIhImrmrjnmshIlXlYlXlXmthImumvmwhHararararardCdCdCaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaedCdCdCarararararararararararararmxmymhmzlHmAmimBmCmBmimhmDlHmEmFmGlLmHmIarararararararararhIlOmJhHmKmLhIlTmMhIarararhImNmNmOhHhIhImPmQmRhHhHhIhIhHhHararararardCdCdCaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaedCdCdCarararararararararararararmSmTmimAmUmAmAmVmWmVmAmAmAmXmYlSmZjKnahHnbararararararararhHncndnenfnghIlTnhhHarararhIhIhHhHhIarhIiqirishHarararararararararardCdCaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaedCdCarararararararararararararninjmhnknlmAmimBmCmBmimhnmnlmEnnnolLmnlKarararararararararhHnpkJhInqnrhIlUnshHhHhHdNararararararararararloarararararararararardCdCaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaedCdCarararararararararararararntnunvmdmemfnwmhminxmimklIlJararmmlLmnmmarararararararararhInynzhIhIhIhHnAnBmZnCmZdNararararararararararararararararararararardCdCaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaedCdCdCarararararararararararararntlilinDlilElFlGlElFnllImlararmInEmnmIararararararnFhHhHhInGmplalSnHlunInJhHlVhHnKararararararararararararararararararararardCdCaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaedCdCdCarararararararararararararararararararararararntlinLararhHmZmZhHhHararararararnMnNnOkKnPhHhIhHhHhInQhHhHhHararararararararararararararararararararardCdCdCaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaeaedCdCdCarararararararararararararararararararararararararararhHnRlSnShHarararararnTnUnVnWnXmJhInYnZhIlSlToahIarararararararararararararararararararararardCdCaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaedCdCarararararararararararararararararararararararararararhHoblTochHarararararjeodoekIkIofogohlshIlToiojhIararararararararararararararararararararardCdCdCaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaedCdCdCararararararararararararararararararararararararararhHmZmZhHhHararararararokolkFkIlPhIomonhIhHoohIhIararararararararararararararararararararardCdCdCaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaedCdCdCararararararararararararararararararararararararararopdNdNoparararararararokoqkGkIorhHhHhIhIdNosdNararararararararararararararararararararardCdCdCaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaedCdCdCararararararararararararararararararararararararararararararararararararotouovowoxhHararararosarararararararararararararararararararararardCdCdCaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaedCdCdCdCarararararararararararararararararararararararararararararararararararararotoujGhIararararosararararararararararararararararararararardCdCdCaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaedCdCdCararararararararararararararararararararararararararararararararararararararararloararararosararararararararararararararararararararardCdCaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaedCdCdCararararararararararararararararararararararararararararararararararararararararararardNosdNararararararararararararararararararardCdCdCaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaedCdCdCarararararararararararararararararararararararararararararararararararararararararardNoydNararararararararararararararararararardCdCaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaedCdCdCararararararararararararararararararararararararararararararararararararararararardNdNdNarararararararararararararararararardCdCdCaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaedCdCdCdCararararararararararararararararararararararararararararararararararararararararozarararararararararararararararararararardCdCaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaedCdCdCdCarararararararararararararararararararararararararararararararararararararararararoAarararararararararararararararardCdCdCdCaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaedCdCdCdCarararararararararararararararararararararararararararararararararararararararararararararararararararararararardCdCdCdCaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaedCdCdCdCdCarararararararararararararararararararararararararararararararararararararararararararararararararararararardCdCaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaedCdCdCdCdCdCararararararararararararararararararararararararararararararararararararararararararararararararardCdCdCdCaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaedCdCdCdCdCdCdCdCdCarararararararararararararararararararararararararararararararararararararararararararardCdCdCdCdCaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaedCdCdCdCdCdCdCdCdCdCdCdCararararararararararararararararararararararararararararararararararardCdCdCdCdCaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaedCdCdCdCdCdCdCdCdCdCdCdCdCdCarararararararararararararararararararararararardCdCdCdCdCdCdCdCdCaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaedCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaedCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaedCdCdCdCdCdCdCdCdCdCdCdCdCaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaoBoBoBaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaoBoBoBaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaoBoCoBaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaoDoEoFoGoGoGoGaaoHoIoJaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaoKoGoLoMoNoOoPaaoBoBoQaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaoRoSaaoToUoVoWoXaaoYoZaapaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aapbaapcpdpeaapfaaaaaaaaaapaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aapgphaapipjpkplpmaapnpoaappaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aapqaaprpsptaapuaaaaaaaaaappaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+"}
diff --git a/_maps/map_files/MetaStation.v39K.dmm b/_maps/map_files/MetaStation.v39K.dmm
index f50bdc5b7b1..6c657034541 100644
--- a/_maps/map_files/MetaStation.v39K.dmm
+++ b/_maps/map_files/MetaStation.v39K.dmm
@@ -1282,8 +1282,8 @@
"ayH" = (/obj/structure/closet/secure_closet/detective,/obj/effect/landmark{name = "blobstart"},/obj/machinery/camera{c_tag = "Detective's Office"; dir = 4; network = list("SS13")},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office)
"ayI" = (/obj/machinery/camera/emp_proof{c_tag = "Fore Arm - Far"; dir = 2; network = list("Singulo")},/turf/simulated/floor/plating/airless,/area/engine/engineering)
"ayJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = "0"},/turf/simulated/floor/plating,/area/crew_quarters/fitness{name = "\improper Recreation Area"})
-"ayK" = (/obj/machinery/turret{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai)
-"ayL" = (/obj/machinery/turret{dir = 8},/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai)
+"ayK" = (/obj/machinery/porta_turret{ai = 1; dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai)
+"ayL" = (/obj/machinery/porta_turret{ai = 1; dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai)
"ayM" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/light,/obj/machinery/door_timer/cell_1,/obj/machinery/camera{c_tag = "Brig - Hallway - Port"; dir = 1; network = list("SS13")},/turf/simulated/floor{icon_state = "red"},/area/security/brig)
"ayN" = (/obj/machinery/hydroponics/constructable,/obj/item/device/analyzer/plant_analyzer,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison)
"ayO" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/hallway/primary/starboard)
@@ -1808,7 +1808,7 @@
"aIN" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/borgupload{pixel_x = -1; pixel_y = 1},/obj/item/weapon/circuitboard/aiupload{pixel_x = 2; pixel_y = -2},/turf/simulated/floor{icon_state = "vault"; dir = 4},/area/storage/tech)
"aIO" = (/obj/structure/disposalpipe/segment,/obj/machinery/hologram/holopad,/turf/simulated/floor{dir = 2; icon_state = "brown"},/area/quartermaster/office{name = "\improper Cargo Office"})
"aIP" = (/obj/item/weapon/storage/box/lights/mixed,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/hallway/primary/central)
-"aIQ" = (/obj/structure/closet{name = "Contraband Locker"},/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap,/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/reishi,/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus,/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom,/obj/item/weapon/suppressor,/obj/effect/spawner/lootdrop{loot = list("/obj/item/weapon/gun/projectile/automatic/pistol","/obj/item/weapon/gun/projectile/automatic/pistol","/obj/item/weapon/gun/projectile/automatic/pistol","/obj/item/weapon/gun/projectile/automatic/pistol","/obj/item/weapon/gun/projectile/automatic/pistol","/obj/item/weapon/gun/projectile/automatic/pistol","/obj/item/weapon/gun/projectile/automatic/pistol","/obj/item/weapon/gun/projectile/automatic/pistol","/obj/item/weapon/gun/projectile/shotgun/combat","/obj/item/weapon/gun/projectile/shotgun/combat","/obj/item/weapon/gun/projectile/shotgun/combat","/obj/item/weapon/gun/projectile/shotgun/combat","/obj/item/weapon/gun/projectile/shotgun/combat","/obj/item/weapon/gun/projectile/revolver/mateba","/obj/item/weapon/gun/projectile/automatic/deagle"); name = "armory contraband gun spawner"},/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden)
+"aIQ" = (/obj/structure/closet{name = "Contraband Locker"},/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap,/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/reishi,/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus,/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom,/obj/item/weapon/suppressor,/obj/effect/spawner/lootdrop/armory_contraband,/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden)
"aIR" = (/obj/structure/table,/obj/item/weapon/wrapping_paper,/obj/item/weapon/wrapping_paper,/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_y = -30},/obj/item/weapon/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/weapon/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/weapon/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/weapon/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/weapon/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/weapon/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/weapon/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/weapon/packageWrap{pixel_x = 2; pixel_y = -3},/turf/simulated/floor{dir = 2; icon_state = "arrival"},/area/quartermaster/office{name = "\improper Cargo Office"})
"aIS" = (/obj/item/weapon/storage/box,/obj/structure/table,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/item/weapon/hand_labeler,/turf/simulated/floor{icon_state = "arrival"; dir = 6},/area/quartermaster/office{name = "\improper Cargo Office"})
"aIT" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "L10"},/area/hallway/primary/central)
@@ -1855,7 +1855,7 @@
"aJI" = (/obj/structure/lattice,/obj/structure/lattice,/turf/space,/area/space)
"aJJ" = (/obj/machinery/door/airlock/hatch{icon_state = "door_closed"; name = "MiniSat Space Access Airlock"; req_one_access_txt = "32;19"},/turf/simulated/floor/plating,/area/construction/hallway{name = "\improper MiniSat Exterior"})
"aJK" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/machinery/door/window{dir = 8; name = "MiniSat Airlock Access"; req_access_txt = "0"},/turf/simulated/floor{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"})
-"aJL" = (/obj/machinery/turret{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai)
+"aJL" = (/obj/machinery/light/small,/obj/machinery/porta_turret{ai = 1; dir = 1},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior{name = "\improper MiniSat Central Foyer"})
"aJM" = (/obj/machinery/ai_slipper{icon_state = "motion0"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
"aJN" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen{pixel_x = 4; pixel_y = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 2; icon_state = "arrival"},/area/quartermaster/office{name = "\improper Cargo Office"})
"aJO" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{dir = 1; icon_state = "yellow"},/area/storage/tools)
@@ -2036,7 +2036,7 @@
"aNh" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 3; pixel_y = 3},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "greencorner"},/area/bridge)
"aNi" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 1; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/obj/machinery/light,/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/central)
"aNj" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 2; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/central)
-"aNk" = (/obj/machinery/turret{dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload)
+"aNk" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/machinery/porta_turret{ai = 1; dir = 1},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/turret_protected/tcomeast{name = "\improper MiniSat East Wing"})
"aNl" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload)
"aNm" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aNn" = (/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload_foyer)
@@ -3249,14 +3249,14 @@
"bky" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/break_room)
"bkz" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
"bkA" = (/obj/machinery/power/apc{dir = 1; name = "Port Hallway APC"; pixel_x = -1; pixel_y = 26},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "neutralcorner"},/area/hallway/primary/port)
-"bkB" = (/obj/machinery/turret{dir = 2},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload)
+"bkB" = (/obj/machinery/light/small,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/porta_turret{ai = 1; dir = 1},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior{name = "\improper MiniSat Central Foyer"})
"bkC" = (/obj/machinery/atmospherics/unary/heat_reservoir/heater{dir = 2; icon_state = "freezer_0"; on = 1; tag = ""},/turf/simulated/floor{dir = 1; icon_state = "caution"},/area/maintenance/storage)
"bkD" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"; dir = 2},/area/shuttle/arrival/station)
"bkE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{dir = 1; icon_state = "neutralcorner"},/area/hallway/primary/port)
"bkF" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/hallway/secondary/entry{name = "Arrivals"})
"bkG" = (/turf/simulated/floor{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"})
"bkH" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload)
-"bkI" = (/obj/machinery/turret{dir = 2},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload)
+"bkI" = (/obj/machinery/porta_turret{ai = 1; dir = 1},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/turret_protected/tcomwest{name = "\improper MiniSat West Wing"})
"bkJ" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 2; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/construction/Storage{name = "Storage Wing"})
"bkK" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/flasher{pixel_x = 0; pixel_y = 24; id = "AI"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload)
"bkL" = (/obj/structure/table,/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler,/obj/item/device/multitool,/obj/item/device/multitool{pixel_x = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor{dir = 5; icon_state = "brown"},/area/storage/primary)
@@ -3538,18 +3538,18 @@
"bqb" = (/obj/machinery/door/airlock{id_tag = "Toilet2"; name = "Unit 2"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
"bqc" = (/obj/item/device/radio/beacon,/turf/simulated/floor{icon_state = "delivery"},/area/hallway/secondary/entry{name = "Arrivals"})
"bqd" = (/obj/machinery/power/apc{dir = 1; name = "Security Post - Cargo APC"; pixel_x = 1; pixel_y = 24},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/checkpoint/supply{name = "Security Post - Cargo"})
-"bqe" = (/obj/machinery/light/small,/obj/machinery/turret{dir = 1; enabled = 0},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior{name = "\improper MiniSat Central Foyer"})
+"bqe" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/porta_turret{ai = 1},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload)
"bqf" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/turret_protected/tcomwest{name = "\improper MiniSat West Wing"})
"bqg" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/central)
"bqh" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 2; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/turret_protected/tcomwest{name = "\improper MiniSat West Wing"})
"bqi" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 4; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/fore)
"bqj" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{glass = 0; icon = 'icons/obj/doors/Doormining.dmi'; name = "Cargo Bay"; opacity = 1; req_access_txt = "0"; req_one_access_txt = "48;50"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/construction/Storage{name = "Storage Wing"})
-"bqk" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/machinery/turret{dir = 1; enabled = 0},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/turret_protected/tcomeast{name = "\improper MiniSat East Wing"})
+"bqk" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/porta_turret{ai = 1},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload)
"bql" = (/obj/machinery/conveyor{dir = 2; id = "QMLoad"},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/camera{c_tag = "Cargo Bay - Port"; dir = 4; network = list("SS13")},/turf/simulated/floor/plating,/area/quartermaster/storage)
"bqm" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/quartermaster/storage)
"bqn" = (/obj/machinery/camera/autoname{dir = 2; network = list("SS13")},/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/machinery/power/apc{dir = 1; name = "Quartermaster's Office APC"; pixel_x = 0; pixel_y = 30},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor{dir = 1; icon_state = "brown"},/area/quartermaster/qm)
"bqo" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/tcomeast{name = "\improper MiniSat East Wing"})
-"bqp" = (/obj/machinery/light/small,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/turret{dir = 1; enabled = 0},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior{name = "\improper MiniSat Central Foyer"})
+"bqp" = (/obj/effect/decal/cleanable/cobweb2,/obj/machinery/porta_turret{ai = 1; dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai)
"bqq" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor{dir = 10; icon_state = "neutral"},/area/hallway/primary/port)
"bqr" = (/obj/structure/closet/secure_closet/quartermaster,/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 9; icon_state = "brown"},/area/quartermaster/qm)
"bqs" = (/obj/machinery/light/small,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -26},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office)
@@ -3562,7 +3562,7 @@
"bqz" = (/obj/structure/table/woodentable,/obj/machinery/computer/security/wooden_tv{pixel_x = 3; pixel_y = 2},/turf/simulated/floor/wood,/area/bridge)
"bqA" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet,/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
"bqB" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/carpet,/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
-"bqC" = (/obj/machinery/turret{dir = 1; enabled = 0},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/turret_protected/tcomwest{name = "\improper MiniSat West Wing"})
+"bqC" = (/obj/machinery/porta_turret{ai = 1; dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload)
"bqD" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "Fore Primary Hallway APC"; pixel_x = 0; pixel_y = -27},/obj/structure/cable/yellow,/obj/machinery/light,/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
"bqE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
"bqF" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/primary/central)
@@ -3985,10 +3985,10 @@
"byG" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = 0; pixel_y = 32},/obj/machinery/camera{c_tag = "Fore Primary Hallway Cells"; dir = 2; network = list("SS13")},/turf/simulated/floor{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
"byH" = (/obj/effect/landmark/start{name = "Bartender"},/turf/simulated/floor/wood,/area/crew_quarters/bar{name = "\improper Maltese Falcon"})
"byI" = (/obj/structure/table,/obj/item/device/assembly/igniter{pixel_x = -4; pixel_y = -4},/obj/item/device/assembly/igniter,/obj/item/weapon/screwdriver{pixel_y = 16},/turf/simulated/floor{dir = 4; icon_state = "brown"},/area/storage/primary)
-"byJ" = (/obj/machinery/turret{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload)
+"byJ" = (/obj/machinery/porta_turret{ai = 1; dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload)
"byK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
"byL" = (/obj/structure/sign/kiddieplaque{pixel_y = 32},/obj/structure/table,/obj/structure/flora/kirbyplants{desc = "A simple, healthy looking potted plant. Likely one of the best friends an AI will ever have."; name = "Photosynthetic Potted Plant"; pixel_y = 8},/obj/machinery/camera/motion{c_tag = "AI Upload Chamber - Fore"; network = list("SS13","RD","AIUpload")},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload)
-"byM" = (/obj/machinery/turret{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload)
+"byM" = (/obj/machinery/porta_turret{ai = 1; dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload)
"byN" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/crew_quarters/courtroom)
"byO" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"byP" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor,/area/crew_quarters/courtroom)
@@ -4208,7 +4208,7 @@
"bCV" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/crew_quarters/locker)
"bCW" = (/obj/structure/table,/obj/item/weapon/book/manual/wiki/security_space_law{pixel_x = -3; pixel_y = 5},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/item/weapon/book/manual/wiki/security_space_law{pixel_x = -3; pixel_y = 5},/obj/item/weapon/book/manual/wiki/security_space_law{pixel_x = -3; pixel_y = 5},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/courtroom)
"bCX" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/briefcase{pixel_x = -3; pixel_y = 2},/obj/item/weapon/storage/secure/briefcase{pixel_x = 2; pixel_y = -2},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office)
-"bCY" = (/obj/machinery/turret{dir = 1},/obj/machinery/flasher{id = "AI"; pixel_x = 0; pixel_y = -24},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload)
+"bCY" = (/obj/machinery/flasher{id = "AI"; pixel_x = 0; pixel_y = -24},/obj/machinery/porta_turret{ai = 1; dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload)
"bCZ" = (/turf/simulated/floor/plating{icon_state = "warnplate"},/area/hallway/secondary/entry{name = "Arrivals"})
"bDa" = (/obj/item/weapon/book/manual/wiki/security_space_law,/obj/machinery/newscaster{hitstaken = 1; pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9; pixel_y = 0},/obj/structure/table/reinforced,/turf/simulated/floor{icon_state = "red"},/area/security/checkpoint/supply{name = "Security Post - Cargo"})
"bDb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/structure/sign/chemistry{pixel_x = -32},/turf/simulated/floor{dir = 8; icon_state = "yellowcorner"},/area/hallway/primary/aft)
@@ -10632,28 +10632,28 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaabmNbmNcEtbJJaEWaCkaCkcEvaEXbJFaEYaEZaKBaKBasNaKBaaaaFaaFaaFaaFaaFaaFaaFaaaearuaruarubNybNSaruarubipbimbiqbrzbrpbhrbikbidbqjbkJbrBbrBbjsbrBbknbrLbkQaWublablgbkNaxwaxwbGSaxwaxwaxwaxwaxwaxwaxwaxwbGSaxwbiBawnblTaoaaoaaoabrmbrmbrmbrmbrmaoabrlaoaaqLaqLaqLaqLbrnaqLakZbaabaabaabxtbhDbaabrcbaabHbbaabrkbmVbmWalZbnabnebngalZbnkbnBbnqabcbNocErarNasPasPasPasPasPbwtbrdaDBaAObqXasPaDDaDEaycbtJaycaDHazDaaeaaaaaaaaeaaeaaeaaeaaeaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaabmNaEUaEUaEUaCkaCkaCkaCkaCkaCkaEUaEUaGtaKBasNafUaaaaFaaFaaFaaFaaFaaFaaFaaaeaaeaGucpZcqFaHZaFVaFDaEBaEAbaTbaUbaRbisaEGbgBbhraCuaBSaBWaDraDtaCVaCYbAQaBOcoWcpGcpNahjaaaaaaaaaaaeaaaaaaaaaaaeaaaaaaaaabEdbEwbEpbiCaoabiEbiDbivaoebvnaogaohaoiaojaoabyEbqUbtXbvcaDsaqLbynbaabhEbAabcEbhDbaabhCbaabKlbaaaUwaUfaUtaCWaCWaCWaCWaCWaCWaCWaCWaCWavAbzjarNaTMaTBbtgaFZasPbylaAJaDBbhRaDHaEOaEPaEQaoGaAKaESawMazDaaebooaaeaaeajGajGajGaaeblfaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaabmNbwkaCkaCkaCkaCkaCkaCkaCkaCkaEUaEUaEUbstblIaKBaaaaFaaFaaFaaFaaFaaFaaFaaHVaHWaHXbwlaLnaKYbcGaIcaIdaIebpRbcIbdzbdMbnlbdMbdMbdMbdMbnmaYhbjjbjgbitbjjaYhaYhaYhaYhbjlaaaaaaaFsaFsaFsaFsaFsaFsaFsaaaaaaaxwbjuatZbjwapdbjvaohbjFapgaphbxAapjapkaplaoabyXaDqbyWbjzbzCaqLbnMbaabaabaabiFbiFbaabaabaabaabaaaXEaXXaZaaCWbrwaHebkUaVJaUBbaMaWiaCWciUacjarNaTBaTBbjcaHFaHGazrampaGhbjdbthasPbhfaGkaGlaGmaGnaGoazDaaeaaaaaaaaebtNbwxajGaaeaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaebmNaJiaCkaCkaCkaCkaJjaCkcwHaCkaCkaEUaJkaKBaxSaKBaaaaFaaFaaFaaFaaFaaFaaFabFOaJmbFOaHYaJnaJoaJpbrgaJraJsbrfbewbetbldbkZbJibJicxgbJibUraYhaTPbkWbkRbmIaSLaSAbkPbkLbkMbzwaGUaGUbkIbkKbyLbkHbkBaLUaLUbyVbkwbkzaLXbiCaoabkvaohapOaohapPaohapQaohaohaoabzYaQDbyWaBUbwoaqLbdjaPpaNdaPpbkcbjGbdlaPDbkibdkaPLbiGaIGbfhaCWbfTbdibdibdibdebchbbDaCWcqHacjarNaKhaKhaHEaHFaHGbkbbypbyobjHbjRaHNaHOaHPaHQaHRaHSawMazDaaeaaabyhaaeajGajGajGaaeaaebooaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaebmNaJiaCkaCkaCkaCkaJjaCkcwHaCkaCkaEUaJkaKBaxSaKBaaaaFaaFaaFaaFaaFaaFaaFabFOaJmbFOaHYaJnaJoaJpbrgaJraJsbrfbewbetbldbkZbJibJicxgbJibUraYhaTPbkWbkRbmIaSLaSAbkPbkLbkMbzwaGUaGUbqkbkKbyLbkHbqeaLUaLUbyVbkwbkzaLXbiCaoabkvaohapOaohapPaohapQaohaohaoabzYaQDbyWaBUbwoaqLbdjaPpaNdaPpbkcbjGbdlaPDbkibdkaPLbiGaIGbfhaCWbfTbdibdibdibdebchbbDaCWcqHacjarNaKhaKhaHEaHFaHGbkbbypbyobjHbjRaHNaHOaHPaHQaHRaHSawMazDaaeaaabyhaaeajGajGajGaaeaaebooaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKqaCkaCkaKraCkaCkaCkaCkaCkaCkaCkbytaKBaKBcylaKBaaeaFaaFaaFaaFaaFaaFaaFaaKsaKtaKsaKuaJnaKvaKvaKwaKvaIebeKbeLbftaKBaKBaKBaKBaKBaKBasNaYhaWfbmzaWkaWebmxbmxbmxbmvbjlaaaaFsbzuaGYaGYaGYaGYaGYbAJaFsaaaaxwblUawnblTaoablRaqGaqHaohaqIaohaqJaqKaohbmubBvbBDbBhbBtbxiaqLblZbmabliblibliblkbllbllblmblmblBbhvbhwbfBbhzaeQbrxbrxbrxbgybiHbgUaCWaiQacjarNaKhblOaUNaGaasPbviaAJbysaAObzxasPaJeblhaDxaDxaDxaDyazDaaeaaaaaaaaeaaeaaeaaeaaeaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLjaLkaLlaaaaLmaCkaCkaCkaCkcEtaCkbPDbPHbPHbQabzKaKBaUDasNaKBaaeaFaaFaaFaaFaaFaaFaaFaaLoaHWaLpbPkaJnaLraKubvjaLtaLubBAbBIbBkbBrbqrbqnbqJbqHaKBbBOaYhbyjbmzcjRcnmckeckeclsbyIbjlaaabNqbyJaGYbOHbOcbPXaGYbyMbORaaaaxwbiBawnblTaoabyNarxadSarzarAarzarBarCbyPaoacoucpTcwQcxabPtaqLbqYaIEaIFaJSaKRbtHbztbQmbzqbzsbzhbribrebrhbqZbraadhbvCbySbyQbwHbwmaCWaUoacjarNasPbwtbwtasPasPbwtbzNbzMbzObDvasPasPaCfasPasPaCgbdIbDrbDsaaaaaaaaaaaeaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLjaLkaLlaaaaLmaCkaCkaCkaCkcEtaCkbPDbPHbPHbQabzKaKBaUDasNaKBaaeaFaaFaaFaaFaaFaaFaaFaaLoaHWaLpbPkaJnaLraKubvjaLtaLubBAbBIbBkbBrbqrbqnbqJbqHaKBbBOaYhbyjbmzcjRcnmckeckeclsbyIbjlaaabNqbqCaGYbOHbOcbPXaGYbyJbORaaaaxwbiBawnblTaoabyNarxadSarzarAarzarBarCbyPaoacoucpTcwQcxabPtaqLbqYaIEaIFaJSaKRbtHbztbQmbzqbzsbzhbribrebrhbqZbraadhbvCbySbyQbwHbwmaCWaUoacjarNasPbwtbwtasPasPbwtbzNbzMbzObDvasPasPaCfasPasPaCgbdIbDrbDsaaaaaaaaaaaeaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLaMIaMJaMIadqbmNaCkaCkaCkaCkaCkaCkaCkaCkaCkbRIaMMaKBbwqbwPaKBaaaaFaaFaaFaaFaaFaaFaaFaaKsaMOaKsaKuaJnaKvaKvaKwaKvaIebpRbEobEsaMRbtKbsUbsobsnaKBbzzbzAbgfbmzbOTbzDbzFbOTcMVbQRbjlaaabPRbsqaLQbPVbDXbPVaLQbRcbSiaaaaxwbiBbzlbQXaoaastasuasuasvaswastasuasxasyaoaaqLcSncLWcRzaqLaqLbCxaIEaJSaKRbAIbnbaIEaIFaKRaKRaJSbwNbAFbsGbsubswbrxbrxbyAbgybEnbzpaCWaTNcMbarNbAlbAkbDHbAmbzPbhxaAJbysaAObAMbpebALaLhbAKayiayjaAUbEeaaebooaaaaaabooaaaaaaaaaaaabooaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaaaNKaNKaNKaNKaMcaNKaNKaNKaNKaMcaNKaNKaNKaNKaMcaNKaNKaNKaNKaaaaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawaMIaObaMIaawbmNaJiaEUaCkaCkaCkaCkaCkcMeaCkbUcaOcaKBbyRaDlaKBaaaaFaaFaaFaaFaaFaaFaaFacdhaOecdhaOfaJnaKvaSpaSqaSraSsbKgaIebJraKAbvPbvzaOnbwuaKBbBBaYhbBwbmzbOTbBEbBFbRUcMVbTKbjlaaaaFsbTjbSraLQbTmaGYbRebRBaFsaaaaxwbAXatZbjwaChbKQaueaueaueaojaueauebAZbQtaoabCSdtNdAubBabTobsLbBabBcbChbChbCebupbutbsRburbusbsQbsRbsMbsOaCWbtPbuCbEqbNtauhbIbbEAaCWaQsbuParNbCrbCqbCpbCobCAbAibAbbzVbxfbBPaMDaMDaMEbBQayiaMGazDbENaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaMibUobBHbBHbBHbzTbBHbBHbBHbBHbZMbBHbBHbBHbBHbzSbBHbBHbBHaXfaFLaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaQNaPqcMgaPsaQNbmNcEvaEUbVDbVXbVEaCkaCkaCkaCkbUcaEUaKBasNbrTafUaaaaFaaFaaFaaFaaFaaFaaFaaPtaHWaPuaPvaJnaKvaKvaKwaKvaIebKgaIebKZaKAbyfbyebydbxcaKBaDUaYhbDcdDRbTqbTCbTDbOTcMVbDfbjlaaeaFsaFsaFsbCYaNlaNkaFsaFsaFsaaeaxwbjuaIvblTaBQcbbaueaueauebOhaueauebCUaojaBQbkcdDPbCVbwLaIFbvtaIFaIEaJSaIFbDOaIFbwOaJSaKRaIFaKRaJSbDLbDMaCWbSsbIubwwatebPobaMbbDaCWbItacjarNbWcaTgbDCbDBbDIbAVbDKbDJbDxbDyaAKaAKbDzayhayiayjaNYaaaaaaaaeaaaaaaaaaaaaaaeaaaaaabIraaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvbCzaIlbGfbFgbFgaFUbFgbFgbFgbFgaJUbFgbFgbFgbFgaFUbFgbFgbFkaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaQNaPqcMgaPsaQNbmNcEvaEUbVDbVXbVEaCkaCkaCkaCkbUcaEUaKBasNbrTafUaaaaFaaFaaFaaFaaFaaFaaFaaPtaHWaPuaPvaJnaKvaKvaKwaKvaIebKgaIebKZaKAbyfbyebydbxcaKBaDUaYhbDcdDRbTqbTCbTDbOTcMVbDfbjlaaeaFsaFsaFsbCYaNlbyMaFsaFsaFsaaeaxwbjuaIvblTaBQcbbaueaueauebOhaueauebCUaojaBQbkcdDPbCVbwLaIFbvtaIFaIEaJSaIFbDOaIFbwOaJSaKRaIFaKRaJSbDLbDMaCWbSsbIubwwatebPobaMbbDaCWbItacjarNbWcaTgbDCbDBbDIbAVbDKbDJbDxbDyaAKaAKbDzayhayiayjaNYaaaaaaaaeaaaaaaaaaaaaaaeaaaaaabIraaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvbCzaIlbGfbFgbFgaFUbFgbFgbFgbFgaJUbFgbFgbFgbFgaFUbFgbFgbFkaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaQNcEwbCJbCZaQMbmNbueaEUaQPbJGbCdaEUaEUaEUbuwbDAbEmaKBcoLasdaKBaaeaFaaFaaFaaFaaFaaFaaFaaaeaaebpMaPvaQTaJoaJpbtAaSrbmXbopbozblLaPyaPyaPyaPyaPyaKBbsbbsgbshbsdbsdbrQbrRbrNbLjbHobHqaaaaaaaaaaFsaFscLpaFsaFsaaaaaaaaabEdbEwbHvblTaChbroavlarPbmfaojaojbsDbsIaojaChbkcbsjbslbrPbsrbonbsrbsvbECboqbsmbsrbsrbsrbsrbsrbsrbsJbsPbzGaCWaCWaCWaCWapJaCWaCWaCWaCWavAacjarNbARbAdbAdbtabsZbsVbsTbsSbtkbtlbvubtnbteawMawNaPoasPaaaaaeaaeaaaaaaaaaaaaaaeaaaaaaaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvbCzaIlaGpaaaaaaaFUaaaaaaaaaaaaaJUaaaaaaaaaaaaaFUaaaaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaQNaQNaSiaShaQNaQNaQNbvfaQNaQNbFublSaQNaQNaQNbFraQNaQNbuSaQNaQNaaeaFaaFaaFaaFaaFaaFaaFaaaaaaeaZpbqlaJnaKvaKvaKwaKvaIeaJuaIebuKaPybrvbqdbmtbmOaKBasNaYhbtCbtDbtFbtrbtsbttbLlbtxbjlaTLbINaTLaNnbEXbukbHwaNnaTLbINaTLaxwbuhbwRbuiaoaaoaaoaaoaaoabtMbtUbufaojbCWaoabkcbtLbtHbuHaCZaCZaCZaCZaCZaCZaCZbuFbuGbuLbovbuBbuDaCZaPpaPpavAbuOaXNbYbborbYbcLtbYbbASbYbbuqarNaNLaNLaNLaNLbuvbuubPnbuybuVbuWbuUaAJbuTavEasPasPasPaaeaaeauBaQIauBauBauBauBauBauBauBauBbvBaaeaaaaaaaaaaaaaakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvbCzaIlaGpaaaaaaaFUaFUaFUaFUaFUaJUaFUaFUaFUaFUaFUaaaaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaTpaZDbrsbIdaZfbsfbrsbtfbHybHrbHybHBbIebHybIjbInbIJbwrbISaQNaaaaaaaFaaFaaFaaFaaFaaaaaaaaaeaZpbvgaJnaKvaKvaKwbKvaIeaTAbumbujbwKbtqbtjbxSbyyaKBasNaYhaYhaYhbjqbvMbvNbjlbsHbsabjlbSXbTHbNpaNnbvAaNpbvraNnbrFbIVbvdbIUbvebqFbuZbuYbuMbLGbrGaoaaoaazAbvGazvaoaaoabvDbvEbvFbvDaCZbwybJmbowboCboFavAavAavAavAbbOavAavAavAavAavAavAacjaUoaQsaJzaJzaJzaJzaJzaJzaJzaNLbvZbvUbvTaNLbBpbATaNLbwabvObwtbwtbvQbvRbqNauybLcauyaScauBbirauBatLatMaSfatMatOauBbiratPauHaaeaaeaacaahaahaahaacaaeaacaahaahaacaacaahaahaahaacaaeaaeaaeaaeaaeaFvaMibIiaLIaLIaLIaLIaLIavcavcavcbwpavcavcavcaLIbwsaLIaLIaLIbHdaFLaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaXFbwBaUMaUMbMnaUMaUMaUMaUOaYbbMFbMEbKcbKcbKcbKnbLHaUQbyFaQNaaaaaaaaeaaeaaaaaaaaeaaaaaeaaeaZpbxlaJnaKvbVqbxaaGDbxgaGDbuAbqmbEzbGdbwnbDabBzaKBcLAbxbbOSbITbxebuzbwXbvhbwbbsKbtOaVkcdbaVkbBNbBMaVsbziaVtaVkbJRaVvbwMaVxbLZbuEaVAaVBaVCaVDaVDaVDbvbbpcaVDaVDaVHaVDbpbboQaVDboJaVDbwvboGavAbpTcLUbpVbBsbpUbqybpUbqObpUbqRaXvbASbuqaThaQsaJzbxBbxJbxLbpSbxObxPaNLbzHbxpbxpbOdbxpbzIaNLbxubuVbzkaHoaHoaHoaHoaHoaRfasPaTnatMaToatMauGasPasPasPaTnatMauGatPasPaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaFvbCzaIlaGpaaaaFUatXatXayKbJjaweaxxbBLbJjayLatXaGvaFUaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaXFbwBaUMaUMbMnaUMaUMaUMaUOaYbbMFbMEbKcbKcbKcbKnbLHaUQbyFaQNaaaaaaaaeaaeaaaaaaaaeaaaaaeaaeaZpbxlaJnaKvbVqbxaaGDbxgaGDbuAbqmbEzbGdbwnbDabBzaKBcLAbxbbOSbITbxebuzbwXbvhbwbbsKbtOaVkcdbaVkbBNbBMaVsbziaVtaVkbJRaVvbwMaVxbLZbuEaVAaVBaVCaVDaVDaVDbvbbpcaVDaVDaVHaVDbpbboQaVDboJaVDbwvboGavAbpTcLUbpVbBsbpUbqybpUbqObpUbqRaXvbASbuqaThaQsaJzbxBbxJbxLbpSbxObxPaNLbzHbxpbxpbOdbxpbzIaNLbxubuVbzkaHoaHoaHoaHoaHoaRfasPaTnatMaToatMauGasPasPasPaTnatMauGatPasPaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaFvbCzaIlaGpaaaaFUatXatXayKbJjaweaxxbBLbJjbqpatXaGvaFUaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeboibojaPBaWgaQNaTpaWhaTpbwBaUMaWLaWYaTpaWhaTpaZCaWlaWmaVyaKBaKBaKBaKBaWpaWqaWraKBaKBaKBaKBaZpaORaOUaOVaOSaOTaKvaOkaPzaOmaOlaPyaPyaPyaPyaPxaKBaKBaSuaKBaKBaWCaOQaOOaWKaMhaWWaWVaWKaMhaOFaOHaWWaOIaWKaWKaWKbbLaWNaOKazxaITaBjaWSaWTaWKaWKaWKaWKaWUaOAaWKaWKaWVawgaOBaWKaWKaWKaWKaLeaKLaVMaVMaVMapJaVMaVMaVMavAaKJavAacjavAavAaHUaHUaHUaHUaOyaOuaOuaOtaKdaUEaNLaOdaTwaROaQFaSbaStaNLaSjaNSaNRaHoaUIaVZaNMaHoaNQasPasPasPasPasPasPasPbUhasPasPasPasPasPasQaaeaacaFvaFvaacaFvaFvaFvaFvaacaFvaFvaFvaFvaacaFvaFvaFvaFvaFvaFvaFvaFvaMiaIlaGpaaaaFUatXaweaxqaCRaxtaxraxuaCRaxvaweaGvaFUaaaaGqaIlaGpaLKaLKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaULaaeaaaaaeaaaaXFbeNaXFaVgaVgaUTaVbaXFbeNboiaXKaQNaXLaVEaOaayTaXObSSaXOaRXaXObSCaNJaXOaNmaNraNsaQSaKzaQhaySaUPaNqaHfaNDaNEaHfaNNaKcaHfaOvaOxaOwaOLaOzaSWaUHaYpaNzaNCaNCaFSaFJaNHaNGaNeaNgaLNaUsaUsaUsaUsaUsaUsaUsaLsbSBaSYaSYaSYaSYaSYaSYaSYaSYaSXaOraNiaTjaSYaNjaSXaSYaSYaLdaYGaUFaVMaJgaJVaJOaIXaIVaVMaOjaMxavAbQWavAaaaaHUaINaIKaHUaMAaOgaMFaMyaMwaKaaNLaMTaMUaMVaMWaNXaQKaNLaQuaMoaLPaHoaSEaMkaMfaHobMQaHFaHFbKXaHFbJQaHFaHFaHFbPMaHFaMpaMqaMpaMqaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaaaMcaMbaIlaGpaaaaFUatXaNyawqatXawlawkawjatXbycaSCaGvaFUaaaaGqaIlaLLaaaaLKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaaaULaWhaZhaSlaSlaSlaSlaZiaWhaULaaaaQNaZjaSeaZlaZlaZlaZlaZlaZlaZlaZlaZmaNaaHfaHfaHfbhAbhFbgeaHfaHfaNxaHfaTHaTFaTGaTDaTEaTvaTuaGRaGQaWnaTtaSWaRmaYpaRpaZNaZNaTRaZNaRoaZLaZLaRqaZLaYgaXtaXtaXtaXtaXtaXtaXtaXtaXtaXtaXtaXtaXtaXtaXtaXpaZTaZTaZUaZTaZTaZTaZTaZTaZTaEMaYpaRkaVMaXGaOsaOqaODaOCaVMbbRbbMavAacjcgaaaaaQGaQHaQLaRaaNVaNIaNPaRdaRbaOpaNLaQxaQzaQwaQwaQBazfaNLaQAaRgaQAaHoaRhaRjaXHaHobXUasPasPasPasPasPasPasPasPasPbtpasPasPaRfasPaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaFvaOXaQraQoaUVaFUaFUaFUatXaTsawfavmatXatXatXauZavdaSHaGvaFUaFUaFUaUYaXfaFLaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaAbaBbJcbaBbaDbaBbaBbaDbaBbJcbaEbaFaQNaZjaXabaHaOPbaJbaKaQkaQjaSGaZlbUnaPFaPVaPWaPQaPJaPQaPQaPSaPQaQCaHfaQVaQlaQqaQvaQyaREaReaSyaSnaRcaKTbbcaHiaQaaPZaZNaQcaIBaNFbaOaZLaTfaQdaTLaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaZTbdnbbCaURbflbdDbdpbdoaZTaWabbFbbGaVMaPdaMsaMraMtaPKaVMavAavAavAaudavAaaaaHUaPbaLiaHUaPeaMvaPhaPkaPjbbqaNLaSxayUaSzaTbaPCazeaNLbwtaPNbwtaHoaPMaPPaPOaHoaJqaJqaJqaawadqaaaaaaaaaaaaaaeaaaaaaasPaMqasPaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaNKaNKaKpaNZaIlaMCaLJaaaaaaaFUaPaaEjaWZatXatXaSUatXatXbycaPAaOZaFUaaaaaaaOiaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakaaaaaaaaaaaaaaaaaaaaaaaabaAbaEbaBbcjbckbckbclbcmbcnbcobcpaGObckbcqbcraTpaZjaSeaMPaRJaRFaRKbcxaRAbczbCLbaeaTlbCNaHtaHtaIaaIbaHIaHfaHfaHfaHfaHgaHraHsaHjaHqaGZaGXaGRaGQaHdaHbaHaaIHaYpbRAaZNaHHaIDaMeaIzaItaDPaIuaEFaaeaaeaHAaHBaHCaGMaZPaGWaHyaGMaZPaGWaGGaGGaFIaaeaaeaZTaICaLAbdqaIAbdqbdraSvaZTaIpaYpaHmaVMaVMaFAaFzaFyaVMaVMaHzaFBaVaaIkaVaaVaaHUaHUaHUaHUaJzaJzaJzaIhaFxaJzaNLaNLaNLaNLaNLaOJaPcaNLaHpaHvaHpaHoaHwaHlaHkaHoaHnaHxdBLdBvdBvdBKaaaaaaaaaaaeaaaaaaaaaaaeaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeajGaJJaJEaIqaJEaJTaGpaaaaaaaaaaFUaImaweaJBaJWbBfbBgaJQaJWaxsaweaGvaFUaaaaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcqbecbedbeebckbefaEdbefaEdbefaEdbefbckbegbehaXFaZjaQUaZlaFGbekaQRbemaQEaFHaZlaXQaEcaFWaFXaGdaGiaGsaGyaGzaFmaFpaMLaFEaFKaFNaFPaFQaGBaGAaGFaGEaGIaGHaGNaHiaYpaRnaZNaGKaFwaYDaJPaZLaDNaFdaTLaaeaaeaFhaKxaEEaDdaRibfaaxlbfcaAYaBmaECaJxaFraaeaaeaZTbfiaClbfkaGTaGLaDVaDzaZTaEMavgaGwazgbfAaExbfAbfwayfaEwbfAbfAbfAaEKbfAayuaEDaMHaJGbfAbfAaCSayubfwaEKaELaxXaCSaybaMSaTmaziaFoaKQaFnaFlaFkaETaEhaDZaDaaFgbcebcebAodBBdBzdBJaaaaaaaaaaaeaakaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeajGaJJaJEaGbaJEaJKaGpaaaaaaaaaaFUaGfaGgayKaEiaNBaJMaNUaEkaJLatXaGvaFUaFUaFUaFUckMaFLaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcqbecbedbeebckbefaEdbefaEdbefaEdbefbckbegbehaXFaZjaQUaZlaFGbekaQRbemaQEaFHaZlaXQaEcaFWaFXaGdaGiaGsaGyaGzaFmaFpaMLaFEaFKaFNaFPaFQaGBaGAaGFaGEaGIaGHaGNaHiaYpaRnaZNaGKaFwaYDaJPaZLaDNaFdaTLaaeaaeaFhaKxaEEaDdaRibfaaxlbfcaAYaBmaECaJxaFraaeaaeaZTbfiaClbfkaGTaGLaDVaDzaZTaEMavgaGwazgbfAaExbfAbfwayfaEwbfAbfAbfAaEKbfAayuaEDaMHaJGbfAbfAaCSayubfwaEKaELaxXaCSaybaMSaTmaziaFoaKQaFnaFlaFkaETaEhaDZaDaaFgbcebcebAodBBdBzdBJaaaaaaaaaaaeaakaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeajGaJJaJEaGbaJEaJKaGpaaaaaaaaaaFUaGfaGgayKaEiaNBaJMaNUaEkayLatXaGvaFUaFUaFUaFUckMaFLaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfPbckbckbJcbckbefaEdbefbfQbefaEdbefbckbegbehaXFaQQaQpaZlbfSaQnaTzbfVaTzbaHbaHaNcaNvaNxaHfaNuaNfaNtaMXaMZaMKaMNaHfaIwaLWaMnaHjaLVaHfaLTaLqaKVaKUaKTbbcaIHaYpbRAaZNaLSaIoaSwaLMaZLaIPbbsaTLaZPaIIaZPaOEbgsbgwbgubgvbgtbgsbgubgwbgvaNAaZPaIIaZPaZTaYtaYtaYtaIxbgAaQbbgCaZTaPlaLZaLYaLbbgMaJHbgMbgObgMaLcbgMbgMbgMaKKbgMaLvaIjaLgaLfbgMbgMaIJaQmaIiaKKbgSaKKaKOayOaKPaTmawaaKWaKWaKZaLxaKWaKWaLzbbEaMjaLDbcebcedBsdBvdBvdByaaaaaaaaaaaeaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaJIaaaaaaaaaaaeaLJaLJaKpaJRaIlaGpaaaaaaaaaaFUaFUaImatXatXatXaTxatXatXatXatXaLHbwsaLGaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcqbhkbedbeebckbefaEdbefaEdbefaEdbefbckbegbehaXFbhlbhmbhnaKeaKbaJZaJZaKgaKfaKebcCaKiaKkaHfaKyaJwaJyaJNaKmaIRaISaHfaIfaHLaILaIOaPnaHfaKHaKNaKIaKFaKDaSWaKEbbFaKlbleblebleblebleaZLaHDaHcaKobhUbqxaPHaNhbgubgubgubguaDTbgubgubgubguaIgaBCaMBaZPbIBbGYbFwbEFbDeaKjaPfaNoaZTaFCaPwaKnazsbiwaGxbiwaGjbiwaMYbiwbiwaIUbiwbiwaOGaKXbiwaIraIUaFOaHhaOGaGjbiwbiyaPiaPmaIYaEuaJaaFjaJcaJdaJfaMjaJlaJlaJhaZbaFtaJqaTmaTmaTmaawaHTaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaIZaIWaJAaJvaJDaJCajeaJFaIlaFUaFUaFUaFUaFUaJXaLFaJXaJXaLwaLyaLwaMQaMQaNWaMdaMgaJUaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiTbiUbaBbcjbckbckbiVbckbiWbiXbckbiYbckbcqbiZaULaZjbjabmsbbpbbrbbzbbtbbnbblbbpbmPbjkbaXaHfbiobiIbjebixaHfaHfaHfaHfaHfaHfaHfbjEaHfaHfbbcbbbbbabbhbbebbdbbiaYpaXoblebbjaVSbbkblebbybeEbjQaQZaZPbnHaZMbhBbjMbmSbjIbaSbjKbjIbjIbjLbjMbjNbjObnJaZPaZTaYtaYtaYtbljaYtaYtaYtaZTbmTaYpbahbkdbcTbezbcTbkdaSaaSaaSaaSaaSaaSaavAavAbcSavAavAavAbhobgGavAavAavAbdmavAbddbdgaUSbdaaTCbcYbcVbhuaJlaXubcRbcQaZbaSmaJqaTmbhsbcFbeuaTSaTSbcUbeaaaaaaeaaaaaaaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaeaaaaIZbcLbcDaaaaaebcubbHbfWbbBbhNbrKaJXbhibkYbfDbhdbhhbhqaJXbofbmbbgNbinbnLbhWbhWbiuaJUaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiTbaBbJcbaBbaDbaBbaBbaDbaBbJcbiUbkDaQNbiabkFbkGaSWbbTaYOaTaaYObbPaSWaZcaXYaZdbaibkXbizaYLaYMbkmbizbjJbkAbizbkEbkXaYNbkXbagaXZaYIaYFbkObkXbjYbibblcbRAaZoaVTaZsaYJbleaTLaTLaTLaTLaZPaQfbloblpblqbeoaQXbssboRbqzaQYblrblqblyblzaQeaPYaZTblCblDblEbigaPRaYtbijaZTbkhaYpaOMbaIbaGbctbgibkdbawbazbfrbaubatbavaSRcixbDEavAaUqaUnbeDchJchOavAabkbaravAbambaobapbaqbakbakbakbfqbfoaJlaJlbggbfnaPgbgabfYbeGbeybcgbbxbbxbbSbbQbaPaYxbaPbaPaYxbaPbaPbaPbaPbaPbaPaYxbaPbaPbaPbaPbaPbaPaYxbaPbaZbbIbbxbbxbbxaYdbdZbejbebbebberbfsbnhbcfbcibdSbdTbdUbdVbdWbdYbbWbbYbbZbcbbccbcdaYZaLIaLIbrJaFLaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaTpaWhbmpaSlaSlaSlaSlbmqaWhaTpaaaaQNbyKbmrbruaSWbktbdKblPbdKbspaSWbsxbjxbfubmCcofbrEbmDbmCbmCbfxboMbmGbmBbmCbmCbfvbmCbmCbmCbfzbfybmKbmKboXbBebdPbnUblebdQbtWbcBbleaSobdLbeiaSBbtIblrbmYbeobskbsYbjXbndblGbndaSDboPboybvkbnjaTkaSZaZTbfIbnnbnobnpaTraZTaZTaZTaEMbnraWQbkdbfRbfObgIbkdbzcbyHbgLbgrbvxbgkbgjbgHbgFbgEbgDcokbhabkTbgYbhebhgbhbavAbddaYabzfaTmaFTbgVaXxbgJbgTbcZbgxbgcbmmaZbbafbadbkybjDaFLaaaaaabgKbcDaaaaaeaaaaaaaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaeaaaaVNbeUbeaaaaaaeaGqbfLbuobulbtzbtvbsXbrObwZbxnbwTbwVbsNbwSbvKbvLbsCbvJbvIbhWbvlbvsaJUaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaTpaaeaaaaaeaaaaXFbzWaXFbpQbqcaVgbpAaXFbzWboibojaQNaZjbwJbpwaSWbqTbdKbdFbdKbpzaSWbpPbhVbdAbdBbosbmobkVbdwboxbdCbnCbosbosbosbosaWPbosbmnbohbkVbdvbosbosbnDboAboBbnUblebbubbVbbfboNbbfbbvbbfbbfbtIaRWaRZboLboLboLbszbppbeJbdEbsyboLboLboLaRNaRLaZPaZTblKboTboUboVboWaZTclackEbaYbpaaWQbcTbeIbeObeMbkdbeRbfEbfCcocaSaaSaavAavAaTUavAavAavAcnPbjpavAavAbeFcgSavAbeAaYabeBaTmaJqaJqaJqaJqbeCaJqaJqaWRbjraZAaTmaTmbffbfebfFaaaaIZbfGaaaaaaaaeaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaVNbeUbeaaaebeSbesbqSbexbqKbtBaJXbrbbqfbqhbqvbqCbhXaJXbqpbpCbqeaMQbqkbqobhWbiuaJUaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaTpaaeaaaaaeaaaaXFbzWaXFbpQbqcaVgbpAaXFbzWboibojaQNaZjbwJbpwaSWbqTbdKbdFbdKbpzaSWbpPbhVbdAbdBbosbmobkVbdwboxbdCbnCbosbosbosbosaWPbosbmnbohbkVbdvbosbosbnDboAboBbnUblebbubbVbbfboNbbfbbvbbfbbfbtIaRWaRZboLboLboLbszbppbeJbdEbsyboLboLboLaRNaRLaZPaZTblKboTboUboVboWaZTclackEbaYbpaaWQbcTbeIbeObeMbkdbeRbfEbfCcocaSaaSaavAavAaTUavAavAavAcnPbjpavAavAbeFcgSavAbeAaYabeBaTmaJqaJqaJqaJqbeCaJqaJqaWRbjraZAaTmaTmbffbfebfFaaaaIZbfGaaaaaaaaeaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaVNbeUbeaaaebeSbesbqSbexbqKbtBaJXbrbbqfbqhbqvbkIbhXaJXbkBbpCaJLaMQaNkbqobhWbiuaJUaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaboibojaPBaWgaQNaULaWhaULbtybrsbcybcMaULaWhaULaZDbrrbpNbkFbkGaSWaUUaSVaTaaSVaUUaSWbcWaXraXiaSWaTeaXmaTiaSWaSWaTcaSWbqabqaaXcbaLbaNaXcbqabqabqabqabqabqabqabqgbboaLBaWJaWIaXwaSTbdsaSTaPEaWFaPGbalbaWbcvbqtbbgbqtbqtbqubajbqwboLboLbdyboLbcObdcaZTbdGaRBbqAbdqbqBbdbaZTbYgaZLaAkbqFaLabkdbkdbkdbkdbkdaTTaUkaSaaSaaSaaXzaUlaSaaVWaVVaVravAbbNbdtavAcauaTZaTXaTYaUhaUiaUbaUgarwcdlaXCarwbYWbelaJqbhcaYsaYnbduaYvaYTaYzaUjaTSaSSaSgaaeaaeaaeaaeaaeaaeaaaaaeaaaaaeaaaaaeaaaaaeaaaaaaaaaaaaaaaaaaaaeaJIaaaaVNaUmaJvaWtaWsajeaJRaIlaFUaUraUpaYKaYRaYAaYEaJXaJXaWjaWzaXdaMQaMQbePaYYaPIaJUaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaXFaZDbrsaZfaYXaZfbrsbrsbrtaQOaYbaYWaXMaXMaXMaXJaRzbryaRyaXVaRraRxaRwaRuaRtaRsaRraXnaTqaRIaUxaUxaUyaUxaUxbrSaRHaWDbqaazHaWEbrXbrYbscbqaaWwazhbqaaWwazhbqabqgaYpbRAbleaVqaRGaONbleaOWaOoaNwaVpbtIaZuaZxboLaZnaOYaXSbssbssaYQaYUaXTaYmboLaWGaWdaZTaXBbsAbsBaXbaSIbsEbsFbYaaZLaEMbqFaRkaSaazYaSdaIyazNaRUaRCaQtaSaaVYaXsaXgaTQaVUaVXbcPavAavAavAavAavAavAaRPavAaRRaRSaRTbgXbiJaRQbiJbiJbiJbgXbgXbiJbiKaRMbiNbbAbcsaIMbiRbiSbgXbgXbgXaaeaaaaaaaaaaaeaaaaaeaaaaaeaaaaacaaaaacaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaFvaOXaIlaGpaRDaFUaZKaZOaZQaTJaTKaTVaTWaUuaUAaUKaVcaWcaLIaLIaSQaFUaFUckMaFLaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaXFbwBaUMaUMbfUaUMaZyaUcaUeaUebpxaUebiebhyaZSbcaaZEbiAbacaXjaKebqqbhpbgRbhtaXeaXhbgPbgQbgWbaxbbJbltaZGaUxaYCaXlajpbqaaYwaYqbrXbrYbscbqaaYobDDbqaaYobDDbqaaWAaYpbRAblebleaYBblebleblebeXbeWaUGbleblublvblwbssbndbndbtQbtRbtSbtTbtTbcHbtVblQbmZblWbdqbtZbuaaZzbucbudaZTcgVaZLaYPbqFaRkaSabilbhYaRUaXRaRUbhZaRUbnAbeHbcPbjbbtdbtcbrZbptbyiaXUaXAbwIbiiavAbyxavAaPTaYaaXWbgXciTciXaZVaYebncbgXbnfbabbdHbkuaVRbkabtubjCbjBbcwbjPbkCbgXaaeaaeaaeaaeaaeaaeaaeaaaaacaaaaXyaaaaXqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaGqaWBaGpaaaaFUbnKboKbniaTJbfbbfJbdRbeqbfNbfXbfKaTJaFUaaaaaaaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/tgstation.2.1.3.dmm b/_maps/map_files/tgstation.2.1.3.dmm
index cbf1792af6b..5de56e758f6 100644
--- a/_maps/map_files/tgstation.2.1.3.dmm
+++ b/_maps/map_files/tgstation.2.1.3.dmm
@@ -677,7 +677,7 @@
"ana" = (/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"anb" = (/obj/structure/cable,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"anc" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/terminal,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
-"and" = (/obj/structure/rack,/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"and" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"ane" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"anf" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"ang" = (/obj/machinery/atmospherics/trinary/filter{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
@@ -719,7 +719,7 @@
"anQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"anR" = (/obj/structure/closet/wardrobe/mixed,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"anS" = (/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},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"anT" = (/obj/structure/table,/obj/item/weapon/reagent_containers/spray/pestspray{pixel_x = 3; pixel_y = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/fpmaint2)
+"anT" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/port)
"anU" = (/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/fpmaint2)
"anV" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/fpmaint2)
"anW" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
@@ -771,9 +771,9 @@
"aoQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/engineering{icon_state = "door_closed"; locked = 0; name = "Fore Starboard Solar Access"; req_access_txt = "10"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"aoR" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/auxsolarstarboard)
"aoS" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aoT" = (/obj/structure/table,/obj/item/device/t_scanner,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aoU" = (/obj/structure/closet,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aoV" = (/obj/structure/rack{dir = 1},/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/glasses/meson,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aoT" = (/obj/structure/rack{dir = 4},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/port)
+"aoU" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aoV" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aoW" = (/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aoX" = (/obj/structure/table,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = -31},/obj/item/clothing/head/cakehat,/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar)
"aoY" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
@@ -789,7 +789,7 @@
"api" = (/obj/machinery/atmospherics/pipe/simple{dir = 5; icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"apj" = (/obj/machinery/atmospherics/valve{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"apk" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"apl" = (/obj/structure/closet,/obj/item/clothing/gloves/white{color = "yellow"; desc = "The colors are a bit dodgy."; icon_state = "yellow"; item_color = "yellow"; item_state = "ygloves"; name = "insulated gloves"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"apl" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"apm" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"apn" = (/obj/machinery/power/apc{dir = 1; name = "Arrivals North Maintenance APC"; pixel_x = -1; pixel_y = 26},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"apo" = (/obj/machinery/camera{c_tag = "Fore Port Solar Access"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
@@ -825,7 +825,7 @@
"apS" = (/turf/simulated/floor/engine{name = "Holodeck Projector Floor"},/area/holodeck/alphadeck)
"apT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"apU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"apV" = (/obj/structure/table,/obj/item/stack/cable_coil{pixel_x = -3; pixel_y = 3},/obj/item/stack/cable_coil{pixel_x = -3; pixel_y = 3},/obj/item/device/assembly/igniter{pixel_x = 5; pixel_y = -4},/obj/item/device/assembly/igniter{pixel_x = 5; pixel_y = -4},/obj/effect/decal/cleanable/cobweb,/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler,/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"apV" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"apW" = (/obj/machinery/power/apc{dir = 1; name = "Bar Maintenance APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"apX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"apY" = (/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Fore Starboard Solar Access"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
@@ -834,7 +834,7 @@
"aqb" = (/obj/structure/table,/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aqc" = (/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aqd" = (/obj/machinery/status_display{density = 0; layer = 3; pixel_x = 32; pixel_y = 0},/obj/machinery/computer/slot_machine,/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar)
-"aqe" = (/obj/structure/closet,/obj/item/stack/sheet/mineral/plasma{layer = 2.9},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aqe" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"aqf" = (/turf/simulated/wall/r_wall,/area/hallway/secondary/entry)
"aqg" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/escape_pod1/station)
"aqh" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/airlock/glass{name = "Garden"},/turf/simulated/floor,/area/hallway/secondary/construction{name = "\improper Garden"})
@@ -847,8 +847,8 @@
"aqo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aqp" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aqq" = (/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/fpmaint2)
-"aqr" = (/obj/item/weapon/vending_refill/cola,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aqs" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aqr" = (/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aqs" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aqt" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/maintenance/fpmaint)
"aqu" = (/obj/structure/closet/secure_closet/detective,/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office)
"aqv" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/red,/obj/item/weapon/hand_labeler,/turf/simulated/floor/carpet,/area/security/detectives_office)
@@ -884,12 +884,12 @@
"aqZ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"ara" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"arb" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"arc" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 20},/obj/item/weapon/stock_parts/cell,/obj/item/weapon/stock_parts/cell,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"arc" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"ard" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"are" = (/obj/structure/rack,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"are" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"arf" = (/obj/structure/door_assembly/door_assembly_mai,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"arg" = (/obj/machinery/door/airlock/maintenance{name = "Firefighting equipment"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"arh" = (/obj/structure/table,/obj/item/device/assembly/timer,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"arh" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"ari" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/donut,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"arj" = (/turf/simulated/wall,/area/maintenance/electrical)
"ark" = (/turf/simulated/wall,/area/hallway/secondary/entry)
@@ -902,9 +902,9 @@
"arr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"ars" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"art" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aru" = (/obj/item/stack/cable_coil{pixel_x = -1; pixel_y = -3},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aru" = (/obj/structure/table,/obj/machinery/light/small{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"arv" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"arw" = (/obj/structure/stool,/obj/item/stack/medical/bruise_pack{amount = 1; pixel_x = 0; pixel_y = 2},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"arw" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"arx" = (/obj/effect/decal/cleanable/cobweb,/obj/structure/closet/secure_closet/chemical,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"ary" = (/obj/structure/closet/secure_closet/chemical,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"arz" = (/obj/structure/closet/secure_closet/medical1,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
@@ -942,12 +942,12 @@
"asf" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = "0"},/turf/simulated/floor/plating,/area/crew_quarters/fitness)
"asg" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = "0"},/turf/simulated/floor/plating,/area/crew_quarters/fitness)
"ash" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"asi" = (/obj/structure/table,/obj/item/weapon/shard,/obj/item/weapon/shard{icon_state = "medium"},/obj/item/weapon/shard{icon_state = "small"},/obj/item/stack/rods{amount = 50},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"asj" = (/obj/structure/rack,/obj/item/clothing/mask/gas,/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"asi" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/fpmaint2)
+"asj" = (/obj/structure/table,/obj/effect/decal/cleanable/cobweb,/obj/effect/spawner/lootdrop/maintenance{lootcount = 8; name = "8maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"ask" = (/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/fsmaint2)
"asl" = (/obj/machinery/door_control{id = "maint3"; name = "Blast Door Control C"; pixel_x = 0; pixel_y = 24; req_access_txt = "0"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"asm" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"asn" = (/obj/structure/table,/obj/item/weapon/storage/box/cups,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"asn" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aso" = (/obj/structure/table,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"asp" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"asq" = (/obj/machinery/recharge_station,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/electrical)
@@ -963,17 +963,17 @@
"asA" = (/obj/machinery/door/airlock/shuttle{name = "Escape Pod Airlock"},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod2/station)
"asB" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/escape_pod2/station)
"asC" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"asD" = (/obj/structure/rack,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"asE" = (/obj/structure/rack,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"asD" = (/obj/structure/closet,/obj/item/weapon/coin/iron,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"asE" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"asF" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"asG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"asH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"asI" = (/obj/item/weapon/airlock_painter,/obj/structure/lattice,/obj/structure/closet,/turf/space,/area/space)
"asJ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/space,/area/space)
"asK" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/space,/area/space)
-"asL" = (/obj/structure/closet,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"asL" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"asM" = (/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},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"asN" = (/obj/structure/rack{dir = 1},/obj/item/stack/rods{amount = 10},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"asN" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"asO" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"asP" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/wall,/area/security/detectives_office)
"asQ" = (/obj/structure/table/woodentable,/obj/item/device/taperecorder{pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office)
@@ -1011,7 +1011,7 @@
"atw" = (/turf/simulated/floor/plating,/area/hallway/secondary/entry)
"atx" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/hallway/secondary/entry)
"aty" = (/obj/machinery/light/small{dir = 8},/obj/machinery/camera{c_tag = "Arrivals Escape Pod 2"; dir = 1},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
-"atz" = (/obj/structure/closet,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"atz" = (/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"atA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"atB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"atC" = (/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/plating,/area/maintenance/fpmaint2)
@@ -1026,7 +1026,7 @@
"atL" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"atM" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"atN" = (/obj/machinery/door/airlock/external{req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"atO" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"atO" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"atP" = (/obj/machinery/door/airlock/maintenance{name = "Chemical Storage"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"atQ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/wall,/area/maintenance/fpmaint)
"atR" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
@@ -1076,13 +1076,13 @@
"auJ" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"auK" = (/obj/item/stack/cable_coil{amount = 5},/turf/simulated/floor/plating/airless,/area/space)
"auL" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"auM" = (/obj/structure/table,/obj/item/device/t_scanner,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"auM" = (/obj/structure/table,/obj/item/weapon/shard,/obj/item/weapon/shard{icon_state = "medium"},/obj/item/weapon/shard{icon_state = "small"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"auN" = (/obj/machinery/light/small{dir = 4},/obj/structure/stool,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"auO" = (/obj/structure/rack{dir = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"auP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"auQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"auR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"auS" = (/obj/structure/rack,/obj/item/clothing/suit/hazardvest,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"auS" = (/obj/structure/stool,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"auT" = (/obj/machinery/power/apc{dir = 1; name = "EVA Maintenance APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"auU" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"auV" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
@@ -1108,13 +1108,13 @@
"avp" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor{icon_state = "green"; dir = 4},/area/crew_quarters/fitness)
"avq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/crew_quarters/fitness)
"avr" = (/obj/structure/table,/obj/item/weapon/paper{desc = ""; info = "Brusies sustained in the holodeck can be healed simply by sleeping."; name = "Holodeck Disclaimer"},/turf/simulated/floor,/area/crew_quarters/fitness)
-"avs" = (/obj/item/stack/sheet/cardboard,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"avt" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/closet/crate,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"avu" = (/obj/structure/closet/crate,/obj/item/bodybag,/obj/item/device/radio,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"avs" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"avt" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 1; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"avu" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"avv" = (/obj/structure/girder,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"avw" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"avx" = (/obj/structure/rack,/obj/item/device/t_scanner,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"avy" = (/obj/structure/rack,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"avx" = (/obj/structure/closet,/obj/effect/landmark{name = "blobstart"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"avy" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"avz" = (/obj/machinery/door_control{id = "maint2"; name = "Blast Door Control B"; pixel_x = -28; pixel_y = 4; req_access_txt = "0"},/obj/machinery/door_control{id = "maint1"; name = "Blast Door Control A"; pixel_x = -28; pixel_y = -6; req_access_txt = "0"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"avA" = (/obj/structure/janitorialcart,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"avB" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
@@ -1194,7 +1194,7 @@
"awX" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"awY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"awZ" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"axa" = (/obj/structure/rack{dir = 1},/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/glasses/meson,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"axa" = (/obj/structure/closet,/obj/effect/decal/cleanable/cobweb,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"axb" = (/turf/simulated/wall/r_wall,/area/maintenance/fpmaint)
"axc" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"axd" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
@@ -1234,11 +1234,11 @@
"axL" = (/obj/machinery/camera{c_tag = "Fitness Room South"; dir = 1},/turf/simulated/floor{icon_state = "green"; dir = 4},/area/crew_quarters/fitness)
"axM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/crew_quarters/fitness)
"axN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/crew_quarters/fitness)
-"axO" = (/obj/structure/rack,/obj/item/stack/cable_coil{amount = 5},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"axO" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"axP" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"axQ" = (/obj/item/weapon/caution/cone,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"axQ" = (/obj/structure/rack,/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"axR" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"axS" = (/obj/item/stack/cable_coil{amount = 5},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"axS" = (/obj/structure/rack,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"axT" = (/obj/machinery/power/terminal,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/electrical)
"axU" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/electrical)
"axV" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/electrical)
@@ -1288,13 +1288,13 @@
"ayN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/crew_quarters/fitness)
"ayO" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"ayP" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"ayQ" = (/obj/structure/closet,/obj/item/device/assembly/timer,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"ayR" = (/obj/structure/closet,/obj/item/clothing/head/that{throwforce = 1; throwing = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"ayS" = (/obj/structure/closet,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"ayT" = (/obj/item/clothing/head/ushanka,/obj/item/weapon/contraband/poster,/obj/structure/closet,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"ayQ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"ayR" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"ayS" = (/obj/structure/rack{dir = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"ayT" = (/obj/effect/decal/cleanable/cobweb2,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"ayU" = (/obj/machinery/door/poddoor/preopen{id = "maint2"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"ayV" = (/obj/machinery/door/poddoor/preopen{id = "maint2"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"ayW" = (/obj/structure/closet,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"ayW" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"ayX" = (/obj/machinery/power/smes{charge = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/electrical)
"ayY" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/wall,/area/maintenance/electrical)
"ayZ" = (/obj/machinery/computer/monitor{name = "backup power monitoring console"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/electrical)
@@ -1319,7 +1319,7 @@
"azs" = (/obj/machinery/seed_extractor,/turf/simulated/floor,/area/hallway/secondary/construction{name = "\improper Garden"})
"azt" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor,/area/hallway/secondary/construction{name = "\improper Garden"})
"azu" = (/obj/structure/sink{pixel_y = 30},/turf/simulated/floor,/area/hallway/secondary/construction{name = "\improper Garden"})
-"azv" = (/obj/item/weapon/extinguisher,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"azv" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/aft)
"azw" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"azx" = (/obj/machinery/power/apc{dir = 2; name = "Primary Tool Storage APC"; pixel_x = 1; pixel_y = -24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/storage/primary)
"azy" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
@@ -1405,10 +1405,10 @@
"aBa" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aBb" = (/obj/structure/stool{pixel_y = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aBc" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 1; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aBd" = (/obj/structure/rack,/obj/item/weapon/storage/box,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aBd" = (/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/aft)
"aBe" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aBf" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aBg" = (/obj/structure/rack,/obj/item/stack/rods{amount = 10},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aBg" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft)
"aBh" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aBi" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/shuttle/arrival/station)
"aBj" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/arrival/station)
@@ -1445,7 +1445,7 @@
"aBO" = (/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "dark"},/area/gateway)
"aBP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/window{name = "Gateway Chamber"; req_access_txt = "62"},/turf/simulated/floor{icon_state = "dark"},/area/gateway)
"aBQ" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "dark"},/area/gateway)
-"aBR" = (/obj/structure/rack{dir = 1},/obj/item/weapon/extinguisher,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aBR" = (/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"aBS" = (/obj/machinery/suit_storage_unit/standard_unit,/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/ai_monitored/storage/eva)
"aBT" = (/obj/machinery/suit_storage_unit/standard_unit,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/ai_monitored/storage/eva)
"aBU" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/ai_monitored/storage/eva)
@@ -1465,12 +1465,12 @@
"aCi" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 4; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics)
"aCj" = (/obj/structure/closet/secure_closet/hydroponics,/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics)
"aCk" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics)
-"aCl" = (/obj/item/stack/rods{amount = 10},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aCl" = (/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft)
"aCm" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aCn" = (/obj/machinery/atmospherics/pipe/simple{pipe_color = "blue"; dir = 4; icon_state = "intact-b-f"; level = 1; name = "pipe"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aCo" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aCp" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aCq" = (/obj/structure/rack,/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/t_scanner,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aCq" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"aCr" = (/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{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aCs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aCt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
@@ -1538,7 +1538,7 @@
"aDD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j1s"; sortType = 18},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aDE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aDF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/wall,/area/maintenance/fsmaint2)
-"aDG" = (/obj/item/stack/rods{amount = 10},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 1; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aDG" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"aDH" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aDI" = (/obj/item/stack/sheet/metal,/turf/simulated/floor/plating/airless,/area/space)
"aDJ" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
@@ -2186,7 +2186,7 @@
"aQb" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/turf/simulated/floor{icon_state = "neutralcorner"; dir = 4},/area/hallway/secondary/entry)
"aQc" = (/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/hallway/secondary/entry)
"aQd" = (/turf/simulated/floor{icon_state = "neutralcorner"; dir = 1},/area/hallway/secondary/entry)
-"aQe" = (/obj/structure/closet,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/port)
+"aQe" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 4; name = "4maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"aQf" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/wall,/area/maintenance/port)
"aQg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port)
"aQh" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/crew_quarters/locker)
@@ -2645,7 +2645,7 @@
"aYS" = (/obj/machinery/door/airlock/command{name = "Conference Room"; req_access = null; req_access_txt = "19"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/wood,/area/bridge/meeting_room)
"aYT" = (/obj/structure/table,/obj/item/weapon/aiModule/reset,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload)
"aYU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
-"aYV" = (/obj/machinery/turret,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload)
+"aYV" = (/obj/machinery/porta_turret{ai = 1},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload)
"aYW" = (/turf/simulated/wall/r_wall,/area/crew_quarters/captain)
"aYX" = (/obj/machinery/door/airlock/command{name = "Captain's Office"; req_access = null; req_access_txt = "20"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"aYY" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/crew_quarters/captain)
@@ -2759,7 +2759,7 @@
"bbc" = (/obj/structure/table,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/turf/simulated/floor{icon_state = "arrival"; dir = 5},/area/quartermaster/office)
"bbd" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor,/area/hallway/primary/central)
"bbe" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/hallway/primary/central)
-"bbf" = (/obj/machinery/turret{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload)
+"bbf" = (/obj/machinery/porta_turret{ai = 1; dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload)
"bbg" = (/obj/machinery/recharger{pixel_y = 4},/obj/structure/table,/turf/simulated/floor/wood,/area/bridge/meeting_room)
"bbh" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/wood,/area/bridge/meeting_room)
"bbi" = (/turf/simulated/floor/carpet,/area/bridge/meeting_room)
@@ -2767,7 +2767,7 @@
"bbk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/wood,/area/bridge/meeting_room)
"bbl" = (/obj/machinery/vending/snack,/turf/simulated/floor/wood,/area/bridge/meeting_room)
"bbm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/electrical)
-"bbn" = (/obj/machinery/turret{dir = 4},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload)
+"bbn" = (/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/machinery/porta_turret{ai = 1; dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload)
"bbo" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/turf/simulated/wall/r_wall,/area/engine/gravity_generator)
"bbp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor/preopen{id = "heads_meeting"; name = "privacy shutters"},/turf/simulated/floor/plating,/area/bridge/meeting_room)
"bbq" = (/turf/simulated/floor,/area/engine/gravity_generator)
@@ -2808,7 +2808,7 @@
"bbZ" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
"bca" = (/obj/effect/landmark{name = "blobstart"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/port)
"bcb" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/port)
-"bcc" = (/obj/structure/rack{dir = 4},/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/port)
+"bcc" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/aft)
"bcd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2 (NORTH)"; icon_state = "pipe-j2"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/port)
"bce" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
"bcf" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
@@ -2993,8 +2993,8 @@
"bfC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/port)
"bfD" = (/obj/machinery/door/airlock{name = "Unit 4"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
"bfE" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
-"bfF" = (/obj/item/stack/sheet/rglass,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/port)
-"bfG" = (/obj/item/weapon/screwdriver,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
+"bfF" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft)
+"bfG" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bfH" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
"bfI" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/port)
"bfJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
@@ -3145,7 +3145,7 @@
"biy" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/disposal)
"biz" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/disposal)
"biA" = (/obj/machinery/door/airlock/maintenance{name = "Disposal Access"; req_access_txt = "12"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/disposal)
-"biB" = (/obj/structure/closet/crate,/obj/item/weapon/coin/twoheaded,/turf/simulated/floor/plating,/area/maintenance/port)
+"biB" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/port)
"biC" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/port)
"biD" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
"biE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
@@ -3174,7 +3174,7 @@
"bjb" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/central)
"bjc" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/maintenance/maintcentral)
"bjd" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/maintcentral)
-"bje" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/item/weapon/extinguisher,/turf/simulated/floor/plating,/area/maintenance/maintcentral)
+"bje" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/port)
"bjf" = (/obj/machinery/power/apc{dir = 1; name = "Bridge Maintenance APC"; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/maintcentral)
"bjg" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/closet/wardrobe/black,/turf/simulated/floor/plating,/area/maintenance/maintcentral)
"bjh" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall,/area/bridge/meeting_room)
@@ -3326,7 +3326,7 @@
"blX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor,/area/hallway/primary/central)
"blY" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/hallway/primary/central)
"blZ" = (/turf/simulated/wall/r_wall,/area/maintenance/maintcentral)
-"bma" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/emergency_oxygen,/turf/simulated/floor/plating,/area/maintenance/maintcentral)
+"bma" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/maintcentral)
"bmb" = (/turf/simulated/wall/r_wall,/area/crew_quarters/heads)
"bmc" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/crew_quarters/heads)
"bmd" = (/turf/simulated/wall,/area/crew_quarters/heads)
@@ -3533,7 +3533,7 @@
"bpW" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bpX" = (/turf/simulated/wall/r_wall,/area/toxins/telesci)
"bpY" = (/obj/structure/closet,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"bpZ" = (/obj/structure/rack,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bpZ" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/maintcentral)
"bqa" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/machinery/door/poddoor{id = "QMLoaddoor2"; name = "supply dock loading door"},/turf/simulated/floor/plating,/area/quartermaster/storage)
"bqb" = (/obj/structure/plasticflaps,/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/floor/plating,/area/quartermaster/storage)
"bqc" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/quartermaster/storage)
@@ -3804,7 +3804,7 @@
"bvh" = (/turf/simulated/floor{icon_state = "white"},/area/toxins/telesci)
"bvi" = (/obj/structure/stool/bed/chair/office/light,/obj/effect/landmark/start{name = "Scientist"},/turf/simulated/floor{icon_state = "white"},/area/toxins/telesci)
"bvj" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "white"},/area/toxins/telesci)
-"bvk" = (/obj/item/stack/rods{amount = 10},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bvk" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/port)
"bvl" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/door/poddoor{id = "QMLoaddoor"; name = "supply dock loading door"},/turf/simulated/floor/plating,/area/quartermaster/storage)
"bvm" = (/obj/structure/plasticflaps,/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/floor/plating,/area/quartermaster/storage)
"bvn" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/quartermaster/storage)
@@ -4218,7 +4218,7 @@
"bDf" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"bDg" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"})
"bDh" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
-"bDi" = (/obj/structure/rack,/obj/item/weapon/extinguisher,/obj/item/weapon/storage/belt/utility,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bDi" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/aft)
"bDj" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 32},/turf/space,/area/space)
"bDk" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen,/obj/machinery/requests_console{department = "Mining"; departmentType = 0; pixel_x = -30; pixel_y = 0},/obj/machinery/light{dir = 8},/turf/simulated/floor,/area/quartermaster/miningdock)
"bDl" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Shaft Miner"},/turf/simulated/floor,/area/quartermaster/miningdock)
@@ -4287,7 +4287,7 @@
"bEw" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "warnwhite"; dir = 1},/area/toxins/mixing)
"bEx" = (/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor{icon_state = "warnwhite"; dir = 5},/area/toxins/mixing)
"bEy" = (/turf/simulated/wall/r_wall,/area/toxins/mixing)
-"bEz" = (/obj/structure/closet/crate,/obj/item/device/multitool,/obj/item/device/multitool,/obj/item/device/assembly/prox_sensor,/obj/item/weapon/coin/silver,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bEz" = (/obj/structure/rack,/obj/effect/decal/cleanable/cobweb2,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bEA" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bEB" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/window/southleft{name = "Armory"; req_access_txt = "3"},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/ai_monitored/security/armory)
"bEC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
@@ -4387,7 +4387,7 @@
"bGs" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/mining,/obj/item/weapon/circuitboard/autolathe{pixel_x = 3; pixel_y = -3},/obj/item/weapon/circuitboard/arcade/battle,/turf/simulated/floor/plating,/area/storage/tech)
"bGt" = (/obj/structure/rack,/obj/item/weapon/circuitboard/telecomms/processor,/obj/item/weapon/circuitboard/telecomms/receiver,/obj/item/weapon/circuitboard/telecomms/server,/obj/item/weapon/circuitboard/telecomms/bus,/obj/item/weapon/circuitboard/telecomms/broadcaster,/obj/item/weapon/circuitboard/message_monitor{pixel_y = -5},/turf/simulated/floor/plating,/area/storage/tech)
"bGu" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
-"bGv" = (/turf/simulated/wall/r_wall,/area/engine/secure_construction)
+"bGv" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engine/engineering)
"bGw" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"bGx" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor,/area/janitor)
"bGy" = (/obj/structure/table,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/machinery/requests_console{department = "Janitorial"; departmentType = 1; pixel_y = -29},/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor,/area/janitor)
@@ -4466,7 +4466,7 @@
"bHT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/storage/tech)
"bHU" = (/obj/machinery/door/airlock/engineering{name = "Tech Storage"; req_access_txt = "23"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/storage/tech)
"bHV" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
-"bHW" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/engine/secure_construction)
+"bHW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/poddoor/shutters/preopen{id = "Singularity"; name = "radiation shutters"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 2; icon_state = "bot"},/area/engine/engineering)
"bHX" = (/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"bHY" = (/obj/machinery/door/airlock/maintenance{name = "Custodial Maintenance"; req_access_txt = "26"},/turf/simulated/floor/plating,/area/janitor)
"bHZ" = (/obj/machinery/power/apc{dir = 8; name = "Medbay Maintenance APC"; pixel_x = -24},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/asmaint)
@@ -4530,9 +4530,9 @@
"bJf" = (/obj/machinery/door/airlock/shuttle{name = "Mining Shuttle Airlock"; req_access_txt = "48"},/turf/simulated/shuttle/plating,/area/shuttle/mining/station)
"bJg" = (/obj/machinery/door/airlock/external{name = "Mining Dock Airlock"; req_access = null; req_access_txt = "48"},/turf/simulated/floor/plating,/area/quartermaster/miningdock)
"bJh" = (/obj/machinery/door/airlock/glass_mining{name = "Mining Dock"; req_access_txt = "48"},/turf/simulated/floor,/area/quartermaster/miningdock)
-"bJi" = (/obj/structure/table,/obj/item/device/t_scanner,/turf/simulated/floor/plating,/area/maintenance/aft)
-"bJj" = (/obj/structure/closet,/turf/simulated/floor/plating,/area/maintenance/aft)
-"bJk" = (/obj/structure/rack{dir = 1},/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/glasses/meson,/turf/simulated/floor/plating,/area/maintenance/aft)
+"bJi" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/aft)
+"bJj" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft)
+"bJk" = (/obj/structure/rack,/obj/structure/disposalpipe/segment,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bJl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/aft)
"bJm" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/robotics{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/mecha_control{pixel_x = 1; pixel_y = -1},/turf/simulated/floor,/area/storage/tech)
"bJn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/storage/tech)
@@ -4636,8 +4636,8 @@
"bLh" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
"bLi" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
"bLj" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/medical/medbay)
-"bLk" = (/obj/structure/rack{dir = 1},/obj/item/clothing/mask/gas,/obj/item/clothing/glasses/meson,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"bLl" = (/obj/structure/rack{dir = 1},/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"bLk" = (/obj/structure/disposalpipe/segment,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bLl" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bLm" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/power/apc{dir = 1; name = "CM Office APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/medical/cmo)
"bLn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bLo" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/asmaint)
@@ -4738,7 +4738,7 @@
"bNf" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/toxins/mixing)
"bNg" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bNh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"bNi" = (/obj/effect/decal/cleanable/cobweb2,/obj/item/weapon/wrench,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bNi" = (/obj/structure/table,/obj/effect/decal/cleanable/cobweb,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bNj" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plating/airless{dir = 10; icon_state = "warnplate"},/area/toxins/test_area)
"bNk" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating/airless{dir = 6; icon_state = "warnplate"},/area/toxins/test_area)
"bNl" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/shuttle/mining/station)
@@ -4767,7 +4767,7 @@
"bNI" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bNJ" = (/turf/simulated/wall/r_wall,/area/medical/virology)
"bNK" = (/turf/simulated/wall,/area/medical/virology)
-"bNL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/access_button{command = "cycle_exterior"; master_tag = "virology_airlock_control"; name = "Virology Access Button"; pixel_x = -24; pixel_y = 0; req_access_txt = "39"},/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/door/airlock/medical{autoclose = 0; frequency = 1449; icon_state = "door_locked"; id_tag = "virology_airlock_exterior"; locked = 1; name = "Virology Exterior Airlock"; req_access_txt = "39"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
+"bNL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/access_button{command = "cycle_exterior"; master_tag = "virology_airlock_control"; name = "Virology Access Button"; pixel_x = -24; pixel_y = 0; req_access_txt = "39"},/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/door/airlock/virology{autoclose = 0; frequency = 1449; icon_state = "door_locked"; id_tag = "virology_airlock_exterior"; locked = 1; name = "Virology Exterior Airlock"; req_access_txt = "39"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"bNM" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/medical/virology)
"bNN" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/medical/virology)
"bNO" = (/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/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 13},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint)
@@ -4791,9 +4791,9 @@
"bOg" = (/turf/simulated/floor{dir = 8; icon_state = "warnwhite"},/area/toxins/mixing)
"bOh" = (/turf/simulated/floor{dir = 4; icon_state = "warnwhite"},/area/toxins/mixing)
"bOi" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/camera{c_tag = "Toxins Lab East"; dir = 8; network = list("SS13","RD"); pixel_y = -22},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/toxins/mixing)
-"bOj" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/stack/cable_coil{amount = 5},/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bOj" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bOk" = (/obj/structure/closet/wardrobe/grey,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"bOl" = (/obj/structure/rack,/obj/item/weapon/extinguisher,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bOl" = (/obj/machinery/light/small{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft)
"bOm" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plating/airless{dir = 10; icon_state = "warnplate"},/area/toxins/test_area)
"bOn" = (/obj/item/device/flashlight/lamp,/turf/simulated/floor/plating/airless{dir = 2; icon_state = "warnplate"},/area/toxins/test_area)
"bOo" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plating/airless{dir = 6; icon_state = "warnplate"},/area/toxins/test_area)
@@ -4914,7 +4914,7 @@
"bQz" = (/obj/effect/decal/cleanable/oil,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bQA" = (/obj/structure/closet/emcloset,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/aft)
"bQB" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plating,/area/maintenance/aft)
-"bQC" = (/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/maintenance/aft)
+"bQC" = (/obj/structure/rack,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bQD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/aft)
"bQE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/aft)
"bQF" = (/obj/item/weapon/table_parts,/turf/simulated/floor/plating,/area/construction)
@@ -4974,8 +4974,8 @@
"bRH" = (/turf/simulated/wall/r_wall,/area/toxins/misc_lab)
"bRI" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/rack,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bRJ" = (/turf/simulated/wall,/area/space)
-"bRK" = (/obj/structure/rack,/obj/item/weapon/screwdriver{pixel_y = 16},/obj/item/weapon/hand_labeler,/turf/simulated/floor/plating,/area/maintenance/aft)
-"bRL" = (/obj/item/weapon/book/manual/wiki/engineering_hacking{pixel_x = 4; pixel_y = 5},/obj/item/weapon/book/manual/wiki/engineering_construction{pixel_x = 0; pixel_y = 3},/obj/item/weapon/stock_parts/cell,/turf/simulated/floor/plating,/area/maintenance/aft)
+"bRK" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft)
+"bRL" = (/obj/structure/closet,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bRM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/aft)
"bRN" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/aft)
"bRO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Construction Area Maintenance"; req_access_txt = "32"},/turf/simulated/floor/plating,/area/construction)
@@ -5007,13 +5007,13 @@
"bSo" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple{pipe_color = "green"; dir = 4; icon_state = "intact-g"; level = 2},/turf/space,/area/space)
"bSp" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1441; icon_state = "on"; id = "waste_in"; on = 1; pixel_y = 1},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos)
"bSq" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"bSr" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/light/small,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/secure_construction)
+"bSr" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engineering)
"bSs" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
-"bSt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only{dir = 2; name = "hazard door south"},/obj/machinery/door/airlock/medical{autoclose = 0; frequency = 1449; icon_state = "door_locked"; id_tag = "virology_airlock_interior"; locked = 1; name = "Virology Interior Airlock"; req_access_txt = "39"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
+"bSt" = (/obj/machinery/door/firedoor/border_only{dir = 2; name = "hazard door south"},/obj/machinery/door/airlock/glass_virology{name = "Monkey Pen"; req_access_txt = "39"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"bSu" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/medical/virology)
"bSv" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/virology)
"bSw" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/medical/virology)
-"bSx" = (/obj/machinery/door/firedoor/border_only{dir = 2; name = "hazard door south"},/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Monkey Pen"; req_access_txt = "39"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
+"bSx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only{dir = 2; name = "hazard door south"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/virology{autoclose = 0; frequency = 1449; icon_state = "door_locked"; id_tag = "virology_airlock_interior"; locked = 1; name = "Virology Interior Airlock"; req_access_txt = "39"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"bSy" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/medical/virology)
"bSz" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/medical/virology)
"bSA" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/wall/r_wall,/area/medical/virology)
@@ -5036,12 +5036,12 @@
"bSR" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{dir = 8; icon_state = "freezer_0"},/turf/simulated/floor/engine,/area/toxins/misc_lab)
"bSS" = (/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},/turf/simulated/floor/plating,/area/toxins/misc_lab)
"bST" = (/obj/machinery/magnetic_module,/obj/effect/landmark{name = "blobstart"},/obj/structure/target_stake,/turf/simulated/floor{dir = 2; icon_state = "bot"},/area/toxins/misc_lab)
-"bSU" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/closet,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bSU" = (/obj/structure/disposalpipe/segment,/obj/structure/rack{dir = 1},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bSV" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bSW" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/asmaint2)
-"bSX" = (/obj/structure/rack,/obj/item/stack/cable_coil{pixel_x = -1; pixel_y = -3},/obj/item/weapon/wrench,/turf/simulated/floor/plating,/area/maintenance/aft)
+"bSX" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/sign/securearea{pixel_y = 32},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bSY" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/aft)
-"bSZ" = (/obj/structure/rack,/obj/item/stack/rods{amount = 23},/turf/simulated/floor/plating,/area/maintenance/aft)
+"bSZ" = (/obj/machinery/light/small,/obj/structure/table,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bTa" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/aft)
"bTb" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/aft)
"bTc" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plating,/area/construction)
@@ -5066,7 +5066,7 @@
"bTv" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "cyan"; dir = 4; icon_state = "manifold-c"; initialize_directions = 11; level = 2},/turf/simulated/floor/plating,/area/atmos)
"bTw" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"bTx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
-"bTy" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "hazard door east"},/obj/machinery/door/airlock/medical{name = "Break Room"; req_access_txt = "39"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
+"bTy" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "hazard door east"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/airlock/virology{name = "Break Room"; req_access_txt = "39"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"bTz" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"bTA" = (/obj/machinery/embedded_controller/radio/access_controller{exterior_door_tag = "virology_airlock_exterior"; id_tag = "virology_airlock_control"; interior_door_tag = "virology_airlock_interior"; name = "Virology Access Console"; pixel_x = 8; pixel_y = 22},/obj/machinery/light_switch{pixel_x = -4; pixel_y = 24},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (NORTH)"; icon_state = "manifold-b-f"; dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"bTB" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
@@ -5186,9 +5186,9 @@
"bVL" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"bVM" = (/obj/machinery/computer/pandemic,/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/medical/virology)
"bVN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/medical/virology)
-"bVO" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Isolation A"; req_access_txt = "39"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
+"bVO" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/glass_virology{name = "Isolation A"; req_access_txt = "39"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"bVP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/medical/virology)
-"bVQ" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Isolation B"; req_access_txt = "39"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
+"bVQ" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/glass_virology{name = "Isolation B"; req_access_txt = "39"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"bVR" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall,/area/toxins/xenobiology)
"bVS" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
"bVT" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
@@ -5214,7 +5214,7 @@
"bWn" = (/turf/simulated/wall/r_wall,/area/tcommsat/server)
"bWo" = (/turf/simulated/wall/r_wall,/area/tcommsat/computer)
"bWp" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/tcommsat/computer)
-"bWq" = (/obj/structure/rack{dir = 1},/obj/item/device/flashlight,/turf/simulated/floor/plating,/area/maintenance/aft)
+"bWq" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bWr" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
"bWs" = (/obj/machinery/atmospherics/pipe/simple{pipe_color = "cyan"; dir = 9; icon_state = "intact-c"; level = 2},/turf/simulated/wall/r_wall,/area/atmos)
"bWt" = (/obj/machinery/camera{c_tag = "Atmospherics Access"; dir = 4; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/light{dir = 8},/turf/simulated/floor{dir = 8; icon_state = "caution"},/area/atmos)
@@ -5285,7 +5285,7 @@
"bXG" = (/obj/machinery/light{dir = 4},/turf/simulated/floor,/area/atmos)
"bXH" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bXI" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"bXJ" = (/obj/structure/closet/crate,/obj/item/weapon/crowbar/red,/obj/item/weapon/pen,/obj/item/device/flashlight/pen{pixel_x = 4; pixel_y = 3},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"bXJ" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bXK" = (/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bXL" = (/obj/structure/table,/obj/item/device/radio/intercom{pixel_x = -25},/obj/machinery/light{dir = 8},/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/syringes,/turf/simulated/floor{dir = 8; icon_state = "whitegreen"},/area/medical/virology)
"bXM" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/effect/landmark/start{name = "Virologist"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
@@ -5306,7 +5306,7 @@
"bYb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/toxins/misc_lab)
"bYc" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "floorgrime"},/area/toxins/misc_lab)
"bYd" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/toxins/misc_lab)
-"bYe" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/engine/engineering)
+"bYe" = (/obj/effect/landmark/start{name = "Station Engineer"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/engine/engineering)
"bYf" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/toxins/misc_lab)
"bYg" = (/obj/structure/table/reinforced,/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 8; icon_state = "rightsecure"; name = "Armory Desk"; req_access_txt = "3"},/obj/machinery/door/window/eastleft{name = "Reception Desk"; req_access_txt = "1"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/ai_monitored/security/armory)
"bYh" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/toxins/misc_lab)
@@ -5418,7 +5418,7 @@
"caj" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/toxins/misc_lab)
"cak" = (/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/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/toxins/misc_lab)
"cal" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor,/area/toxins/misc_lab)
-"cam" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 1; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/engine/engineering)
+"cam" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engine/engineering)
"can" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cao" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/incinerator)
"cap" = (/obj/machinery/power/apc{dir = 4; name = "Labor Camp Security APC"; pixel_x = 24; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple,/obj/machinery/camera{c_tag = "Labor Camp Monitoring"; network = list("Labor")},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/mine/laborcamp/security)
@@ -5452,13 +5452,13 @@
"caR" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1441; icon_state = "on"; id = "tox_in"; on = 1; pixel_y = 1},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos)
"caS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"caT" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"caU" = (/obj/item/weapon/paper/crumpled,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"caU" = (/obj/structure/rack{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"caV" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/medical/virology)
-"caW" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plating,/area/engine/secure_construction)
-"caX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plating,/area/engine/secure_construction)
-"caY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/engine/secure_construction)
+"caW" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = -32; pixel_y = 0},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engine/engineering)
+"caX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engine/engineering)
+"caY" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/engine/engineering)
"caZ" = (/obj/structure/closet/emcloset,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cba" = (/obj/structure/rack{dir = 1},/obj/item/device/flashlight,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cba" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cbb" = (/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/toxins/xenobiology)
"cbc" = (/obj/structure/window/reinforced,/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio6"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/toxins/xenobiology)
"cbd" = (/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 = "xenobio6"; name = "containment blast door"},/turf/simulated/floor/engine,/area/toxins/xenobiology)
@@ -5472,7 +5472,7 @@
"cbl" = (/obj/structure/stool,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cbm" = (/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/asmaint2)
"cbn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cbo" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/wrench,/turf/simulated/floor/plating,/area/maintenance/aft)
+"cbo" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cbp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/aft)
"cbq" = (/obj/structure/lattice,/obj/item/weapon/shard{icon_state = "medium"},/turf/space,/area/space)
"cbr" = (/obj/item/stack/rods,/obj/structure/lattice,/turf/space,/area/space)
@@ -5497,13 +5497,13 @@
"cbK" = (/obj/machinery/atmospherics/pipe/manifold{dir = 8; icon_state = "manifold"; level = 2},/obj/structure/stool,/turf/simulated/floor,/area/atmos)
"cbL" = (/obj/machinery/atmospherics/unary/heat_reservoir/heater{dir = 8; icon_state = "freezer_0"},/turf/simulated/floor,/area/atmos)
"cbM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cbN" = (/obj/structure/rack,/obj/item/weapon/tank/emergency_oxygen,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cbO" = (/obj/item/stack/rods{amount = 10},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cbN" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft)
+"cbO" = (/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cbP" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cbQ" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cbR" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/status_display{density = 0; layer = 3; pixel_x = 0; pixel_y = 32},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod4/station)
-"cbS" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/item/apc_frame,/turf/simulated/floor/plating,/area/engine/secure_construction)
-"cbT" = (/obj/structure/table,/obj/item/weapon/pen/blue,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -35},/turf/simulated/floor,/area/engine/secure_construction)
+"cbS" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/engine/engineering)
+"cbT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/poddoor/shutters/preopen{id = "Singularity"; name = "radiation shutters"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 2; icon_state = "bot"},/area/engine/engineering)
"cbU" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cbV" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cbW" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint)
@@ -5517,12 +5517,12 @@
"cce" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/toxins/misc_lab)
"ccf" = (/obj/machinery/power/apc{dir = 4; name = "Testing Lab APC"; pixel_x = 26; pixel_y = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "floorgrime"},/area/toxins/misc_lab)
"ccg" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor,/area/toxins/misc_lab)
-"cch" = (/obj/structure/closet,/obj/item/weapon/storage/box/lights/mixed,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cch" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cci" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/asmaint2)
"ccj" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cck" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"ccl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"ccm" = (/obj/structure/closet,/obj/item/weapon/storage/box,/turf/simulated/floor/plating,/area/maintenance/aft)
+"ccm" = (/obj/structure/rack{dir = 1},/obj/machinery/light/small{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"ccn" = (/obj/item/weapon/shard,/obj/structure/lattice,/turf/space,/area/space)
"cco" = (/obj/structure/lattice,/obj/structure/disposalpipe/segment{dir = 4},/turf/space,/area/space)
"ccp" = (/obj/machinery/camera{c_tag = "Telecoms Server Room"; dir = 4; network = list("SS13")},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server)
@@ -5550,7 +5550,7 @@
"ccL" = (/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos)
"ccM" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"ccN" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"ccO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/engine/secure_construction)
+"ccO" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/engine/engineering)
"ccP" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"ccQ" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"ccR" = (/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,/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/toxins/xenobiology)
@@ -5563,15 +5563,15 @@
"ccY" = (/obj/structure/closet/crate,/obj/item/target,/obj/item/target,/obj/item/target,/turf/simulated/floor,/area/toxins/misc_lab)
"ccZ" = (/obj/structure/closet/crate,/obj/item/target/alien,/obj/item/target/alien,/obj/item/target/alien,/turf/simulated/floor,/area/toxins/misc_lab)
"cda" = (/obj/structure/closet/crate,/obj/item/target/syndicate,/obj/item/target/syndicate,/obj/item/target/syndicate,/turf/simulated/floor,/area/toxins/misc_lab)
-"cdb" = (/obj/structure/rack,/obj/item/weapon/extinguisher,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cdb" = (/obj/effect/decal/cleanable/cobweb2,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cdc" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/port)
"cdd" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating/airless,/area/solar/port)
"cde" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/port)
"cdf" = (/obj/structure/table,/obj/item/weapon/storage/fancy/cigarettes,/turf/simulated/floor/plating,/area/maintenance/aft)
"cdg" = (/obj/structure/stool,/turf/simulated/floor/plating,/area/maintenance/aft)
"cdh" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/aft)
-"cdi" = (/obj/machinery/light/small{dir = 1},/obj/item/weapon/extinguisher,/turf/simulated/floor/plating,/area/maintenance/aft)
-"cdj" = (/obj/item/stack/rods{amount = 10},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cdi" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Uplink Management Control"; req_access_txt = "151"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership)
+"cdj" = (/obj/machinery/door_control{id = "nukeop_ready"; name = "mission launch control"; pixel_x = -26; pixel_y = 0; req_access_txt = "151"},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"cdk" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/aft)
"cdl" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/security/prison)
"cdm" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/aft)
@@ -5616,8 +5616,8 @@
"cdZ" = (/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor{dir = 2; icon_state = "bot"},/area/toxins/misc_lab)
"cea" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "floorgrime"},/area/toxins/misc_lab)
"ceb" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "floorgrime"},/area/toxins/misc_lab)
-"cec" = (/obj/item/stack/rods{amount = 10},/obj/structure/table,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"ced" = (/obj/structure/table,/obj/item/weapon/weldingtool,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cec" = (/turf/simulated/wall/mineral/clown,/area/space)
+"ced" = (/obj/machinery/door/airlock/clown,/turf/simulated/floor/mineral/bananium/airless,/area/space)
"cee" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/solar/port)
"cef" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/aft)
"ceg" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/aft)
@@ -5663,14 +5663,14 @@
"ceU" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"ceV" = (/obj/structure/disposalpipe/segment,/obj/structure/lattice,/turf/space,/area/space)
"ceW" = (/obj/structure/closet/emcloset,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"ceX" = (/obj/structure/rack,/obj/item/clothing/mask/gas,/obj/item/clothing/glasses/meson,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"ceX" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/item/weapon/ore/clown,/turf/simulated/floor/mineral/bananium/airless,/area/space)
"ceY" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"ceZ" = (/obj/machinery/atmospherics/pipe/tank/air,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cfa" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor{dir = 2; icon_state = "bot"},/area/toxins/misc_lab)
"cfb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/toxins/misc_lab)
"cfc" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Research Division Delivery"; req_access_txt = "47"},/turf/simulated/floor{icon_state = "delivery"},/area/toxins/misc_lab)
"cfd" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "Research Division"},/obj/structure/plasticflaps{opacity = 1},/turf/simulated/floor{icon_state = "bot"},/area/toxins/misc_lab)
-"cfe" = (/obj/structure/closet,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cfe" = (/turf/simulated/floor/mineral/bananium/airless,/area/space)
"cff" = (/obj/structure/table,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cfg" = (/obj/machinery/telecomms/server/presets/service,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server)
"cfh" = (/obj/machinery/telecomms/processor/preset_two,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server)
@@ -5703,7 +5703,7 @@
"cfI" = (/obj/machinery/door/airlock/external{req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cfJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/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},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cfK" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/maintenance/asmaint)
-"cfL" = (/obj/structure/disposalpipe/segment,/obj/structure/rack{dir = 1},/obj/item/clothing/mask/gas,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cfL" = (/obj/structure/shuttle/engine/heater{color = "#FFFF00"; dir = 4; icon_state = "heater"},/obj/structure/window/reinforced{color = "#FFFF00"; dir = 8},/turf/simulated/floor/plating/airless{color = "#FFFF00"},/area/space)
"cfM" = (/obj/structure/disposalpipe/segment,/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cfN" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/closet/l3closet/general,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cfO" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
@@ -5714,7 +5714,7 @@
"cfT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/toxins/misc_lab)
"cfU" = (/obj/item/stack/sheet/cardboard,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cfV" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cfW" = (/obj/structure/closet,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/device/assembly/timer,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cfW" = (/obj/structure/shuttle/engine/propulsion{color = "#FFFF00"; dir = 8; icon_state = "propulsion_l"},/turf/space,/area/space)
"cfX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cfY" = (/obj/machinery/light/small,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cfZ" = (/obj/machinery/door/airlock/external{req_access_txt = "13"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
@@ -5753,7 +5753,7 @@
"cgG" = (/obj/machinery/door/airlock/maintenance{name = "Air Supply Maintenance"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cgH" = (/obj/machinery/door/airlock/maintenance{name = "Testing Lab Maintenance"; req_access_txt = "47"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/toxins/misc_lab)
"cgI" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/toxins/misc_lab)
-"cgJ" = (/obj/item/weapon/gun/projectile/revolver/russian,/obj/structure/closet,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cgJ" = (/obj/effect/landmark/corpse/clown,/turf/simulated/floor/mineral/bananium/airless,/area/space)
"cgK" = (/obj/structure/closet,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cgL" = (/obj/machinery/door/airlock/maintenance{name = "Firefighting equipment"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cgM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar)
@@ -5802,7 +5802,7 @@
"chD" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"chE" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/maintenance/asmaint2)
"chF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"chG" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/sign/securearea{pixel_y = 32},/obj/item/stack/cable_coil{amount = 5},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"chG" = (/obj/structure/closet/crate,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/turf/simulated/floor/mineral/bananium/airless,/area/space)
"chH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"chI" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/rack{dir = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"chJ" = (/obj/machinery/door/airlock/maintenance{name = "Research Delivery access"; req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
@@ -5860,11 +5860,11 @@
"ciJ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"ciK" = (/obj/structure/reagent_dispensers/watertank,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"ciL" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 1},/obj/structure/window/reinforced/tinted,/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"ciM" = (/obj/structure/rack{dir = 1},/obj/item/device/flashlight,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"ciM" = (/obj/item/weapon/ore/clown,/turf/simulated/floor/mineral/bananium/airless,/area/space)
"ciN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"ciO" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"ciP" = (/obj/structure/table,/obj/item/device/t_scanner,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"ciQ" = (/obj/structure/rack{dir = 1},/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/glasses/meson,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"ciP" = (/obj/item/weapon/paper{info = "The call has gone out! Our ancestral home has been rediscovered! Not a small patch of land, but a true clown nation, a true Clown Planet! We're on our way home at last!"},/turf/simulated/floor/mineral/bananium/airless,/area/space)
+"ciQ" = (/obj/effect/landmark/corpse/clown{name = "Clown Pilot"},/turf/simulated/floor/mineral/bananium/airless,/area/space)
"ciR" = (/obj/machinery/power/tracker,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area/solar/port)
"ciS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating/airless,/area/solar/port)
"ciT" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/solar/port)
@@ -5879,7 +5879,7 @@
"cjc" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/structure/reagent_dispensers/peppertank{pixel_x = 30; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "red"; dir = 6},/area/security/checkpoint/engineering)
"cjd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/aft)
"cje" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/aft)
-"cjf" = (/obj/item/stack/cable_coil{amount = 5},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cjf" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/mineral/bananium/airless,/area/space)
"cjg" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/aft)
"cjh" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/aft)
"cji" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft)
@@ -5890,11 +5890,11 @@
"cjn" = (/obj/machinery/shieldgen,/turf/simulated/floor/plating,/area/engine/engineering)
"cjo" = (/obj/machinery/the_singularitygen{anchored = 0},/turf/simulated/floor/plating,/area/engine/engineering)
"cjp" = (/obj/machinery/power/apc{cell_type = 15000; dir = 1; name = "Engineering APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor{icon_state = "yellow"},/area/engine/engineering)
-"cjq" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/obj/machinery/light{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/power/port_gen/pacman,/turf/simulated/floor{icon_state = "yellow"},/area/engine/engineering)
-"cjr" = (/obj/machinery/power/smes,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/engine/engine_smes)
-"cjs" = (/obj/machinery/power/smes,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engine_smes)
-"cjt" = (/obj/machinery/power/smes,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/engine/engine_smes)
-"cju" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "yellow"},/area/engine/engineering)
+"cjq" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/engine/engineering)
+"cjr" = (/turf/simulated/floor,/area/engine/engine_smes)
+"cjs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engine_smes)
+"cjt" = (/turf/simulated/wall/r_wall,/area/engine/engine_smes)
+"cju" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/engine/engineering)
"cjv" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{icon_state = "yellow"},/area/engine/engineering)
"cjw" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/engine/engineering)
"cjx" = (/obj/machinery/computer/station_alert,/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor,/area/engine/engineering)
@@ -5915,9 +5915,9 @@
"cjM" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cjN" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cjO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cjP" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/item/weapon/wrench,/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cjP" = (/obj/item/weapon/shard,/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/mineral/bananium/airless,/area/space)
"cjQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/engine/engineering)
-"cjR" = (/obj/structure/table,/obj/item/clothing/head/welding{pixel_x = -3; pixel_y = 5},/obj/item/weapon/weldingtool,/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cjR" = (/obj/structure/grille{color = "#FFFF00"},/obj/structure/window/reinforced{color = "#FFFF00"},/obj/structure/window/reinforced{color = "#FFFF00"; dir = 4},/obj/structure/window/reinforced{color = "#FFFF00"; dir = 8},/turf/simulated/floor/plating/airless{color = "#FFFF00"},/area/space)
"cjS" = (/obj/structure/rack,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cjT" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cjU" = (/obj/machinery/power/apc{dir = 8; name = "Science Maintenance APC"; pixel_x = -25},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/camera{c_tag = "Aft Starboard Solar Access"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
@@ -5928,7 +5928,7 @@
"cjZ" = (/turf/simulated/floor/plating,/area/maintenance/portsolar)
"cka" = (/obj/machinery/power/apc{dir = 4; name = "Aft Port Solar APC"; pixel_x = 23; pixel_y = 2},/obj/machinery/camera{c_tag = "Aft Port Solar Control"; dir = 1},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/portsolar)
"ckb" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/atmos)
-"ckc" = (/obj/structure/closet/crate,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/aft)
+"ckc" = (/obj/item/weapon/pickaxe,/turf/simulated/floor/mineral/bananium/airless,/area/space)
"ckd" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/aft)
"cke" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/aft)
"ckf" = (/obj/structure/closet/crate,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/rods{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/stack/sheet/mineral/plasma{amount = 30},/turf/simulated/floor/plating,/area/engine/engineering)
@@ -5936,12 +5936,12 @@
"ckh" = (/turf/simulated/floor/plating,/area/engine/engineering)
"cki" = (/obj/machinery/door/poddoor{id = "Secure Storage"; name = "secure storage"},/turf/simulated/floor/plating,/area/engine/engineering)
"ckj" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/engine/engineering)
-"ckk" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "warningcorner"; dir = 8},/area/engine/engineering)
-"ckl" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/engineering)
-"ckm" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/engineering)
-"ckn" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/engineering)
+"ckk" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/engine/engineering)
+"ckl" = (/obj/structure/table,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -35},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/engine/engine_smes)
+"ckm" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor{icon_state = "warning"},/area/engine/engine_smes)
+"ckn" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "SMES room APC"; pixel_y = -24},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/engine/engine_smes)
"cko" = (/obj/machinery/suit_storage_unit/engine,/turf/simulated/floor,/area/engine/engineering)
-"ckp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/engine/engineering)
+"ckp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor,/area/engine/engineering)
"ckq" = (/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,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/engine/engineering)
"ckr" = (/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,/area/engine/engineering)
"cks" = (/obj/structure/dispenser,/turf/simulated/floor,/area/engine/engineering)
@@ -5950,13 +5950,14 @@
"ckv" = (/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,/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ckw" = (/obj/structure/table/reinforced,/obj/item/stack/medical/bruise_pack{pixel_x = -3; pixel_y = 2},/obj/item/weapon/reagent_containers/pill/kelotane{pixel_x = -3; pixel_y = -8},/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{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ckx" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/closet/radiation,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/engine/engineering)
+"cky" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor,/area/engine/engineering)
"ckz" = (/obj/machinery/atmospherics/pipe/simple,/obj/structure/grille,/obj/machinery/meter,/turf/simulated/wall/r_wall,/area/atmos)
"ckA" = (/obj/machinery/atmospherics/pipe/simple,/obj/structure/grille,/obj/machinery/meter{frequency = 1443; id = "mair_in_meter"; name = "Mixed Air Tank In"},/turf/simulated/wall/r_wall,/area/atmos)
"ckB" = (/obj/machinery/atmospherics/pipe/simple,/obj/structure/grille,/obj/machinery/meter{frequency = 1443; id = "mair_out_meter"; name = "Mixed Air Tank Out"},/turf/simulated/wall/r_wall,/area/atmos)
"ckC" = (/obj/machinery/atmospherics/binary/pump{dir = 2; icon_state = "intact_on"; name = "Waste Out"; on = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"ckD" = (/obj/structure/transit_tube{icon_state = "N-S"},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/engine/engineering)
"ckE" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"ckF" = (/obj/structure/rack,/obj/item/stack/cable_coil{amount = 5},/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"ckF" = (/obj/structure/closet/crate,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/turf/simulated/floor/mineral/bananium/airless,/area/space)
"ckG" = (/turf/simulated/wall/r_wall,/area/maintenance/starboardsolar)
"ckH" = (/obj/machinery/door/airlock/engineering{name = "Aft Starboard Solar Access"; req_access_txt = "10"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
"ckI" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/starboardsolar)
@@ -5969,8 +5970,8 @@
"ckP" = (/obj/machinery/portable_atmospherics/canister/toxins,/obj/machinery/light/small{dir = 8},/obj/machinery/camera{c_tag = "Engineering Secure Storage"; dir = 4; network = list("SS13")},/turf/simulated/floor/plating,/area/engine/engineering)
"ckQ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engine/engineering)
"ckR" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering)
-"ckS" = (/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,/area/engine/engineering)
-"ckT" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_engineering{name = "Power Storage"; req_access_txt = "11"; req_one_access_txt = "0"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/engine/engineering)
+"ckS" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/engine/engineering)
+"ckT" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 1; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/engine/engineering)
"ckU" = (/turf/simulated/floor,/area/engine/engineering)
"ckV" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engineering)
"ckW" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
@@ -5991,24 +5992,24 @@
"cll" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; external_pressure_bound = 0; frequency = 1443; icon_state = "in"; id_tag = "air_out"; internal_pressure_bound = 2000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos)
"clm" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cln" = (/obj/structure/transit_tube{tag = "icon-N-SE"; icon_state = "N-SE"},/turf/space,/area/space)
-"clo" = (/obj/structure/rack,/obj/item/weapon/weldingtool,/obj/item/weapon/screwdriver{pixel_y = 16},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"clo" = (/obj/structure/closet/crate,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/clothing/shoes/clown_shoes{desc = "These shoes appear var-edited!."; name = "uhangi's shoes"; slowdown = -1},/turf/simulated/floor/mineral/bananium/airless,/area/space)
"clp" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"clq" = (/obj/machinery/power/apc{dir = 8; name = "Aft Starboard Solar APC"; pixel_x = -26; pixel_y = 3},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
"clr" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
"cls" = (/obj/machinery/power/smes{charge = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
"clt" = (/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator)
-"clu" = (/obj/structure/cable,/turf/simulated/floor/plating,/area/engine/secure_construction)
+"clu" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes)
"clv" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor,/area/engine/engineering)
"clw" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor,/area/engine/engineering)
"clx" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/airlock/command{name = "MiniSat Access"; req_access_txt = "65"},/turf/simulated/floor,/area/engine/engineering)
"cly" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/engine/gravity_generator)
-"clz" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating,/area/maintenance/aft)
+"clz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes)
"clA" = (/obj/machinery/field/generator,/turf/simulated/floor/plating,/area/engine/engineering)
"clB" = (/obj/machinery/power/emitter,/turf/simulated/floor/plating,/area/engine/engineering)
"clC" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engine/engineering)
"clD" = (/obj/structure/table,/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/obj/item/weapon/module/power_control,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor,/area/engine/engineering)
-"clE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/table,/obj/item/weapon/book/manual/engineering_singularity_safety,/obj/item/clothing/gloves/yellow,/turf/simulated/floor,/area/engine/engineering)
-"clF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor,/area/engine/engineering)
+"clE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes)
+"clF" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes)
"clG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 1; icon_state = "yellow"},/area/engine/engineering)
"clH" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{dir = 4; icon_state = "yellowcorner"},/area/engine/engineering)
"clI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 1; icon_state = "yellow"},/area/engine/engineering)
@@ -6035,28 +6036,28 @@
"cmd" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cme" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cmf" = (/obj/structure/transit_tube{icon_state = "D-SW"},/obj/structure/lattice,/turf/space,/area/space)
-"cmg" = (/obj/structure/rack,/obj/item/stack/cable_coil{pixel_x = -1; pixel_y = -3},/obj/item/stack/cable_coil,/obj/item/weapon/wirecutters,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cmg" = (/obj/machinery/computer/syndicate_station/recall,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"cmh" = (/obj/structure/table,/obj/machinery/cell_charger,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cmi" = (/obj/structure/stool,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/camera{c_tag = "Aft Starboard Solar Control"; dir = 4; network = list("SS13")},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
"cmj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
"cmk" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
-"cml" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/stack/rods{amount = 10},/turf/simulated/floor/plating,/area/maintenance/aft)
-"cmm" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/engine/secure_construction)
-"cmn" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 4},/area/engine/secure_construction)
-"cmo" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/secure_construction)
-"cmp" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor{icon_state = "vault"; dir = 1},/area/engine/secure_construction)
+"cml" = (/obj/machinery/porta_turret{ai = 1; dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
+"cmm" = (/obj/structure/table,/obj/item/weapon/book/manual/engineering_singularity_safety,/obj/item/clothing/gloves/yellow,/turf/simulated/floor,/area/engine/engineering)
+"cmn" = (/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/engine_smes)
+"cmo" = (/obj/machinery/power/smes,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "vault"; dir = 1},/area/engine/engine_smes)
+"cmp" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes)
"cmq" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/engine/gravity_generator)
-"cmr" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/aft)
-"cms" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 1; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/aft)
-"cmt" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cmr" = (/obj/machinery/power/smes,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor{icon_state = "vault"; dir = 4},/area/engine/engine_smes)
+"cms" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes)
+"cmt" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/engine/engineering)
"cmu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall,/area/engine/engineering)
"cmv" = (/turf/simulated/wall,/area/engine/engineering)
-"cmw" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/engine/engineering)
+"cmw" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_engineering{name = "Power Storage"; req_access_txt = "11"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/engine/engineering)
"cmx" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/engine/engineering)
-"cmy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/engine/engineering)
+"cmy" = (/obj/machinery/vending/engivend,/turf/simulated/floor{dir = 1; icon_state = "yellow"},/area/engine/engineering)
"cmz" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering)
"cmA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/engine/engineering)
-"cmB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/engine/engineering)
+"cmB" = (/obj/machinery/vending/tool,/turf/simulated/floor{dir = 1; icon_state = "yellowcorner"},/area/engine/engineering)
"cmC" = (/obj/structure/table,/obj/item/weapon/crowbar,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor{dir = 9; icon_state = "yellow"},/area/engine/engineering)
"cmD" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/belt/utility,/obj/item/weapon/wrench,/obj/item/weapon/weldingtool,/obj/item/clothing/head/welding{pixel_x = -3; pixel_y = 5},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 1; icon_state = "yellow"},/area/engine/engineering)
"cmE" = (/turf/simulated/floor{dir = 1; icon_state = "yellowcorner"},/area/engine/engineering)
@@ -6070,25 +6071,25 @@
"cmM" = (/obj/machinery/light/small,/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos)
"cmN" = (/obj/machinery/atmospherics/pipe/vent{dir = 1},/turf/simulated/floor/plating/airless,/area/space)
"cmO" = (/obj/machinery/light/small{dir = 4},/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cmP" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/engine/secure_construction)
+"cmP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes)
"cmQ" = (/obj/structure/closet/toolcloset,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cmR" = (/obj/machinery/power/solar_control{id = "starboardsolar"; name = "Aft Starboard Solar Control"; track = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
"cmS" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
"cmT" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
-"cmU" = (/turf/simulated/floor{icon_state = "dark"},/area/engine/secure_construction)
-"cmV" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/secure_construction)
+"cmU" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/wall/r_wall,/area/engine/engine_smes)
+"cmV" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/engine/engine_smes)
"cmW" = (/obj/machinery/gravity_generator/main/station,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/gravity_generator)
-"cmX" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/light{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/engine/secure_construction)
-"cmY" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/secure_construction)
-"cmZ" = (/obj/structure/closet,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/aft)
-"cna" = (/obj/structure/closet,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/aft)
+"cmX" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engine_smes)
+"cmY" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/engine/engine_smes)
+"cmZ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 7; on = 1},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes)
+"cna" = (/obj/machinery/light,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "warning"},/area/engine/engine_smes)
"cnb" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=2"; freq = 1400; location = "Engineering"},/obj/structure/plasticflaps{opacity = 1},/turf/simulated/floor{icon_state = "bot"},/area/engine/engineering)
"cnc" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = -32; pixel_y = 0},/obj/structure/disposalpipe/segment,/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/aft)
"cnd" = (/obj/structure/closet/secure_closet/engineering_welding,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 9; icon_state = "yellow"},/area/engine/engineering)
"cne" = (/obj/structure/closet/secure_closet/engineering_electrical,/turf/simulated/floor{dir = 1; icon_state = "yellow"},/area/engine/engineering)
-"cnf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/vending/engivend,/turf/simulated/floor{dir = 1; icon_state = "yellow"},/area/engine/engineering)
-"cng" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/vending/tool,/turf/simulated/floor{dir = 1; icon_state = "yellowcorner"},/area/engine/engineering)
-"cnh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/computer/security/telescreen{desc = "Used for watching the singularity chamber."; dir = 1; layer = 4; name = "Singularity Engine Telescreen"; network = list("Singularity"); pixel_x = 0; pixel_y = -30},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering)
+"cnf" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "vault"; dir = 4},/area/engine/engine_smes)
+"cng" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera{c_tag = "SMES Room"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes)
+"cnh" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "warningcorner"; dir = 2},/area/engine/engine_smes)
"cni" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/engine/engineering)
"cnj" = (/obj/machinery/suit_storage_unit/ce,/turf/simulated/floor{dir = 4; icon_state = "warnwhite"},/area/engine/chiefs_office)
"cnk" = (/obj/structure/sign/nosmoking_2{pixel_y = 32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{dir = 1; icon_state = "yellow"},/area/engine/engineering)
@@ -6097,6 +6098,7 @@
"cnn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/engine/engineering)
"cno" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/engine/engineering)
"cnp" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/engine/engineering)
+"cnq" = (/obj/machinery/power/smes,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor{icon_state = "vault"; dir = 1},/area/engine/engine_smes)
"cnr" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cns" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
"cnt" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
@@ -6107,19 +6109,19 @@
"cny" = (/obj/structure/closet,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cnz" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator)
"cnA" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator)
-"cnB" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/engine/secure_construction)
+"cnB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes)
"cnC" = (/obj/structure/closet/emcloset,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cnD" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2_sensor"},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos)
"cnE" = (/obj/machinery/door/window/southleft{base_state = "left"; dir = 2; icon_state = "left"; name = "Engineering Delivery"; req_access_txt = "10"},/turf/simulated/floor{icon_state = "delivery"},/area/engine/engineering)
"cnF" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{name = "Engineering Maintenance"; req_access_txt = "10"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/engine/engineering)
"cnG" = (/obj/machinery/camera{c_tag = "Engineering West"; dir = 4; network = list("SS13")},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "yellowcorner"},/area/engine/engineering)
"cnH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor,/area/engine/engineering)
-"cnI" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering)
-"cnJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering)
-"cnK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering)
-"cnL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering)
+"cnI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes)
+"cnJ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering)
+"cnK" = (/obj/machinery/door_control{id = "Singularity"; name = "Shutters Control"; pixel_x = -25; pixel_y = 0; req_access_txt = "11"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering)
+"cnL" = (/obj/machinery/particle_accelerator/control_box,/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/engine/engineering)
"cnM" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
-"cnN" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering)
+"cnN" = (/obj/structure/stool,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering)
"cnO" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/engine/engineering)
"cnP" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering)
"cnQ" = (/obj/effect/landmark/start{name = "Station Engineer"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering)
@@ -6132,90 +6134,90 @@
"cnX" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "o2_sensor"},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/atmos)
"cnY" = (/obj/machinery/air_sensor{frequency = 1443; id_tag = "air_sensor"; output = 7},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos)
"cnZ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"coa" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor{icon_state = "dark"},/area/engine/secure_construction)
-"cob" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor{icon_state = "dark"},/area/engine/secure_construction)
+"coa" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/engine/engine_smes)
+"cob" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 1; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/obj/machinery/camera{c_tag = "SMES Access"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/engine/engine_smes)
"coc" = (/obj/structure/closet/radiation,/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/gravity_generator)
-"cod" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "vault"; dir = 1},/area/engine/secure_construction)
-"coe" = (/turf/simulated/floor{icon_state = "loadingarea"},/area/engine/engineering)
-"cof" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/engine/engineering)
-"cog" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor,/area/engine/engineering)
-"coh" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/firealarm{pixel_y = 24},/turf/simulated/floor,/area/engine/engineering)
+"cod" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engine_smes)
+"coe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "loadingarea"},/area/engine/engineering)
+"cof" = (/obj/machinery/light/small{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering)
+"cog" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/turf/simulated/floor,/area/engine/engineering)
+"coh" = (/obj/machinery/firealarm{pixel_y = 24},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/engine/engineering)
"coi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sign/nosmoking_2{pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor,/area/engine/engineering)
"coj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering)
"cok" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering)
"col" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/alarm{pixel_y = 23},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering)
-"com" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering)
+"com" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/engine/engineering)
"con" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor,/area/engine/engineering)
"coo" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor,/area/engine/engineering)
"cop" = (/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor,/area/engine/engineering)
"coq" = (/obj/structure/closet/radiation,/turf/simulated/floor,/area/engine/engineering)
-"cor" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/poddoor/shutters/preopen{id = "Singularity"; name = "radiation shutters"},/turf/simulated/floor{dir = 2; icon_state = "bot"},/area/engine/engineering)
+"cor" = (/obj/machinery/door_control{id = "Singularity"; name = "Shutters Control"; pixel_x = 25; pixel_y = 0; req_access_txt = "11"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering)
"cos" = (/obj/structure/table,/obj/item/device/flashlight{pixel_y = 5},/obj/item/clothing/ears/earmuffs{pixel_x = -5; pixel_y = 6},/obj/item/weapon/airlock_painter,/turf/simulated/floor,/area/engine/engineering)
"cot" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 4; icon_state = "yellow"},/area/engine/engineering)
"cou" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cov" = (/obj/structure/rack{dir = 1},/obj/item/weapon/extinguisher,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cov" = (/obj/machinery/porta_turret{ai = 1; dir = 8},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
"cow" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cox" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"coy" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
"coz" = (/obj/structure/lattice,/obj/structure/grille,/obj/structure/lattice,/turf/space,/area/space)
-"coA" = (/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/secure_construction)
-"coB" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 4; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "vault"; dir = 4},/area/engine/secure_construction)
+"coA" = (/obj/item/clothing/glasses/meson,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering)
+"coB" = (/obj/machinery/door/poddoor/shutters/preopen{id = "Singularity"; name = "radiation shutters"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engineering)
"coC" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/gravity_generator)
-"coD" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor{icon_state = "dark"},/area/engine/secure_construction)
-"coE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/engine/secure_construction)
-"coF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/engine/secure_construction)
-"coG" = (/obj/structure/rack,/obj/item/weapon/extinguisher,/obj/item/weapon/storage/belt/utility,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"coH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "dark"},/area/engine/secure_construction)
-"coI" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "dark"},/area/engine/secure_construction)
-"coJ" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor,/area/engine/secure_construction)
-"coK" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/turf/simulated/floor/plating,/area/engine/secure_construction)
-"coL" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering)
-"coM" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 4; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/engine/engineering)
+"coD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/engine_smes)
+"coE" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/engine/engine_smes)
+"coF" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engine_smes)
+"coG" = (/obj/machinery/porta_turret{ai = 1; dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/aisat_interior)
+"coH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/airlock/engineering{name = "SMES Room"; req_access_txt = "32"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/engine_smes)
+"coI" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/engine/engine_smes)
+"coJ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engine/engineering)
+"coK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engineering)
+"coL" = (/obj/machinery/power/rad_collector{anchored = 1},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/engine/engineering)
+"coM" = (/obj/machinery/power/rad_collector{anchored = 1},/obj/item/weapon/tank/plasma,/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/engine/engineering)
"coN" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/engine/engineering)
-"coO" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/engine/engineering)
-"coP" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor,/area/engine/engineering)
+"coO" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor,/area/engine/engineering)
+"coP" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/engine_smes)
"coQ" = (/obj/structure/table,/obj/item/weapon/book/manual/wiki/engineering_hacking{pixel_x = 3; pixel_y = 3},/obj/item/weapon/book/manual/wiki/engineering_construction,/turf/simulated/floor,/area/engine/engineering)
"coR" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/engine/engineering)
"coS" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/gloves/black,/obj/item/weapon/extinguisher{pixel_x = 8},/turf/simulated/floor,/area/engine/engineering)
"coT" = (/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/engine/engineering)
-"coU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/engineering)
+"coU" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes)
"coV" = (/obj/machinery/camera{c_tag = "Engineering Center"; dir = 2; pixel_x = 23},/obj/machinery/light{dir = 1},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/engineering)
"coW" = (/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/engine/engineering)
"coX" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/gloves/yellow,/obj/item/weapon/storage/belt/utility,/turf/simulated/floor,/area/engine/engineering)
"coY" = (/obj/structure/table,/obj/item/weapon/book/manual/wiki/engineering_guide,/obj/item/weapon/book/manual/engineering_particle_accelerator{pixel_y = 6},/turf/simulated/floor,/area/engine/engineering)
-"coZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "dark"},/area/engine/secure_construction)
+"coZ" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/engine_smes)
"cpa" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/escape_pod4/station)
"cpb" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/escape_pod4/station)
"cpc" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/shuttle/escape_pod4/station)
"cpd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating/airless,/area/solar/starboard)
-"cpe" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/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/plating,/area/engine/secure_construction)
+"cpe" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/engine/engineering)
"cpf" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/engine/engineering)
"cpg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engine/gravity_generator)
"cph" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/asmaint2)
-"cpi" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/engine/secure_construction)
-"cpj" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/engine/secure_construction)
-"cpk" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/engine/secure_construction)
+"cpi" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the singularity chamber."; dir = 1; layer = 4; name = "Singularity Engine Telescreen"; network = list("Singularity"); pixel_x = 0; pixel_y = -30},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engine/engineering)
+"cpj" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/engine/engineering)
+"cpk" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/engine_smes)
"cpl" = (/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,/area/engine/engineering)
-"cpm" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering)
+"cpm" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes)
"cpn" = (/obj/structure/table,/obj/item/clothing/gloves/yellow,/obj/item/weapon/storage/toolbox/electrical{pixel_y = 5},/turf/simulated/floor,/area/engine/engineering)
-"cpo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/engine/engineering)
-"cpp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/poddoor/shutters/preopen{id = "Singularity"; name = "radiation shutters"},/turf/simulated/floor{dir = 2; icon_state = "bot"},/area/engine/engineering)
-"cpq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engineering)
-"cpr" = (/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,/area/engine/engineering)
+"cpo" = (/obj/machinery/door/window{name = "SMES Chamber"; req_access_txt = "32"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes)
+"cpp" = (/obj/structure/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes)
+"cpq" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/poddoor/shutters/preopen{id = "Singularity"; name = "radiation shutters"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 2; icon_state = "bot"},/area/engine/engineering)
+"cpr" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/machinery/power/port_gen/pacman,/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/engine/engine_smes)
"cps" = (/obj/structure/particle_accelerator/end_cap,/turf/simulated/floor/plating,/area/engine/engineering)
-"cpt" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/engine/engineering)
-"cpu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/engine/engineering)
-"cpv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/poddoor/shutters/preopen{id = "Singularity"; name = "radiation shutters"},/turf/simulated/floor{dir = 2; icon_state = "bot"},/area/engine/engineering)
-"cpw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/engine/engineering)
-"cpx" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/engine/engineering)
+"cpt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/engine_smes)
+"cpu" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engine/engineering)
+"cpv" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 4; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engine/engineering)
+"cpw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engine/engineering)
+"cpx" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/engineering)
"cpy" = (/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/engine/engineering)
"cpz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge)
"cpA" = (/obj/machinery/door/airlock/shuttle{name = "Escape Pod Airlock"},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod4/station)
"cpB" = (/obj/structure/stool/bed/chair{dir = 4},/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod4/station)
-"cpC" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/secure_construction)
+"cpC" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/table,/obj/item/weapon/reagent_containers/pill/antitox,/turf/simulated/floor{icon_state = "yellow"},/area/engine/engineering)
"cpD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/shuttle/escape_pod4/station)
-"cpE" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/engine/secure_construction)
-"cpF" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/secure_construction)
+"cpE" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor{icon_state = "yellow"},/area/engine/engineering)
+"cpF" = (/obj/machinery/light{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "yellow"},/area/engine/engineering)
"cpG" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cpH" = (/obj/structure/table,/obj/machinery/camera{c_tag = "Engineering Storage"; dir = 4; network = list("SS13")},/turf/simulated/floor,/area/engine/engineering)
"cpI" = (/obj/structure/table,/obj/item/stack/rods{amount = 50},/turf/simulated/floor,/area/engine/engineering)
@@ -6223,35 +6225,28 @@
"cpK" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering)
"cpL" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = -32},/obj/machinery/light,/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering)
"cpM" = (/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering)
-"cpN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/clothing/glasses/meson,/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering)
-"cpO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/stool,/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering)
-"cpP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door_control{id = "Singularity"; name = "Shutters Control"; pixel_x = 25; pixel_y = 0; req_access_txt = "11"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering)
+"cpN" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor{icon_state = "yellow"},/area/engine/engineering)
+"cpO" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/table,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/clothing/mask/breath{step_x = 0; step_y = 0},/turf/simulated/floor{icon_state = "yellow"},/area/engine/engineering)
+"cpP" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/turretid{control_area = "\improper AI Satellite Antechamber"; enabled = 1; icon_state = "control_standby"; name = "Antechamber Turret Control"; pixel_x = 0; pixel_y = -24; req_access = list(65)},/turf/simulated/floor,/area/aisat)
"cpQ" = (/obj/machinery/door_control{id = "Singularity"; name = "Shutters Control"; pixel_x = -25; pixel_y = 0; req_access_txt = "11"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engineering)
-"cpR" = (/obj/machinery/particle_accelerator/control_box,/obj/structure/cable,/turf/simulated/floor/plating,/area/engine/engineering)
"cpS" = (/obj/structure/particle_accelerator/fuel_chamber,/turf/simulated/floor/plating,/area/engine/engineering)
"cpT" = (/obj/machinery/door_control{id = "Singularity"; name = "Shutters Control"; pixel_x = 25; pixel_y = 0; req_access_txt = "11"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/engine/engineering)
-"cpU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door_control{id = "Singularity"; name = "Shutters Control"; pixel_x = -25; pixel_y = 0; req_access_txt = "11"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering)
-"cpV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering)
"cpW" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering)
"cpX" = (/obj/machinery/light,/turf/simulated/floor,/area/engine/engineering)
-"cpY" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/engine/secure_construction)
"cpZ" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/escape_pod4/station)
"cqa" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/shuttle/escape_pod4/station)
"cqb" = (/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space)
"cqc" = (/obj/structure/lattice,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/space)
"cqd" = (/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/aft)
"cqe" = (/obj/structure/table,/obj/item/stack/sheet/plasteel{amount = 10},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor,/area/engine/engineering)
-"cqf" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor,/area/engine/engineering)
"cqg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/external{name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/engine/engineering)
"cqh" = (/obj/machinery/door/poddoor/shutters/preopen{id = "Singularity"; name = "radiation shutters"},/turf/simulated/floor/plating,/area/engine/engineering)
-"cqi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/poddoor/shutters/preopen{id = "Singularity"; name = "radiation shutters"},/turf/simulated/floor/plating,/area/engine/engineering)
"cqj" = (/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/weapon/crowbar,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engineering)
"cqk" = (/obj/structure/stool,/turf/simulated/floor,/area/engine/engineering)
"cql" = (/obj/structure/particle_accelerator/power_box,/turf/simulated/floor/plating,/area/engine/engineering)
"cqm" = (/obj/item/weapon/screwdriver,/turf/simulated/floor,/area/engine/engineering)
"cqn" = (/obj/machinery/door/airlock/external{name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/engine/engineering)
"cqo" = (/obj/structure/cable,/turf/simulated/floor/plating/airless,/area/solar/starboard)
-"cqp" = (/obj/item/clothing/head/hardhat,/obj/structure/table,/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor/plating,/area/maintenance/aft)
"cqq" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plating,/area/maintenance/aft)
"cqr" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft)
"cqs" = (/obj/structure/table,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/stack/cable_coil,/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/turf/simulated/floor,/area/engine/engineering)
@@ -6262,9 +6257,6 @@
"cqx" = (/obj/machinery/light/small{dir = 8},/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/engine/engineering)
"cqy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32},/turf/simulated/floor/plating,/area/engine/engineering)
"cqz" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/engine/engineering)
-"cqA" = (/obj/structure/cable,/obj/machinery/power/rad_collector{anchored = 1},/turf/simulated/floor/plating,/area/engine/engineering)
-"cqB" = (/obj/structure/cable,/obj/machinery/power/rad_collector{anchored = 1},/obj/item/weapon/tank/plasma,/turf/simulated/floor/plating,/area/engine/engineering)
-"cqC" = (/obj/machinery/power/rad_collector{anchored = 1},/obj/structure/cable,/turf/simulated/floor/plating,/area/engine/engineering)
"cqD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/engine/engineering)
"cqE" = (/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engineering)
"cqF" = (/obj/structure/particle_accelerator/particle_emitter/left,/turf/simulated/floor/plating,/area/engine/engineering)
@@ -6280,7 +6272,6 @@
"cqP" = (/turf/simulated/floor/plating/airless,/area/solar/starboard)
"cqQ" = (/obj/structure/table,/obj/item/device/taperecorder{pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/aft)
"cqR" = (/obj/structure/table,/obj/item/weapon/storage/box/matches,/obj/item/weapon/storage/fancy/cigarettes,/turf/simulated/floor/plating,/area/maintenance/aft)
-"cqS" = (/obj/structure/table,/obj/item/device/radio/off,/turf/simulated/floor/plating,/area/maintenance/aft)
"cqT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/space)
"cqU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/space)
"cqV" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/space)
@@ -6296,7 +6287,6 @@
"crf" = (/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/engine/engineering)
"crg" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering)
"crh" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/engine/engineering)
-"cri" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/secure_construction)
"crj" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating/airless,/area/solar/starboard)
"crk" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating/airless,/area/solar/starboard)
"crl" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/solar/starboard)
@@ -6460,7 +6450,6 @@
"cun" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cuo" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/brig)
"cup" = (/obj/machinery/door/window/brigdoor{id = "Cell 4"; name = "Cell 4"; req_access_txt = "2"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "red"},/area/security/brig)
-"cuq" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/secure_construction)
"cur" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew2,/area/space)
"cus" = (/turf/space/transit/east/shuttlespace_ew14,/area/shuttle/escape_pod4/transit)
"cut" = (/turf/space/transit/east/shuttlespace_ew15,/area/shuttle/escape_pod4/transit)
@@ -7055,10 +7044,8 @@
"cFK" = (/obj/structure/stool/bed/chair,/obj/effect/landmark{name = "tdomeobserve"},/turf/unsimulated/floor{icon_state = "redbluefull"; dir = 2},/area/tdome/tdomeobserve)
"cFL" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'FOURTH WALL'."; name = "\improper FOURTH WALL"; pixel_x = -32},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership)
"cFM" = (/obj/structure/table,/obj/item/device/aicard,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start)
-"cFN" = (/obj/machinery/door_control{id = "nukeop_ready"; name = "mission launch control"; pixel_x = -26; pixel_y = 0; req_access_txt = "150"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership)
"cFO" = (/obj/effect/landmark{name = "Syndicate-Spawn"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership)
"cFP" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership)
-"cFQ" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Uplink Management Control"; req_access_txt = "150"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership)
"cFR" = (/obj/structure/mopbucket,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
"cFS" = (/turf/unsimulated/wall/fakedoor{name = "Thunderdome"},/area/tdome/tdomeobserve)
"cFT" = (/obj/machinery/computer/security/telescreen,/turf/unsimulated/floor{icon_state = "redbluefull"; dir = 2},/area/tdome/tdomeobserve)
@@ -8111,29 +8098,8 @@
"daa" = (/obj/machinery/power/apc{dir = 0; name = "Worn-out APC"; pixel_y = -24},/turf/simulated/floor/airless,/area/derelict/teleporter)
"dab" = (/turf/simulated/mineral/random,/area/space)
"dac" = (/turf/simulated/floor/plating/asteroid/airless,/area/space)
-"dad" = (/obj/machinery/door/airlock/shuttle,/turf/simulated/floor/plating/airless,/area/space)
-"dae" = (/turf/simulated/floor/plating/asteroid/airless,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/space)
-"daf" = (/obj/effect/landmark/corpse/clown,/turf/simulated/floor/airless,/area/space)
-"dag" = (/obj/structure/closet/crate,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/turf/simulated/floor/airless,/area/space)
-"dah" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/item/weapon/ore/clown,/turf/simulated/floor/airless,/area/space)
-"dai" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/space)
-"daj" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"; dir = 8},/turf/space,/area/space)
"dak" = (/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plating/asteroid/airless,/area/space)
-"dal" = (/obj/item/weapon/ore/clown,/turf/simulated/floor/airless,/area/space)
-"dam" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/turf/space,/area/space)
"dan" = (/obj/item/weapon/shard{icon_state = "medium"},/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating/asteroid/airless,/area/space)
-"dao" = (/obj/effect/landmark/corpse/clown{name = "Clown Pilot"},/turf/simulated/floor/airless,/area/space)
-"dap" = (/obj/item/weapon/paper{info = "The call has gone out! Our ancestral home has been rediscovered! Not a small patch of land, but a true clown nation, a true Clown Planet! We're on our way home at last!"},/turf/simulated/floor/airless,/area/space)
-"daq" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/space)
-"dar" = (/obj/item/weapon/shard,/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/airless,/area/space)
-"das" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/airless,/area/space)
-"dat" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/space)
-"dau" = (/turf/simulated/floor/airless,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/space)
-"dav" = (/obj/item/weapon/pickaxe,/turf/simulated/floor/airless,/area/space)
-"daw" = (/obj/structure/closet/crate,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/turf/simulated/floor/airless,/area/space)
-"dax" = (/obj/structure/closet/crate,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/clothing/shoes/clown_shoes{desc = "These shoes appear var-edited!."; name = "uhangi's shoes"; slowdown = -1},/turf/simulated/floor/airless,/area/space)
-"day" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/turf/space,/area/space)
-"daz" = (/obj/structure/door_assembly/door_assembly_shuttle,/turf/simulated/floor/plating/airless,/area/space)
"daA" = (/turf/simulated/mineral,/area/mine/unexplored)
"daB" = (/turf/space,/area/syndicate_station/mining)
"daC" = (/turf/simulated/mineral/random,/area/mine/unexplored)
@@ -8372,7 +8338,6 @@
"dfb" = (/obj/machinery/door_control{id = "Labor"; name = "Labor Camp Lockdown"; pixel_x = 28; pixel_y = 7; req_access_txt = "2"},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor,/area/mine/laborcamp/security)
"dfc" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/pipe/simple{dir = 6},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/mine/laborcamp/security)
"dfd" = (/obj/structure/girder,/turf/simulated/floor/plating{icon_plating = "asteroidplating"; icon_state = "asteroidplating"; temperature = 273.15},/area/mine/explored)
-"dfe" = (/obj/structure/door_assembly/door_assembly_eng,/obj/item/weapon/airlock_electronics,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/secure_construction)
"dff" = (/obj/machinery/atmospherics/pipe/simple,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/laborcamp)
"dfg" = (/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/laborcamp)
"dfh" = (/turf/simulated/floor{icon_state = "asteroidfloor"; temperature = 273.15},/area/mine/explored)
@@ -8450,7 +8415,6 @@
"dgB" = (/obj/machinery/conveyor_switch/oneway{id = "miningmint"; name = "mining conveyor"},/turf/simulated/floor,/area/mine/production)
"dgC" = (/obj/machinery/camera{c_tag = "Mint"; dir = 4; network = list("MINE")},/turf/simulated/floor,/area/mine/production)
"dgD" = (/obj/machinery/vending/coffee,/turf/simulated/floor,/area/mine/laborcamp/security)
-"dgE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/airlock/engineering{name = "Construction Area"; req_access_txt = "32"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/secure_construction)
"dgF" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/mine/laborcamp/security)
"dgG" = (/obj/machinery/door/window{dir = 1; name = "Mint"; req_access_txt = "48"},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor,/area/mine/production)
"dgH" = (/obj/machinery/door/window{base_state = "right"; dir = 1; icon_state = "right"; name = "Mint"; req_access_txt = "48"},/turf/simulated/floor,/area/mine/production)
@@ -8483,7 +8447,6 @@
"dhi" = (/obj/machinery/power/port_gen/pacman{anchored = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/mine/laborcamp/security)
"dhj" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/mine/laborcamp/security)
"dhk" = (/obj/machinery/atmospherics/pipe/simple{dir = 5; icon_state = "intact-f"},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/mine/laborcamp/security)
-"dhl" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/engine/secure_construction)
"dhm" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/mine/laborcamp/security)
"dhn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable,/turf/simulated/floor/plating,/area/mine/laborcamp/security)
"dho" = (/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 9},/area/mine/explored)
@@ -8885,7 +8848,6 @@
"doU" = (/obj/machinery/atmospherics/pipe/simple,/obj/machinery/flasher{id = "Labor"; pixel_x = 0; pixel_y = -26},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/laborcamp)
"doV" = (/obj/machinery/light/small{dir = 8},/obj/item/weapon/wrench,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/security/prison)
"doW" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/security/prison)
-"doX" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engine/engineering)
"doY" = (/obj/structure/window/reinforced,/obj/structure/stool/bed/chair,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/prison)
"doZ" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/security/armory)
"dpa" = (/obj/machinery/light{dir = 1},/obj/machinery/computer/security/telescreen{desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; network = list("Prison"); pixel_x = 0; pixel_y = 30},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/camera{c_tag = "Prison Hallway West"; network = list("SS13","Prison")},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/prison)
@@ -8907,10 +8869,6 @@
"dpq" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1441; icon_state = "on"; id = "waste_in"; on = 1; pixel_y = 1},/turf/simulated/floor{icon_state = "dark"},/area/security/prison)
"dpr" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/medical/virology)
"dps" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/engine/engineering)
-"dpt" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/secure_construction)
-"dpu" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engineering)
-"dpv" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engine/engineering)
-"dpw" = (/obj/item/weapon/crowbar,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"dpx" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 6},/area/syndicate_mothership)
"dpy" = (/obj/effect/decal/cleanable/dirt,/obj/item/device/radio/beacon,/turf/simulated/floor/plating/airless,/area/AIsattele)
"dpz" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/medical/virology)
@@ -8926,7 +8884,6 @@
"dpJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall/r_wall,/area/aisat)
"dpK" = (/obj/machinery/recharge_station,/turf/simulated/floor{dir = 9; icon_state = "yellow"},/area/aisat)
"dpL" = (/obj/machinery/atmospherics/pipe/tank/air,/turf/simulated/floor{dir = 5; icon_state = "yellow"},/area/aisat)
-"dpM" = (/obj/machinery/light/small,/obj/structure/table,/obj/item/device/flashlight,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"dpN" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"dpO" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/stool/bed/chair,/obj/item/weapon/storage/fancy/cigarettes,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"dpP" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/stool/bed/chair,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
@@ -8978,10 +8935,8 @@
"dqJ" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/turretid{name = "AI Chamber turret control"; pixel_x = 5; pixel_y = 24},/obj/machinery/flasher{id = "AI"; pixel_x = -6; pixel_y = 24},/obj/machinery/camera/motion{c_tag = "AI Chamber South"; dir = 2; network = list("RD","MiniSat")},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai)
"dqK" = (/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "AI Chamber APC"; pixel_y = 24},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai)
"dqL" = (/obj/machinery/door/window{name = "AI Core Door"; req_access_txt = "16"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai)
-"dqM" = (/obj/machinery/turret{dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
"dqN" = (/obj/machinery/mech_bay_recharge_port,/obj/structure/cable,/turf/simulated/floor/plating,/area/assembly/chargebay)
"dqO" = (/obj/machinery/flasher{id = "AI"; pixel_x = 0; pixel_y = -21},/obj/machinery/ai_slipper{icon_state = "motion0"; uses = 10},/obj/machinery/light,/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
-"dqP" = (/obj/machinery/turret{dir = 8},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
"dqQ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/turret_protected/ai)
"dqR" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plating,/area/aisat)
"dqS" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/aisat)
@@ -9004,7 +8959,6 @@
"drj" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/camera{c_tag = "MiniSat Exterior North East"; dir = 4; network = list("MiniSat"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plating,/area/aisat)
"drk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/engine/gravity_generator)
"drl" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/engine/engineering)
-"drm" = (/obj/machinery/turret{dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/aisat_interior)
"drn" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering)
"dro" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/aisat_interior)
"drp" = (/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_x = -28; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/aisat_interior)
@@ -9096,7 +9050,6 @@
"dsX" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/engine/engineering)
"dsY" = (/obj/machinery/bot/floorbot{on = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior)
"dsZ" = (/obj/machinery/bot/cleanbot{on = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior)
-"dta" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/turretid{control_area = "\improper AI Satellite Antechamber"; enabled = 1; icon_state = "motion3"; name = "Antechamber Turret Control"; pixel_x = 0; pixel_y = -24; req_access = list(65)},/turf/simulated/floor,/area/aisat)
"dtb" = (/obj/structure/transit_tube{tag = "icon-E-NW"; icon_state = "E-NW"},/turf/space,/area/space)
"dtc" = (/obj/item/weapon/mop,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
"dtd" = (/obj/structure/table/woodentable,/obj/item/device/paicard,/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership)
@@ -9132,7 +9085,6 @@
"dtL" = (/obj/machinery/computer/slot_machine{balance = 15; money = 500},/obj/item/weapon/coin/iron,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"dtM" = (/obj/structure/transit_tube,/obj/structure/lattice,/turf/space,/area/space)
"dtN" = (/obj/effect/decal/cleanable/cobweb,/obj/item/weapon/coin/gold,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"dtO" = (/obj/item/device/flash,/obj/structure/closet,/obj/item/weapon/coin/iron,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"dtP" = (/obj/item/weapon/coin/gold,/obj/item/weapon/coin/iron,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"dtQ" = (/obj/machinery/computer/slot_machine,/turf/simulated/floor/wood,/area/bridge/meeting_room)
"dtT" = (/turf/simulated/floor{dir = 8; icon_state = "loadingarea"},/area/mine/production)
@@ -9244,20 +9196,20 @@ ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlah
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlahlahlahlahjalWalXalYalZalWamaamaahlahlahjahjahlahlahlahlahlahlahlahlahlahlahlahjahlaiCalCalCalCambamcajNamcajjaiHakuakvamgalKalKalKagEalKalKamhalKalKalKalKalKalKalKamialKalKalKamjalKalKalKalKalKalKamkalnalnamlammamnamoampamqamramsamtamuamuamvabIahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjamwamxamyamzamwahjahlahlahjahlahjahlahjahlahlahlahjakmakmakmalvakmakmakmakmakmakmahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlamaamaamaamaamaahjahjalWamAamBamCalWamDamaahlahlahjahjahlahlahlahlahlahlahlahlahlahlahjahjahlaiCamEamEamEaiCajgajhamFagIafZahPajOahyamKamKamKamKamKamLamMamKamKamKamKamKamKamKamNamOamOamOamPamQamOamRagDagCagBalNamSamTahuahuahuamUahuamVabIamWamXabIamYamZabIahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjamwanaanbancamwahjahlahlahjahlahjahlahjakmaknakmaknakmandalvalvalvalvalvalvaneakmahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlamaamaamaamaanfanganhamaahlahlalWanianjankalWanlamaahlahlahjahjahlahlahlahlahlahlahlahlahlahjahjahlahlaiCanmanmanmaiCahlahjadcaebabUannaetanpanpanqanranqanpanpansantantantanuantantanvanwanxabIabIanyabIabIabIabIabIabIabIabIabIabIanzanAanBanCanDanEanFanGanHanIanJabIahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlamwanKanLanMamwanNanNanNanNanNanOanPanQakmanRalvaneakmakmalvakmakmakmakmanSakmakmahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahjamaanTanUanVanlanWanlamaanXanYalWalWanZaoaalWanlamaamaanXaobaocamaamaahlahjahlahlahlahlahlahlahjahjahlaodaoeaoeaoeaofahlahjahyaKUajNannaOdanpaomaonaonaonaooanpaopantaoqaoraosaotantalHalKaouabIaovaowaoxaoxaoxaoxaoxaoyaoxaoxaoxaozafRaoAaoBaoCaoDaoEaoFaoGaoHaoIaoJabIahjaoKaoLaoLaoMaoLaoLaoNahlahlahlahlahlahjaoOaoPaoOahlanNamwamwaoQaoRamwaoSalvalvalvakmaoTaoUaoVakmalvalvalvaoWakmalvakmdtNdtLakmalvaoYakmahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaoZapaapbahlapcapdapeahlahjapfapgapfahlahlahjamaaphapiapjapkanlaplamaapmanlapnapoasGanlanlanlanlanlanlanlanlanlamaahlappahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahjahyaKUaSvannaSLanpapuapvapwapxapyanpaopantapzapAapBapCapDalHalKalMabIapEapFapGapHapGapGapIapJapGapHapGapFapGapGapHapGapKapLapMapNapOapPapQapQapQapRapSapSapSapSapSapRapQahlahlahlahlahjapTalvapUahlanNapVapWapXapYalvalvalvakmalvakmapZalvalvakmalvaqaaqbaqcanSalvakmdtPdtOakmalvaqeakmahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaqfaqgbahaqgaqfaqibcpaqiaqfahjaqkanlaqlahlahlamaamaamaamaamaaqmamaamaamaaqnaqocBIaqoaqpaqqaqraqsamaanlamaamaamaanlamaahlahjahlahlahlahlahlahlahjahlahjahjahjahjaogaogaogaogaogaogaogaqtaptanpaquapvaqvaqwaqxanpaopantaqyapAaqzaqAaqBalHalKaXOabIahvaqDaqEaqFaqGaqHaqIaqJaqHaqKaqLaqMaqHaqNaqOaqPaqQaqRaqSaqTaqUaqVaqWaqXapQapRapSapSapSapSapSapRapQahjahjahjahjaqYaqZaoParaarbanNarcalvardalvarealvakmakmarfakmakmargakmakmaqcarharialvakmalvarjarjarjarjarjarjarjarjarjbRJbRJbRJbRJdsibRJbRJahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlarkaqgarlaqgarkaqiarmaqiarkamaarnapgaroaobanYamaaqnaqoaqoaqoarparqarqarrarsamaamaamaamaamaamaamaamaanlartamaaruanlamaamaamaahlahlahlahlahlahjahjahjahjahjahlahlaogarvarwaogarxaryarzaqtarAarBarCarDapvapvarEanpaoparFarGarGarHarIarJarKalKarLabIahvarMarNarOarParQarRarSaqHarTarUarVaqHarUarUarWapQarXarYarZasaasbascasdaseasfapSapSapSapSapSasgapQapQapQahlahlashalvalvalvaoSanNasiaqcardalvasjaskaslanSalvalvalvalvasmalvalvasnasoalvaspalvarjasqbcDassarjastasuasvarjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlarkaswasxasyarkaszasAasBarkasCanlanlasDasEartasFasGamaamaamaamaamaamaamaasHamacUbdsiakjamaanlasLasManlasFamaasNanlanlanlapfahlahlahlahlahlahjahlahlahjahlaogaogaogapqapqaogapqapqapqaqtasOasPasQasRaonasSasTanpaopantantasUasVasWantasXalKalMabIahvaqDaqHaqHaqHaqHarRarSaqHaqHasYaqHaqHaqHasZaqHapQataarYatbatcatdateasbatfatgapSapSapSapSapSathatiatjatkahlahlatlalvalvatmalvanNatnalvatoatpatpatpatpatqatpatralvalvalvalvalvalvalvalvakmaskarjatsattattarjbbmavFbgharjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlarkatvatwatxarkatyatwatxarkatzaqnatAaqoaqoaqoatBatCamaatDatEatFatGatHamaasHamadsiasIcUbatJatKatLamaamaamaamaamaamaamaanlatMahjahlahlahlahlahjahlahjdsidsiatNatOatNapqapqaogaogatPaogatQatRatSatTatTatUatTatTatTatVatWatXatXatYantantatZalKauaabIaubapFaucaudaueaqHaufaugauhauiaujaujaKTaulaujaumaunarXarYauoaupauqaurausautauuapSapSapSapSapSauuauvauwauxahjahjakmalvalvakmakmanNanNanNanNanNanNanNanNanNakmauyauzakmakmakmakmakmakmakmakmalvauAarjattattauBbjNatsauDarjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlaqfarkauEauFaqfarkauGauFaqfamaauHamaamaamaamaamaasGamaanlauIaavanlanlamaasHamacUZahjcUZamaauLatLamaauMauNamaauOatzamaanlamaaogauPauQauQauQauQauQauQauQauRaogaogaogaogapqaogauSapqauTauUauVauWauWauWauXauWauWauWauYauZauWauWavaavaavbavcavdavdaveavfarMarNarParPavgarRavhavhaviavjavkavlaviavhavhavmavnavoauoaupauqaurausavpavqapSapSapSapSapSavqavrauwauxahlahlakmavsalvalvavtakmavuaneavvavwavxakmatnavyakmavzalvakmavAalvakmaqaaqbavBatpatpatpavCavDavEbjObnJavHavIarjbRJbRJdsidsibRJbRJbRJbRJahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlavJavKavKavKavLavKavKavKavMavNavOavMavMavMavPamaavQamaanlauJavSanlavTamaasHamaamaamaamaamaavUamaamaatzavSavVanlanlapqapqavWavXapqapqapqapqapqapqapqapqavYavZawaawbawbawbawbawbawbawcawdaweawfawfawfawgawfawfawfawfawfawhawhawhawhawhawialKawjawkawlawmaqHaqHaqHaqHarRawnavhaviawoawpawqawrawsawtawuawvawwawxawyawzawAawBawCawDapSapSapSapSapSawEawFawGawHahlahlakmalvalvalvalvalvalvavBatpatpatpatpatpatpatpawIalvalvalvalvaspalvalvardalvalvauAarjattawJattavGattawKarjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjawLawMawNawMawOawNawNawPawMawNawQawRawSawSawTamaavQamaawUanlanlawVawWamaawXarqarqarqarqarqawYawZamaaxaanlamaasCasCaogapqaogaxbaxcaxdaxdaxdaxdaxdaxdaxdaxeaxbaxfaxgaxgaxgaxgaxgaxgaxgaopaxhawfaxiaxjaxkaxlaxmaxnaxoaxpaxqaxraxsaxtawhaxualKaxvabIaxwapFaucaudaxxaqHarRaxyawtawtawtaxzaxAaxBaxCaxDaunaxEaxFaxGaxHaxIaxJaxKaxLaxMapSapSapSapSapSaxNapQapQapQakmakmakmaxOakmakmanSakmakmardakmakmaxPakmakmanSakmardaxQakmakmaxRakmalvaxSardalvasoarjaxTavDaxUaxVaxWavDaxXarjahjahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlarkavJaxYavJaxZawNawNayaavJaxYavJaybaycawOaydamaavQamaamaamaamaamaayeayeayfaspakmayeayeayeayeaygaogaogaogaogaogaogaogapqarvaxbahlahjahlahjahlahjahlahjahlaxbaxfaxgayhayiayjaykaylaxgaopaymaynayoaypayqayraysaysaytayuayvaywaywayxawhaxualKaxvabIayyarMarNarParPayzarRayAaxCayBayCayDayEayFayFayGayFapQayHayIayJayKayLayMapQayNapSapSapSapSapSayNapQaoUalvayOayPakmakmakmayQalvakmayRardakmaySalvakmayTalvakmayUayVakmayWalvakmanOanQardanOanQarjayXavDayYayZazaavDcbBarjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjazbaqfazcatwazdazeazfazgazhazdatwaziazjaqfazkazlamaazmaznaznaznaqoazoayeazpazqazrazsaztazuazpayeazvazwazxapqapqapqapqapqapqazyaxbahjazzazzazzazzazzazzazzahjaxbaxfaxgazAazBazCazDazAaxgazEazFawfazGazHazIazJaywazKazLazMazNaywaywaywazOaxualKazPabIayyaqDaqHaqHaqHaqHaufazQayFayFayFayFayFayFazRazSazTayFapQapQapQapQazUakmapQayNapSapSapSapSapSayNapQakmalvazVayPakmazWakmalvalvakmalvardakmalvalvakmalvalvakmardaskakmalvalvakmazXalvardalvaqcarjarjarjazYarjazZarjarjarjbRJbRJbRJbRJbRJahjahjahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlawLaxYaAaaAbaAbaAbaAbaAcaxYawLaAdaqfaAeaydaAfaAfaAfaAfaAfaAfaAgayeazpaAhazraAiazrazrazpayeaogaAjaAkaAkaAkaAkaAkaAkaAkaAkaAlahlazzaECaGvaGwaGxdteazzahlaxbaxfaxgazAaAraAsaAtazAaxgaopapqawfaAuaAvaAwaAxaAyaywaAzaAAaywaywaABaywaACaxualKaxvabIaxwapFaucaudaADaqHarRazQayFaAEazSaAFaAFayFazRaAGazTayFaAHaAIaAJaAKaALakmahjaAMaANaANaANaANaANaAOahlakmalvaAPaAQakmakmakmakmakmakmaARaASakmakmakmakmakmakmakmaATaAUaAVaAVaAVaAWaAXaAYaAZaBaaBbaAVaBcaBdaBeaBfaBgalvaqcaBhahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlaBiaBjaBkaBjaBjaBlaBmaBjaBjaBkaBnaBoaqfaxZaBpaBqaBraBsaBtaBuaBvaBwayeazpaAhazraBxazrazrazpayeaByaBzaBAaBBaBCaBDaBEaBFaBGaBHaAlahjazzaAoaApaAmaAnaAqazzahjaxbaxfaxgaBNaBOaBPaBOaBQaxgaopaBRawfaBSaBTazIaBUazIaBVaBWaBXaBYaBZawhaCaawhaxualKaxvabIayyarMarNarOarPaCbarRazQayFaCcazSazSazSayGaCdaCeaCfayFaCgaChaHpaISaDDakmahlahjahlahjahlahjahlahjahlakmaClaCmaCnaCoaCpakmaCqalvaxSardalvakmahlakmalvalvalvayOaCraCsaCsaCsaCsaCsaCtaCuaCvaCwaCxaCxaCyaCwaCzaCAaCBatpaCCaCDahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaBiaBnaBjaCEaCFaCFaCGaCHaCIaCJaCKaCFaCFaCLaCMavJaxZaCNaAfaCOaCPaCQaCRaCQaCSayeaCTaAhazrazrazrazrazraCUaBGaCVaCWaCWaCWaCXaCWaCWaCWaBGaAlahlazzaBIaBJaBKaAnaBLazzahlaxbaxfaxgaDcaDdaDeaDfaDgaxgaopaDhawfawfaDiaDjaDkaDjaDlawfawfaDmaDnawhaDoawhaxualKaxvabIayyaDpaDqaDqaDqaDqaDraDsaDtaDuaDvaDwaDwaDwaDxaDwaDyaDwaDzaDAaKqaAKaKrakmakmakmakmakmakmakmakmakmakmakmakmakmakmaDEakmakmakmaDFaBaaAZaDGaDHasJaDHaDJaDKaDLaDMaDNaDOaDOaDOaDOaDOaDPaDQaDRaDRaDSaDTaDUaDRaDVaDWaDXakmaDVaDVaDVahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahjamaasianUanVanlanWanlamaanXanYalWalWanZaoaalWanlamaamaanXaobaocamaamaahlahjahlahlahlahlahlahlahjahjahlaodaoeaoeaoeaofahlahjahyaKUajNannaOdanpaomaonaonaonaooanpaopantaoqaoraosaotantalHalKaouabIaovaowaoxaoxaoxaoxaoxaoyaoxaoxaoxaozafRaoAaoBaoCaoDaoEaoFaoGaoHaoIaoJabIahjaoKaoLaoLaoMaoLaoLaoNahlahlahlahlahlahjaoOaoPaoOahlanNamwamwaoQaoRamwaoSalvalvalvakmarualvarwakmalvalvalvaoWakmalvakmdtNdtLakmalvaoYakmahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaoZapaapbahlapcapdapeahlahjapfapgapfahlahlahjamaaphapiapjapkanlapVamaapmanlapnapoasGanlanlanlanlanlanlanlanlanlamaahlappahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahjahyaKUaSvannaSLanpapuapvapwapxapyanpaopantapzapAapBapCapDalHalKalMabIapEapFapGapHapGapGapIapJapGapHapGapFapGapGapHapGapKapLapMapNapOapPapQapQapQapRapSapSapSapSapSapRapQahlahlahlahlahjapTalvapUahlanNasjapWapXapYalvalvalvakmalvakmapZalvalvakmalvaqaaqbaqcanSalvakmdtPasDakmalvasnakmahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaqfaqgbahaqgaqfaqibcpaqiaqfahjaqkanlaqlahlahlamaamaamaamaamaaqmamaamaamaaqnaqocBIaqoaqpaqqatzasNamaanlamaamaamaanlamaahlahjahlahlahlahlahlahlahjahlahjahjahjahjaogaogaogaogaogaogaogaqtaptanpaquapvaqvaqwaqxanpaopantaqyapAaqzaqAaqBalHalKaXOabIahvaqDaqEaqFaqGaqHaqIaqJaqHaqKaqLaqMaqHaqNaqOaqPaqQaqRaqSaqTaqUaqVaqWaqXapQapRapSapSapSapSapSapRapQahjahjahjahjaqYaqZaoParaarbanNasLalvardalvandalvakmakmarfakmakmargakmakmaqcasEarialvakmalvarjarjarjarjarjarjarjarjarjbRJbRJbRJbRJdsibRJbRJahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlarkaqgarlaqgarkaqiarmaqiarkamaarnapgaroaobanYamaaqnaqoaqoaqoarparqarqarrarsamaamaamaamaamaamaamaamaanlartamaatzanlamaamaamaahlahlahlahlahlahjahjahjahjahjahlahlaogarvauSaogarxaryarzaqtarAarBarCarDapvapvarEanpaoparFarGarGarHarIarJarKalKarLabIahvarMarNarOarParQarRarSaqHarTarUarVaqHarUarUarWapQarXarYarZasaasbascasdaseasfapSapSapSapSapSasgapQapQapQahlahlashalvalvalvaoSanNauMaqcardalvatOaskaslanSalvalvalvalvasmalvalvasEasoalvaspalvarjasqbcDassarjastasuasvarjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlarkaswasxasyarkaszasAasBarkasCanlanlaoUaoUartasFasGamaamaamaamaamaamaamaasHamacUbdsiakjamaanlaplasManlasFamaaoVanlanlanlapfahlahlahlahlahlahjahlahlahjahlaogaogaogapqapqaogapqapqapqaqtasOasPasQasRaonasSasTanpaopantantasUasVasWantasXalKalMabIahvaqDaqHaqHaqHaqHarRarSaqHaqHasYaqHaqHaqHasZaqHapQataarYatbatcatdateasbatfatgapSapSapSapSapSathatiatjatkahlahlatlalvalvatmalvanNatnalvatoatpatpatpatpatqatpatralvalvalvalvalvalvalvalvakmaskarjatsattattarjbbmavFbgharjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlarkatvatwatxarkatyatwatxarkapVaqnatAaqoaqoaqoatBatCamaatDatEatFatGatHamaasHamadsiasIcUbatJatKatLamaamaamaamaamaamaamaanlatMahjahlahlahlahlahjahlahjdsidsiatNaqeatNapqapqaogaogatPaogatQatRatSatTatTatUatTatTatTatVatWatXatXatYantantatZalKauaabIaubapFaucaudaueaqHaufaugauhauiaujaujaKTaulaujaumaunarXarYauoaupauqaurausautauuapSapSapSapSapSauuauvauwauxahjahjakmalvalvakmakmanNanNanNanNanNanNanNanNanNakmauyauzakmakmakmakmakmakmakmakmalvauAarjattattauBbjNatsauDarjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlaqfarkauEauFaqfarkauGauFaqfamaauHamaamaamaamaamaasGamaanlauIaavanlanlamaasHamacUZahjcUZamaauLatLamaarhauNamaauOapVamaanlamaaogauPauQauQauQauQauQauQauQauRaogaogaogaogapqaogareapqauTauUauVauWauWauWauXauWauWauWauYauZauWauWavaavaavbavcavdavdaveavfarMarNarParPavgarRavhavhaviavjavkavlaviavhavhavmavnavoauoaupauqaurausavpavqapSapSapSapSapSavqavrauwauxahlahlakmaqralvalvarcakmaqsaneavvavwandakmatnandakmavzalvakmavAalvakmaqaaqbavBatpatpatpavCavDavEbjObnJavHavIarjbRJbRJdsidsibRJbRJbRJbRJahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlavJavKavKavKavLavKavKavKavMavNavOavMavMavMavPamaavQamaanlauJavSanlavTamaasHamaamaamaamaamaavUamaamaanlavSavVanlanlapqapqavWavXapqapqapqapqapqapqapqapqavYavZawaawbawbawbawbawbawbawcawdaweawfawfawfawgawfawfawfawfawfawhawhawhawhawhawialKawjawkawlawmaqHaqHaqHaqHarRawnavhaviawoawpawqawrawsawtawuawvawwawxawyawzawAawBawCawDapSapSapSapSapSawEawFawGawHahlahlakmalvalvalvalvalvalvavBatpatpatpatpatpatpatpawIalvalvalvalvaspalvalvardalvalvauAarjattawJattavGattawKarjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjawLawMawNawMawOawNawNawPawMawNawQawRawSawSawTamaavQamaawUanlanlawVawWamaawXarqarqarqarqarqawYawZamaavuanlamaasCasCaogapqaogaxbaxcaxdaxdaxdaxdaxdaxdaxdaxeaxbaxfaxgaxgaxgaxgaxgaxgaxgaopaxhawfaxiaxjaxkaxlaxmaxnaxoaxpaxqaxraxsaxtawhaxualKaxvabIaxwapFaucaudaxxaqHarRaxyawtawtawtaxzaxAaxBaxCaxDaunaxEaxFaxGaxHaxIaxJaxKaxLaxMapSapSapSapSapSaxNapQapQapQakmakmakmandakmakmanSakmakmardakmakmaxPakmakmanSakmardaqrakmakmaxRakmalvaqrardalvasEarjaxTavDaxUaxVaxWavDaxXarjahjahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlarkavJaxYavJaxZawNawNayaavJaxYavJaybaycawOaydamaavQamaamaamaamaamaayeayeayfaspakmayeayeayeayeaygaogaogaogaogaogaogaogapqarvaxbahlahjahlahjahlahjahlahjahlaxbaxfaxgayhayiayjaykaylaxgaopaymaynayoaypayqayraysaysaytayuayvaywaywayxawhaxualKaxvabIayyarMarNarParPayzarRayAaxCayBayCayDayEayFayFayGayFapQayHayIayJayKayLayMapQayNapSapSapSapSapSayNapQasnalvayOayPakmakmakmasnalvakmasnardakmaxaalvakmavyalvakmayUayVakmavxalvakmanOanQardanOanQarjayXavDayYayZazaavDcbBarjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjazbaqfazcatwazdazeazfazgazhazdatwaziazjaqfazkazlamaazmaznaznaznaqoazoayeazpazqazrazsaztazuazpayeaxOazwazxapqapqapqapqapqapqazyaxbahjazzazzazzazzazzazzazzahjaxbaxfaxgazAazBazCazDazAaxgazEazFawfazGazHazIazJaywazKazLazMazNaywaywaywazOaxualKazPabIayyaqDaqHaqHaqHaqHaufazQayFayFayFayFayFayFazRazSazTayFapQapQapQapQazUakmapQayNapSapSapSapSapSayNapQakmalvazVayPakmazWakmalvalvakmalvardakmalvalvakmalvalvakmardaskakmalvalvakmazXalvardalvaqcarjarjarjazYarjazZarjarjarjbRJbRJbRJbRJbRJahjahjahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlawLaxYaAaaAbaAbaAbaAbaAcaxYawLaAdaqfaAeaydaAfaAfaAfaAfaAfaAfaAgayeazpaAhazraAiazrazrazpayeaogaAjaAkaAkaAkaAkaAkaAkaAkaAkaAlahlazzaECaGvaGwaGxdteazzahlaxbaxfaxgazAaAraAsaAtazAaxgaopapqawfaAuaAvaAwaAxaAyaywaAzaAAaywaywaABaywaACaxualKaxvabIaxwapFaucaudaADaqHarRazQayFaAEazSaAFaAFayFazRaAGazTayFaAHaAIaAJaAKaALakmahjaAMaANaANaANaANaANaAOahlakmalvaAPaAQakmakmakmakmakmakmaARaASakmakmakmakmakmakmakmaATaAUaAVaAVaAVaAWaAXaAYaAZaBaaBbaAVaBcaxSaBeaBfaxQalvaqcaBhahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlaBiaBjaBkaBjaBjaBlaBmaBjaBjaBkaBnaBoaqfaxZaBpaBqaBraBsaBtaBuaBvaBwayeazpaAhazraBxazrazrazpayeaByaBzaBAaBBaBCaBDaBEaBFaBGaBHaAlahjazzaAoaApaAmaAnaAqazzahjaxbaxfaxgaBNaBOaBPaBOaBQaxgaopavsawfaBSaBTazIaBUazIaBVaBWaBXaBYaBZawhaCaawhaxualKaxvabIayyarMarNarOarPaCbarRazQayFaCcazSazSazSayGaCdaCeaCfayFaCgaChaHpaISaDDakmahlahjahlahjahlahjahlahjahlakmaqraCmaCnaCoaCpakmatOalvaqrardalvakmahlakmalvalvalvayOaCraCsaCsaCsaCsaCsaCtaCuaCvaCwaCxaCxaCyaCwaCzaCAaCBatpaCCaCDahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaBiaBnaBjaCEaCFaCFaCGaCHaCIaCJaCKaCFaCFaCLaCMavJaxZaCNaAfaCOaCPaCQaCRaCQaCSayeaCTaAhazrazrazrazrazraCUaBGaCVaCWaCWaCWaCXaCWaCWaCWaBGaAlahlazzaBIaBJaBKaAnaBLazzahlaxbaxfaxgaDcaDdaDeaDfaDgaxgaopaDhawfawfaDiaDjaDkaDjaDlawfawfaDmaDnawhaDoawhaxualKaxvabIayyaDpaDqaDqaDqaDqaDraDsaDtaDuaDvaDwaDwaDwaDxaDwaDyaDwaDzaDAaKqaAKaKrakmakmakmakmakmakmakmakmakmakmakmakmakmakmaDEakmakmakmaDFaBaaAZavtaDHasJaDHaDJaDKaDLaDMaDNaDOaDOaDOaDOaDOaDPaDQaDRaDRaDSaDTaDUaDRaDVaDWaDXakmaDVaDVaDVahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaCLaDYaDZaEaaCFaEbaCFaEbaCFaEbaCFaEbaCFaEcaEdazdaxZaEeaAfaEfaEgaEhaEiaEjaEkayeaElaEmaEnazraEoaEpaEqayeaEraEsaCWaCWaCWaCWaCWaCWaEtaEuaEvaEwaBMaDbaExaCZaDaaCYazzahjaxbaEDaEEaEFaEGaEHaEIaEJaEEaEKaELaEMaENaEOaEPaEQaEPayvaERawhaESaESawhaDmawhaETaEUaEVabIaEWaEXaEXaEXaEYaEZaFaaFbaFcaFdaFeaFcaFfaFcaFgaFcaFhaFiaFjaFkaFlaAKaFmaFnaFoaFpaFqaFnaFraFsaFsaFsaFsaFtaFuaFvaFsaFwaFxaFyaFzaFAaFBaFCaFDaFEasKaFEaFGaFHaFIaFJaFKaDOaFLaFMaFNaDOaDRaFOaDRaFPaFQaFRaFSaFTaFUaFVaFWaFXaFYaFZaGaahjahlahjahlahjahlahjahlahjahjahlaGbaGbaGbaGbaGbaGbaGbahlahjahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGcahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGdaCFaCFaGeaCFaEbaCFaEbaGfaEbaCFaEbaCFaEcaEdazdaxZbdiaAfaGhaGiaGjaGkaGjaGlaGmaGmaGnaGmaGoaGpaEobgBaGmaGraGsaCWaCWaCWaGtaCWaCWaCWaGuaAlahlaEAazzaEyaEzaEyazzazzahlaxbaGyaxgaGzaGAaGBaGCaGDaGEaGFaGGaGHaGIaAvaDmaDmaDmaBUaGKawhaGLaGMawhaCaawhaGNaGOaGPabIamrabIabIabIaGQabIaGRaGSayFaGTazSayFaGUayFaGVayFaGWaGXaGYaGZaHaaHbaHcaCnaHdaHeaHfaHgaHhaHfaHfaHiaHfaHjaHkaCnaHlaHmaCnaHnaHoaKsaHqaHraHsaIRaIRaIRaIRaHtaHuaHvaHwaHxaHyaHzaHAaDOaHBaHCaDRaHDaHEaHFaHGaFTaHHaFXaFWaHIaDVaDVaDVahjahjahjahjahjahjahjahjahjahlaGbaGbaGbaGbaGbaGbaGbaGbaGbdsiahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaCLaHJaDZaEaaCFaEbaCFaEbaCFaEbaCFaEbaCFaEcaEdazdaHKaHLaHMaHNaHNaHNaHNaHLaHOaHPaHQaHRayeaukaHTaqjaqCayeaHWaBzaBGaHXaHYaHZaIaaIbaIcaIdaAlahlaIeahlaIfaIgaIfahlahjahlaxbaGyaxgaIhaIiaIjaIkaIlaxgapsapqawhaImaInaDmaDmaDmaIoaIpawhahlahlaIqaIraIsaItaIuaIvaIwaIxaIqahlahlaIyaIzaIAaIBayFaICazSazSazSaCeazSazSazSaIDaAKaIEaAKaIFaIGakmaIHaIIaIIaIJaIKaILaIIaIMaIIaINaIOaINaIPaINaIQaIRaIRaDBaIRaIRaITaIRaCkaKwaIRaIUaHuaHwaIVaIWaIXaIYaIZaDOaJaaGJaJcaJdaJeaJfaHGaJgaHHaFXaFWaFXaJhaJiaJjahlahlahlahlahlahlahjahlahjahlaGbaGbaGbaGbaGbaGbaGbaGbaGbahjahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
@@ -9266,7 +9218,7 @@ ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlah
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlavJaxYaMpaAbaAbaAbaAbaMqaxYavJaAdaqfaAeaMrazdaMsaMtaMuaMuaMvarkaMwaKSaMxaMyaMzaMAaMBaMCaMDaMEaMFaKYaKYaKYaKYaKYaKYaKYaLaaKYaMGaKYaKYaKYaMHaMIaKYaKYaKYaKYaMJaKYaMKaKYaKYaKYaMLaLlaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaLpaIuaMMaMNaMOaMPaMQaMRaMSaMTaIuaIuaLyaIuaIuaIuaIuaIuaIuaIuaIuaIuaMUaIuaAKaJYaMVaJYaJYaJYaJYaMWaKcaMXaQSaIIaMYaMZaNaaIIaIIaINaNbaKlaNcaLRaNdaINaIRaIRaNeaIRaIRaIRaNfaNgaNfaIRaIUaHuaNhaHwaHwaNiaHwaNjaDOaDRaDRaDRaDRaDRaDRaNkaDRaFXaFXaFWaFXaNlaNmaDVaNnaNoafJaNqaNraNsahjahlahjaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjazbaqfazdatwazdaNtaNuaNvaNwazdatwaNxaNyaqfaxZawNazdaNzaNAaMuaMuaMvarkaNBaKSaJsaMyaMzaNCaNDaNEaNEaNEaNFaNGaNHaNEaNIaNEaNEaNEaNJaNKaNLaNEaNEaNEaNMaNNaNOaNPaNPaNQaNRaNSaNTaNUaKYaKYaMLaLlaIuaNVaIuaNWaNWaNWaNWaNWaNWaNWaNWaNXaNWaNWaNWaNWaNWaNWaNWaNWaNWaNWaNWaNYaNWaNWaNWaNWaNWaNWaNWaNWaIuaIuaIuaAKaNZaOaaNZaNZaNZaObaOcaKcaMXaqdaIIaIIaOeaIIaIIaOfaINaOgaKlaOhaOiaOjaINaIRaOkaOlaOmaOnaOmaOmaOoaOpaIRaIUaHuaOqaOqaOraOsaOtaOtaOuaDOaOvaOwaOxaDVaOyaOzaOAaFXaFXaOBaOAaDVaOCaDVaODaOEaOFaOFaOGaOHaMnaMnaOIaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlarkawLaxYawLaxZawNawNayaawLaxYawLaOJaOKaOLawNawLaOMaOMaKPaOMaKQarkaONaKSaJsaOOaOOaOPaOQaOOaORaORaORaORaORaOSaOTaORaOUaORaORaORaOVaOWaOXaOWaOYaOZaPaaKYaKYaPbaPcaPdaKYaKZaKYaKYaPeaPeaIuaIuaIvaPfaJPaJPaPgaPgaPgaPgaPhaPiaPjaPkaPlaPmaPnaPmaPoaPmaPpaPkaPqaPiaPraPgaPgaPgaPgaJPaJPaPsaItaIuaIuaIIaoXaokaKcaKcaKcaKcaPvaPwaPxaKcaIIaPyaPzaPAaINaINaINaINaPBaINaPCaINaINaIRaOmaPDaPEaPEaPEaPEaPFaOmaIRaPGaHuaPHaHwaOraOsaHwaHwaPIaDOaPJaPKaPLaDVaFXaPMaPNaPOaPOaPPaPNaPQaPRaDVafsaPTaPUaPVaOFaPWaPXaPXaPWaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGcahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjavJaPZawNavKaOLawNawNaQaavKawNaPZaOLawNawNawNaQbaQcaQcaQcaQcaQcaQcaQcaQdaJsaOOaQeaQfaQgaQhaQiaQjaQkaQlaQmaQnaQoaQpaQqaQraQsaQtaQuaQvaQwaQxaOYaQyaPaaPaaQzaPaaQAaPeaPeaQBaQCaPeaPeaPeaQDaIuaIvaQEahlahlahlahlahlahlahlaPiaQFaQGaQHaQIaQJaQKaQLaQMaQNaQOaQPaPiahlahlahlahlahlahlahlaQQaItaIuaQRaIIaPtaPuaQTaKcaKcaKcaQTaKcaQUaLJaQVaKcaQWaQXaINaQYaQZaRaaRbaRcaRdaReaRfaINaOmaRgaRhaRhaRhaRhaRiaOmaIRaRjaHuaRkaRkaOraOsaRlaRlaRmaDOaDOaRnaDOaDVaRoaOzaOAaRpaRpaOBaOAaDVaDVaDVaMmaRqaRraMmaMnaMnaMnaMnaRsaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjavJaPZawNavKaOLawNawNaQaavKawNaPZaOLawNawNawNaQbaQcaQcaQcaQcaQcaQcaQcaQdaJsaOOanTaQfaQgaQhaQiaQjaQkaQlaQmaQnaQoaQpaQqaQraQsaQtaQuaQvaQwaQxaOYaQyaPaaPaaQzaPaaQAaPeaPeaQBaQCaPeaPeaPeaQDaIuaIvaQEahlahlahlahlahlahlahlaPiaQFaQGaQHaQIaQJaQKaQLaQMaQNaQOaQPaPiahlahlahlahlahlahlahlaQQaItaIuaQRaIIaPtaPuaQTaKcaKcaKcaQTaKcaQUaLJaQVaKcaQWaQXaINaQYaQZaRaaRbaRcaRdaReaRfaINaOmaRgaRhaRhaRhaRhaRiaOmaIRaRjaHuaRkaRkaOraOsaRlaRlaRmaDOaDOaRnaDOaDVaRoaOzaOAaRpaRpaOBaOAaDVaDVaDVaMmaRqaRraMmaMnaMnaMnaMnaRsaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlawLaRtaRuaRuaRuaRuaRuaRuaRuaRuaRtaRuaRvawNawNaRwawNawNaRxawNaRyawNaRzaRAaRBaOOaRCaOPaRDaORaREaQnaQnaQnaQnaQnaQoaRFaQnaQnaQnaQtaOVaRGaQwaQwaOYaQyaPaaRHaRIaRIaRJaPeaRKaRLaRMaRNaROaRPaIuaIuaIvaQEahlahlahlahlaPiaPiaPiaPiaRQaRRaRSaRTaRUaRVaRWaRXaRYaRZaSaaPiaPiaPiaPiahlahlahlahlaQQaItaIuaIuaSbaKcaScaSdaSeaKcaSfaSgaSeaQUaLJaShaKcaSiaKcaSjaSkaSkaSkaSlaSmaSnaSoaSkaSpaSqaSraRhaSsaStaRhaSuaOmaIRaIUaHuaHwaHwaOraOsaHwaHwaHwaolaSwaHwaSxaDVaKHaSyaSzaRpaRpaSAaSzaSBaDVaSCaSDaPTaSEaOFaOFaSFaPXaPXaSGaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjaqfaqfaSHaSIaSIaSIaSIaSIaSIaSJaqfaqfarkaSKaJtaSMaSMaSMaSNaSMaSMaSMaSOaSMaSOaOOaRCaSPaSQaORaSRaQnaQnaSSaSTaSUaSVaSSaQnaQnaQnaSWaOVaSXaSYaSZaOYaTaaPaaTbaTcaTdaTeaPeaTfaTgaThaRMaTiaTjaIuaIuaIvaJTaPhaTkaTlaPiaPiaTmaTnaToaTpaTqaTqaTraTsaTqaTtaTqaTqaTqaTuaTvaTwaTxaPiaPiaTlaTkaJOaTyaItaIuaIuaIIaTzaPuaTAaKcaKcaKcaTAaKcaQUaLJaTBaTCaKcaTDaINaSkaTEaTFaTGaTHaTIaTJaSkaTKaTLaTMaRhaTNaTOaRhaTPaTQaIRaIUaHuaTRaTRaOraOsaTSaHwaHwaTTaHwaTUaTVaDVaTWaTXaTYaRpaRpaTZaTYaFXaDVaUaaOFaPTaSEaOFaOGaUbaMnaMnaOIaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUdazeawOaUeaUfaUgaUhaUiaUjaUkaUlaUmaUkaUnaUoaUpaUqaUraORaUsaQnaQnaSSaSUaUtaUuaSSaQnaQnaQnaQtaOVaOYaOYaUvaOYaUwaUxaUxaUxaUxaUyaUzaUAaRMaRMaRMaRMaTjaIuaIuaIvaIwaIwaUBaUCaUDaPiaUEaUFaUGaTqaTqaTqaUHaUIaUJaUKaULaUMaUNaULaUOaUPaUQaPiaURaUCaUSaUTaIwaItaIuaIuaSbaKcaPuaQTaKcaUUaKcaQTaKcaQUaLJaUVaKcaKcaKcaUWaSkaSkaUXaUYaUZaVaaTJaVbaINaVcaTMaVdaRhaRhaRhaTPaVeaIRaVfaHuaDOaDOaOraOsaVgaVhaHwaViaVjaKAaVkaVlaMjaVmaVnaVoaVoaVpaVqaVraVlaVsaVtaVuaVvaVtaVwaNsahlahjahjaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
@@ -9275,68 +9227,68 @@ ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlah
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaYpaYqaVzaxZawNaYraWZaYsaXaaXaaXaaXaaYsaWZaSMaYtaYuaXfaXgaYvaYwaYxaYyaXhaYzaYAaYBaORaYCaYDaYEaQnaORaYFaYGaYHaYHaYHaYHaYIaYHaYHaYJaYKaYKaYKaYLaYKaYMaYNaYOaYOaYPaYQaYQaYQaYQaYQaYQaYRaYSaYRaYQbqwaYVbkMbkMbrIbambkMaYVbqwaYWaYWaYXaYYaYWaYWaYWaYWaYWaYWaYZaYOaYOaIIaZaaZbaZcaZdaKcaKcaKcaZeaZfaZgaKcaZhaZiaZjaINaINaINaZkaZlaZlaZlaINaINaINaZmaRhaRhaZnaZoaZpaZqaNfaIRaZraYjaZsaDOaZtbaHaZvaVhaZyaZuaTTaVhbbsaDVaZzaFXaZAaRpaRpaZAaFXaZBaDVaZCaZDaZEaSEaOFaOGaZFaMnaMnaOIaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcawLaZGaOLaZHaSOaZIaZIaZIaWZaZJaZIaZKaZIaSMaZLaZMaZNaZOaZPaZPaZQaZRaZPaZSaYAaZTaORaYCaYDaYEaQnaORaZUaYGaYHaZVaZWaZWaZWaZXaYHaZYaZZbaababaYNaYNaYNaYNaIubacbadaYQbaebafbagaHSbaibajbakbalbqwaYTbkMbkMbnIaGqbnIbkMbkMasrbqwbaqbarbasbatbaubavbawbaxaYWaXVaIuaIuaIIaIIaIIaIIaIIbayaSbbaybazbaAaIIaIIaIIaIIaIIbaBbaCbaCbaCbaCbaCbaCbaDbaCbaBaNfbaEbaEbaFaYkaYkaYkaYkbaBaZrbaGaZsaDOaDOaDOaZwaDOaZxaDOaZwaDOaDOaDVbaIbaJbaKbaKbaKbaKbaLaDVaDVbaMaOFbaNaSEaOFaOFaSGaPXaPXaSGaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjaqfaqfaSHaSIaSIaSIaSIaSIaSIaSJaqfaqfarkbaOaHLbaPaSMaSMaSMaSMaSMaSMaSMaSMaSMbaQaVWbaRaXgaYvbaSaYybaTaXhbaUbaVbaWaORaYCaYDaYEaQnaORaZUaYGaYHaZWbaXbaXaZWbaXaYHaZYbaYbaZbaZbbabbbbbcaYNbbdbbeaXDbcxbbgbbhbbibbjbbjbbibbkbblbqwaHVbkMbkMbnIbaobnIbkMbkMbczbqwbbtbaxbbubbvbbwbbxbaxbbyaYWaXVbbzaIubdpbbBaYkaYkaYkaYkaYkaYkaYkaYkbbCaYkaYkaYkaYkbbDaYkaYkaYkaYkaYkaYkaYkaYkbbBaYkaYkaYkaYkaYkaYkaYkaYkbbEbbFbbGbbHbbKbbHbbHbbHbbIbbJbbHbbHbbHbbHbbLbbMbbHbbHbbHbbHbbHbbHbbNbbObbPbbQbbRbbSaPVbbTbbUaMnaMnbbVaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlavJavNavMavMavMavMavMavMavMavMavNavMbbWawNawNbbXbbYbbZbbZbbZbbZbbZbcabcbaOObccbbYbcdaXgaXhaXhbcebcfaXhaORaORbcgaORaYCaYDbchbciaORaZUaYGaYHaZWbcjaZWbaXbckaYHaZYbclbaZbaZbaZbcmbcnaYNbcobbeaXDbbpbcqbcrbcsbctbcubcvbbkbcwbqwbbnbnIbkMbmiaYUbmibkMbnIbbfbqwbcAbcBbbubbvbcCbbxbaxbaxaYWaHUaIuaIubdpbbBaYkaYkaYkaYkaYkaYkaYkaYkbcEaYkaYkaYkaYkaYkaYkbcFbbHbbHbbHbbHbbHbbHbcGbbHbbHbbHbbHbbHbbHbbHbcHbcIbcJbcKaWNaWNaWNaWNaWNaWMaWNaWNaWNaWNaWNaWNaWNaWNaWNaWNaWNaWNbcLbcMbcNbcObcObcPaOFaOFaOFbcQaPXaPXbcQaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlavJavNavMavMavMavMavMavMavMavMavNavMbbWawNawNbbXbbYbbZbbZbbZbbZbbZbcabcbaOOaoTbbYbcdaXgaXhaXhbcebcfaXhaORaORbcgaORaYCaYDbchbciaORaZUaYGaYHaZWbcjaZWbaXbckaYHaZYbclbaZbaZbaZbcmbcnaYNbcobbeaXDbbpbcqbcrbcsbctbcubcvbbkbcwbqwbbnbnIbkMbmiaYUbmibkMbnIbbfbqwbcAbcBbbubbvbcCbbxbaxbaxaYWaHUaIuaIubdpbbBaYkaYkaYkaYkaYkaYkaYkaYkbcEaYkaYkaYkaYkaYkaYkbcFbbHbbHbbHbbHbbHbbHbcGbbHbbHbbHbbHbbHbbHbbHbcHbcIbcJbcKaWNaWNaWNaWNaWNaWMaWNaWNaWNaWNaWNaWNaWNaWNaWNaWNaWNaWNbcLbcMbcNbcObcObcPaOFaOFaOFbcQaPXaPXbcQaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjawLawMawNawMawOawNawNawPawMawNawMawOawNawNawNbcRbcSbcRbcRbcRbcRbcRbcTaOOaOOaOObcTaXfaXgaYvbcUbcVbcWaXhbcXbcYbcZaORaORaORaOObbXaOOaZUaYGaYHbdaaZWbaXbdbbdcaYHaZYaYNbddbaZbaZbdebdfbdgbdhbbeaXDbuqbdjbcrbcsbdkbdlbcvbdmbdnbnGbupbuobkMbtfbundsxbkMbrKbtbbrHbdubdvbdwbdxbdxbdybdzbdAaYWbdBbdCaIubdpbbBaYkaYkbdDaYkbdEbdFbdFbdFbdGbdFbdFbdFbdHaYkaYkaYkaYkaYkaYkbdIbdJbdKbbBaYkaYkaYkaYkaYkbdLbdMbdNbdObdPaYkaYkaYkaYkaYkbdQbdRaYkaYkaYkaYkaYkaYkaYkaYkaYkaYkaYkaYkaYkbdSbdTbdUbdVbdWaOFaOFaOGbdXaMnaMnaOIaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlarkavJbdYavJaxZawNawNayaavJbdZavJaybbeabebbebbcRbecbedbeebefbegbcRbehbeibejbejbekbelbembenbenbeobepbenbeqbeqberbeqbesaUoaUoaUoaUobetbeubevbewbexbexbeybezbevbeAbeBbeCbaZbaZbeDbeEbeFbeGbbeaXDaYQbaibeHbbibbibeIbbibbkbeJaYQbqybqwbapbqwbqwbqwbqAbqwbhzaYWbeNbeObePbeQbaxbeRbaxbeSaYWaXVaIuaIubeVbeVbeVbeVbeVbeVbeVbeWbeXbeYbeZbfabfabeWbfbbfbbfbbfbbfbbfcbfcbfcbfdbfcbfcbfcbfcbfeaYkbdQbffbfgbfhbfibfjaYkaYkbfkbfkbflbflbflbflbflbfmbfnbfnbfnbfnaYkbfnbfobfnbfnbfpbfqbfqbfqbfqbfrbfsbftbfuaNsahjahlahjaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjazbaqfazcatwazdazeazfbfvbfwazdatwaziazjaqfazbarkbcRbfxbfybfybfybfzbcRbfAbfBaRCaRCbcTbfCaXhaYvbfDaYybfEaXhbfFbfGbfHbfHbfIbfJbfKbfKbfLbfKbfMbfNbfObfPbfObfObfQbfRbfSbfTbfUbaZbaZbfVbfWbfXbeGbbebfYaYQbfZbgabgbdtQbgcbgdbgebgfaYQbqxcmqboZcltcltboXboYclybgiaYWbgjbgkbglbgmbaxbgnbaxbgoaYWaXVaIubgpbeVbgqbgrbgsbgtbgubeVbgvbgwbgwbgxbgybgybgybgzboLbjpbgCbfbbgDbgEbgEbgEbgEbgFbgGbgHbgIbgJbgIbgIbgIbgKbgLbgMbgNbgMbgObgObflbgPbgQbgRbfldombgTdombflbfmaYkbfpbfqdolbgVdolbfqbgWbgXbfqbgYbgZaMmaMnbhaahjahlahjaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjazbaqfazcatwazdazeazfbfvbfwazdatwaziazjaqfazbarkbcRbfxbfybfybfybfzbcRbfAbfBaRCaRCbcTbfCaXhaYvbfDaYybfEaXhbjebiBbfHbfHbfIbfJbfKbfKbfLbfKbfMbfNbfObfPbfObfObfQbfRbfSbfTbfUbaZbaZbfVbfWbfXbeGbbebfYaYQbfZbgabgbdtQbgcbgdbgebgfaYQbqxcmqboZcltcltboXboYclybgiaYWbgjbgkbglbgmbaxbgnbaxbgoaYWaXVaIubgpbeVbgqbgrbgsbgtbgubeVbgvbgwbgwbgxbgybgybgybgzboLbjpbgCbfbbgDbgEbgEbgEbgEbgFbgGbgHbgIbgJbgIbgIbgIbgKbgLbgMbgNbgMbgObgObflbgPbgQbgRbfldombgTdombflbfmaYkbfpbfqdolbgVdolbfqbgWbgXbfqbgYbgZaMmaMnbhaahjahlahjaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjawLbdYaAaaAbaAbaAbaAbaAcbdZawLahjahjahjahlbcRbhbbcRbhcbfybhdbhebcRaRCbbYbhfbhgbhhaXhaXhaXhaXhaXhaXhbhibhjbhkaRCbhlaYHaYHaYHbhmaYHaYHaYHbhnaYHaYHaYHaYHbhobhpbhqbhrbaZbaZbhsbhtbeFbeGbbebhuaYQbhvbgaaYRaYRaYRbaibhwbhxaYQahjckNcnAboTboUboWcnzckNahjaYWaLTbhBbhCbhDbaxbeRbhEbhFbhGbhHbhIbhJbeVbhKbhLbhMbhNbhObhPbgybhQbgybhRbgybgybhSbhTbhVbhUbhWbfbbhXbgEbhXbgEbhXbhYbgEbfcbhZbhZbiabibbfgbicbfibidbiebifbigbigbflbihbiibijbikbilbimbinbflbiobfnbipbfqbiqbirbiqbisbitbitbfqbiubgZahlahjahlahjahlahjahlaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahjahjahlahlahlahlahlahjahjahlbcRbivbiwbixbiybiybizbiAbbZbhgaOObiBbiCbiDbiDbiDbfKbfKbfKbiEbiFbiFbiFbiGaYHbiHbiIbiJbiKbiLbiMbiNbiOaYHbiPbiQbiRbiSbiTbiUbiVbiWbiXbiVbiYbiZbjabjbbjcbjdbjebjfbjgbjhbjibhwaYQaYQahjckNcnAboUcltboUcnzckNahjaYWbFabjmbaxbjnbaxbjodoNbjqaYWaXVaIuaIubeVbjrbjsbjtbjubjvbjwbgybjxbjybjzbjAbjAbjBbjCbjDbjEbjFbfbbhXbgEbhXbgEbhXbhYbjGbfcbjHbjIbjJbjKbfgbjLbjMdtkdrgdrgdrbbjPbjQbjRbjSbjSbjSbjTbjSbjUbjVbjWbjXbjYbjZbkabkbbitbkcbkdbkebfqbiubgZbgZbgZbgZbgZahjahjahjahjahjahjahjahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGcahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahjahjahlahlahlahlahlahjahjahlbcRbivbiwbixbiybiybizbiAbbZbhgaOObvkbiCbiDbiDbiDbfKbfKbfKbiEbiFbiFbiFbiGaYHbiHbiIbiJbiKbiLbiMbiNbiOaYHbiPbiQbiRbiSbiTbiUbiVbiWbiXbiVbiYbiZbjabjbbjcbjdbpZbjfbjgbjhbjibhwaYQaYQahjckNcnAboUcltboUcnzckNahjaYWbFabjmbaxbjnbaxbjodoNbjqaYWaXVaIuaIubeVbjrbjsbjtbjubjvbjwbgybjxbjybjzbjAbjAbjBbjCbjDbjEbjFbfbbhXbgEbhXbgEbhXbhYbjGbfcbjHbjIbjJbjKbfgbjLbjMdtkdrgdrgdrbbjPbjQbjRbjSbjSbjSbjTbjSbjUbjVbjWbjXbjYbjZbkabkbbitbkcbkdbkebfqbiubgZbgZbgZbgZbgZahjahjahjahjahjahjahjahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGcahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlahlahlahlahlahjahjahlahlahlahlahlahjahjahlbcRbkfbcRbkgbkhbkhbkibcRbkjbkkaOObklbkmbklbklbklbkmbklaOOaOOaYHaYHaYHbknaYHbiNbiNbkobiNbiNbiNbiNbiNbkpbkqbkrbksbktbkubkubkubkvbkwbkxbkybkzbkAbkBbkCbkDbkEbkFbkGbkHbkIbkJaYQahjahjckNcnAboWcmWboTbDDckNahjahjbkQaYWbkRaYWaYWaYWaYWbkSaYWbkTaIuaIubeVbkUbjsbkVbhNbhObkWbgybhRbkXbkYbkZblablbbfbblcbldblebfbbhXblfbhXbgEbhXbhYbgEbfcbfgbfgbfgbfgbfgbjLbfidqNblhblibljblkbllblmblnblobloblpbijblqbflblrblsbltbfqblublvblwblxblyblzbfqbiublAceYblBblCblBahlahlahlahlahlahlahjahjahjahjahjahjahjdsiahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahjahjahlahlahlahlahlahjahlahlahlahlahlahlahlahjahlbcRblDblEblFbkhblGblHbcRahlahjdsiblIblIblIblIblIblIblIahlahlblJblKblLblMblNbiNbiNbiNbiNbiNbiNbiNbiNblObhrbaZblPblQblRblSblTblUbiSblVaYNbYYblXblYblZbmabmdbmdbmcbmdbmebmfbmbahjahlckNbBjbzTcltcltbyGckNahlahjbmkbmlbmmbmnbmobmpbmqbmrbmsbmtaIubmubmvbCybmxbkVbmybmzbeVbmAbhRbkXbkZbmBbgybmCbfbbYFbmEbmFbfbbmGbmHbmIbmJbmKbmLbmKbmMbmNbmObmNbmNbmNbmPbfibmQbiedqCdqobmRbmSbmTbmUbmVbmVbmWbmXbmYbflbmZblsbnabfqbnbbncbndblxbitbnebfqbiublAblAbgZbgZbgZbgZbgZbgZbgZahlahlahjahlahlahjahlahjahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahjahlahlahlahlahlahlahlahjahlbcRbnfbngbnhbnibcRbcRbcRahlahldsiblIblIblIblIblIblIblIahlahlbnjbnkbiNbnlbnmbnmbnmbnmbnmbnmbnmbnmbnmbnnbnobnpbnqbnrbnsbntbnubhsbnvbnwbnxbnybnzbnAblZblZbmbbnBbnCbnDbnEbnFbmbahlahlckNbvIbvJbmhbyDbyEckNahlahlbnLbnMbmmbnNbmsbnObmsbnPbmsbmtaIuaIubeVbnQbjsbkVbnRbnSbeVbnTbnUbnVbnWbnXbgybnYbnZboabobbocbfbbfcbodbfcbfcbfcboeboeboeboeboeboeboeboebjLbfiblgblhblibofbogbohboibojbojbojbmWbijbokbflbolblsbombfqbonboobonbopbitboqbfqborbosbosbosbosbosbosbosbotbgZbgZbgZbgZahlahlahjahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlbRJahlahlahjblIblIblIblIblIblIblIboubovbowboxbiNbiNbiNboyboyboyboybiNbiNbiNbiNbkpbozbaZboAboBboCboDboEbhsboFbaZboGboHboIboJboKbNoaNpboNboOboPboQbjlbmbahjahlckNbkNbnHcoCbmjbmwckNahlahjbmkbpbbpcbpdbmsbpebmsbnPbmsbpfaIuaIubeVbpgbjsbkVbphbpibeVbpjbhRbgybpkbplbpmbpnbnTbpobppbpqbprbpsbptbgybpubpvbpwbpxbpybpzbpAbpBbpCbpDbgKbgLbpGbpFbpEbpHbpIbflbpJbojbojbpKbpLbijbpMbflbpNbpObpPbfqbpQbpRbpSbpTbpUbpVbfqbpWbpXbpXbpXbpXbpXbpXbpXbiubgZbpYbpZbgZbgZahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlbRJahlahlahjblIblIblIblIblIblIblIboubovbowboxbiNbiNbiNboyboyboyboybiNbiNbiNbiNbkpbozbaZboAboBboCboDboEbhsboFbaZboGboHboIboJboKbNoaNpboNboOboPboQbjlbmbahjahlckNbkNbnHcoCbmjbmwckNahlahjbmkbpbbpcbpdbmsbpebmsbnPbmsbpfaIuaIubeVbpgbjsbkVbphbpibeVbpjbhRbgybpkbplbpmbpnbnTbpobppbpqbprbpsbptbgybpubpvbpwbpxbpybpzbpAbpBbpCbpDbgKbgLbpGbpFbpEbpHbpIbflbpJbojbojbpKbpLbijbpMbflbpNbpObpPbfqbpQbpRbpSbpTbpUbpVbfqbpWbpXbpXbpXbpXbpXbpXbpXbiubgZbpYbfGbgZbgZahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahldsiahlahlahjblIblIblIblIblIblIblIbqabqbbqabqcbqdbiNbiNbiNbiNbiNbiNbiNbiNbqeaYHaYHbqfbaZbaZbqgbqhbqibqjbhsbqkbaZbqlbqmbnzbqnbqobqpbqqbqrbqsbqtbqubqvbmbahlahlckNdrNbmgdrkcpgbbrckNahlahlbqBbqCbqCbqCbqCbqCbqCbqDbqCbqEbqFbqFbeVbeVbqGbqHbqIbqJbeVbqKbhRbgybgybgybgybqLbgybqMbqNbgybgybgybqNbgybgybpvbqObqPbqQbqRbqSbqTbqUboebqVbqWboVbqXbqYbqZbiebflbrabijbijbrbbrcbijbrdbrebrfbrfbrgbrhbrhbribMVbrjbMVbrhbfqbpXbpXbrkbrlbrmbrnbrobpXbrpbrqbrrbrsbrtbgZahlahjahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldsiahlahlahjblIblIblIblIblIblIblIbrubrvbrubrwbiNbiNbiNboyboyboyboybiNbiNbrxbryaYHbrzbaZbaZbqgbrAbntbqjbhsbaZbaZbqlbqmbrBaIuaQQbqpbrCbrDbrEbrFbrFbrGbmbahjahjckNckNbkPbbqbbqbbockNahjahjbrJbkObrLbrMbrNbrObrPbrQbqCbrRaIuaIubrSbrTbrUbrVbrWbrXbrYbrZbsabrZbsbbrZbrZbscbrZbsdbsebrZbrZbrZbsfbsgbsgbshbqObsibqQbsjbsjbskbslboebjLbfibsmbsnbsobspbspbflbsqbsrbssbrebstbijbsubrebsvbswbsxbsybszbsAbsBbsCbsDbsEbFPbsGbsHbsIbsJbsJbsJbsKbsLbsMbgZbsNblAbgZbgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbRJahlahlahjblIblIblIblIblIblIblIbsObovbsPbsQbiNbiNbiNbiNbiNbiNbiNbiNbiNbrxbsRaYHbsSbcmbaZbqgbaZbsTbaZbhsbaZbsUbnxbsVbrBaIuaQQbqpbmbbsWbsXbsYbsZbtabmbahlahlahjckNckNbhyckNckNahjahlahlbrJbtcbtdbtebkKbtgbtgbthbtibtjaIuaIubtkbtlbhRbqMbtmbtnbtobtnbtpbtnbtqbtrbtnbtsbpqbttbgybgybgybtubtvbtvbtwbtxbtybtzbqQbtAbtBbqTbslboebfhbfibtCbtCbtDbtCbtCbflbrebrebrebrebBAbtFbtEbreboMbtHbtIbsEbsEbtJblsbtKbtLbtMbtNbtObtPbtQbtRbtRbtSbtTbpXbtUbgZbsNblAbgZahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbRJahjahjahjblIblIblIblIblIblIblIbrubrvbrubnkbtVbiNbiNbtWbtXbtYbtXbtXbtXbtZbuabevbubbiXbiVbucbiVbudbiWbiXbuebufboGbsVbrBaXDbugbuhbmbbuibujbukbulbumbmbahlahlahjbdrbggcoCbeMbdrahjahlahlburbusbutbutbuubuvbuwbuxbqCbuyaIuaIubnTbnTbuzbqMbuAbuBbuCbuDbuEbuFbuGbuCbuDbuCbuDbuCbuDbuCbfabfabtvbuHbsjbuIbuJbqObqQbuKbuLbuMbuNboebuObuPbuQbuRbuSbsEbsEbuTbsEbsEbuUbuVbuWbsEbsDbsEbuXbuYbuZbvabvbbvcbvdbvebvdbvdbvdbvfbvgbvhbvibvhbvjbvhbpXbtUbgZbsNbvkbgZbgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbRJahjahjahjblIblIblIblIblIblIblIbrubrvbrubnkbtVbiNbiNbtWbtXbtYbtXbtXbtXbtZbuabevbubbiXbiVbucbiVbudbiWbiXbuebufboGbsVbrBaXDbugbuhbmbbuibujbukbulbumbmbahlahlahjbdrbggcoCbeMbdrahjahlahlburbusbutbutbuubuvbuwbuxbqCbuyaIuaIubnTbnTbuzbqMbuAbuBbuCbuDbuEbuFbuGbuCbuDbuCbuDbuCbuDbuCbfabfabtvbuHbsjbuIbuJbqObqQbuKbuLbuMbuNboebuObuPbuQbuRbuSbsEbsEbuTbsEbsEbuUbuVbuWbsEbsDbsEbuXbuYbuZbvabvbbvcbvdbvebvdbvdbvdbvfbvgbvhbvibvhbvjbvhbpXbtUbgZbsNaBRbgZbgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahjahlblIblIblIblIblIblIblIbvlbvmbvlbvnbvobvnbvnbvnbvnbvnbvpbvqbiNbrxbvraYHbvsbaZbvtbvubvvbvwbvxbvybvzbvwbvwbvAbrBaJSbvBbqpbmbbvDbvEbvFbvGbumbmbahlahlahjbdrcocbbqboRbdrahjahlahlbrJbvKbvLbvMbvNbuvbuwbuxbqCbvOaIuaIubvPbvQbvRbqMbvSbvTbuCbvUbvVbvWbvXbvYbvZbwabwbbwabwcbuCbgybgybtvbwdbsjbwebwfbwgbwhbwibwjbwjbwkbwlbwmbwnbwobwpbwqbwrbwsbwrbwrbwtbwrbwubwvbwrbwrbwrbwwbwxbwybwzbwAbwBbwCdnZbwEbwFbvdbwGbwHbwIbwJbwKbwHbwLbpXbtUbgZbwMbrsbwNbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahjahlblIblIblIblIblIblIblIbwObwPbovbwQaYHbwRbovbwQbwSbwSbwSbwSbwTbwUbwVbwSbwSbwWbwWbwXbwWbvwbwYbwZbxabxbbvwbsVbrBaIvaTkaTkbmbbmbbmbbmbbmbbxcbmbaJOaJPaJUbdrbdtbhybdsbdraJOaJPaJUbqBbqCbqCbqCbqCbqCbqCbxgbqCbvOaIubxhbuCbuCbxibxjbxkbuCbuCbxlbxmbxnbxobxpbxqbxrbxsbxtbxubxvbgybgybtvbxwbxxbxybxzbxAbxBbxCbxzbxzbxDbxEbxFbxGbxHbxHbxHbxHbxIbxHbxHbxHbxJbxKbxLbxMbxNbxObxPbxQbxRbwzbxSbxTbxUbxVbxWbxXbxYbpXbpXbxZbyabybbpXbycbpXbtUbgZbsNblAbgZbgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlblIblIblIblIblIblIblIahlahjahlahlahjahlahlahjahlbwSbydbyebyfbygbyhbyibyjbykbylbymbynbyobypbyqbyrbysbvwbytbyubyvbyvbyvbywbyxbyybbAbyzbyAbyBbyCbyCbyCbBhbyFbyIbyHbyJaIuaIuaIubbeaLFaIuaLpaIuaIuaIubyKbyLbvOaIubyMbuCbyNbyObyPbyQbyRbuCbySbxmbyTbxobxpbxqbxqbyUbyVbyWbxvbgybyXbtvbsjbyYbyZbzabzbbzcbzdbzebzfboeboebfhbzgbxHbzhbzibzjbzkbzlbzmbxHbAVbzobzpbzqbzrbzsbxPbxQbxRbztbzubzvbzwbzxbzybzzbxYbzAbzAbzAbzAbzAbzAbzAbpXbtUbgZbsNblAbgZahlahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGcahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahjahlblIblIblIblIblIblIblIahlahjahlahlahjahlahlahjahlbzBbzCbzDbzEbzFbzGbzHbzIbzJbzKbzLbylbzMbzNbzObyrbzPbvwbzQbzRaIuaIuaIuaIuaIuaIubbAaIubrBaIuaIuaIuaIuaIubzSbeKbzUaIuaIuaIuaIubbeaIuaIuaLpaIuaIuaIubzVbzWbvObzXbzYbzZbAabAbbAcbAdbAebAfbAgbAhbAibAjbuCbAkbAlbAmbAnbAobuCbgybgybtvbtvbtvbtvbtvboeboeboeboeboeboebApbAqbArbxHbAsbAtbAubAvbAwbAxbxHbAybAzbAAbABbACbADbAEbAFbAGbAHbAIbAJbAJbAKbALbAMbxYbzAbANbzAbAObzAbzAbzAbpXbtUbgZbsNblAbgZbgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlblIblIblIblIblIahlahlahjahlahlahjahlahlahjahlbwSbAPbAQbARbASbATbAUbyjbylbylbymbylbyobznbAWbAXbAYbvwbAZbBabBbbBbbBbbBcbBbbBbbBdbBbbBeaIubBfbBgbhIbhIbBiaWEbBkbBlbBmbBnaWEbBkbBoaWEbBpbBqaWEbBrbBsbBtbBuaIuaIubuCbBvbBwbBxbBybBzbuCbuDbBBbuDbuCbuCbuCbuCbuCbuCbuCbuCbgybgybgybBCbBDbuBbBEbBFbBGbBHbBIbBJbBKbBLbBMbBNbxHbBObBPbBQbBRbBSbBTbxHbBUbBVbBWbBXbBYbBZbCabCbbCcbCdbCebCfbCgbChbCibCjbxYbzAbzAbzAbCkbzAbzAbzAbpXbtUbrqbClbrsbrtbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjbwSbwSbCmbCnbCnbCobwSbwSbCpbCqbCrbCsbvwbvwbCtbvwbvwbvwbCubCvaTkaTkaTkaTkbCwbCwbCwbCwbCwbCwbCwbCwbCwbCwbnKbeUbeTbCAbCAbCAbCAbCBbCCbCAbCAbCAbCAbCDbCEbCFaIzaJVbCGbuCbCHbCIbCJbCKbCLbuCbCMbxmbCNbuDbCObCObCPbCQbCRbCSbuDbCTbgybgybgybgybgybqMbCUbCVbCWbCXbCYbCZbDabDbbDcbDcbDcbDcbDcbDcbDcbDcbDcbDdbDebDdbDdbDdbDdbDfbDgbDhbvdbvdbvdbvdbvdbvdbvdbxYbpXbpXbpXbpXbpXbpXbpXbpXbtUbgZbpYbDibgZbgZahjahjahjdsidsidsidsidsidsidsidsiahjahjahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlbDjahlahlahlahjahlahlbwWbDkbDlbDmbDnbDnbDobDpbDqbDrbDsbDtbCvahlahlahjahlbCwbDubDvbDwbDxbDybDzbDAbDBbCwbDCbdqbDEbCAbDFbDGbDHbDIbDJbDKbDKbDLbDMbDNbDObDPbDQbDRbCDbuCbDSbxmbyTbDTbDUbuCbDVbxmbDWbDXbxobxobxobxobxobDYbDZbEabpqbpqbpqbpqbEbbqMbEcbEdbEebEfbEgbBFbDabDbbDcbEhbEhbEhbEibEhbEhbEhbDcbEjbEkbElbEjbEjbDdbEmbEnbxRaKtbEobEpbEqbErbEsbEtbEubEvbEwbExbEybEzbEAbECbECbEDbEobEobEobgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjbwSbwSbCmbCnbCnbCobwSbwSbCpbCqbCrbCsbvwbvwbCtbvwbvwbvwbCubCvaTkaTkaTkaTkbCwbCwbCwbCwbCwbCwbCwbCwbCwbCwbnKbeUbeTbCAbCAbCAbCAbCBbCCbCAbCAbCAbCAbCDbCEbCFaIzaJVbCGbuCbCHbCIbCJbCKbCLbuCbCMbxmbCNbuDbCObCObCPbCQbCRbCSbuDbCTbgybgybgybgybgybqMbCUbCVbCWbCXbCYbCZbDabDbbDcbDcbDcbDcbDcbDcbDcbDcbDcbDdbDebDdbDdbDdbDdbDfbDgbDhbvdbvdbvdbvdbvdbvdbvdbxYbpXbpXbpXbpXbpXbpXbpXbpXbtUbgZaDGaCqbgZbgZahjahjahjdsidsidsidsidsidsidsidsiahjahjahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlbDjahlahlahlahjahlahlbwWbDkbDlbDmbDnbDnbDobDpbDqbDrbDsbDtbCvahlahlahjahlbCwbDubDvbDwbDxbDybDzbDAbDBbCwbDCbdqbDEbCAbDFbDGbDHbDIbDJbDKbDKbDLbDMbDNbDObDPbDQbDRbCDbuCbDSbxmbyTbDTbDUbuCbDVbxmbDWbDXbxobxobxobxobxobDYbDZbEabpqbpqbpqbpqbEbbqMbEcbEdbEebEfbEgbBFbDabDbbDcbEhbEhbEhbEibEhbEhbEhbDcbEjbEkbElbEjbEjbDdbEmbEnbxRaKtbEobEpbEqbErbEsbEtbEubEvbEwbExbEyaQebEAbECbECbEDbEobEobEobgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbEEbEFbEGbEFbEHahlahjahlbwWbwWbEIbylbEJbylbEKbwWbELbELbEMbENbEObCvahjbEPbEQbERbESbETbDBbEUbDBbEVbEWbEXbEXbEYbEZbjjbFbbFcbDKbFdbFebFfbFgbFhbFibCAbCAbFjbFkbFlbFmbFnbFobFpbFqbxmbFrbDTbxobFsbFtbxmbFubuCbFvbFwbxobFxbFybFzbnTbnTbnTbnTbnTbFAbqMbqMbFBbCVbFCbFDbFEbFFbFGbDbbDcbEhbEhbEhbEhbEhbEhbEhbDcbFHbFIbFJbFKbFLbDdaLVbFMbFNbFObsFbFQbFQbFQbFQbFQbFQbFRbFSbFTbEybgZbFUbgZbEobEobEobFVbFWahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbFXbFYbFXahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbFZbGabGbbGabFZbGcbGdbGebwWbGfbylbGgbGhbylbGibwWbCvbGjbCvbCvbGkbGlahlbGmbGnbGobGpbDBbDBbGqbDBdnRbGsbGtbDBbCwbGubjkbGwbCAbGxbGybGzbGAbGBbFhbGCbGDbGEbGFbGGbGHbGIbGJbGKbuCbGLbGMbGNbGObAibuCbGPbxmbGQbuCbGRbDTbxobxmbGSbGTbnTbGUbGVbGWbGXbhRbqMbqMbGYbCVbCVbGZbHabHbbHcbHdbDcbEhbEhbEhbEhbEhbEhbEhbDcbHebHfbHgbHhbHibHjbHkbHlbHmbHnbHobFQbHpbHqbHqbHrbHqbHqbHqbHqbHsbHtbHubHvbHwbHxbHybHzbHAahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbHBbFXbHCbFXbHBahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahjahlbEGbHDbHEbHDbEGbHFbHGbHHbwWbHIbylbHJbylbylbGibwWbHKbHLbELbCvbGkbHMahjbGmbHNbHObHPbHQbHRbHQbHQbHSbHTbHQbHQbHUbHVbeLbHXbCAbCAbCAbCAbCAbCAbHYbCAbCAbHZbIabIbbIcbIdbIebIfbuCbIgbIhbIibIjbIkbuCbIlbImbInbuCbIobIpbIqbIrbIsbItbnTbIubgybhSbIvbhRbIwbIxbIybIzbCVbCVbIAbBFbIBbDbbDcbDcbICbEhbEhbIDbICbDcbDcbIEbIFbIGbIGbIHbDdbIIbIJbxRbIKbsFbFQbFQbILbIMbINbFQbIObIPbIQbIRbISbITbIUbIVbIWbIXbIYbIZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbJabJbbJcbJdbJebJbbJaahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbFZbHDbHDbHDbJfbJgbylbylbJhbHIbylbylbylbylbGibwWbJibJjbJkbCvbGkbJlahlbGmbJmbJnbJobDBbDBbJpbDBbJqbJrbJsbJtbCwbJubJvbJwbJxbJybJybJybJybJzbJybJybJybJAbJBbJzbJCbJDbJEbJFbAfbJGbJHbAfbJIbJGbAfbAfbJHbJIbAfbAfbJIbAfbJJbJKbuCbnTbJLbnTbpnbnTbJMbqMbhSbBFbBFbBFbBFbBFbBFbJNbJObJPbJQbJRbJSbJTbJUbJVbJQbJWbIEbIFbIGbIGbJXbDdbJYbIJbxRaKvbEobKabKabKbbKcbKdbKebFQbFQbKfbEybKgbKhbKibEobKjbKkbKlbEoahjahlahlahjahlahlahlahlahjahlahlahlahlahjahlahlahlahlahjahlahjahjbKmbKnbKobKpbKpbKpbKqbKmbKnahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbEGbHEbHEbHEbEGbKrbKsbKtbKubKvbylbylbKwbKxbwWbwWbCvbCvbCvbCvbGkbCvahjbKybEQbKzbKAbKBbDBbKCbDBbDBbKDbKEbKFbKGbKHbKIbKJbCDbKKbKKbKKbKKbKLbKKbKMbKNbKObKPbKQbKRbKSbKTbKUbKVbKWbKXbKYbKYbKWbKYbKYbKXbKYbKYbKYbKYbKYbKZbLabLbbnTbLcbLdbLebLfbLgbLhbLibLjbLkbLlbLmbLnbKPbLobLpbLqbLrbLsbLtbLubLvbLwbLxbJWbJWbJWbJWbJWbJWbLybLzbIJbLAbLBbEobEybEybEybEybLCbEybLDbFQbFQbEybLEbLFbgZbEobLGbLHbLIbLJdsidsiahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjbLKbLLbLKbKpbLMbKpbLNbLObFXahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbFZbLPbLQbLRbFZbLSbGdbGebwWbwWbLTbLUbLVbwWbwWahlahlahlahlbLWbLXbGlahlahlahjahlbCwbLYbLZbMabDBbMbbMcbMdbMebCwbMfbMgbMhbMibMjbMkbMlbMmbMnbMjbMobMjbMjbMjbMpbMqbMjbMjbMrbMobMsbMjbMjbMjbMpbMjbCDbCDbCDbCDbCDbCDbCDbMtbMubLnbLjbMvbMwbMxbMybMzbMAbMBbMCbMDbMDbMEbMDbMDbMFbMGbMHbMIbMJbMKbMLbMMbMNbMObMPbMQbMRbMSbMTbMUbgUbxPbIJbMWbMXahjbMYbMZbNabNbbNcbNbbNdbNebNfbEybNgbNhbNibEobEobEobEobEoahjahlahlahjahlahlahlahlahjahlahlahlahlahjahlahlahlahlahjahlahjahjbKmbKnbNjbKpbKpbKpbNkbKmbKnahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbNlbEFbNmbEFbNnahlahjahlahjdsiahjahlahjdsiahjahlahlahlahjbHMbGkbHMahjahjahjahjbCwbCwbCwbCwbCwbCwbCwbMdbCwbCwblWbNpbMhbNqbMjbMkbMlbMmbMnbNrbNsbNtbNubNvbNwbNxbNybNzbNAbNBbNCbNDbNEbNFbNGbNHahjahlahlahlahlahlahjbzgbNIbNJbNJbNJbNJbNJbNJbNKbNLbNMbNJbNJbNJbNJbNJbNJbNNbNObNPbNQbNRbNSbNTbNUbNUbNVbNWbNWbNWbNWbNWbNWbNXbNYbNZbOabObahjbMYbOcbOcbOdbOebOfbOgbOhbOibEybOjbNhblAbgZbOkbOlbgZahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahjahjbJabHBbOmbOnbOobOpbJaahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbFZbHDbHDbHDbJfbJgbylbylbJhbHIbylbylbylbylbGibwWbfFbELbccbCvbGkbJlahlbGmbJmbJnbJobDBbDBbJpbDBbJqbJrbJsbJtbCwbJubJvbJwbJxbJybJybJybJybJzbJybJybJybJAbJBbJzbJCbJDbJEbJFbAfbJGbJHbAfbJIbJGbAfbAfbJHbJIbAfbAfbJIbAfbJJbJKbuCbnTbJLbnTbpnbnTbJMbqMbhSbBFbBFbBFbBFbBFbBFbJNbJObJPbJQbJRbJSbJTbJUbJVbJQbJWbIEbIFbIGbIGbJXbDdbJYbIJbxRaKvbEobKabKabKbbKcbKdbKebFQbFQbKfbEybKgbKhbKibEobKjbKkbKlbEoahjahlahlahjahlahlahlahlahjahlahlahlahlahjahlahlahlahlahjahlahjahjbKmbKnbKobKpbKpbKpbKqbKmbKnahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbEGbHEbHEbHEbEGbKrbKsbKtbKubKvbylbylbKwbKxbwWbwWbCvbCvbCvbCvbGkbCvahjbKybEQbKzbKAbKBbDBbKCbDBbDBbKDbKEbKFbKGbKHbKIbKJbCDbKKbKKbKKbKKbKLbKKbKMbKNbKObKPbKQbKRbKSbKTbKUbKVbKWbKXbKYbKYbKWbKYbKYbKXbKYbKYbKYbKYbKYbKZbLabLbbnTbLcbLdbLebLfbLgbLhbLibLjaySaySbLmbLnbKPbLobLpbLqbLrbLsbLtbLubLvbLwbLxbJWbJWbJWbJWbJWbJWbLybLzbIJbLAbLBbEobEybEybEybEybLCbEybLDbFQbFQbEybLEbLFbgZbEobLGbLHbLIbLJdsidsiahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjbLKbLLbLKbKpbLMbKpbLNbLObFXahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbFZbLPbLQbLRbFZbLSbGdbGebwWbwWbLTbLUbLVbwWbwWahlahlahlahlbLWbLXbGlahlahlahjahlbCwbLYbLZbMabDBbMbbMcbMdbMebCwbMfbMgbMhbMibMjbMkbMlbMmbMnbMjbMobMjbMjbMjbMpbMqbMjbMjbMrbMobMsbMjbMjbMjbMpbMjbCDbCDbCDbCDbCDbCDbCDbMtbMubLnbLjbMvbMwbMxbMybMzbMAbMBbMCbMDbMDbMEbMDbMDbMFbMGbMHbMIbMJbMKbMLbMMbMNbMObMPbMQbMRbMSbMTbMUbgUbxPbIJbMWbMXahjbMYbMZbNabNbbNcbNbbNdbNebNfbEybNgbNhayTbEobEobEobEobEoahjahlahlahjahlahlahlahlahjahlahlahlahlahjahlahlahlahlahjahlahjahjbKmbKnbNjbKpbKpbKpbNkbKmbKnahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbNlbEFbNmbEFbNnahlahjahlahjdsiahjahlahjdsiahjahlahlahlahjbHMbGkbHMahjahjahjahjbCwbCwbCwbCwbCwbCwbCwbMdbCwbCwblWbNpbMhbNqbMjbMkbMlbMmbMnbNrbNsbNtbNubNvbNwbNxbNybNzbNAbNBbNCbNDbNEbNFbNGbNHahjahlahlahlahlahlahjbzgbNIbNJbNJbNJbNJbNJbNJbNKbNLbNMbNJbNJbNJbNJbNJbNJbNNbNObNPbNQbNRbNSbNTbNUbNUbNVbNWbNWbNWbNWbNWbNWbNXbNYbNZbOabObahjbMYbOcbOcbOdbOebOfbOgbOhbOibEyayQbNhblAbgZbOkayRbgZahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahjahjbJabHBbOmbOnbOobOpbJaahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahjahlahjdsiahjahlahjdsiahjahlahlahlahlbHMbGkbHMahlahlahlahjbOqbOrbOrbOsbOtbOubOubOvbOwbOqbOxbOybMhbOzbMjbOAbOBbOBbOCbODbNsbOEbOFbOGbNGbNxbOHbOIbOJbOKbOGbOLbOGbOMbONbOOahjbOPbOPbOPbOPbOPahjbzgbNIbNJbOQbORbOSbOTbNJbOUbOVbOWbNJbOXbOYbOZbOYbOXbNNbPabPbbPcbPcbPcbPdbPcbPcbPebPfbPcbPcbPgbPcbPcbgSbPibPjbPjbPkahjbMYbOcbPlbNbbPmbNbbPnbPobPpbEybPqbNhblAbgZblAblAbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbJbbFXbPrbFXbPsahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahjahjahjahjahjahjbCvbCvbPtbPubPvbCvbCvahlahlahlahlbHMbGkbHMahlahlahlahjbOqbPwbOsbOsbOsbOsbOubPxbPybOqbPzbMgbPAbPBbPCbPDbOGbPEbNGbPFbPGbPHbOGbOGbOGbNxbPIbOIbPJbOGbPKbPLbPMbPNbPObUpbPQbPRbPSbPTbPUbOPahjbPVbNIbNJbPWbPXbPYbPYbPZbQabQbbQcbNJbOYbQdbOYbQebOYbNNbDbbDcbQfbQgbQhbQibQjbQkbQlbQmbQnbQobQpbQqbQrbJWbSSbQtbSSbQubQubEybEybEybEybQvbQwbQxbQxbQxbQwbQybNhbvkblAblAbQzbgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbFXbFYbFXahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlbCvbQAbELbQBbELbQCbCvahlahlahlahlbHMbLXbHMahlahjbQDbQEbOqbQFbQGbQHbOsbOsbQIbQJbOubQKbQLbMgbQMbQNbQObQPbOGbOGbOGbQQbQRbOGbQSbOGbQTbQUbOGbQVbQWbQXbQYbQZbRabRbbRcbRdahjbRebRfbPUbRgbOPahjbRhbNIbNJbRibRjbOXbRkbNJbRlbRmbRnbNJbOXbRobRpbRqbOXbNNbRrbRsbJWbJWbJWbJWbLybRtbRubRvbLybJWbJWbJWbJWbJWbRwbRxbRybRzbRAbRBbRCcbGbRCbREbQubRFbRybRGbRHbRIbNhblAbgZbgZbgZbgZbRJahjahjahjdsidsidsidsidsidsiahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahjbCvbRKbELbELbELbRLbCvahlahlahlahlbHMbGkbJlahlahjbTabRNbRObRPbRQbOsbOsbOsbOsbOsbRRbOqbRSbRTbRUbRVbRWbRXbPHbOGbRYbRZbSabSbbScbSdbSebSfbSfbSgbShbPKbSibSjbSkbSlbSmbWIbSobPRbSpbPUbPUbOPahjbSqbNIbNJbdobOXbSsbNKbNJbNJbStbSubNJbSvbSwbSxbSybSzbSAbSBbSCbSDbSEbSEbSFbSGbMNbSHbSIbSJbSKbEhbEhbEhbJWbSLbRybRxbSMbSNbRBbSObSPbSQbSRbSSbRybSTbRybRHbSUbSVbSWbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbCvbSXbELbELbSYbSZbCvahlahjahlahlbJlbGkbCvbCvbCvbCvbTbbOqbTcbRQbOsbOsbTdbTebTfbTgbOqbQLbMgbQMbNqbQObThbTibOGbOGbTjbNsbTkbTlbTmbTnbOGbOGbTobTpbTqbTrbTsbTtbTubTtbTvahjbOPbOPbOPbOPbOPahjbzgbNIbNJbTwbTxbTxbTybTzbTAbTBbTCbTDbTEbTFbTxbTGbTHbNJbTIbSCbEhbEhbEhbTJbTKbMNbTLbMNbTMbTNbEhbEhbEhbJWbTObRybTPbRxbTQbTRbTSbTTbTRbTUbQubTVbRybTWbRHbLEbgZbNhbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahjahjahjahjahjahjbCvbCvbPtbPubPvbCvbCvahlahlahlahlbHMbGkbHMahlahlahlahjbOqbPwbOsbOsbOsbOsbOubPxbPybOqbPzbMgbPAbPBbPCbPDbOGbPEbNGbPFbPGbPHbOGbOGbOGbNxbPIbOIbPJbOGbPKbPLbPMbPNbPObUpbPQbPRbPSbPTbPUbOPahjbPVbNIbNJbPWbPXbPYbPYbPZbQabQbbQcbNJbOYbQdbOYbQebOYbNNbDbbDcbQfbQgbQhbQibQjbQkbQlbQmbQnbQobQpbQqbQrbJWbSSbQtbSSbQubQubEybEybEybEybQvbQwbQxbQxbQxbQwbQybNhaBRblAblAbQzbgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbFXbFYbFXahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlbCvbQAbELbQBbELaClbCvahlahlahlahlbHMbLXbHMahlahjbQDbQEbOqbQFbQGbQHbOsbOsbQIbQJbOubQKbQLbMgbQMbQNbQObQPbOGbOGbOGbQQbQRbOGbQSbOGbQTbQUbOGbQVbQWbQXbQYbQZbRabRbbRcbRdahjbRebRfbPUbRgbOPahjbRhbNIbNJbRibRjbOXbRkbNJbRlbRmbRnbNJbOXbRobRpbRqbOXbNNbRrbRsbJWbJWbJWbJWbLybRtbRubRvbLybJWbJWbJWbJWbJWbRwbRxbRybRzbRAbRBbRCcbGbRCbREbQubRFbRybRGbRHbRIbNhblAbgZbgZbgZbgZbRJahjahjahjdsidsidsidsidsidsiahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahjbCvazvbELbELbELaBdbCvahlahlahlahlbHMbGkbJlahlahjbTabRNbRObRPbRQbOsbOsbOsbOsbOsbRRbOqbRSbRTbRUbRVbRWbRXbPHbOGbRYbRZbSabSbbScbSdbSebSfbSfbSgbShbPKbSibSjbSkbSlbSmbWIbSobPRbSpbPUbPUbOPahjbSqbNIbNJbdobOXbSsbNKbNJbNJbSxbSubNJbSvbSwbStbSybSzbSAbSBbSCbSDbSEbSEbSFbSGbMNbSHbSIbSJbSKbEhbEhbEhbJWbSLbRybRxbSMbSNbRBbSObSPbSQbSRbSSbRybSTbRybRHayWbSVbSWbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbCvazvbELbELbSYaBgbCvahlahjahlahlbJlbGkbCvbCvbCvbCvbTbbOqbTcbRQbOsbOsbTdbTebTfbTgbOqbQLbMgbQMbNqbQObThbTibOGbOGbTjbNsbTkbTlbTmbTnbOGbOGbTobTpbTqbTrbTsbTtbTubTtbTvahjbOPbOPbOPbOPbOPahjbzgbNIbNJbTwbTxbTxbTybTzbTAbTBbTCbTDbTEbTFbTxbTGbTHbNJbTIbSCbEhbEhbEhbTJbTKbMNbTLbMNbTMbTNbEhbEhbEhbJWbTObRybTPbRxbTQbTRbTSbTTbTRbTUbQubTVbRybTWbRHbLEbgZbNhbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbTXahlahjahjbTYbTYbTYbTYbTYbTYbTYbTYbCvbCvbTZbCvbCvbCvbPtbPubPvbCvbCvbLXbCvckdbELbCvbTbbOqbOqbUabOqbOqbOqbOqbOqbOqbOqbUbbUcbQMbUdbMjbNrbNrbUebUfbUgbUhbOGbOGbOGbTnbUibONbONbUjbUkbUlbPLbUmbUnbUobUpbPQbPRbUqbUrbUrbOPahjbzgbNIbNJbNJbNJbNJbNKbUsbUtbUubUvbUwbUxbUybUybUzbRobNJbTIbSCbEhbEhbEhbUAbUBbSIbUCbMNbUDbUEbSEbSEbUFbJWbUGbUHbUIbRxbUJbRBbSQbUKbTRbULbQubUMbUMbUMbRHbUNbQubNhbgZahjahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbUObUPbUQbURbUSbURbUTbUUbUVbUWbUXbUYbUZbTYbVabVbbVbbVbbVbbVbbVbbVbbVbbVbbVcbVdbVebVebVebVebVfbVgbVgbVhbVibVjbVkbVlbVlbVlbVmbVnbMgbQMbVobVpbVqbONbONbONbVrbVsbONbONbVtbVubVvbOGbVwbVxbVybVzbOGbVAbVBbVCbRdahjbRebVDbVEbVFbOPahjbVGbVHbVIbVIbVIbVJbNJbVKbOXbVLbVMbVNbVObSybVPbSzbVQbNJbTIbSCbJWbJWbJWbJWbVRbVSbTLbVTbVRbJWbJWbJWbJWbJWbVUbVVbVWbVXbVYbVZbVZbVZbWabWbbSSbUMbUMbWcbRHbWdbQubNhbgZbgZbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbWebWebWebWebWebWfbWgbWhbWibWibWhbTYbELbWjbWkbWkbWkbWkbWkbWkbWlbCvbWmbWnbWnbWnbWnbWnbWnbWnbWnbWobWobWpbWobWobWqbELbCvbWrbMgbQMbVobWsbWtbWubWvbSfbWwbWxbSfbSfbWybWzbWAbWBbWCbWDbWEbWFbOGbVAbWGbWHbWIbSobPRbWJbUrbUrbOPahjbWKbWLbCDbCDbCDbWMbNJbWNbWObUzbWPbWQbUtbWRbWSbWTbUtbNJbTIbSCbSDbSEbSEbWUbSGbMNbSHbSIbWVbWWbEhbEhbEhbJWbWXbWYbWZbRxbRybRxbRybRybXabXbbQubUMbUMbUMbRHbWdbQubNhblAblAbgZahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbXcbXdbXebXfbXebXgbXhbXibXjbXjbXkbTYbXlbXmahlahlahjahlahlahjahlbCvbWmbWnbXnbXobXpbXqbXrbXsbXnbXtbXubXvbXwbWobWobELbCvbXxbMgbQMbXybXzbXAbXBbXCbMjbMobMjbMjbMjbXDbXEbNrbNrbNrbXFbOGbVybOGbVAbVBbXGbRdahjbOPbOPbOPbOPbOPahjbXHbXIbCDbXJbXKbWMbNJbXLbRqbXMbXNbWQbOXbXObWSbXPbXQbNJbTIbSCbEhbXRbEhbXSbTKbMNbTLbMNbTMbXTbEhbXRbEhbJWbXUbXVbXWbXXbXYbXZbYabYbbYcbYdbSSbCxbYfchUbRHbYhbQubYibgZblAbgZbgZbgZdsidsiahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbWebWebWebWebWebWfbWgbWhbWibWibWhbTYbELbWjbWkbWkbWkbWkbWkbWkbWlbCvbWmbWnbWnbWnbWnbWnbWnbWnbWnbWobWobWpbWobWocbNbELbCvbWrbMgbQMbVobWsbWtbWubWvbSfbWwbWxbSfbSfbWybWzbWAbWBbWCbWDbWEbWFbOGbVAbWGbWHbWIbSobPRbWJbUrbUrbOPahjbWKbWLbCDbCDbCDbWMbNJbWNbWObUzbWPbWQbUtbWRbWSbWTbUtbNJbTIbSCbSDbSEbSEbWUbSGbMNbSHbSIbWVbWWbEhbEhbEhbJWbWXbWYbWZbRxbRybRxbRybRybXabXbbQubUMbUMbUMbRHbWdbQubNhblAblAbgZahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbXcbXdbXebXfbXebXgbXhbXibXjbXjbXkbTYbXlbXmahlahlahjahlahlahjahlbCvbWmbWnbXnbXobXpbXqbXrbXsbXnbXtbXubXvbXwbWobWobELbCvbXxbMgbQMbXybXzbXAbXBbXCbMjbMobMjbMjbMjbXDbXEbNrbNrbNrbXFbOGbVybOGbVAbVBbXGbRdahjbOPbOPbOPbOPbOPahjbXHbXIbCDcbobXKbWMbNJbXLbRqbXMbXNbWQbOXbXObWSbXPbXQbNJbTIbSCbEhbXRbEhbXSbTKbMNbTLbMNbTMbXTbEhbXRbEhbJWbXUbXVbXWbXXbXYbXZbYabYbbYcbYdbSSbCxbYfchUbRHbYhbQubYibgZblAbgZbgZbgZdsidsiahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjbXcbYjbYkbYlbYmbWhbYnbWhbYobWhbWhbYpbELbXmahlahlahjahlahlahjahlbCvbWmbWnbXnbYqbYrbYsbYtbYubXnbYvbYwbYxbYybYzbWobELbCvbWrbMgbQMbYAbYBbMobYCbYDbMjbYEcuLbYGbMjbYHbTnbZUbNrbYJbWFbOGbWDbYKbYLbUnbYMbUpbPQbPRbYNbYObYPbOPahjbCDbXIbCDbYQbXKbWMbNJbYRbYSbYTbYUbYVbOQbYWdprchWchXbNJbTIbSCbEhbEhbEhbYZbZabSIbUCbMNbUDbZbbSEbSEbUFbDcbRHbZcbZdbZebRHbRHbZfbZgbZhbZibZjbVYbVZbZkbUMbYhbQubNhbgZbrqbgZbZlbgZahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjbXcbZmbZnbZobZnbZpbZqbZrbZsbZtbZubTYbZvbZwahlahlahlahlahlahlahlbCvbWmbWnbZxbZybZzbYsbZAbZxbZxbYvbZBbZCbZDbZEbZFbZGbZHbZIbZJbZKbZLbZMbZNbZObZPbZQbZRbZSbZTbMjbOGbTndjybZVbYJbZWbOGbWDbYKbVAbVBbZXbRdahjbReclkbZZcaabOPahjbCDbXIbCDcabcacbWMbNJbNJcadcaebNJbNNbNJbNJbSubNJbNJbNJbTIbSCbJWbJWbJWbJWbVRcafbTLcagbVRbJWbJWbJWbJWbDcbTRcahbTRbTRbTRbRHbZfbZgcaicajcakcalbRxbCzbRHbYhbQubNhbgZblAblAblAcanahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGcahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahjahjahjahjahjahjahjbWebWebWebWebWebTYbTYcaobTYbTYbTYbTYahjahlahlaPYahlahlahlahlahlcaqbWmbWnbZxbZxcarcasbXnbZxcatcaucavcawcaxcaybWobELbCvcazcaAcaBcaCcaDcaEcaFcaGcaHcaIcaJcaKbMjcaLcaMbZUbNrbYJcaNbOGcaObYKbVAcaPcaQbWIbSobPRcaRbYObYObOPahjcaSbXIbCDcaTbXKbWMcaUbNJbNJcaVbNJdpEdpDdpCdpzcaZcbabXKbTIbSCbSDbSEbSEcbbbSGbMNbSHbSIcbccbdbEhbEhbEhbDccbebTRbTRbTRbTRbRHcbfcbgcbhcbibQubQubRxbQubRHcbjbQubNhbgZcbkcblcbmcbnahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHaaHdpXdpXaaHdpXdpXdpXaaRdpXdpXdpXaaHdpXahjahjbCvbELbELbELbELbELbELbELbELcbocbpahjahlahlahjdsiaFFahlahlahlbRMbWmbWncbscbtcascbubXnbXncbvcbwcbvcbxbYycbybWobELbTZbQLbMgcbzcbAdpFcaEcbCcbDcbEcbFciWcjcckbbPHcbIbNrbNrbNrcbJbOGcbKcbLbVAbVBbOGbRdahjbOPbOPbOPbOPbOPahjcbMbXIbCDcbNcbObVHbVIbVIcbPcbQbNKdpAcuYdpBdpzcbUcbVcbVcbWbSCbEhbEhbEhcbXbTKbMNbTLbMNbTMcbYbEhbEhbEhbDccbZbTRccabTRbTRccbcccccdcceccfbQubRxbRxccgbRHcchblAccibgZccjcckblAcclahjahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlahlahjahjahlahjahjahlahlahjahjahjahldpXahlahlbCvccmbELbCvbCvbTZbCvbCvbCvbCvbCvahlahlahldsiaDIauKdsidsiahjbRMbWmbWnccpbZxbXnbXnbXnbZxcatccqccrbYyccscctbZFbZHbZHccuccvccwcbAcbAccxcaFccycczccAccBccCbMjbOGbOJccDccEccFbQWccGccHccIbYLbUnccJbUpbPQbPRccKccLccLbOPahjbXHbXIbCDbCDbCDbXKbCDbCDccMccNbCDbCDcuBbCDbzgccNbFoccPccQbSCbEhbEhbEhccRccSbSIccTbMNbUDccUbSEbSEbUFbDcbTRbTRccVbTRbTRbRHcbfcbgccWccXbQuccYccZcdabRHcdbblAbNhbgZbgZbgZblAbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlcdccddcdeahlcdccddcdeahlcdccddcdeahjdpXahlahlbCvcdfcdgbCvcdhbELbELcdicdjcdkbCvahlahlahlatIdsidsiahjahlahlcdmbWmbWnbZxcdncdobXncdpbZxbZxbYvcdqbYybYycdrbWocdscdtcducdvcdwcdxcdycdzcaFcdzcaEcaFcdAcdBbMjcdCcdDcdEbSfbSfbShbUicdFbUmbSibVBcdGbRdahjbReclhcdIcdJbOPahjbCDbXIbXKcdKbXKbXKcdLbCDcdMcdNcdOcdPcdQcdRcdScdTcdUbgZcdVbSCbDcbDcbDcbDcbDccdWcdXcdYbDcbDcbDcbDcbDcbDcbRHbRHbRHbRHbRHbRHcdZcdZceacebbRHbRHbRHbRHbRHbLEbgZbNhbgZceccedblAbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlcdcceecdeahlcdcceecdeahlcdcceecdeahjahjahlahlbCvbPtbPvbCvbCvcefcegbQCbELbSYbCvahlahlahlahlahjahlahlahlahlbCvbWmbWnbXncehceibXncejcekbXnbYvcelcemcencenceocepceqcercescetceucevcewcexceycezcaFcdAceAbMjceBbOGbOJbUibONceCceDceEceFbNFceGceHbWIbSobPRceIccLccLbOPahjbCDceJbLnbLnbLnbLnceKceLceMceNceOcePceQcePceRceSceTbgZceUbLEahlahlahlahjahlahlceVahlahjahlahlahlahlbgZceWceXceYceZceZbRHcfacfaceacfbcfccfdblAblAblAcfebgZbYibgZcffblAblAbgZbgZbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjcdcceecdeahlcdcceecdeahjcdcceecdeahjahjahlahlahlahlahjahjbCvbCvbCvbCvbTZbCvbCvahlahlahlahlahjahlahlahjahlbCvbWmbWnbXncfgcfhcficfjcfkbXncflcfmcfncfocfpbWocfqcfrcfscftcfucfvcfwcfxcfycfzcfAcfBcfCcfDbMjcfEbQZcfFcfGbOGbOGbOGbOMbVvcfGbVBbXGbRdahjbOPbOPbOPbOPbOPahjbCDcabcfHcfIcfJcacbCDbCDbCDcfKcfLcdUbXKcfMcfNbzgbCDbgZceUbLEahlahlahlahjahlahlceVahlahjahlahlahlahlbgZcfOcfPbrscfQcfRbRHcfScfScfTcfbbRHbQubgZcfUcfVcfWbgZcfXbECbECbECcfYcfZcgacfZcgbdsiahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlcdcceecdeahjcdcceecdeahlcdcceecdeahlahjahlahlahlahlahlahlbCvckLbCvbELbELbCvahjahlahjahlahlahjahlahlahjahlbCvbWmbWnbWnbWnbWnbWnbWnbWnbWnbWobWobWobWobWobWobCvcgfbCvcggcghcghcghcgicgjcgkcghcglcgmcgncgocgpcgqbSkcgrcgscgtcgscgrcgucgrcgvbUicgwahjahjahjahjahjahjahjahlahjcbMbXKcbMahjahlbCDcgxbCDcgycgzcgAcgzcgBbzgbYQbCDceUbLEcgCcgDcgEbgZcgCcgDcuncgEbgZcgCcgDcgDcgEbgZcgFbgZcgGbgZbgZbRHbRHbRHcgHcgIbRHcgJbgZcbmblAcgKbgZccibgZbgZcgLbgZbgZbgZbgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHdpXahjahlcdcceecdeahjcdcceecdeahlcdcceecdeahjahjahjahjcgMcgNcgNcgNcgNbCvbCvcgObELbCvcgPbWkbWkbWkbWkbWkbWkbWkbWlbCvbCvbWmbCvcgQcgRcgScgScgScgScgScgScgScgScgScgTcgTcgScgUcefcggcnjcgWcgXcgYcgZchacghchbchcchdbMjchechfchgchhchichjchkchlbOGchmchnchobOIahjahjahlahlahlahlahjahlahjchpcfIchpahjahlbCDchqchrchschtbKPcePchuceJbLnceLchvchwchxchxchxchxchxchxchychzchzchzchzchAchAchBchCchAchAchAchDchEchFchGchHchIchEchEchEchEchJchKbgZbNhbgZchLblAblAbgZahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlahjahlahjahjchMahjahjahjchMahjahlahjchMahjahlahjchNchOchPchQchRchSchTcgebELchYchZciachZchZchZchZchZchZchZchZchZchZchZcibbCvbELbLXcicciccicciccicciccicciccicciccicciccidciccggcghciecifcigcihcnMcijcikcilcimciccinciocipciqcipciocipciqcipcircipcircisahjahjahlahlahlahlahjahlahjahlahlahlahjahlbCDchqcitcdMciucivciwcixdpQdpRdpSdpTdpNdpNdpNdpNdpNdpNdpOdpPdpNdpNdpNdpNdpNdpNdpVdpUciGciFciCciHciIciIciIciJciKciLciMciIciIciIciIciNciObgZciPbpYciQbgZahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjciRciSciSciTciUciUciUciUciUciUciUciUciUciUciUciVciXciYciXciZcjacjbcbHchZcjdcjecjfbCvcjgcjhcjhcjhcjhcjhcjhcjhcjibCvbELcjjcjkcjlcjmciccjncjncjociccjpcjqcjrcjscjtcjucjvcjwcjxcjycghcjzcjAcjBcjCcjDcjEcjFcjGckxcicahjcjIahjcjJahjcjIahjcjJahjcjKahjcjKahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbCDbXKcjLcjMcjNcjOcjPbFodpMcjRbCDbgZcgCcgDcgDcgEbgZcgCcgDcgDcgEbgZcgCcgDcgDcgEbgZcpGblAbgZcjScbmbgZbgZcgCcgEbgZbgZcjTblAcjTbgZcjUcjVbpWbgZbgZbgZbgZbgZahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlahjahlahjahjcjWahjahlahjcjWahjahlahjcjWahjahlahlchNchOcjXcjYcjZckacgNbELbELbELbELbCvahlahlahjahlahlahjahlahlahjbCvckdbELbCvbEMckecicckfckgckhckickjckkcklckmcknbYebYIbYXckrbhAcghbvCckuckvcjCckwcghaJbbSnbPPcicbOPckzbReckzbOPckzbReckzbOPckAbReckBbOPahlahlahlahlahlahlahlahlahlahlahlahlahjahlbCDbCDbCDbXKckCcjMccPcnCbCDbCDbCDahlahlahjahlahjahjahlahlahlahlahlahlahlahlahlbgZcnyckEbgZcjTblAbgZahlahlahlahlbgZblAblAckFckGckGckHckIckGahlahjahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHdpXahjahjcdcckJcdeahlcdcckJcdeahlcdcckJcdeahjahjahjahjckKcgNcgNcgNcgNckccmlbELbELbCvahjahjbGvbGvbGvbGvbGvbGvbGvbCvbCvbCvbCvcdjckOcicckPckhckhckickQckRckSckScamcgVcnHcnPciickUcghckWckXckYckZclacghclbchccnRcicbOPcldcnDclfbOPclgcnXclibOPcljcnYcllbOPahlahlahlahlahlahlahlahlahlahlahlahlahjahlbRJahlbCDcfKclmcnZcacbCDbCDahlbRJahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlbgZcnUbgZbgZcloblAbgZbgZcgCcgEbgZbgZblAclpckEckGclqclrclsckGahlahlahjahjahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcdcckJcdeahjcdcckJcdeahlcdcckJcdeahlahlahlahlahlahlahlahlbCvbCvbCvbXlbELbCvahlahlbGvcmUcmpcmocmncmmcmPclzbSYbELbELbELckOcicclAclAclBcicclCclDclEclFckpcmFckqcksckockocghclKclLclMclNclOclPclQclRcnScicbOPclTclUclTbOPclVclWclVbOPclXclYclZbOPahlahlahlahlahlahlahlahlahlahlahlahlahlahlbRJahlahlahjcmaahlahlahjahlahlbRJahlahlahlahlahjahjahlahlahlahlahlahlcmccmdcmebgZcoGbpYbgZcmgblAblAbgZblAblAblAblAcbmblAcmhckGcmicmjcmkckGahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGcahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjcdcckJcdeahlcdcckJcdeahlcdcckJcdeahjahlahlahlahlahlahlahlcgccgdcgcbELbELbCvahlahlbGvcmUcmVcmUcmYcmXcnBcmrcmsbVlbVlbVlcmtcicclAclAclBciccmucmvcmwcmxckTckVcktcmvcmzcmAcmvcmCcmDcmEcmFcmGcmHcmEcmIcotcicbOPclTcmKclTbOPclVcmLclVbOPclZcmMclZbOPahlahlahlahlahlahlaaeahlahlahlahlahlahlahlbRJahlahlahjcmNahlahlahlahlahlbRJahlahlahlahlahjahjahlahlahlahlahlahjcbnblAcmObgZcphblAbgZcmQblAblAbrqblAbgZbgZbgZcgCcgEbgZckGcmRcmScmTckGahlahlahjahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjcdcckJcdeahlcdcckJcdeahjcdcckJcdeahjahjahjahjahjahjahjahjbCvbCvbCvbCvbELbCvahjahjbGvcoacoBcoAcodcobbGvcmZcnaciccnbciccnccicclAclBclBciccndcnecnfcngckpclHclIclJclGclGcnkcnlcnmcnncnocnncnncnncnpcqMcicbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlbRJahlahlahlahlahjahjahlahlahlahlahjdsicbncnrblAbrqcpGblAbgZbgZbgZbgZbgZblAbgZahlahjahlahjahlcnscntcnucnvcnwahjahjahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaRahjcdccnxcdeahlcdccnxcdeahlcdccnxcdeahjdpXahjahlahlahlahlahlahlahlahlbLWbELcaqahlahlbGvcoDcoHcmUcoZcoIbGvcoEcoFciccnEciccnFciccicciccicciccnGcnHcnIcnJcmBcnKcmycnKcnLcnhcnNcnOcnOcnPcnPcnQcnPcnPdufduecicahjahlahlahlahjahjahlahlahjahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlaaeahlahlahlahlahlahlahlbRJahlahlahlahlahlahjahlahlahlahlahldsicbnblAbvkbgZdpwblAblAblAblAblAblAblAbgZahlahjahlahjahlahjcnVcnWcnVahjahlahlahjahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahlahjahlahlahlahjahjahjahlahlahjahjahldpXahjahjahlahlahlahlahlahlahlbRMbELbRMahlahlbGvcpecpkcmUcpjcpibGvcpFcpEbGvcoecofcogcohcoicojcokcolcomconcoocopcnicoqclcciccorciccorcicclccoqckUckUcosckUduhdugcpfduiciccicciccmvcmvcmvcmvcicahlahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlcoucmdcmebgZcnUbgZbgZcovcowckEcoxbgZbgZahlahjahlahlahlahjcoycnucoyahjahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHdpXaaHaaHaaRdpXdpXdpXdpXaaHdpXdpXaaHcozahlahjahjahlahlahlahlahlahjbRMbELbRMahjahjbGvcpYcuqcridptcoKdfecpCdhldgEdpudpvdoXcoLcoMcoNcoOcoPcmFckUcoQcoRckUcoSciccoTcoUcoVcoUcoWciccoXckUcoRcoYckUdujcnPcnPcqNcnPdsHcicdsWdsXcpacpbcpbcpcahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjcmbahlbgZbgZcgCcgEbgZbgZahjahjahlahlahlahlahjahlcpdahlahlahlahlahlahlahlahjahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlahlahlahlahlcdmbELcdmahlahlbGvcbSccOcaYcaXcaWbGvbSrbHWbGvckUckUcmFckUcmIcplcpmcpncmFcopckUckjcpocpocppcpqcprcpscptcpucpvcpwcpwcpxckUcopcmFckUckUbpackUbvHboSckhckhcpAcpBcbRcpDahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlbqzahlahlahjahlahjahlahlahjahjahjahlahlahlahjahlcpdahlahjahlahlahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlahlahlbCvbCvbTZbCvbCvahlbGvclucoJcbTbGvbGvbGvbGvbGvciccpHckUcmFckUcjFcpIcpJcpKcmFcpLcpMcpNcpOcpPciccpQcpRcpScopcpTciccpUcpVcpVcpMcpLcmFcpWciycdHclSbxfcicbxeckhcpZcpbcpbcqaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahjahlahlcqbcqbcqbcqcahjahjahjahjcpdahjahjahjahjahjaaRcqbcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlahlbCvckdbELcqdbCvahjbGvbGvbGvbGvbGvahjahlahlahjciccqeckUcmFckUckUcqfcmvcmvcqgciccqhcqicqicqiciccqjcqkcqlcqmcpyciccqicqicqicqhciccqgcmvcmvbpackUdpsciccmvcmvcmvcmvcicahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahjahlahlcqbahlahjahlahjahlahlahlcqoahlahjahjahlahlahlahlcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlbLWcqpcqqcqrbCvahjahlahlahjahlahlahjahlahlahjciccqscqtcmFcqucqvcqwcmvcqxcqyciccqzcqAcqBcqCcqDcqEcqFcqGcqHcpycqIcqAcqAcqAcqJciccqKcqLcicbpacjHciEciBckUbZYcqIahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahjahlahlcqbahlcqOcqOcqOcqOcqOahjcqPahjcqOcqOcqOcqOcqOahlcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbRMcqQcqRcqSbCvbCvcqTcqUcqUcqUcqUcqUcqUcqVcmvciccqWcqXcqYcqZcqWciccicciccqgcicciccmzcracrbcrccrdcpMcrecpMcrfcrgcrbcracrhcicciccqgciccicclwcmJclxclvckUciAcizahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlcqbahjcrjcrkcrkcrkcrkcrlcqPcrmcrncrncrncrncroahjcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahjahjahjahjahjahjahjbWebWebWebWebWebTYbTYcaobTYbTYbTYbTYahjahlahlaPYahlahlahlahlahlcaqbWmbWnbZxbZxcarcasbXnbZxcatcaucavcawcaxcaybWobELbCvcazcaAcaBcaCcaDcaEcaFcaGcaHcaIcaJcaKbMjcaLcaMbZUbNrbYJcaNbOGcaObYKbVAcaPcaQbWIbSobPRcaRbYObYObOPahjcaSbXIbCDcaTbXKbWMcdbbNJbNJcaVbNJdpEdpDdpCdpzcaZccmbXKbTIbSCbSDbSEbSEcbbbSGbMNbSHbSIcbccbdbEhbEhbEhbDccbebTRbTRbTRbTRbRHcbfcbgcbhcbibQubQubRxbQubRHcbjbQubNhbgZcbkcblcbmcbnahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHaaHdpXdpXaaHdpXdpXdpXaaRdpXdpXdpXaaHdpXahjahjbCvbELbELbELbELbELbELbELbELbJjcbpahjahlahlahjdsiaFFahlahlahlbRMbWmbWncbscbtcascbubXnbXncbvcbwcbvcbxbYycbybWobELbTZbQLbMgcbzcbAdpFcaEcbCcbDcbEcbFciWcjcckbbPHcbIbNrbNrbNrcbJbOGcbKcbLbVAbVBbOGbRdahjbOPbOPbOPbOPbOPahjcbMbXIbCDcchcbObVHbVIbVIcbPcbQbNKdpAcuYdpBdpzcbUcbVcbVcbWbSCbEhbEhbEhcbXbTKbMNbTLbMNbTMcbYbEhbEhbEhbDccbZbTRccabTRbTRccbcccccdcceccfbQubRxbRxccgbRHbRLblAccibgZccjcckblAcclahjahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlahlahjahjahlahjahjahlahlahjahjahjahldpXahlahlbCvbRKbELbCvbCvbTZbCvbCvbCvbCvbCvahlahlahldsiaDIauKdsidsiahjbRMbWmbWnccpbZxbXnbXnbXnbZxcatccqccrbYyccscctbZFbZHbZHccuccvccwcbAcbAccxcaFccycczccAccBccCbMjbOGbOJccDccEccFbQWccGccHccIbYLbUnccJbUpbPQbPRccKccLccLbOPahjbXHbXIbCDbCDbCDbXKbCDbCDccMccNbCDbCDcuBbCDbzgccNbFoccPccQbSCbEhbEhbEhccRccSbSIccTbMNbUDccUbSEbSEbUFbDcbTRbTRccVbTRbTRbRHcbfcbgccWccXbQuccYccZcdabRHbQCblAbNhbgZbgZbgZblAbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlcdccddcdeahlcdccddcdeahlcdccddcdeahjdpXahlahlbCvcdfcdgbCvcdhbELbELbOlaClcdkbCvahlahlahlatIdsidsiahjahlahlcdmbWmbWnbZxcdncdobXncdpbZxbZxbYvcdqbYybYycdrbWocdscdtcducdvcdwcdxcdycdzcaFcdzcaEcaFcdAcdBbMjcdCcdDcdEbSfbSfbShbUicdFbUmbSibVBcdGbRdahjbReclhcdIcdJbOPahjbCDbXIbXKcdKbXKbXKcdLbCDcdMcdNcdOcdPcdQcdRcdScdTcdUbgZcdVbSCbDcbDcbDcbDcbDccdWcdXcdYbDcbDcbDcbDcbDcbDcbRHbRHbRHbRHbRHbRHcdZcdZceacebbRHbRHbRHbRHbRHbLEbgZbNhbgZbNibOjblAbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlcdcceecdeahlcdcceecdeahlcdcceecdeahjahjahlahlbCvbPtbPvbCvbCvcefcegaClbELbSYbCvahlahlahlahlahjahlahlahlahlbCvbWmbWnbXncehceibXncejcekbXnbYvcelcemcencenceocepceqcercescetceucevcewcexceycezcaFcdAceAbMjceBbOGbOJbUibONceCceDceEceFbNFceGceHbWIbSobPRceIccLccLbOPahjbCDceJbLnbLnbLnbLnceKceLceMceNceOcePceQcePceRceSceTbgZceUbLEahlahlahlahjahlahlceVahlahjahlahlahlahlbgZceWayRceYceZceZbRHcfacfaceacfbcfccfdblAblAblAbRLbgZbYibgZcffblAblAbgZbgZbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjcdcceecdeahlcdcceecdeahjcdcceecdeahjahjahlahlahlahlahjahjbCvbCvbCvbCvbTZbCvbCvahlahlahlahlahjahlahlahjahlbCvbWmbWnbXncfgcfhcficfjcfkbXncflcfmcfncfocfpbWocfqcfrcfscftcfucfvcfwcfxcfycfzcfAcfBcfCcfDbMjcfEbQZcfFcfGbOGbOGbOGbOMbVvcfGbVBbXGbRdahjbOPbOPbOPbOPbOPahjbCDcabcfHcfIcfJcacbCDbCDbCDcfKbSUcdUbXKcfMcfNbzgbCDbgZceUbLEahlahlahlahjahlahlceVahlahjahlahlahlahlbgZcfOcfPbrscfQcfRbRHcfScfScfTcfbbRHbQubgZcfUcfVbRLbgZcfXbECbECbECcfYcfZcgacfZcgbdsiahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlcdcceecdeahjcdcceecdeahlcdcceecdeahlahjahlahlahlahlahlahlbCvckLbCvbELbELbCvahjahlahjahlahlahjahlahlahjahlbCvbWmbWnbWnbWnbWnbWnbWnbWnbWnbWobWobWobWobWobWobCvcgfbCvcggcghcghcghcgicgjcgkcghcglcgmcgncgocgpcgqbSkcgrcgscgtcgscgrcgucgrcgvbUicgwahjahjahjahjahjahjahjahlahjcbMbXKcbMahjahlbCDcgxbCDcgycgzcgAcgzcgBbzgbYQbCDceUbLEcgCcgDcgEbgZcgCcgDcuncgEbgZcgCcgDcgDcgEbgZcgFbgZcgGbgZbgZbRHbRHbRHcgHcgIbRHaDGbgZcbmblAcgKbgZccibgZbgZcgLbgZbgZbgZbgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHdpXahjahlcdcceecdeahjcdcceecdeahlcdcceecdeahjahjahjahjcgMcgNcgNcgNcgNbCvbCvcgObELbCvcgPbWkbWkbWkbWkbWkbWkbWkbWlbCvbCvbWmbCvcgQcgRcgScgScgScgScgScgScgScgScgScgTcgTcgScgUcefcggcnjcgWcgXcgYcgZchacghchbchcchdbMjchechfchgchhchichjchkchlbOGchmchnchobOIahjahjahlahlahlahlahjahlahjchpcfIchpahjahlbCDchqchrchschtbKPcePchuceJbLnceLchvchwchxchxchxchxchxchxchychzchzchzchzchAchAchBchCchAchAchAchDchEchFbSXchHchIchEchEchEchEchJchKbgZbNhbgZchLblAblAbgZahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlahjahlahjahjchMahjahjahjchMahjahlahjchMahjahlahjchNchOchPchQchRchSchTcgebELchYchZciachZchZchZchZchZchZchZchZchZchZchZcibbELbELbLXcicciccicciccicciccicciccicciccicciccidciccggcghciecifcigcihcnMcijcikcilcimciccinciocipciqcipciocipciqcipcircipcircisahjahjahlahlahlahlahjahlahjahlahlahlahjahlbCDchqcitcdMciucivciwcixdpQdpRdpSdpTdpNdpNdpNdpNdpNdpNdpOdpPdpNdpNdpNdpNdpNdpNdpVdpUciGciFciCciHciIciIciIciJciKciLcaUciIciIciIciIciNciObgZbOjblAcbabgZahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjciRciSciSciTciUciUciUciUciUciUciUciUciUciUciUciVciXciYciXciZcjacjbcbHchZcjdcjeaClbCvcjgcjhcjhcjhcjhcjhcjhcjhcjibCvbCvcjjcjkcjlcjmciccjncjncjociccjpcpFcpEcpCcpOcpNcjvcjwcjxcjycghcjzcjAcjBcjCcjDcjEcjFcjGckxcicahjcjIahjcjJahjcjIahjcjJahjcjKahjcjKahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbCDbXKcjLcjMcjNcjObXJbFobSZbWqbCDbgZcgCcgDcgDcgEbgZcgCcgDcgDcgEbgZcgCcgDcgDcgEbgZcpGblAbgZcjScbmbgZbgZcgCcgEbgZbgZcjTblAcjTbgZcjUcjVbpWbgZbgZbgZbgZbgZahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlahjahlahjahjcjWahjahlahjcjWahjahlahjcjWahjahlahlchNchOcjXcjYcjZckacgNbELbELbELbELbCvahlahlahjahlahlahjahlahlahjahlbCvckdbCvbEMckecicckfckgckhckickjbhAckUckUckUcoObYIbYXckrbhAcghbvCckuckvcjCckwcghaJbbSnbPPcicbOPckzbReckzbOPckzbReckzbOPckAbReckBbOPahlahlahlahlahlahlahlahlahlahlahlahlahjahlbCDbCDbCDbXKckCcjMccPcnCbCDbCDbCDahlahlahjahlahjahjahlahlahlahlahlahlahlahlahlbgZcnyckEbgZcjTblAbgZahlahlahlahlbgZblAblAbEzckGckGckHckIckGahlahjahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHdpXahjahjcdcckJcdeahlcdcckJcdeahlcdcckJcdeahjahjahjahjckKcgNcgNcgNcgNbJibJjbELbELbCvahjahjcjtcjtcjtcjtcjtcjtcjtahjbCvbCvbCvaClckOcicckPckhckhckickQckRckRckRckTcgVcnHcnPciickUcghckWckXckYckZclacghclbchccnRcicbOPcldcnDclfbOPclgcnXclibOPcljcnYcllbOPahlahlahlahlahlahlahlahlahlahlahlahlahjahlbRJahlbCDcfKclmcnZcacbCDbCDahlbRJahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlbgZcnUbgZbgZayRblAbgZbgZcgCcgEbgZbgZblAclpckEckGclqclrclsckGahlahlahjahjahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcdcckJcdeahjcdcckJcdeahlcdcckJcdeahlahlahlahlahlahlahlahlbCvbCvbCvbXlbELbCvahlahlcjtclFclzclEclzclucjtahlbCvbSYbELbELckOcicclAclAclBcicclCclDcmmckUbpacmFckqcksckockocghclKclLclMclNclOclPclQclRcnScicbOPclTclUclTbOPclVclWclVbOPclXclYclZbOPahlahlahlahlahlahlahlahlahlahlahlahlahlahlbRJahlahlahjcmaahlahlahjahlahlbRJahlahlahlahlahjahjahlahlahlahlahlahlcmccmdcmebgZbJkaDGbgZaCqblAblAbgZblAblAblAblAcbmblAcmhckGcmicmjcmkckGahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGcahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjcdcckJcdeahlcdcckJcdeahlcdcckJcdeahjahlahlahlahlahlahlahlcgccgdcgcbELbELbCvahlahlcjtcmscmocmncmrcmpcjtahlbCvcegbELbELckOcicclAclAclBciccmucmvcmtcmxcmwckVcktcmvcmzcmAcmvcmCcmDcmEcmFcmGcmHcmEcmIcotcicbOPclTcmKclTbOPclVcmLclVbOPclZcmMclZbOPahlahlahlahlahlahlaaeahlahlahlahlahlahlahlbRJahlahlahjcmNahlahlahlahlahlbRJahlahlahlahlahjahjahlahlahlahlahlahjcbnblAcmObgZcphblAbgZcmQblAblAbrqblAbgZbgZbgZcgCcgEbgZckGcmRcmScmTckGahlahlahjahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjcdcckJcdeahlcdcckJcdeahjcdcckJcdeahjahjahjahjahjahjahjahjbCvbCvbCvbCvbELbCvahjahjcjtcmPcoZcoUcoPcmPcjtahjbCvciccnbciccnccicclAclBclBciccndcnecmycmBbpaclHclIclJclGclGcnkcnlcnmcnncnocnncnncnncnpcqMcicbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlbRJahlahlahlahlahjahjahlahlahlahlahjdsicbncnrblAbrqcpGblAbgZbgZbgZbgZbgZblAbgZahlahjahlahjahlcnscntcnucnvcnwahjahjahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaRahjcdccnxcdeahlcdccnxcdeahlcdccnxcdeahjdpXahjahlahlahlahlahlahlahlahlbLWbELcaqahlahlcjtcmZcnfcpkcnqcngcjtcjtcjtciccnEciccnFciccicciccicciccnGcnHcnPcnPcqNcnPcnOcnPcpjcpicpecnOcnOcnPcnPcnQcnPcnPdufduecicahjahlahlahlahjahjahlahlahjahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlaaeahlahlahlahlahlahlahlbRJahlahlahlahlahlahjahlahlahlahlahldsicbnblAaBRbgZbLkblAblAblAblAblAblAblAbgZahlahjahlahjahlahjcnVcnWcnVahjahlahlahjahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahlahjahlahlahlahjahjahjahlahlahjahjahldpXahjahjahlahlahlahlahlahlahlbRMbELbRMahlahlcjtcnBcppcpocpmcnIcoacodcobcoacoecofcogcohcoicojcokcolcomconcoocopcnicoqclcciccpqciccpqcicclccoqckUckUcosckUduhdugcpfduiciccicciccmvcmvcmvcmvcicahlahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlcoucmdcmebgZcnUbgZbgZbLlcowckEcoxbgZbgZahlahjahlahlahlahjcoycnucoyahjahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHdpXaaHaaHaaRdpXdpXdpXdpXaaHdpXdpXaaHcozahlahjahjahlahlahlahlahlahjbRMbELbRMahjahjcjtcprcoDcptcoDcoEcoHcoFcoIcoHcoKcnPcoJcpjcpvcamcpucamcpwccOcoQcoRckUcoSciccoTcpxcoVcpxcoWciccoXckUcoRcoYckUdujcnPcnPcqNcnPdsHcicdsWdsXcpacpbcpbcpcahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjcmbahlbgZbgZcgCcgEbgZbgZahjahjahlahlahlahlahjahlcpdahlahlahlahlahlahlahlahjahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlahlahlahlahlcdmbELcdmahlahlcjtcjscjrcnhcnacmYcmUcmXcmVcmUcaWcamcaXcaYcmIcplcqDcpncmFbYecambGvbGvbGvbHWbSrcjqcpsckSckkcbTcbScbSccOckUcopcmFckUckUbpackUbvHboSckhckhcpAcpBcbRcpDahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlbqzahlahlahjahlahjahlahlahjahjahjahlahlahlahjahlcpdahlahjahlahlahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlahlahlbCvbCvbTZbCvbCvahlcjtcknckmcklcjtcjtcjtcjtcjtciccpHckUcjuckUcjFcpIcpJcpKcmFcpLcpMcoAcnNcorciccpQcnLcpScopcpTciccnKcnJcnJcpMcpLcmFcpWciycdHclSbxfcicbxeckhcpZcpbcpbcqaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahjahlahlcqbcqbcqbcqcahjahjahjahjcpdahjahjahjahjahjaaRcqbcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlahlbCvckdbELcqdbCvahjcjtcjtcjtcjtcjtahjahlahlahjciccqeckUckpcoNcoNckycmvcmvcqgciccqhcoBcoBcoBciccqjcqkcqlcqmcpyciccoBcoBcoBcqhciccqgcmvcmvbpackUdpsciccmvcmvcmvcmvcicahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahjahlahlcqbahlahjahlahjahlahlahlcqoahlahjahjahlahlahlahlcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlbLWbDicqqcqrbCvahjahlahlahjahlahlahjahlahlahjciccqscqtcmFcqucqvcqwcmvcqxcqyciccqzcoLcoMcoLcqDcqEcqFcqGcqHcpycqIcoLcoLcoLcqJciccqKcqLcicbpacjHciEciBckUbZYcqIahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahjahlahlcqbahlcqOcqOcqOcqOcqOahjcqPahjcqOcqOcqOcqOcqOahlcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbRMcqQcqRbfFbCvbCvcqTcqUcqUcqUcqUcqUcqUcqVcmvciccqWcqXcqYcqZcqWciccicciccqgcicciccmzcracrbcrccrdcpMcrecpMcrfcrgcrbcracrhcicciccqgciccicclwcmJclxclvckUciAcizahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlcqbahjcrjcrkcrkcrkcrkcrlcqPcrmcrncrncrncrncroahjcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjcrpcrqcrqcrrbCvahjahlahlahjahlahlahjahlahlahjdsidsidsiahjahlahjdsiciccrscrtcruahlahlahlcrvcrwcracracracracracrwcrxahlahlahlcrycrzcrAciccleciccicdrlcpXciDcjQahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlcqbahjcrBcrBcrBcrBcrBahlcqPahlcrBcrBcrBcrBcrBahjcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldsidsidsidsidsidsiahlahjahlahjahjahlahlahlahjciccrCcrDahlahlahlahjahjahjahjahjahjahjahjahjahjahjahlahlahlcrEcrCcicdrndrTciccmvcmvckDcmvahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlcqbahlahjahlahjahjahjahlcqPahlahjahlahjahlahjahlcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlciccrFcrGcrHahjahjahjcrIahlahlahlahlcrIahlahlcrIahjahjahjcrHcrJcrKciccqndoBcmvahjahlclndtAahjahlahlahlahjahlahlahlahjahlahlahlahjahlahlahlahjahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcqbahlcqOcqOcqOcqOcqOahjcqPahjcqOcqOcqOcqOcqOahjcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
@@ -9353,20 +9305,20 @@ ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlah
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsdcsdcsdcsdcsdcsdcsdcsdcsdahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlclbciccicciccrHahjahjahjahlahlahlahlahlahlahjahjahjahjcrHcicciccicclbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjdpHdpHdsmdrUdrUdqudsndqudquahlahlahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcqbcqbcqbcqbcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsdcsdcsdcsdcsdcsdcsdcsdcsdahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlcKQciccicciccicciccicciccicciccicciccicciccicciccicciccKQahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjdsidsiahlahjahldsjdrWdrUdrUdsldskdsjahjahjahjdsidsiahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsdcsdcsdcsdcsdahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlcKQcKQcKQcKQdoJcKQcKQcKQcKQcKQcKQcKQdoJcKQcKQcKQcKQahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdpXdshdshdpXdpXahldsddsedsgdsfdscdsbdsdahldpXdpXdshdshdpXdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsdcsdcsdcsdcsdahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahlahlahlahlahjahjahjahjahlahlahlahlahlahjahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdrHdrYdrXdpXdpXdrSdrWdrUdrVdrUdtadrSdpXdpXdrZdsadrIdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsdcsdcsdcsdcsdahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahlahlahlahlahjahjahjahjahlahlahlahlahlahjahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdrHdrYdrXdpXdpXdrSdrWdrUdrVdrUcpPdrSdpXdpXdrZdsadrIdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdrHdrIdrOdqidrcdrcdrKdrLdrcdrLdrMdrcdrcdqidrJdrHdrIdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdrEdrGdqpdqpdrFdrAdrzdredredredrDdrCdrBdqedqedrxdrydqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdrRdrQdrQdrcdrpdredredrudredredrodrcdrQdrQdrPdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdqmahlahldrcdrvdrwdrtdpIdrrdrsdrqdrcahlahldqfdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdradpHdpHdpHdrcdrddredrfdpGdrfdredridrcdpHdpHdpHdrjdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdqmahlahldrcdsYdrmdrfdrfdtqdrmdsZdrcahlahldqfdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcslcslcslcslcslcslcslcslcslahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdqmahlahldrcdsYcoGdrfdrfdtqcoGdsZdrcahlahldqfdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcslcslcslcslcslcslcslcslcslahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdqmahlahldqudqQdqtdqTdqUaXNdqvdqWdquahlahldqfdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcslcslcslcslcslcslcslcslcslahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdqmahldquaXNdqZdqDdqYbandqXdqDdqVaXNdquahldqfdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcslcslcslcslcslcslcslcslcslahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdqmahldquaXNdqMbanbandqObanbandqPaXNdquahldqfdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcslcslcslcslcslcslcslcslcslahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdqmahldquaXNcmlbanbandqObanbancovaXNdquahldqfdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcslcslcslcslcslcslcslcslcslahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdqRdpHdpHdquaXNdqDbanbcybcybcybandqDaXNdqudpHdpHdqSdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcslcslcslcslcslcslcslcslcslahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdqmdquaXNdqFdqDdqGbcydqIbcydqGdqDdqHaXNdqudqfdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcslcslcslcslcslahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsmcsmcsmcsmcsmcsmcsmcsmcsmahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdqmahldquaXNdqDbandqKdqLdqJbandqDaXNdquahldqfdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcslcslcslcslcslahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsdcsdcsdcsdcsdahlcsdcsdcsdcsdcsdahlcsdcsdcsdcsdcsdahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsmcsmcsmcsmcsmcsmcsmcsmcsmahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdqmahldquaXNdqMbanbandqzbanbandqPaXNdquahldqfdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcslcslcslcslcslcslcslcslcslcslahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsdcsdcsdcsdcsdahlcsdcsdcsdcsdcsdahlcsdcsdcsdcsdcsdahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsmcsmcsmcsmcsmcsmcsmcsmcsmahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdqmahldquaXNcmlbanbandqzbanbancovaXNdquahldqfdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcslcslcslcslcslcslcslcslcslcslahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsdcsdcsdcsdcsdahlcsdcsdcsdcsdcsdahlcsdcsdcsdcsdcsdahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsmcsmcsmcsmcsmcsmcsmcsmcsmahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdqmahldquaXNdtlbandqAdqBbxdbandtlaXNdquahldqfdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcslcslcslcslcslcslcslcslcslcslahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsdcsdcsdcsdcsdahlahlahlahlahlahlahlcsdcsdcsdcsdcsdahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsmcsmcsmcsmcsmcsmcsmcsmcsmahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdqxdpHdpHdpHdquaXNdqvaXNdqwaXNdqtaXNdqudpHdpHdpHdqsdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcslcslcslcslcslcslcslcslcslcslcslcslcslcslahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsmcsmcsmcsmcsmcsmcsmcsmcsmahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdqmahlahlahldqudqudqudtjdqudqudquahlahlahldqfdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcslcslcslcslcslcslcslcslcslcslcslcslcslcslahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
@@ -9572,14 +9524,14 @@ ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlah
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcCPcCPcCPcDAcDBcDCcDDcDDcDDcDEcDBcDFcCPcCPcCPcCPcDicCPcDwcCQcDwcCQcCPcCRcCPcCRcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDpcDGcDGcDHcDIcDJcDKcDLcDGcDGcAlcCocCocCocCpcBFcBGcBHcAQcDxcDxcDxcDxcAQcDMcBxcBxcDNcAQahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcCPcCPcCPcDBcDOcDPcDQcDRcDScDTcDTcDBcDUcCPcCPcDwcCEcCEcDVcDWcCEcCEcDwcDXcDYcDwcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDpcDZcEacEbcEccEdcEecEbcEacDZcAlcCocEfcEgcEhcAlahlahlcAQcEicEicEjcEjcAQcBycBxcBxcDzcBAahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcCPcCPcCPcDBcEkcDPcDPcElcDPcDPcDPcDBcDUcCPcEmcCEcCEcEncEocEocEncCEcCEcCEcCEcCEcCEcCEcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDpcEacEpcEqcEccEdcEecEqcErcEacAlcCocEscEtcEucAlahlahlcEvcBlcEwcEwcEwcEwcEwcEwcEwcBlcExahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcCPcCPcCPcDBcEycDPcDPcDPcEzcDPcEAcDBcDUcDicEmcCEcEBcEBcEBcEBcEBcEBcEBcEBdpxdtdcEDcEEcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDpcEFcEacEFcEccEdcEecEFcEacEFcAlcCocCocCocCocAlahlahlahlcEvcEGcEGcEGcEGcEGcEGcEGcExahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcCPcCPcCPcDBcEycDPcDPcDPcEzcDPcEAcDBcDUcDicEmcCEcmgcEBcEBcEBcEBcEBcEBcEBdpxdtdcEDcEEcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDpcEFcEacEFcEccEdcEecEFcEacEFcAlcCocCocCocCocAlahlahlahlcEvcEGcEGcEGcEGcEGcEGcEGcExahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcCPcCPcCPcEHcDBcDBcDBcEIcDBcDBcDBcEJcCPcCPcEKcCEcELcEMcEMcEBcEBcEBcEBcEBcENcEOcEOcEOcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDpcEPcEacEacEccEdcEecEacEacEQcAlcERcEScEScETcAlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcCPcCPcCPcCPcCPcDBcEUcDPcEVcDBcEWcDwcDwcDwcEXcCEcEBcEYcEZcEMcEBcEBcFacFbdpxcFccFdcCEcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDpcFecFfcFfcEccEdcEecFgcFgcFhcAlcAlcFicAlcAlcAlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcCPcCPcCPcCPcCPcDBcDPcDPcDPcDBcFjcFkcFkcDWcCEcCEcEBcFlcFmcEMcEBcEBcFacFncCEcCEcCEcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDpcDGcDGcDGcDGcEdcDGcDGcDGcDGcAlcApcApcApcApcAlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcDAcDBcDBcDBcDBcDBcDPcDPcDPcDBcFocFpcFpcFpcFqcFrcEBcEBcEBcEBcEBcEBcFacFncCEcCEcCEcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDGcEdcDGcFscFscFscApcApcApcApcApcAlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcDBcEAcDPcDPcFtcDBcDPcDPcDPcDBcFucFqcDVcDWcCEcCEcEBcEMcEMcEMcEBcEBcFacFvcCEcFwcFxcCEcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDGcDGcDGcDGcDGcDGcDGcDGcDJcDGcDGcDGcDGcDGcDGcDGcDGcAlcAlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcCPcCPcCPcCPcCPcDBcDPcDPcDPcDBcFjcFkcFkcFkcDWcCEcEBcFlcFmcEMcEBcEBcFacFncCEcCEcCEcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDpcDGcDGcDGcDGcEdcDGcDGcDGcDGcAlcApcApcApcApcAlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcDAcDBcDBcDBcDBcDBcDPcDPcDPcDBcFocFpcFpcFpcFpcFrcEBcEBcEBcEBcEBcEBcFacFncCEcCEcCEcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDGcEdcDGcFscFscFscApcApcApcApcApcAlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcDBcEAcDPcDPcFtcDBcDPcDPcDPcDBcFucFqcDVcFkcDWcCEcdjcEMcEMcEMcEBcEBcFacFvcCEcFwcFxcCEcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDGcDGcDGcDGcDGcDGcDGcDGcDJcDGcDGcDGcDGcDGcDGcDGcDGcAlcAlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcDBcEAcDPcFycFzcDBcDPcDPcDPcDBcDBcFAcFBcDFcFCcCEcFDcFEcFFcFEcFEcEBcEBcEBcFGcFHcFHcFIcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDGcFJcFKcFKcFKcFKcFKcFJcFJcFJcFKcFKcFKcFKcFKcFJcDGahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcFLcCPcDBcEAcDPcFycFMcDBcDPcDPcDPcDBcDPcDPcDPcDBcEKcCEcFNcFOcFPcFOcFQcEBcEBcEBcCEcFRdtccFIcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcFScFJcFJcFJcFTcFJcFJcFJcFJcFJcFJcFJcFTcFJcFJcFJcFSahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcFLcCPcDBcEAcDPcFycFMcDBcDPcDPcDPcDBcDPcDPcDPcDBcEKcCEcFPcFOcFPcFPcdicEBcEBcEBcCEcFRdtccFIcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcFScFJcFJcFJcFTcFJcFJcFJcFJcFJcFJcFJcFTcFJcFJcFJcFSahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcDBcEAcDPcDPcDPcFUcDPcDPcDPcFVcDPcDPcDPcDBcEmcCEcCEcFbcFWcFXcFYcCEcCEcCEcCEcCEcCEcCEcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDGcFJcFKcFKcFKcFKcFKcFJcFJcFJcFKcFKcFKcFKcFKcFJcDGahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcDBcEAcDPcDPcDPcFZcDPcDPcDPcGacDPcDPcGbcDBcGccFCcCEcCEcCEcCEcCEcCEahlahlahlahlahlahlahlahlahlcGdcGdcGdcGdcGdcGdcGdcGdcGdcGdcGdcGdahlahlahlahlahlahlahlahlahlahlcDGcDKcGecGecGecGecGecGecGecGecGecGecGecGecGecDIcDGahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcDAcDBcDBcDBcDBcDBcDBcGfcDPcDPcDBcDBcDBcDBcDBcDBcDFcFCcCEahlahlahlahlahlahlahlahlahlahlahlahlahlcGdcGgcGhcGicGjcGkcGlcGdcGmcGncGocGdahlahlcGpcGpcGpcGpcGpcGpcGpcGpcGpcGqcGrcGrcGrcGrcGrcGrcGrcGrcGrcGrcGrcGrcGrcGqcGpcGpcGpcGpcGpcGpcGpcGpcGpahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
@@ -10135,13 +10087,13 @@ ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlah
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabahlahldabdabdabdabdabdacdacdabdabdabahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdacdacdabdabahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdabdabahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdacdacahlahlcJWcJYcJYdaddadcJYcJYcJYcJYcJZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdaccJWcJYdaedacdafcPCcPCdagdagdahcPCdaidajahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdabdabdabdakcPCcPCcPCcPCcPCdalcPCdaidamahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdabdabdabdandaocPCdapdalcPCdalcPCdaldaidamahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdabdaqcPCdarcPCdascPCdafcPCcPCcPCdaldaidamahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdabdatcJYdaucPCdavcPCcPCdawdaxdagcPCdaidayahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
-ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdabdabdabcKtcJYcJYdaddazcJYcJYcJYcJYcKvahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdacdacahlahlceccecceccedcedcecceccecceccecahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdaccecceccecdaccgJcfecfechGchGceXcfecfLcfWahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdabdabdabdakcfecfecfecfecfeciMcfecfLcfWahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdabdabdabdanciQcfeciPciMcfeciMcfeciMcfLcfWahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdabcjRcfecjPcfecjfcfecgJcfecfecfeciMcfLcfWahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdabceccecceccfeckccfecfeckFclochGcfecfLcfWahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
+ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdabdabdabceccecceccedcedcecceccecceccecahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdabdabdabdabdabdabdabdabdabdabdabdabahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabahldabdabdabdabdabdacdacdabdabdabdabdabdabdabdabdabdabdabahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdacdacdacdabdabdabdabdabdabdabdabdabahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl
diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm
index 5d47b855257..e6dc792d33a 100644
--- a/code/ATMOSPHERICS/atmospherics.dm
+++ b/code/ATMOSPHERICS/atmospherics.dm
@@ -21,13 +21,11 @@ Pipelines + Other Objects -> Pipe network
/obj/machinery/atmospherics/var/initialize_directions = 0
-/obj/machinery/atmospherics/var/pipe_color
-
+/obj/machinery/atmospherics/var/pipe_color/
+/*
/obj/machinery/atmospherics/process()
- if(gc_destroyed) //comments on /vg/ imply that GC'd pipes still process
- return PROCESS_KILL
- build_network()
-
+ //build_network()
+*/
/obj/machinery/atmospherics/proc/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference)
// Check to see if should be added to network. Add self if so and adjust variables appropriately.
// Note don't forget to have neighbors look as well!
@@ -89,3 +87,6 @@ Pipelines + Other Objects -> Pipe network
qdel(src)
else
return ..()
+
+/obj/machinery/atmospherics/proc/nullifyPipenetwork()
+ return
\ No newline at end of file
diff --git a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm
index 923bb5ea0c2..27c9085e6ac 100644
--- a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm
@@ -128,3 +128,7 @@
node2 = null
return null
+
+/obj/machinery/atmospherics/binary/nullifyPipenetwork()
+ network1 = null
+ network2 = null
\ No newline at end of file
diff --git a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm
index deb86fb9f8e..4976ebb5feb 100644
--- a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm
@@ -160,3 +160,8 @@
node3 = null
return null
+
+/obj/machinery/atmospherics/trinary/nullifyPipenetwork()
+ network1 = null
+ network2 = null
+ network3 = null
\ No newline at end of file
diff --git a/code/ATMOSPHERICS/components/unary/unary_base.dm b/code/ATMOSPHERICS/components/unary/unary_base.dm
index 07465402083..3efd0b1d2a6 100644
--- a/code/ATMOSPHERICS/components/unary/unary_base.dm
+++ b/code/ATMOSPHERICS/components/unary/unary_base.dm
@@ -49,7 +49,7 @@
if(!infiniteloop)
target.initialize(1)
break
- build_network()
+ //build_network()
update_icon()
@@ -97,3 +97,6 @@
del(network)
return null
+
+/obj/machinery/atmospherics/unary/nullifyPipenetwork()
+ network = null
\ No newline at end of file
diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm
index 837e70ef4eb..5be3be0e53d 100644
--- a/code/ATMOSPHERICS/components/unary/vent_pump.dm
+++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm
@@ -281,6 +281,7 @@
if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if (WT.remove_fuel(0,user))
+ playsound(loc, 'sound/items/Welder.ogg', 40, 1)
user << "Now welding the vent."
if(do_after(user, 20))
if(!src || !WT.isOn()) return
@@ -293,10 +294,6 @@
user.visible_message("[user] unwelds the vent.", "You unweld the vent.", "You hear welding.")
welded = 0
update_icon()
- else
- user << "The welding tool needs to be on to start this task."
- else
- user << "You need more welding fuel to complete this task."
return 1
else
return ..()
@@ -361,7 +358,7 @@
L << " There are no available vents to travel to, they could be welded. "
return
- var/obj/selection = input(L,"Select a destination.", "Duct System") as null|anything in sortAssoc(vents)
+ var/obj/selection = input(L,"Select a destination.", "Duct System") as null|anything in sortList(vents)
if(!selection) return
if(!Adjacent(L))
diff --git a/code/ATMOSPHERICS/components/valve.dm b/code/ATMOSPHERICS/components/valve.dm
index 47b9b940489..b553d9578d6 100644
--- a/code/ATMOSPHERICS/components/valve.dm
+++ b/code/ATMOSPHERICS/components/valve.dm
@@ -11,7 +11,7 @@
can_unwrench = 1
var/open = 0
- var/openDuringInit = 0
+ var/openDuringInit //useless, must remove
var/obj/machinery/atmospherics/node1
var/obj/machinery/atmospherics/node2
@@ -178,12 +178,7 @@ obj/machinery/atmospherics/valve/attack_hand(mob/user as mob)
node2 = target
break
- build_network()
-
- if(openDuringInit)
- close()
- open()
- openDuringInit = 0
+ //build_network()
/*
var/connect_directions
@@ -309,3 +304,7 @@ obj/machinery/atmospherics/valve/attack_hand(mob/user as mob)
close()
else
open()
+
+/obj/machinery/atmospherics/valve/nullifyPipenetwork()
+ network_node1 = null
+ network_node2 = null
\ No newline at end of file
diff --git a/code/ATMOSPHERICS/datum_pipe_network.dm b/code/ATMOSPHERICS/datum_pipe_network.dm
index 7956edb5a34..4a4b9b5191d 100644
--- a/code/ATMOSPHERICS/datum_pipe_network.dm
+++ b/code/ATMOSPHERICS/datum_pipe_network.dm
@@ -12,7 +12,14 @@ var/global/list/datum/pipe_network/pipe_networks = list()
/datum/pipe_network/New()
air_transient = new()
+ ..()
+/datum/pipe_network/Destroy()
+ pipe_networks -= src
+ for(var/datum/pipeline/P in line_members)
+ P.network = null
+ for(var/obj/machinery/atmospherics/A in normal_members)
+ A.nullifyPipenetwork()
..()
/datum/pipe_network/proc/process()
@@ -30,7 +37,7 @@ var/global/list/datum/pipe_network/pipe_networks = list()
//Notes: Assuming that members will add themselves to appropriate roster in network_expand()
if(!start_normal)
- del(src)
+ qdel(src)
start_normal.network_expand(src, reference)
@@ -39,7 +46,7 @@ var/global/list/datum/pipe_network/pipe_networks = list()
if((normal_members.len>0)||(line_members.len>0))
pipe_networks += src
else
- del(src)
+ qdel(src)
/datum/pipe_network/proc/merge(datum/pipe_network/giver)
if(giver==src) return 0
@@ -56,8 +63,6 @@ var/global/list/datum/pipe_network/pipe_networks = list()
for(var/datum/pipeline/line_member in giver.line_members)
line_member.network = src
- del(giver)
-
update_network_gases()
return 1
diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/ATMOSPHERICS/datum_pipeline.dm
index 1d9e9e2d21a..9664b73747a 100644
--- a/code/ATMOSPHERICS/datum_pipeline.dm
+++ b/code/ATMOSPHERICS/datum_pipeline.dm
@@ -8,16 +8,6 @@
var/alert_pressure = 0
-/datum/pipeline/Del()
- if(network)
- del(network)
-
- if(air && air.volume)
- temporarily_store_air()
- del(air)
-
- ..()
-
/datum/pipeline/proc/process()//This use to be called called from the pipe networks
//Check to see if pressure is within acceptable limits
@@ -51,9 +41,9 @@
corresponding.moles = trace_gas.moles*member.volume/air.volume
-/datum/pipeline/proc/build_pipeline(obj/machinery/atmospherics/pipe/base)
- air = new
+var/pipenetwarnings = 10
+/datum/pipeline/proc/build_pipeline(obj/machinery/atmospherics/pipe/base)
var/list/possible_expansions = list(base)
members = list(base)
edges = list()
@@ -67,7 +57,6 @@
base.air_temporary = null
else
air = new
-
while(possible_expansions.len>0)
for(var/obj/machinery/atmospherics/pipe/borderline in possible_expansions)
@@ -77,6 +66,13 @@
if(result.len>0)
for(var/obj/machinery/atmospherics/pipe/item in result)
if(!members.Find(item))
+
+ if(item.parent)
+ if(pipenetwarnings > 0)
+ error("[item.type] added to a pipenet while still having one. ([item.x], [item.y], [item.z])")
+ pipenetwarnings -= 1
+ if(pipenetwarnings == 0)
+ error("further messages about pipenets will be supressed")
members += item
possible_expansions += item
@@ -87,6 +83,7 @@
if(item.air_temporary)
air.merge(item.air_temporary)
+ item.air_temporary = null
edge_check--
@@ -97,6 +94,53 @@
air.volume = volume
+/datum/pipeline/proc/addMember(obj/machinery/atmospherics/pipe/P)
+ P.parent = src
+ var/list/adjacent = P.pipeline_expansion()
+ var/list/oldedges = list()
+ for(var/obj/machinery/atmospherics/pipe/I in adjacent)
+ oldedges += I
+ if(I.parent == src)
+ continue
+ var/datum/pipeline/E = I.parent
+ air.volume += E.air.volume
+ if(E.members.len > members.len)
+ members.Add(E.members)
+ for(var/obj/machinery/atmospherics/pipe/S in E.members)
+ S.parent = src
+ edges.Add(E.edges)
+ air.merge(E.air)
+ adjacent -= I
+ if(adjacent.len)
+ edges |= P
+ if(!members.Find(P))
+ members += P
+ air.volume += P.volume
+ if(oldedges.len)
+ for(var/obj/machinery/atmospherics/pipe/O in oldedges)
+ var/list/Oedges = O.pipeline_expansion()
+ for(var/obj/machinery/atmospherics/pipe/Oedgepipes in Oedges)
+ Oedges -= Oedgepipes
+ if(Oedges.len)
+ edges |= O
+ else
+ edges -= O
+
+/obj/machinery/atmospherics/proc/addMember(obj/machinery/atmospherics/pipe/P)
+ return
+
+/obj/machinery/atmospherics/pipe/addMember(obj/machinery/atmospherics/pipe/P)
+ parent.addMember(P)
+
+/datum/pipeline/Destroy()
+ if(network)
+ qdel(network)
+ if(air && air.volume)
+ temporarily_store_air()
+ for(var/obj/machinery/atmospherics/pipe/P in members)
+ P.parent = null
+ ..()
+
/datum/pipeline/proc/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference)
if(new_network.line_members.Find(src))
diff --git a/code/ATMOSPHERICS/he_pipes.dm b/code/ATMOSPHERICS/he_pipes.dm
index c1cd3304c8e..03a892e7a37 100644
--- a/code/ATMOSPHERICS/he_pipes.dm
+++ b/code/ATMOSPHERICS/he_pipes.dm
@@ -4,58 +4,42 @@
icon_state = "intact"
level = 2
var/initialize_directions_he
-
minimum_temperature_difference = 20
thermal_conductivity = WINDOW_HEAT_TRANSFER_COEFFICIENT
-// BubbleWrap
/obj/machinery/atmospherics/pipe/simple/heat_exchanging/New()
..()
initialize_directions_he = initialize_directions // The auto-detection from /pipe is good enough for a simple HE pipe
-// BubbleWrap END
/obj/machinery/atmospherics/pipe/simple/heat_exchanging/initialize()
normalize_dir()
- var/node1_dir
- var/node2_dir
-
- for(var/direction in cardinal)
- if(direction&initialize_directions_he)
- if (!node1_dir)
- node1_dir = direction
- else if (!node2_dir)
- node2_dir = direction
-
- for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src,node1_dir))
- if(target.initialize_directions_he & get_dir(target,src))
- node1 = target
- break
- for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src,node2_dir))
- if(target.initialize_directions_he & get_dir(target,src))
- node2 = target
- break
+ var/N = 2
+ for(var/D in cardinal)
+ if(D & initialize_directions_he)
+ N--
+ for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src, D))
+ if(target.initialize_directions_he & get_dir(target,src))
+ if(!node1 && N == 1)
+ node1 = target
+ break
+ if(!node2 && N == 0)
+ node2 = target
+ break
update_icon()
- return
-
/obj/machinery/atmospherics/pipe/simple/heat_exchanging/process()
- if(!parent)
- ..()
- else
- var/environment_temperature = 0
- if(istype(loc, /turf/simulated/))
- if(loc:blocks_air)
- environment_temperature = loc:temperature
- else
- var/datum/gas_mixture/environment = loc.return_air()
- environment_temperature = environment.temperature
- else
+ var/environment_temperature = 0
+ if(istype(loc, /turf/simulated))
+ if(loc:blocks_air)
environment_temperature = loc:temperature
- var/datum/gas_mixture/pipe_air = return_air()
- if(abs(environment_temperature-pipe_air.temperature) > minimum_temperature_difference)
- parent.temperature_interact(loc, volume, thermal_conductivity)
-
-
+ else
+ var/datum/gas_mixture/environment = loc.return_air()
+ environment_temperature = environment.temperature
+ else
+ environment_temperature = loc:temperature
+ var/datum/gas_mixture/pipe_air = return_air()
+ if(abs(environment_temperature-pipe_air.temperature) > minimum_temperature_difference)
+ parent.temperature_interact(loc, volume, thermal_conductivity)
/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction
icon = 'icons/obj/pipes/junction.dmi'
@@ -64,23 +48,21 @@
minimum_temperature_difference = 300
thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT
-// BubbleWrap
/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/New()
- .. ()
- switch ( dir )
- if ( SOUTH )
+ ..()
+ switch(dir)
+ if(SOUTH)
initialize_directions = NORTH
initialize_directions_he = SOUTH
- if ( NORTH )
+ if(NORTH)
initialize_directions = SOUTH
initialize_directions_he = NORTH
- if ( EAST )
+ if(EAST)
initialize_directions = WEST
initialize_directions_he = EAST
- if ( WEST )
+ if(WEST)
initialize_directions = EAST
initialize_directions_he = WEST
-// BubbleWrap END
/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/update_icon()
if(node1&&node2)
@@ -89,8 +71,6 @@
var/have_node1 = node1?1:0
var/have_node2 = node2?1:0
icon_state = "exposed[have_node1][have_node2]"
- if(!node1&&!node2)
- qdel(src)
/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/initialize()
for(var/obj/machinery/atmospherics/target in get_step(src,initialize_directions))
@@ -101,6 +81,5 @@
if(target.initialize_directions_he & get_dir(target,src))
node2 = target
break
-
update_icon()
return
diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm
index 53858c331f2..c1f9971c375 100644
--- a/code/ATMOSPHERICS/pipes.dm
+++ b/code/ATMOSPHERICS/pipes.dm
@@ -1,16 +1,11 @@
/obj/machinery/atmospherics/pipe
-
var/datum/gas_mixture/air_temporary //used when reconstructing a pipeline that broke
var/datum/pipeline/parent
-
var/volume = 0
force = 20
-
layer = 2.4 //under wires with their 2.44
use_power = 0
-
can_unwrench = 1
-
var/alert_pressure = 80*ONE_ATMOSPHERE
//minimum pressure before check_pressure(...) should be called
@@ -20,68 +15,63 @@
/obj/machinery/atmospherics/pipe/proc/check_pressure(pressure)
//Return 1 if parent should continue checking other pipes
//Return null if parent should stop checking other pipes. Recall: del(src) will by default return null
-
return 1
/obj/machinery/atmospherics/pipe/return_air()
if(!parent)
parent = new /datum/pipeline()
parent.build_pipeline(src)
-
return parent.air
/obj/machinery/atmospherics/pipe/build_network()
if(!parent)
parent = new /datum/pipeline()
parent.build_pipeline(src)
-
return parent.return_network()
/obj/machinery/atmospherics/pipe/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference)
if(!parent)
parent = new /datum/pipeline()
parent.build_pipeline(src)
-
return parent.network_expand(new_network, reference)
/obj/machinery/atmospherics/pipe/return_network(obj/machinery/atmospherics/reference)
if(!parent)
parent = new /datum/pipeline()
parent.build_pipeline(src)
-
return parent.return_network(reference)
/obj/machinery/atmospherics/pipe/Destroy()
del(parent)
- if(air_temporary)
- loc.assume_air(air_temporary)
- del(air_temporary)
-
..()
+/obj/machinery/atmospherics/pipe/attackby(obj/item/weapon/W, mob/user)
+ if(istype(W, /obj/item/device/analyzer))
+ atmosanalyzer_scan(parent.air, user)
+ else
+ return ..()
+
+/obj/machinery/atmospherics/pipe/proc/releaseAirToTurf()
+ if(air_temporary)
+ var/turf/T = loc
+ T.assume_air(air_temporary)
+ air_update_turf()
+
/obj/machinery/atmospherics/pipe/simple
icon = 'icons/obj/pipes.dmi'
icon_state = "intact-f"
-
name = "pipe"
desc = "A one meter section of regular pipe"
-
volume = 70
-
dir = SOUTH
initialize_directions = SOUTH|NORTH
-
var/obj/machinery/atmospherics/node1
var/obj/machinery/atmospherics/node2
-
var/minimum_temperature_difference = 300
var/thermal_conductivity = 0 //WALL_HEAT_TRANSFER_COEFFICIENT No
-
var/maximum_pressure = 70*ONE_ATMOSPHERE
var/fatigue_pressure = 55*ONE_ATMOSPHERE
alert_pressure = 55*ONE_ATMOSPHERE
-
-
level = 1
/obj/machinery/atmospherics/pipe/simple/New()
@@ -100,65 +90,56 @@
if(SOUTHWEST)
initialize_directions = SOUTH|WEST
-
-/obj/machinery/atmospherics/pipe/simple/hide(var/i)
- if(level == 1 && istype(loc, /turf/simulated))
- invisibility = i ? 101 : 0
+/obj/machinery/atmospherics/pipe/simple/initialize()
+ normalize_dir()
+ var/N = 2
+ for(var/D in cardinal)
+ if(D & initialize_directions)
+ N--
+ for(var/obj/machinery/atmospherics/target in get_step(src, D))
+ if(target.initialize_directions & get_dir(target,src))
+ if(!node1 && N == 1)
+ node1 = target
+ break
+ if(!node2 && N == 0)
+ node2 = target
+ break
+ var/turf/T = loc // hide if turf is not intact
+ hide(T.intact)
update_icon()
-/obj/machinery/atmospherics/pipe/simple/process()
- if(!parent) //This should cut back on the overhead calling build_network thousands of times per cycle
- ..()
- else
- . = PROCESS_KILL
+/obj/machinery/atmospherics/pipe/simple/Destroy()
+ if(node1)
+ var/obj/machinery/atmospherics/A = node1
+ node1.disconnect(src)
+ A.build_network()
+ if(node2)
+ var/obj/machinery/atmospherics/A = node2
+ node2.disconnect(src)
+ A.build_network()
+ releaseAirToTurf()
+ ..()
- /*if(!node1)
- parent.mingle_with_turf(loc, volume)
- if(!nodealert)
- //world << "Missing node from [src] at [src.x],[src.y],[src.z]"
- nodealert = 1
-
- else if(!node2)
- parent.mingle_with_turf(loc, volume)
- if(!nodealert)
- //world << "Missing node from [src] at [src.x],[src.y],[src.z]"
- nodealert = 1
- else if (nodealert)
- nodealert = 0
-
-
- else if(parent)
- var/environment_temperature = 0
-
- if(istype(loc, /turf/simulated/))
- if(loc:blocks_air)
- environment_temperature = loc:temperature
- else
- var/datum/gas_mixture/environment = loc.return_air()
- environment_temperature = environment.temperature
-
- else
- environment_temperature = loc:temperature
-
- var/datum/gas_mixture/pipe_air = return_air()
-
- if(abs(environment_temperature-pipe_air.temperature) > minimum_temperature_difference)
- parent.temperature_interact(loc, volume, thermal_conductivity)
- */ //Screw you heat lag
+/obj/machinery/atmospherics/pipe/simple/disconnect(obj/machinery/atmospherics/reference)
+ if(reference == node1)
+ if(istype(node1, /obj/machinery/atmospherics/pipe))
+ qdel(parent)
+ node1 = null
+ if(reference == node2)
+ if(istype(node2, /obj/machinery/atmospherics/pipe))
+ qdel(parent)
+ node2 = null
+ update_icon()
/obj/machinery/atmospherics/pipe/simple/check_pressure(pressure)
var/datum/gas_mixture/environment = loc.return_air()
-
var/pressure_difference = pressure - environment.return_pressure()
-
if(pressure_difference > maximum_pressure)
burst()
-
else if(pressure_difference > fatigue_pressure)
//TODO: leak to turf, doing pfshhhhh
if(prob(5))
burst()
-
else return 1
/obj/machinery/atmospherics/pipe/simple/proc/burst()
@@ -175,17 +156,6 @@
else if(dir==12)
dir = 4
-/obj/machinery/atmospherics/pipe/simple/Destroy()
- if(node1)
- node1.disconnect(src)
- if(node2)
- node2.disconnect(src)
-
- ..()
-
-/obj/machinery/atmospherics/pipe/simple/pipeline_expansion()
- return list(node1, node2)
-
/obj/machinery/atmospherics/pipe/simple/update_icon()
if(node1&&node2)
var/C = ""
@@ -197,62 +167,139 @@
if ("yellow") C = "-y"
if ("purple") C = "-p"
icon_state = "intact[C][invisibility ? "-f" : "" ]"
-
- //var/node1_direction = get_dir(src, node1)
- //var/node2_direction = get_dir(src, node2)
-
- //dir = node1_direction|node2_direction
-
else
- if(!node1&&!node2)
- qdel(src) //TODO: silent deleting looks weird
var/have_node1 = node1?1:0
var/have_node2 = node2?1:0
icon_state = "exposed[have_node1][have_node2][invisibility ? "-f" : "" ]"
+/obj/machinery/atmospherics/pipe/simple/hide(var/i)
+ if(level == 1 && istype(loc, /turf/simulated))
+ invisibility = i ? 101 : 0
+ update_icon()
-/obj/machinery/atmospherics/pipe/simple/initialize()
- normalize_dir()
- var/node1_dir
- var/node2_dir
+/obj/machinery/atmospherics/pipe/simple/pipeline_expansion()
+ return list(node1, node2)
- for(var/direction in cardinal)
- if(direction&initialize_directions)
- if (!node1_dir)
- node1_dir = direction
- else if (!node2_dir)
- node2_dir = direction
+/obj/machinery/atmospherics/pipe/simple/insulated
+ icon = 'icons/obj/atmospherics/red_pipe.dmi'
+ icon_state = "intact"
+ minimum_temperature_difference = 10000
+ thermal_conductivity = 0
+ maximum_pressure = 1000*ONE_ATMOSPHERE
+ fatigue_pressure = 900*ONE_ATMOSPHERE
+ alert_pressure = 900*ONE_ATMOSPHERE
+ level = 2
- for(var/obj/machinery/atmospherics/target in get_step(src,node1_dir))
- if(target.initialize_directions & get_dir(target,src))
- node1 = target
- break
- for(var/obj/machinery/atmospherics/target in get_step(src,node2_dir))
- if(target.initialize_directions & get_dir(target,src))
- node2 = target
- break
+/obj/machinery/atmospherics/pipe/manifold
+ icon = 'icons/obj/atmospherics/pipe_manifold.dmi'
+ icon_state = "manifold-f"
+ name = "pipe manifold"
+ desc = "A manifold composed of regular pipes"
+ volume = 105
+ dir = SOUTH
+ initialize_directions = EAST|NORTH|WEST
+ var/obj/machinery/atmospherics/node1
+ var/obj/machinery/atmospherics/node2
+ var/obj/machinery/atmospherics/node3
+ level = 1
+ layer = 2.4 //under wires with their 2.44
+/obj/machinery/atmospherics/pipe/manifold/New()
+ switch(dir)
+ if(NORTH)
+ initialize_directions = EAST|SOUTH|WEST
+ if(SOUTH)
+ initialize_directions = WEST|NORTH|EAST
+ if(EAST)
+ initialize_directions = SOUTH|WEST|NORTH
+ if(WEST)
+ initialize_directions = NORTH|EAST|SOUTH
+ ..()
+/obj/machinery/atmospherics/pipe/manifold/initialize()
+ for(var/D in cardinal)
+ if(D == dir)
+ continue
+ for(var/obj/machinery/atmospherics/target in get_step(src, D))
+ if(target.initialize_directions & get_dir(target,src))
+ if(turn(dir, 90) == D)
+ node1 = target
+ if(turn(dir, 270) == D)
+ node2 = target
+ if(turn(dir, 180) == D)
+ node3 = target
+ break
var/turf/T = src.loc // hide if turf is not intact
hide(T.intact)
update_icon()
- //update_icon()
-/obj/machinery/atmospherics/pipe/simple/disconnect(obj/machinery/atmospherics/reference)
+/obj/machinery/atmospherics/pipe/manifold/Destroy()
+ if(node1)
+ var/obj/machinery/atmospherics/A = node1
+ node1.disconnect(src)
+ A.build_network()
+ if(node2)
+ var/obj/machinery/atmospherics/A = node2
+ node2.disconnect(src)
+ A.build_network()
+ if(node3)
+ var/obj/machinery/atmospherics/A = node3
+ node3.disconnect(src)
+ A.build_network()
+ releaseAirToTurf()
+ ..()
+
+/obj/machinery/atmospherics/pipe/manifold/disconnect(obj/machinery/atmospherics/reference)
if(reference == node1)
if(istype(node1, /obj/machinery/atmospherics/pipe))
- del(parent)
+ qdel(parent)
node1 = null
-
if(reference == node2)
if(istype(node2, /obj/machinery/atmospherics/pipe))
- del(parent)
+ qdel(parent)
node2 = null
+ if(reference == node3)
+ if(istype(node3, /obj/machinery/atmospherics/pipe))
+ qdel(parent)
+ node3 = null
+ update_icon()
+ ..()
+/obj/machinery/atmospherics/pipe/manifold/update_icon()
+ if(node1&&node2&&node3)
+ var/C = ""
+ switch(pipe_color)
+ if ("red") C = "-r"
+ if ("blue") C = "-b"
+ if ("cyan") C = "-c"
+ if ("green") C = "-g"
+ if ("yellow") C = "-y"
+ if ("purple") C = "-p"
+ icon_state = "manifold[C][invisibility ? "-f" : ""]"
+ else
+ var/connected = 0
+ var/unconnected = 0
+ var/connect_directions = (NORTH|SOUTH|EAST|WEST)&(~dir)
+ if(node1)
+ connected |= get_dir(src, node1)
+ if(node2)
+ connected |= get_dir(src, node2)
+ if(node3)
+ connected |= get_dir(src, node3)
+ unconnected = (~connected)&(connect_directions)
+ icon_state = "manifold_[connected]_[unconnected]"
+
+/obj/machinery/atmospherics/pipe/manifold/hide(var/i)
+ if(level == 1 && istype(loc, /turf/simulated))
+ invisibility = i ? 101 : 0
update_icon()
- return null
+/obj/machinery/atmospherics/pipe/manifold/pipeline_expansion()
+ return list(node1, node2, node3)
+
+
+//coloured pipes
/obj/machinery/atmospherics/pipe/simple/scrubbers
name="Scrubbers pipe"
pipe_color="red"
@@ -319,434 +366,7 @@
icon_state = "intact-y-f"
-
-/obj/machinery/atmospherics/pipe/simple/insulated
- icon = 'icons/obj/atmospherics/red_pipe.dmi'
- icon_state = "intact"
-
- minimum_temperature_difference = 10000
- thermal_conductivity = 0
- maximum_pressure = 1000*ONE_ATMOSPHERE
- fatigue_pressure = 900*ONE_ATMOSPHERE
- alert_pressure = 900*ONE_ATMOSPHERE
-
- level = 2
-
-
-/obj/machinery/atmospherics/pipe/tank
- icon = 'icons/obj/atmospherics/pipe_tank.dmi'
- icon_state = "intact"
-
- name = "pressure tank"
- desc = "A large vessel containing pressurized gas."
-
- volume = 10000 //in liters, 1 meters by 1 meters by 2 meters
-
- dir = SOUTH
- initialize_directions = SOUTH
- density = 1
-
- can_unwrench = 0
-
- var/obj/machinery/atmospherics/node1
-
-/obj/machinery/atmospherics/pipe/tank/New()
- initialize_directions = dir
- ..()
-
-/obj/machinery/atmospherics/pipe/tank/process()
- if(!parent)
- ..()
- else
- . = PROCESS_KILL
-/* if(!node1)
- parent.mingle_with_turf(loc, 200)
- if(!nodealert)
- //world << "Missing node from [src] at [src.x],[src.y],[src.z]"
- nodealert = 1
- else if (nodealert)
- nodealert = 0
-*/
-/obj/machinery/atmospherics/pipe/tank/carbon_dioxide
- name = "pressure tank (Carbon Dioxide)"
-
-/obj/machinery/atmospherics/pipe/tank/carbon_dioxide/New()
- air_temporary = new
- air_temporary.volume = volume
- air_temporary.temperature = T20C
-
- air_temporary.carbon_dioxide = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature)
-
- ..()
-
-/obj/machinery/atmospherics/pipe/tank/toxins
- icon = 'icons/obj/atmospherics/orange_pipe_tank.dmi'
- name = "pressure tank (Plasma)"
-
-/obj/machinery/atmospherics/pipe/tank/toxins/New()
- air_temporary = new
- air_temporary.volume = volume
- air_temporary.temperature = T20C
-
- air_temporary.toxins = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature)
-
- ..()
-
-/obj/machinery/atmospherics/pipe/tank/oxygen_agent_b
- icon = 'icons/obj/atmospherics/red_orange_pipe_tank.dmi'
- name = "pressure tank (Oxygen + Plasma)"
-
-/obj/machinery/atmospherics/pipe/tank/oxygen_agent_b/New()
- air_temporary = new
- air_temporary.volume = volume
- air_temporary.temperature = T0C
-
- var/datum/gas/oxygen_agent_b/trace_gas = new
- trace_gas.moles = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature)
-
- air_temporary.trace_gases += trace_gas
-
- ..()
-
-/obj/machinery/atmospherics/pipe/tank/oxygen
- icon = 'icons/obj/atmospherics/blue_pipe_tank.dmi'
- name = "pressure tank (Oxygen)"
-
-/obj/machinery/atmospherics/pipe/tank/oxygen/New()
- air_temporary = new
- air_temporary.volume = volume
- air_temporary.temperature = T20C
-
- air_temporary.oxygen = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature)
-
- ..()
-
-/obj/machinery/atmospherics/pipe/tank/nitrogen
- icon = 'icons/obj/atmospherics/red_pipe_tank.dmi'
- name = "pressure tank (Nitrogen)"
-
-/obj/machinery/atmospherics/pipe/tank/nitrogen/New()
- air_temporary = new
- air_temporary.volume = volume
- air_temporary.temperature = T20C
-
- air_temporary.nitrogen = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature)
-
- ..()
-
-/obj/machinery/atmospherics/pipe/tank/air
- icon = 'icons/obj/atmospherics/red_pipe_tank.dmi'
- name = "pressure tank (Air)"
-
-/obj/machinery/atmospherics/pipe/tank/air/New()
- air_temporary = new
- air_temporary.volume = volume
- air_temporary.temperature = T20C
-
- air_temporary.oxygen = (25*ONE_ATMOSPHERE*O2STANDARD)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature)
- air_temporary.nitrogen = (25*ONE_ATMOSPHERE*N2STANDARD)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature)
-
- ..()
-
-/obj/machinery/atmospherics/pipe/tank/Destroy()
- if(node1)
- node1.disconnect(src)
-
- ..()
-
-/obj/machinery/atmospherics/pipe/tank/pipeline_expansion()
- return list(node1)
-
-/obj/machinery/atmospherics/pipe/tank/update_icon()
- if(node1)
- icon_state = "intact"
-
- dir = get_dir(src, node1)
-
- else
- icon_state = "exposed"
-
-/obj/machinery/atmospherics/pipe/tank/initialize()
-
- var/connect_direction = dir
-
- for(var/obj/machinery/atmospherics/target in get_step(src,connect_direction))
- if(target.initialize_directions & get_dir(target,src))
- node1 = target
- break
-
- update_icon()
-
-/obj/machinery/atmospherics/pipe/tank/disconnect(obj/machinery/atmospherics/reference)
- if(reference == node1)
- if(istype(node1, /obj/machinery/atmospherics/pipe))
- del(parent)
- node1 = null
-
- update_icon()
-
- return null
-
-/obj/machinery/atmospherics/pipe/tank/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
- if (istype(W, /obj/item/device/analyzer) && get_dist(user, src) <= 1)
- atmosanalyzer_scan(parent.air, user)
-
-/obj/machinery/atmospherics/pipe/vent
- icon = 'icons/obj/atmospherics/pipe_vent.dmi'
- icon_state = "intact"
-
- name = "vent"
- desc = "A large air vent"
-
- level = 1
-
- volume = 250
-
- dir = SOUTH
- initialize_directions = SOUTH
-
- can_unwrench = 0
-
- var/build_killswitch = 1
-
- var/obj/machinery/atmospherics/node1
-
-/obj/machinery/atmospherics/pipe/vent/New()
- initialize_directions = dir
- ..()
-
-/obj/machinery/atmospherics/pipe/vent/process()
- if(!parent)
- if(build_killswitch <= 0)
- . = PROCESS_KILL
- else
- build_killswitch--
- ..()
- return
- else
- parent.mingle_with_turf(loc, 250)
-/*
- if(!node1)
- if(!nodealert)
- //world << "Missing node from [src] at [src.x],[src.y],[src.z]"
- nodealert = 1
- else if (nodealert)
- nodealert = 0
-*/
-/obj/machinery/atmospherics/pipe/vent/Destroy()
- if(node1)
- node1.disconnect(src)
-
- ..()
-
-/obj/machinery/atmospherics/pipe/vent/pipeline_expansion()
- return list(node1)
-
-/obj/machinery/atmospherics/pipe/vent/update_icon()
- if(node1)
- icon_state = "intact"
-
- dir = get_dir(src, node1)
-
- else
- icon_state = "exposed"
-
-/obj/machinery/atmospherics/pipe/vent/initialize()
- var/connect_direction = dir
-
- for(var/obj/machinery/atmospherics/target in get_step(src,connect_direction))
- if(target.initialize_directions & get_dir(target,src))
- node1 = target
- break
-
- update_icon()
-
-/obj/machinery/atmospherics/pipe/vent/disconnect(obj/machinery/atmospherics/reference)
- if(reference == node1)
- if(istype(node1, /obj/machinery/atmospherics/pipe))
- del(parent)
- node1 = null
-
- update_icon()
-
- return null
-
-/obj/machinery/atmospherics/pipe/vent/hide(var/i) //to make the little pipe section invisible, the icon changes.
- if(node1)
- icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]intact"
- dir = get_dir(src, node1)
- else
- icon_state = "exposed"
-
-/obj/machinery/atmospherics/pipe/manifold
- icon = 'icons/obj/atmospherics/pipe_manifold.dmi'
- icon_state = "manifold-f"
-
- name = "pipe manifold"
- desc = "A manifold composed of regular pipes"
-
- volume = 105
-
- dir = SOUTH
- initialize_directions = EAST|NORTH|WEST
-
- var/obj/machinery/atmospherics/node1
- var/obj/machinery/atmospherics/node2
- var/obj/machinery/atmospherics/node3
-
- level = 1
- layer = 2.4 //under wires with their 2.44
-
-/obj/machinery/atmospherics/pipe/manifold/New()
- switch(dir)
- if(NORTH)
- initialize_directions = EAST|SOUTH|WEST
- if(SOUTH)
- initialize_directions = WEST|NORTH|EAST
- if(EAST)
- initialize_directions = SOUTH|WEST|NORTH
- if(WEST)
- initialize_directions = NORTH|EAST|SOUTH
-
- ..()
-
-
-
-/obj/machinery/atmospherics/pipe/manifold/hide(var/i)
- if(level == 1 && istype(loc, /turf/simulated))
- invisibility = i ? 101 : 0
- update_icon()
-
-/obj/machinery/atmospherics/pipe/manifold/pipeline_expansion()
- return list(node1, node2, node3)
-
-/obj/machinery/atmospherics/pipe/manifold/process()
- if(!parent)
- ..()
- else
- . = PROCESS_KILL
-/*
- if(!node1)
- parent.mingle_with_turf(loc, 70)
- if(!nodealert)
- //world << "Missing node from [src] at [src.x],[src.y],[src.z]"
- nodealert = 1
- else if(!node2)
- parent.mingle_with_turf(loc, 70)
- if(!nodealert)
- //world << "Missing node from [src] at [src.x],[src.y],[src.z]"
- nodealert = 1
- else if(!node3)
- parent.mingle_with_turf(loc, 70)
- if(!nodealert)
- //world << "Missing node from [src] at [src.x],[src.y],[src.z]"
- nodealert = 1
- else if (nodealert)
- nodealert = 0
-*/
-/obj/machinery/atmospherics/pipe/manifold/Destroy()
- if(node1)
- node1.disconnect(src)
- if(node2)
- node2.disconnect(src)
- if(node3)
- node3.disconnect(src)
-
- ..()
-
-/obj/machinery/atmospherics/pipe/manifold/disconnect(obj/machinery/atmospherics/reference)
- if(reference == node1)
- if(istype(node1, /obj/machinery/atmospherics/pipe))
- del(parent)
- node1 = null
-
- if(reference == node2)
- if(istype(node2, /obj/machinery/atmospherics/pipe))
- del(parent)
- node2 = null
-
- if(reference == node3)
- if(istype(node3, /obj/machinery/atmospherics/pipe))
- del(parent)
- node3 = null
-
- update_icon()
-
- ..()
-
-/obj/machinery/atmospherics/pipe/manifold/update_icon()
- if(node1&&node2&&node3)
- var/C = ""
- switch(pipe_color)
- if ("red") C = "-r"
- if ("blue") C = "-b"
- if ("cyan") C = "-c"
- if ("green") C = "-g"
- if ("yellow") C = "-y"
- if ("purple") C = "-p"
- icon_state = "manifold[C][invisibility ? "-f" : ""]"
-
- else
- var/connected = 0
- var/unconnected = 0
- var/connect_directions = (NORTH|SOUTH|EAST|WEST)&(~dir)
-
- if(node1)
- connected |= get_dir(src, node1)
- if(node2)
- connected |= get_dir(src, node2)
- if(node3)
- connected |= get_dir(src, node3)
-
- unconnected = (~connected)&(connect_directions)
-
- icon_state = "manifold_[connected]_[unconnected]"
-
- if(!connected)
- qdel(src)
-
- return
-
-/obj/machinery/atmospherics/pipe/manifold/initialize()
- var/connect_directions = (NORTH|SOUTH|EAST|WEST)&(~dir)
-
- for(var/direction in cardinal)
- if(direction&connect_directions)
- for(var/obj/machinery/atmospherics/target in get_step(src,direction))
- if(target.initialize_directions & get_dir(target,src))
- node1 = target
- connect_directions &= ~direction
- break
- if (node1)
- break
-
-
- for(var/direction in cardinal)
- if(direction&connect_directions)
- for(var/obj/machinery/atmospherics/target in get_step(src,direction))
- if(target.initialize_directions & get_dir(target,src))
- node2 = target
- connect_directions &= ~direction
- break
- if (node2)
- break
-
-
- for(var/direction in cardinal)
- if(direction&connect_directions)
- for(var/obj/machinery/atmospherics/target in get_step(src,direction))
- if(target.initialize_directions & get_dir(target,src))
- node3 = target
- connect_directions &= ~direction
- break
- if (node3)
- break
-
- var/turf/T = src.loc // hide if turf is not intact
- hide(T.intact)
- //update_icon()
- update_icon()
-
+//coloured manifolds
/obj/machinery/atmospherics/pipe/manifold/scrubbers
name="Scrubbers pipe"
pipe_color="red"
@@ -812,8 +432,202 @@
level = 1
icon_state = "manifold-y-f"
-obj/machinery/atmospherics/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
- if (istype(W, /obj/item/device/analyzer) && get_dist(user, src) <= 1)
- atmosanalyzer_scan(parent.air, user)
+/obj/machinery/atmospherics/pipe/vent
+ icon = 'icons/obj/atmospherics/pipe_vent.dmi'
+ icon_state = "intact"
+
+ name = "vent"
+ desc = "A large air vent"
+
+ level = 1
+
+ volume = 250
+
+ dir = SOUTH
+ initialize_directions = SOUTH
+
+ can_unwrench = 0
+
+ var/build_killswitch = 1
+
+ var/obj/machinery/atmospherics/node1
+
+/obj/machinery/atmospherics/pipe/vent/New()
+ initialize_directions = dir
+ ..()
+
+/obj/machinery/atmospherics/pipe/vent/process()
+ if(!parent)
+ if(build_killswitch <= 0)
+ . = PROCESS_KILL
+ else
+ build_killswitch--
+ ..()
+ return
else
- return ..()
+ parent.mingle_with_turf(loc, 250)
+/*
+ if(!node1)
+ if(!nodealert)
+ //world << "Missing node from [src] at [src.x],[src.y],[src.z]"
+ nodealert = 1
+ else if (nodealert)
+ nodealert = 0
+*/
+/obj/machinery/atmospherics/pipe/vent/Destroy()
+ if(node1)
+ node1.disconnect(src)
+ ..()
+
+/obj/machinery/atmospherics/pipe/vent/pipeline_expansion()
+ return list(node1)
+
+/obj/machinery/atmospherics/pipe/vent/update_icon()
+ if(node1)
+ icon_state = "intact"
+
+ dir = get_dir(src, node1)
+
+ else
+ icon_state = "exposed"
+
+/obj/machinery/atmospherics/pipe/vent/initialize()
+ var/connect_direction = dir
+
+ for(var/obj/machinery/atmospherics/target in get_step(src,connect_direction))
+ if(target.initialize_directions & get_dir(target,src))
+ node1 = target
+ break
+
+ update_icon()
+
+/obj/machinery/atmospherics/pipe/vent/disconnect(obj/machinery/atmospherics/reference)
+ if(reference == node1)
+ if(istype(node1, /obj/machinery/atmospherics/pipe))
+ del(parent)
+ node1 = null
+
+ update_icon()
+
+ return null
+
+/obj/machinery/atmospherics/pipe/vent/hide(var/i) //to make the little pipe section invisible, the icon changes.
+ if(node1)
+ icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]intact"
+ dir = get_dir(src, node1)
+ else
+ icon_state = "exposed"
+
+/obj/machinery/atmospherics/pipe/tank
+ icon = 'icons/obj/atmospherics/pipe_tank.dmi'
+ icon_state = "intact"
+ name = "pressure tank"
+ desc = "A large vessel containing pressurized gas."
+ volume = 10000 //in liters, 1 meters by 1 meters by 2 meters
+ dir = SOUTH
+ initialize_directions = SOUTH
+ density = 1
+ can_unwrench = 0
+ var/obj/machinery/atmospherics/node1
+
+/obj/machinery/atmospherics/pipe/tank/New()
+ initialize_directions = dir
+ ..()
+
+/obj/machinery/atmospherics/pipe/tank/carbon_dioxide
+ name = "pressure tank (Carbon Dioxide)"
+
+/obj/machinery/atmospherics/pipe/tank/carbon_dioxide/New()
+ air_temporary = new
+ air_temporary.volume = volume
+ air_temporary.temperature = T20C
+ air_temporary.carbon_dioxide = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature)
+ ..()
+
+/obj/machinery/atmospherics/pipe/tank/toxins
+ icon = 'icons/obj/atmospherics/orange_pipe_tank.dmi'
+ name = "pressure tank (Plasma)"
+
+/obj/machinery/atmospherics/pipe/tank/toxins/New()
+ air_temporary = new
+ air_temporary.volume = volume
+ air_temporary.temperature = T20C
+ air_temporary.toxins = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature)
+ ..()
+
+/obj/machinery/atmospherics/pipe/tank/oxygen_agent_b
+ icon = 'icons/obj/atmospherics/red_orange_pipe_tank.dmi'
+ name = "pressure tank (Oxygen + Plasma)"
+
+/obj/machinery/atmospherics/pipe/tank/oxygen_agent_b/New()
+ air_temporary = new
+ air_temporary.volume = volume
+ air_temporary.temperature = T0C
+ var/datum/gas/oxygen_agent_b/trace_gas = new
+ trace_gas.moles = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature)
+ air_temporary.trace_gases += trace_gas
+ ..()
+
+/obj/machinery/atmospherics/pipe/tank/oxygen
+ icon = 'icons/obj/atmospherics/blue_pipe_tank.dmi'
+ name = "pressure tank (Oxygen)"
+
+/obj/machinery/atmospherics/pipe/tank/oxygen/New()
+ air_temporary = new
+ air_temporary.volume = volume
+ air_temporary.temperature = T20C
+ air_temporary.oxygen = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature)
+ ..()
+
+/obj/machinery/atmospherics/pipe/tank/nitrogen
+ icon = 'icons/obj/atmospherics/red_pipe_tank.dmi'
+ name = "pressure tank (Nitrogen)"
+
+/obj/machinery/atmospherics/pipe/tank/nitrogen/New()
+ air_temporary = new
+ air_temporary.volume = volume
+ air_temporary.temperature = T20C
+ air_temporary.nitrogen = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature)
+ ..()
+
+/obj/machinery/atmospherics/pipe/tank/air
+ icon = 'icons/obj/atmospherics/red_pipe_tank.dmi'
+ name = "pressure tank (Air)"
+
+/obj/machinery/atmospherics/pipe/tank/air/New()
+ air_temporary = new
+ air_temporary.volume = volume
+ air_temporary.temperature = T20C
+ air_temporary.oxygen = (25*ONE_ATMOSPHERE*O2STANDARD)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature)
+ air_temporary.nitrogen = (25*ONE_ATMOSPHERE*N2STANDARD)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature)
+ ..()
+
+/obj/machinery/atmospherics/pipe/tank/Destroy()
+ if(node1)
+ node1.disconnect(src)
+ ..()
+
+/obj/machinery/atmospherics/pipe/tank/pipeline_expansion()
+ return list(node1)
+
+/obj/machinery/atmospherics/pipe/tank/update_icon()
+ if(node1)
+ icon_state = "intact"
+ dir = get_dir(src, node1)
+ else
+ icon_state = "exposed"
+
+/obj/machinery/atmospherics/pipe/tank/initialize()
+ var/connect_direction = dir
+ for(var/obj/machinery/atmospherics/target in get_step(src,connect_direction))
+ if(target.initialize_directions & get_dir(target,src))
+ node1 = target
+ break
+ update_icon()
+
+/obj/machinery/atmospherics/pipe/tank/disconnect(obj/machinery/atmospherics/reference)
+ if(reference == node1)
+ if(istype(node1, /obj/machinery/atmospherics/pipe))
+ del(parent)
+ node1 = null
+ update_icon()
\ No newline at end of file
diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
index b86d5e613b5..954cf9c3c6c 100644
--- a/code/__DEFINES/flags.dm
+++ b/code/__DEFINES/flags.dm
@@ -1,20 +1,22 @@
/*
These defines are specific to the atom/flags bitmask
*/
+#define ALL ~0 //For convenience.
+#define NONE 0
+
//FLAGS BITMASK
#define STOPSPRESSUREDMAGE 1 //This flag is used on the flags variable for SUIT and HEAD items which stop pressure damage. Note that the flag 1 was previous used as ONBACK, so it is possible for some code to use (flags & 1) when checking if something can be put on your back. Replace this code with (inv_flags & SLOT_BACK) if you see it anywhere
//To successfully stop you taking all pressure damage you must have both a suit and head item with this flag.
-#define NODROP 2 // This flag makes it so that an item literally cannot be removed at all, or at least that's how it should be. Only deleted.
-#define NOBLUDGEON 4 // when an item has this it produces no "X has been hit by Y with Z" message in the default attackby()
-#define MASKINTERNALS 8 // mask allows internals
-//#define SUITSPACE 8 // suit protects against space
-//#define USEDELAY 16 // For adding extra delay to heavy items, not currently used
-#define NOSHIELD 32 // weapon not affected by shield
-#define CONDUCT 64 // conducts electricity (metal etc.)
-#define ABSTRACT 128 // for all things that are technically items but used for various different stuff, made it 128 because it could conflict with other flags other way
-#define FPRINT 256 // takes a fingerprint
-#define ON_BORDER 512 // item has priority to check when entering or leaving
+#define NODROP 2 // This flag makes it so that an item literally cannot be removed at all, or at least that's how it should be. Only deleted.
+#define NOBLUDGEON 4 // when an item has this it produces no "X has been hit by Y with Z" message in the default attackby()
+#define MASKINTERNALS 8 // mask allows internals
+#define HEAR 16 // This flag is what recursive_hear_check() uses to determine wether to add an item to the hearer list or not.
+#define NOSHIELD 32 // weapon not affected by shield
+#define CONDUCT 64 // conducts electricity (metal etc.)
+#define ABSTRACT 128 // for all things that are technically items but used for various different stuff, made it 128 because it could conflict with other flags other way
+#define FPRINT 256 // takes a fingerprint
+#define ON_BORDER 512 // item has priority to check when entering or leaving
#define GLASSESCOVERSEYES 1024
@@ -61,4 +63,15 @@
#define NOBREATH 256
#define NOGUNS 512
#define NOBLOOD 1024
-#define NOFIRE 2048
\ No newline at end of file
+#define NOFIRE 2048
+
+/*
+ These defines are used specifically with the atom/movable/languages bitmask.
+ They are used in atom/movable/Hear() and atom/movable/say() to determine whether hearers can understand a message.
+*/
+#define HUMAN 1
+#define MONKEY 2
+#define ALIEN 4
+#define ROBOT 8
+#define SLIME 16
+#define DRONE 32
\ No newline at end of file
diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm
index 1bc3a639cbd..a8b240c4743 100644
--- a/code/__DEFINES/preferences.dm
+++ b/code/__DEFINES/preferences.dm
@@ -12,8 +12,10 @@
#define CHAT_RADIO 512
#define MEMBER_PUBLIC 1024
#define CHAT_PULLR 2048
+#define INTENT_STYLE 4096
+#define CHAT_GHOSTWHISPER 8192
-#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|MEMBER_PUBLIC|CHAT_PULLR)
+#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|MEMBER_PUBLIC|CHAT_PULLR|INTENT_STYLE|CHAT_GHOSTWHISPER)
#define BE_TRAITOR 1
#define BE_OPERATIVE 2
@@ -27,4 +29,4 @@
#define BE_BLOB 512
#define BE_NINJA 1024
#define BE_MONKEY 2048
-#define BE_GANG 4096
\ No newline at end of file
+#define BE_GANG 4096
diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm
index 1b8387805d9..a0620d4d2fb 100644
--- a/code/__HELPERS/_logging.dm
+++ b/code/__HELPERS/_logging.dm
@@ -63,10 +63,6 @@
if (config.log_adminchat)
diary << "\[[time_stamp()]]ADMINSAY: [text]"
-/proc/log_adminwarn(text)
- if (config.log_adminwarn)
- diary << "\[[time_stamp()]]ADMINWARN: [text]"
-
/proc/log_pda(text)
if (config.log_pda)
diary << "\[[time_stamp()]]PDA: [text]"
\ No newline at end of file
diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm
new file mode 100644
index 00000000000..0c86ae75c4e
--- /dev/null
+++ b/code/__HELPERS/cmp.dm
@@ -0,0 +1,30 @@
+/proc/cmp_numeric_dsc(a,b)
+ return b - a
+
+/proc/cmp_numeric_asc(a,b)
+ return a - b
+
+/proc/cmp_text_asc(a,b)
+ return sorttext(b,a)
+
+/proc/cmp_text_dsc(a,b)
+ return sorttext(a,b)
+
+/proc/cmp_name_asc(atom/a, atom/b)
+ return sorttext(b.name, a.name)
+
+/proc/cmp_name_dsc(atom/a, atom/b)
+ return sorttext(a.name, b.name)
+
+var/cmp_field = "name"
+/proc/cmp_records_asc(datum/data/record/a, datum/data/record/b)
+ return sorttext(b.fields[cmp_field], a.fields[cmp_field])
+
+/proc/cmp_records_dsc(datum/data/record/a, datum/data/record/b)
+ return sorttext(a.fields[cmp_field], b.fields[cmp_field])
+
+/proc/cmp_ckey_asc(client/a, client/b)
+ return sorttext(b.ckey, a.ckey)
+
+/proc/cmp_ckey_dsc(client/a, client/b)
+ return sorttext(a.ckey, b.ckey)
\ No newline at end of file
diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index 2210414cdad..96dca1bb1f0 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -32,7 +32,7 @@
// Like view but bypasses luminosity check
-/proc/hear(var/range, var/atom/source)
+/proc/get_hear(var/range, var/atom/source)
var/lum = source.luminosity
source.luminosity = 6
@@ -131,13 +131,29 @@
return turfs
+//This is the new version of recursive_mob_check, used for say().
+//The other proc was left intact because morgue trays use it.
+/proc/recursive_hear_check(var/atom/O)
+ var/list/processing_list = list(O)
+ var/list/processed_list = list()
+ var/list/found_mobs = list()
-//var/debug_mob = 0
+ while(processing_list.len)
+ var/atom/A = processing_list[1]
+ if(A.flags & HEAR)
+ found_mobs |= A
+
+ for(var/atom/B in A)
+ if(!processed_list[B])
+ processing_list |= B
+
+ processing_list.Cut(1, 2)
+ processed_list[A] = A
+
+ return found_mobs
// Better recursive loop, technically sort of not actually recursive cause that shit is retarded, enjoy.
//No need for a recursive limit either
-
-
/proc/recursive_mob_check(var/atom/O,var/client_check=1,var/sight_check=1,var/include_radio=1)
var/list/processing_list = list(O)
@@ -178,24 +194,21 @@
return found_mobs
-/proc/get_mobs_in_view(var/R, var/atom/source)
- // Returns a list of mobs in range of R from source. Used in radio and say code.
-
+/proc/get_hearers_in_view(var/R, var/atom/source)
+ // Returns a list of hearers in range of R from source. Used in saycode.
var/turf/T = get_turf(source)
var/list/hear = list()
if(!T)
return hear
- var/list/range = hear(R, T)
-
+ var/list/range = get_hear(R, T)
for(var/atom/movable/A in range)
- hear |= recursive_mob_check(A, 1, 0, 1)
+ hear |= recursive_hear_check(A)
return hear
-
/proc/get_mobs_in_radio_ranges(var/list/obj/item/device/radio/radios)
set background = BACKGROUND_ENABLED
@@ -208,7 +221,7 @@
if(R)
var/turf/speaker = get_turf(R)
if(speaker)
- for(var/turf/T in hear(R.canhear_range,speaker))
+ for(var/turf/T in get_hear(R.canhear_range,speaker))
speaker_coverage[T] = T
@@ -222,6 +235,7 @@
. |= M
return .
+
#define SIGN(X) ((X<0)?-1:1)
/proc/inLineOfSight(X1,Y1,X2,Y2,Z=1,PX1=16.5,PY1=16.5,PX2=16.5,PY2=16.5)
@@ -255,6 +269,7 @@
return 1
#undef SIGN
+
/proc/isInSight(var/atom/A, var/atom/B)
var/turf/Aturf = get_turf(A)
var/turf/Bturf = get_turf(B)
@@ -268,6 +283,7 @@
else
return 0
+
/proc/get_cardinal_step_away(atom/start, atom/finish) //returns the position of a step from start away from finish, in one of the cardinal directions
//returns only NORTH, SOUTH, EAST, or WEST
var/dx = finish.x - start.x
@@ -295,20 +311,57 @@
return M
return null
-// Will return a list of active candidates. It increases the buffer 5 times until it finds a candidate which is active within the buffer.
+// Will poll ghosts for volunteers
+/proc/get_candidates(be_special_flag=0, rolename=null, wait_time=200)
+ var/list/mob/dead/observer/volunteers = list()
+ var/list/client/candidates = list()
+ var/time_passed = world.time
+
+ for(var/mob/dead/observer/G in player_list)
+ spawn(0)
+ if(!G.client)
+ return
+ if((G.client.prefs.be_special & be_special_flag) && !jobban_isbanned(G, get_roletext(be_special_flag)) || (be_special_flag < 0))
+ switch(alert(G,"Do you want to be considered to be a [rolename ? rolename : get_roletext(be_special_flag)]?","Please answer in [wait_time/10] seconds!","Yes","No"))
+ if("Yes")
+ if((world.time-time_passed)>wait_time)
+ return
+ volunteers += G
+ if("No")
+ return
+ else
+ return
+ sleep(wait_time)
+
+ for(var/mob/dead/observer/G in volunteers)
+ if(G.client)
+ candidates += G.client
-/proc/get_candidates(be_special_flag=0, afk_bracket=3000)
- var/list/candidates = list()
- // Keep looping until we find a non-afk candidate within the time bracket (we limit the bracket to 10 minutes (6000))
- while(!candidates.len && afk_bracket < 6000)
- for(var/mob/dead/observer/G in player_list)
- if(G.client != null)
- if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
- if(!G.client.is_afk(afk_bracket) && (G.client.prefs.be_special & be_special_flag))
- candidates += G.client
- afk_bracket += 600 // Add a minute to the bracket, for every attempt
return candidates
+/proc/pick_from_candidates(be_special_flag=0, rolename=null, wait_time=200)
+ var/list/candidates = get_candidates(be_special_flag, rolename, wait_time)
+ if(candidates.len)
+ var/client/C = pick(candidates)
+ return C
+ return 0 //Unable to find a valid candidate
+
+
+/proc/get_roletext(role) //Translates role flag to role text
+ var/roletext
+ switch(role)
+ if(BE_CHANGELING) roletext="changeling"
+ if(BE_TRAITOR) roletext="traitor"
+ if(BE_OPERATIVE) roletext="operative"
+ if(BE_WIZARD) roletext="wizard"
+ if(BE_REV) roletext="revolutionary"
+ if(BE_GANG) roletext="gangster"
+ if(BE_CULTIST) roletext="cultist"
+ if(BE_MONKEY) roletext="monkey"
+ if(BE_NINJA) roletext="ninja"
+ if(BE_ALIEN) roletext="alien"
+ return roletext
+
/proc/ScreenText(obj/O, maptext="", screen_loc="CENTER-7,CENTER-7", maptext_height=480, maptext_width=480)
if(!isobj(O)) O = new /obj/screen/text()
O.maptext = maptext
diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm
index eb44cf81c71..cd56614098c 100644
--- a/code/__HELPERS/lists.dm
+++ b/code/__HELPERS/lists.dm
@@ -167,25 +167,25 @@
/*
* Sorting
*/
-
+/*
//Reverses the order of items in the list
/proc/reverselist(var/list/input)
var/list/output = list()
for(var/i = input.len; i >= 1; i--)
output += input[i]
return output
+*/
//Randomize: Return the list in a random order
-/proc/shuffle(var/list/shufflelist)
- if(!shufflelist)
+/proc/shuffle(var/list/L)
+ if(!L)
return
- var/list/new_list = list()
- var/list/old_list = shufflelist.Copy()
- while(old_list.len)
- var/item = pick(old_list)
- new_list += item
- old_list -= item
- return new_list
+ L = L.Copy()
+
+ for(var/i=1, i<=L.len, ++i)
+ L.Swap(i,rand(1,L.len))
+
+ return L
//Return a list with no duplicate entries
/proc/uniquelist(var/list/L)
@@ -195,141 +195,22 @@
K += item
return K
-//Mergesort: divides up the list into halves to begin the sort
-/proc/sortKey(var/list/client/L, var/order = 1)
- if(isnull(L) || L.len < 2)
- return L
- var/middle = L.len / 2 + 1
- return mergeKey(sortKey(L.Copy(0,middle)), sortKey(L.Copy(middle)), order)
+//for sorting clients or mobs by ckey
+/proc/sortKey(list/L, order=1)
+ return sortTim(L, order >= 0 ? /proc/cmp_ckey_asc : /proc/cmp_ckey_dsc)
-//Mergsort: does the actual sorting and returns the results back to sortAtom
-/proc/mergeKey(var/list/client/L, var/list/client/R, var/order = 1)
- var/Li=1
- var/Ri=1
- var/list/result = new()
- while(Li <= L.len && Ri <= R.len)
- var/client/rL = L[Li]
- var/client/rR = R[Ri]
- if(sorttext(rL.ckey, rR.ckey) == order)
- result += L[Li++]
- else
- result += R[Ri++]
+//Specifically for record datums in a list.
+/proc/sortRecord(list/L, field = "name", order = 1)
+ cmp_field = field
+ return sortTim(L, order >= 0 ? /proc/cmp_records_asc : /proc/cmp_records_dsc)
- if(Li <= L.len)
- return (result + L.Copy(Li, 0))
- return (result + R.Copy(Ri, 0))
+//any value in a list
+/proc/sortList(var/list/L, cmp=/proc/cmp_text_asc)
+ return sortTim(L.Copy(), cmp)
-//Mergesort: divides up the list into halves to begin the sort
-/proc/sortAtom(var/list/atom/L, var/order = 1)
- if(isnull(L) || L.len < 2)
- return L
- var/middle = L.len / 2 + 1
- return mergeAtoms(sortAtom(L.Copy(0,middle)), sortAtom(L.Copy(middle)), order)
-
-//Mergsort: does the actual sorting and returns the results back to sortAtom
-/proc/mergeAtoms(var/list/atom/L, var/list/atom/R, var/order = 1)
- var/Li=1
- var/Ri=1
- var/list/result = new()
- while(Li <= L.len && Ri <= R.len)
- var/atom/rL = L[Li]
- var/atom/rR = R[Ri]
- if(sorttext(rL.name, rR.name) == order)
- result += L[Li++]
- else
- result += R[Ri++]
-
- if(Li <= L.len)
- return (result + L.Copy(Li, 0))
- return (result + R.Copy(Ri, 0))
-
-
-
-
-//Mergesort: Specifically for record datums in a list.
-/proc/sortRecord(var/list/datum/data/record/L, var/field = "name", var/order = 1)
- if(isnull(L))
- return list()
- if(L.len < 2)
- return L
- var/middle = L.len / 2 + 1
- return mergeRecordLists(sortRecord(L.Copy(0, middle), field, order), sortRecord(L.Copy(middle), field, order), field, order)
-
-//Mergsort: does the actual sorting and returns the results back to sortRecord
-/proc/mergeRecordLists(var/list/datum/data/record/L, var/list/datum/data/record/R, var/field = "name", var/order = 1)
- var/Li=1
- var/Ri=1
- var/list/result = new()
- if(!isnull(L) && !isnull(R))
- while(Li <= L.len && Ri <= R.len)
- var/datum/data/record/rL = L[Li]
- if(isnull(rL))
- L -= rL
- continue
- var/datum/data/record/rR = R[Ri]
- if(isnull(rR))
- R -= rR
- continue
- if(sorttext(rL.fields[field], rR.fields[field]) == order)
- result += L[Li++]
- else
- result += R[Ri++]
-
- if(Li <= L.len)
- return (result + L.Copy(Li, 0))
- return (result + R.Copy(Ri, 0))
-
-
-
-
-//Mergesort: any value in a list
-/proc/sortList(var/list/L)
- if(L.len < 2)
- return L
- var/middle = L.len / 2 + 1 // Copy is first,second-1
- return mergeLists(sortList(L.Copy(0,middle)), sortList(L.Copy(middle))) //second parameter null = to end of list
-
-//Mergsorge: uses sortList() but uses the var's name specifically. This should probably be using mergeAtom() instead
-/proc/sortNames(var/list/L)
- var/list/Q = new()
- for(var/atom/x in L)
- Q[x.name] = x
- return sortList(Q)
-
-/proc/mergeLists(var/list/L, var/list/R)
- var/Li=1
- var/Ri=1
- var/list/result = new()
- while(Li <= L.len && Ri <= R.len)
- if(sorttext(L[Li], R[Ri]) < 1)
- result += R[Ri++]
- else
- result += L[Li++]
-
- if(Li <= L.len)
- return (result + L.Copy(Li, 0))
- return (result + R.Copy(Ri, 0))
-
-//Mergesort: any value in a list, preserves key=value structure
-/proc/sortAssoc(var/list/L)
- if(L.len < 2)
- return L
- var/middle = L.len / 2 + 1 // Copy is first,second-1
- return mergeAssoc(sortAssoc(L.Copy(0,middle)), sortAssoc(L.Copy(middle))) //second parameter null = to end of list
-
-/proc/mergeAssoc(var/list/L, var/list/R)
- var/Li=1
- var/Ri=1
- var/list/result = new()
- while(Li <= L.len && Ri <= R.len)
- if(sorttext(L[Li], R[Ri]) < 1)
- result += R&R[Ri++]
- else
- result += L&L[Li++]
-
- if(Li <= L.len)
- return (result + L.Copy(Li, 0))
- return (result + R.Copy(Ri, 0))
+//uses sortList() but uses the var's name specifically. This should probably be using mergeAtom() instead
+/proc/sortNames(var/list/L, order=1)
+ return sortTim(L, order >= 0 ? /proc/cmp_name_asc : /proc/cmp_name_dsc)
//Converts a bitfield to a list of numbers (or words if a wordlist is provided)
@@ -368,4 +249,84 @@
/proc/find_record(field, value, list/L)
for(var/datum/data/record/R in L)
if(R.fields[field] == value)
- return R
\ No newline at end of file
+ return R
+
+
+//Move a single element from position fromIndex within a list, to position toIndex
+//This will preserve associations ~Carnie
+/proc/moveElement(list/L, fromIndex, toIndex)
+ if(fromIndex > toIndex)
+ ++fromIndex
+ else
+ ++toIndex
+
+ L.Insert(toIndex, null)
+ L.Swap(fromIndex, toIndex)
+ L.Cut(fromIndex, fromIndex+1)
+
+
+//Move elements [fromIndex,fromIndex+len) to [toIndex,toIndex+len)
+//This will preserve associations and is much faster than copying to a new list
+//or checking for associative lists and manually copying elements ~Carnie
+/proc/moveRange(list/L, fromIndex, toIndex, len=1)
+ var/distance = abs(toIndex - fromIndex)
+ if(len > distance) //there are more elements to be moved than the distance to be moved. Therefore the same result can be achieved (with fewer operations) by moving elements between where we are and where we are going
+ if(fromIndex < toIndex)
+ toIndex += len
+ else
+ fromIndex += len
+
+ for(var/i=0, i toIndex)
+ fromIndex += len
+ else
+ toIndex += len //?
+
+ for(var/i=0, i distance) //there is an overlap, therefore swapping each element will require more swaps than inserting new elements
+ if(fromIndex < toIndex)
+ toIndex += len
+ else
+ fromIndex += len
+
+ for(var/i=0, i fromIndex)
+ var/a = toIndex
+ toIndex = fromIndex
+ fromIndex = a
+
+ for(var/i=0, i= 2)
+ fromIndex = fromIndex % L.len
+ toIndex = toIndex % (L.len+1)
+ if(fromIndex <= 0)
+ fromIndex += L.len
+ if(toIndex <= 0)
+ toIndex += L.len + 1
+
+ sortInstance.L = L
+ sortInstance.cmp = cmp
+ sortInstance.associative = associative
+
+ sortInstance.binarySort(fromIndex, toIndex, fromIndex)
+ return L
\ No newline at end of file
diff --git a/code/__HELPERS/sorts/MergeSort.dm b/code/__HELPERS/sorts/MergeSort.dm
new file mode 100644
index 00000000000..228a08efb93
--- /dev/null
+++ b/code/__HELPERS/sorts/MergeSort.dm
@@ -0,0 +1,16 @@
+//merge-sort - gernerally faster than insert sort, for runs of 7 or larger
+/proc/sortMerge(list/L, cmp=/proc/cmp_numeric_asc, associative, fromIndex=1, toIndex)
+ if(L && L.len >= 2)
+ fromIndex = fromIndex % L.len
+ toIndex = toIndex % (L.len+1)
+ if(fromIndex <= 0)
+ fromIndex += L.len
+ if(toIndex <= 0)
+ toIndex += L.len + 1
+
+ sortInstance.L = L
+ sortInstance.cmp = cmp
+ sortInstance.associative = associative
+ sortInstance.mergeSort(fromIndex, toIndex)
+
+ return L
\ No newline at end of file
diff --git a/code/__HELPERS/sorts/TimSort.dm b/code/__HELPERS/sorts/TimSort.dm
new file mode 100644
index 00000000000..4aa51263656
--- /dev/null
+++ b/code/__HELPERS/sorts/TimSort.dm
@@ -0,0 +1,17 @@
+//TimSort interface
+/proc/sortTim(list/L, cmp=/proc/cmp_numeric_asc, associative, fromIndex=1, toIndex=0)
+ if(L && L.len >= 2)
+ fromIndex = fromIndex % L.len
+ toIndex = toIndex % (L.len+1)
+ if(fromIndex <= 0)
+ fromIndex += L.len
+ if(toIndex <= 0)
+ toIndex += L.len + 1
+
+ sortInstance.L = L
+ sortInstance.cmp = cmp
+ sortInstance.associative = associative
+
+ sortInstance.timSort(fromIndex, toIndex)
+
+ return L
\ No newline at end of file
diff --git a/code/__HELPERS/sorts/__main.dm b/code/__HELPERS/sorts/__main.dm
new file mode 100644
index 00000000000..01dc9e96d9c
--- /dev/null
+++ b/code/__HELPERS/sorts/__main.dm
@@ -0,0 +1,668 @@
+ //These are macros used to reduce on proc calls
+#define moveElement(L, fromIndex, toIndex) if((fromIndex) > (toIndex)){L.Insert((toIndex), null);L.Swap((fromIndex)+1, (toIndex));L.Cut((fromIndex)+1, (fromIndex)+2);}else{L.Insert((toIndex)+1, null);L.Swap((fromIndex), (toIndex)+1);L.Cut((fromIndex), (fromIndex)+1);}
+#define fetchElement(L, i) (associative) ? L[L[i]] : L[i]
+
+ //Minimum sized sequence that will be merged. Anything smaller than this will use binary-insertion sort.
+ //Should be a power of 2
+#define MIN_MERGE 32
+
+ //When we get into galloping mode, we stay there until both runs win less often than MIN_GALLOP consecutive times.
+#define MIN_GALLOP 7
+
+ //This is a global instance to allow much of this code to be reused. The interfaces are kept seperately
+var/datum/sortInstance/sortInstance = new()
+/datum/sortInstance
+ //The array being sorted.
+ var/list/L
+
+ //The comparator proc-reference
+ var/cmp = /proc/cmp_numeric_asc
+
+ //whether we are sorting list keys (0: L[i]) or associated values (1: L[L[i]])
+ var/associative = 0
+
+ //This controls when we get *into* galloping mode. It is initialized to MIN_GALLOP.
+ //The mergeLo and mergeHi methods nudge it higher for random data, and lower for highly structured data.
+ var/minGallop = MIN_GALLOP
+
+ //Stores information regarding runs yet to be merged.
+ //Run i starts at runBase[i] and extends for runLen[i] elements.
+ //runBase[i] + runLen[i] == runBase[i+1]
+ //var/stackSize
+ var/list/runBases = list()
+ var/list/runLens = list()
+
+
+ proc/timSort(start, end)
+ runBases.Cut()
+ runLens.Cut()
+
+ var/remaining = end - start
+
+ //If array is small, do a 'mini-TimSort' with no merges
+ if(remaining < MIN_MERGE)
+ var/initRunLen = countRunAndMakeAscending(start, end)
+ binarySort(start, end, start+initRunLen)
+ return
+
+ //March over the array finding natural runs
+ //Extend any short natural runs to runs of length minRun
+ var/minRun = minRunLength(remaining)
+
+ do
+ //identify next run
+ var/runLen = countRunAndMakeAscending(start, end)
+
+ //if run is short, extend to min(minRun, remaining)
+ if(runLen < minRun)
+ var/force = (remaining <= minRun) ? remaining : minRun
+
+ binarySort(start, start+force, start+runLen)
+ runLen = force
+
+ //add data about run to queue
+ runBases.Add(start)
+ runLens.Add(runLen)
+
+ //maybe merge
+ mergeCollapse()
+
+ //Advance to find next run
+ start += runLen
+ remaining -= runLen
+
+ while(remaining > 0)
+
+
+ //Merge all remaining runs to complete sort
+ //ASSERT(start == end)
+ mergeForceCollapse();
+ //ASSERT(runBases.len == 1)
+
+ //reset minGallop, for successive calls
+ minGallop = MIN_GALLOP
+
+ return L
+
+ /*
+ Sorts the specified portion of the specified array using a binary
+ insertion sort. This is the best method for sorting small numbers
+ of elements. It requires O(n log n) compares, but O(n^2) data
+ movement (worst case).
+
+ If the initial part of the specified range is already sorted,
+ this method can take advantage of it: the method assumes that the
+ elements in range [lo,start) are already sorted
+
+ lo the index of the first element in the range to be sorted
+ hi the index after the last element in the range to be sorted
+ start the index of the first element in the range that is not already known to be sorted
+ */
+ proc/binarySort(lo, hi, start)
+ //ASSERT(lo <= start && start <= hi)
+ if(start <= lo)
+ start = lo + 1
+
+ for(,start < hi, ++start)
+ var/pivot = fetchElement(L,start)
+
+ //set left and right to the index where pivot belongs
+ var/left = lo
+ var/right = start
+ //ASSERT(left <= right)
+
+ //[lo, left) elements <= pivot < [right, start) elements
+ //in other words, find where the pivot element should go using bisection search
+ while(left < right)
+ var/mid = (left + right) >> 1 //round((left+right)/2)
+ if(call(cmp)(pivot, fetchElement(L,mid)) < 0)
+ right = mid
+ else
+ left = mid+1
+
+ //ASSERT(left == right)
+ moveElement(L, start, left) //move pivot element to correct location in the sorted range
+
+ /*
+ Returns the length of the run beginning at the specified position and reverses the run if it is back-to-front
+
+ A run is the longest ascending sequence with:
+ a[lo] <= a[lo + 1] <= a[lo + 2] <= ...
+ or the longest descending sequence with:
+ a[lo] > a[lo + 1] > a[lo + 2] > ...
+
+ For its intended use in a stable mergesort, the strictness of the
+ definition of "descending" is needed so that the call can safely
+ reverse a descending sequence without violating stability.
+ */
+ proc/countRunAndMakeAscending(lo, hi)
+ //ASSERT(lo < hi)
+
+ var/runHi = lo + 1
+ if(runHi >= hi)
+ return 1
+
+ var/last = fetchElement(L,lo)
+ var/current = fetchElement(L,runHi++)
+
+ if(call(cmp)(current, last) < 0)
+ while(runHi < hi)
+ last = current
+ current = fetchElement(L,runHi)
+ if(call(cmp)(current, last) >= 0)
+ break
+ ++runHi
+ reverseRange(L, lo, runHi)
+ else
+ while(runHi < hi)
+ last = current
+ current = fetchElement(L,runHi)
+ if(call(cmp)(current, last) < 0)
+ break
+ ++runHi
+
+ return runHi - lo
+
+ //Returns the minimum acceptable run length for an array of the specified length.
+ //Natural runs shorter than this will be extended with binarySort
+ proc/minRunLength(n)
+ //ASSERT(n >= 0)
+ var/r = 0 //becomes 1 if any bits are shifted off
+ while(n >= MIN_MERGE)
+ r |= (n & 1)
+ n >>= 1
+ return n + r
+
+ //Examines the stack of runs waiting to be merged and merges adjacent runs until the stack invariants are reestablished:
+ // runLen[i-3] > runLen[i-2] + runLen[i-1]
+ // runLen[i-2] > runLen[i-1]
+ //This method is called each time a new run is pushed onto the stack.
+ //So the invariants are guaranteed to hold for i= 2)
+ var/n = runBases.len - 1
+ if(n > 1 && runLens[n-1] <= runLens[n] + runLens[n+1])
+ if(runLens[n-1] < runLens[n+1])
+ --n
+ mergeAt(n)
+ else if(runLens[n] <= runLens[n+1])
+ mergeAt(n)
+ else
+ break //Invariant is established
+
+
+ //Merges all runs on the stack until only one remains.
+ //Called only once, to finalise the sort
+ proc/mergeForceCollapse()
+ while(runBases.len >= 2)
+ var/n = runBases.len - 1
+ if(n > 1 && runLens[n-1] < runLens[n+1])
+ --n
+ mergeAt(n)
+
+
+ //Merges the two consecutive runs at stack indices i and i+1
+ //Run i must be the penultimate or antepenultimate run on the stack
+ //In other words, i must be equal to stackSize-2 or stackSize-3
+ proc/mergeAt(i)
+ //ASSERT(runBases.len >= 2)
+ //ASSERT(i >= 1)
+ //ASSERT(i == runBases.len - 1 || i == runBases.len - 2)
+
+ var/base1 = runBases[i]
+ var/base2 = runBases[i+1]
+ var/len1 = runLens[i]
+ var/len2 = runLens[i+1]
+
+ //ASSERT(len1 > 0 && len2 > 0)
+ //ASSERT(base1 + len1 == base2)
+
+ //Record the legth of the combined runs. If i is the 3rd last run now, also slide over the last run
+ //(which isn't involved in this merge). The current run (i+1) goes away in any case.
+ runLens[i] += runLens[i+1]
+ runLens.Cut(i+1, i+2)
+ runBases.Cut(i+1, i+2)
+
+
+ //Find where the first element of run2 goes in run1.
+ //Prior elements in run1 can be ignored (because they're already in place)
+ var/k = gallopRight(fetchElement(L,base2), base1, len1, 0)
+ //ASSERT(k >= 0)
+ base1 += k
+ len1 -= k
+ if(len1 == 0)
+ return
+
+ //Find where the last element of run1 goes in run2.
+ //Subsequent elements in run2 can be ignored (because they're already in place)
+ len2 = gallopLeft(fetchElement(L,base1 + len1 - 1), base2, len2, len2-1)
+ //ASSERT(len2 >= 0)
+ if(len2 == 0)
+ return
+
+ //Merge remaining runs, using tmp array with min(len1, len2) elements
+ if(len1 <= len2)
+ mergeLo(base1, len1, base2, len2)
+ else
+ mergeHi(base1, len1, base2, len2)
+
+
+ /*
+ Locates the position to insert key within the specified sorted range
+ If the range contains elements equal to key, this will return the index of the LEFTMOST of those elements
+
+ key the element to be inserted into the sorted range
+ base the index of the first element of the sorted range
+ len the length of the sorted range, must be greater than 0
+ hint the offset from base at which to begin the search, such that 0 <= hint < len; i.e. base <= hint < base+hint
+
+ Returns the index at which to insert element 'key'
+ */
+ proc/gallopLeft(key, base, len, hint)
+ //ASSERT(len > 0 && hint >= 0 && hint < len)
+
+ var/lastOffset = 0
+ var/offset = 1
+ if(call(cmp)(key, fetchElement(L,base+hint)) > 0)
+ var/maxOffset = len - hint
+ while(offset < maxOffset && call(cmp)(key, fetchElement(L,base+hint+offset)) > 0)
+ lastOffset = offset
+ offset = (offset << 1) + 1
+
+ if(offset > maxOffset)
+ offset = maxOffset
+
+ lastOffset += hint
+ offset += hint
+
+ else
+ var/maxOffset = hint + 1
+ while(offset < maxOffset && call(cmp)(key, fetchElement(L,base+hint-offset)) <= 0)
+ lastOffset = offset
+ offset = (offset << 1) + 1
+
+ if(offset > maxOffset)
+ offset = maxOffset
+
+ var/temp = lastOffset
+ lastOffset = hint - offset
+ offset = hint - temp
+
+ //ASSERT(-1 <= lastOffset && lastOffset < offset && offset <= len)
+
+ //Now L[base+lastOffset] < key <= L[base+offset], so key belongs somewhere to the right of lastOffset but no farther than
+ //offset. Do a binary search with invariant L[base+lastOffset-1] < key <= L[base+offset]
+ ++lastOffset
+ while(lastOffset < offset)
+ var/m = lastOffset + ((offset - lastOffset) >> 1)
+
+ if(call(cmp)(key, fetchElement(L,base+m)) > 0)
+ lastOffset = m + 1
+ else
+ offset = m
+
+ //ASSERT(lastOffset == offset)
+ return offset
+
+ /**
+ * Like gallopLeft, except that if the range contains an element equal to
+ * key, gallopRight returns the index after the rightmost equal element.
+ *
+ * @param key the key whose insertion point to search for
+ * @param a the array in which to search
+ * @param base the index of the first element in the range
+ * @param len the length of the range; must be > 0
+ * @param hint the index at which to begin the search, 0 <= hint < n.
+ * The closer hint is to the result, the faster this method will run.
+ * @param c the comparator used to order the range, and to search
+ * @return the int k, 0 <= k <= n such that a[b + k - 1] <= key < a[b + k]
+ */
+ proc/gallopRight(key, base, len, hint)
+ //ASSERT(len > 0 && hint >= 0 && hint < len)
+
+ var/offset = 1
+ var/lastOffset = 0
+ if(call(cmp)(key, fetchElement(L,base+hint)) < 0) //key <= L[base+hint]
+ var/maxOffset = hint + 1 //therefore we want to insert somewhere in the range [base,base+hint] = [base+,base+(hint+1))
+ while(offset < maxOffset && call(cmp)(key, fetchElement(L,base+hint-offset)) < 0) //we are iterating backwards
+ lastOffset = offset
+ offset = (offset << 1) + 1 //1 3 7 15
+ //if(offset <= 0) //int overflow, not an issue here since we are using floats
+ // offset = maxOffset
+
+ if(offset > maxOffset)
+ offset = maxOffset
+
+ var/temp = lastOffset
+ lastOffset = hint - offset
+ offset = hint - temp
+
+ else //key > L[base+hint]
+ var/maxOffset = len - hint //therefore we want to insert somewhere in the range (base+hint,base+len) = [base+hint+1, base+hint+(len-hint))
+ while(offset < maxOffset && call(cmp)(key, fetchElement(L,base+hint+offset)) >= 0)
+ lastOffset = offset
+ offset = (offset << 1) + 1
+ //if(offset <= 0) //int overflow, not an issue here since we are using floats
+ // offset = maxOffset
+
+ if(offset > maxOffset)
+ offset = maxOffset
+
+ lastOffset += hint
+ offset += hint
+
+ //ASSERT(-1 <= lastOffset && lastOffset < offset && offset <= len)
+
+ ++lastOffset
+ while(lastOffset < offset)
+ var/m = lastOffset + ((offset - lastOffset) >> 1)
+
+ if(call(cmp)(key, fetchElement(L,base+m)) < 0) //key <= L[base+m]
+ offset = m
+ else //key > L[base+m]
+ lastOffset = m + 1
+
+ //ASSERT(lastOffset == offset)
+
+ return offset
+
+
+ //Merges two adjacent runs in-place in a stable fashion.
+ //For performance this method should only be called when len1 <= len2!
+ proc/mergeLo(base1, len1, base2, len2)
+ //ASSERT(len1 > 0 && len2 > 0 && base1 + len1 == base2)
+
+ //degenerate cases
+ if(len2 == 1)
+ moveElement(L, base2, base1)
+ return
+
+ if(len1 == 1)
+ moveElement(L, base1, base2+len2-1)
+ return
+
+
+ //Move first element of second run
+ moveElement(L, base2, base1) //L[dest++] = L[cursor2++]
+ --len2
+
+ var/cursor1 = base1+1
+ var/cursor2 = base2+1
+
+ outer:
+ while(1)
+ var/count1 = 0 //# of times in a row that first run won
+ var/count2 = 0 // " " " " " " second run won
+
+ //do the straightfoward thin until one run starts winning consistently
+
+ do
+ //ASSERT(len1 > 1 && len2 > 0)
+ if(call(cmp)(fetchElement(L,cursor2), fetchElement(L,cursor1)) < 0)
+ moveElement(L, cursor2, cursor1)
+ ++cursor2
+ ++cursor1
+ --len2
+
+ ++count2
+ count1 = 0
+
+ if(len2 == 0)
+ break outer
+ else
+ ++cursor1
+
+ ++count1
+ count2 = 0
+
+ if(--len1 == 1)
+ break outer
+
+ while((count1 | count2) < minGallop)
+
+
+ //one run is winning consistently so galloping may provide huge benifits
+ //so try galloping, until such time as the run is no longer consistently winning
+ do
+ //ASSERT(len1 > 1 && len2 > 0)
+
+ count1 = gallopRight(fetchElement(L,cursor2), cursor1, len1, 0)
+ if(count1)
+ cursor1 += count1
+ len1 -= count1
+
+ if(len1 <= 1)
+ break outer
+
+ moveElement(L, cursor2, cursor1)
+ ++cursor2
+ ++cursor1
+ if(--len2 == 0)
+ break outer
+
+ count2 = gallopLeft(fetchElement(L,cursor1), cursor2, len2, 0)
+ if(count2)
+ moveRange(L, cursor2, cursor1, count2)
+
+ cursor2 += count2
+ cursor1 += count2
+ len2 -= count2
+
+ if(len2 == 0)
+ break outer
+
+ ++cursor1
+ if(--len1 == 1)
+ break outer
+
+ --minGallop
+
+ while((count1|count2) > MIN_GALLOP)
+
+ if(minGallop < 0)
+ minGallop = 0
+ minGallop += 2; // Penalize for leaving gallop mode
+
+
+ if(len1 == 1)
+ //ASSERT(len2 > 0)
+
+ moveRange(L, cursor2, cursor1, len2)
+
+ //else
+ //ASSERT(len2 == 0)
+ //ASSERT(len1 > 1)
+
+
+ proc/mergeHi(base1, len1, base2, len2)
+ //ASSERT(len1 > 0 && len2 > 0 && base1 + len1 == base2)
+
+ //degenerate cases
+ if(len2 == 1)
+ moveElement(L, base2, base1)
+ return
+
+ if(len1 == 1)
+ moveElement(L, base1, base2+len2-1)
+ return
+
+ var/cursor1 = base1 + len1 - 1
+ var/cursor2 = base2 + len2 - 1
+
+ moveElement(L, cursor1, cursor2)
+ --len1
+ --cursor1
+ --cursor2
+
+ outer:
+ while(1)
+ var/count1 = 0 //# of times in a row that first run won
+ var/count2 = 0 // " " " " " " second run won
+
+ //do the straightfoward thing until one run starts winning consistently
+ do
+ //ASSERT(len1 > 0 && len2 > 1)
+ if(call(cmp)(fetchElement(L,cursor2), fetchElement(L,cursor1)) < 0)
+ moveElement(L, cursor1, cursor2)
+
+ --cursor1
+ --cursor2
+ --len1
+
+ ++count1
+ count2 = 0
+
+ if(len1 == 0)
+ break outer
+ else
+ --cursor2
+ --len2
+
+ ++count2
+ count1 = 0
+
+ if(len2 == 1)
+ break outer
+ while((count1 | count2) < minGallop)
+
+ //one run is winning consistently so galloping may provide huge benifits
+ //so try galloping, until such time as the run is no longer consistently winning
+ do
+ //ASSERT(len1 > 0 && len2 > 1)
+
+ count1 = len1 - gallopRight(fetchElement(L,cursor2), base1, len1, len1-1) //should cursor1 be base1?
+ if(count1)
+ cursor1 -= count1
+ cursor2 -= count1
+ len1 -= count1
+
+ moveRange(L, cursor1+1, cursor2+1, count1)
+
+ if(len1 == 0)
+ break outer
+
+ --cursor2
+
+ if(--len2 == 1)
+ break outer
+
+ count2 = len2 - gallopLeft(fetchElement(L,cursor1), base1+len1, len2, len2-1)
+ if(count2)
+ cursor2 -= count2
+ len2 -= count2
+
+ if(len2 <= 1)
+ break outer
+
+ moveElement(L, cursor1, cursor2)
+ --cursor1
+ --cursor2
+ --len1
+
+ if(len1 == 0)
+ break outer
+
+ --minGallop
+ while((count1|count2) > MIN_GALLOP)
+
+ if(minGallop < 0)
+ minGallop = 0
+ minGallop += 2 // Penalize for leaving gallop mode
+
+ if(len2 == 1)
+ //ASSERT(len1 > 0)
+
+ cursor1 -= len1
+ cursor2 -= len1
+ moveRange(L, cursor1+1, cursor2+1, len1)
+
+ //else
+ //ASSERT(len1 == 0)
+ //ASSERT(len2 > 0)
+
+
+ proc/mergeSort(start, end)
+ var/remaining = end - start
+
+ //If array is small, do an insertion sort
+ if(remaining < MIN_MERGE)
+ //var/initRunLen = countRunAndMakeAscending(start, end)
+ binarySort(start, end, start/*+initRunLen*/)
+ return
+
+ var/minRun = minRunLength(remaining)
+
+ do
+ var/runLen = (remaining <= minRun) ? remaining : minRun
+
+ binarySort(start, start+runLen, start)
+
+ //add data about run to queue
+ runBases.Add(start)
+ runLens.Add(runLen)
+
+ //Advance to find next run
+ start += runLen
+ remaining -= runLen
+
+ while(remaining > 0)
+
+ while(runBases.len >= 2)
+ var/n = runBases.len - 1
+ if(n > 1 && runLens[n-1] <= runLens[n] + runLens[n+1])
+ if(runLens[n-1] < runLens[n+1])
+ --n
+ mergeAt2(n)
+ else if(runLens[n] <= runLens[n+1])
+ mergeAt2(n)
+ else
+ break //Invariant is established
+
+ while(runBases.len >= 2)
+ var/n = runBases.len - 1
+ if(n > 1 && runLens[n-1] < runLens[n+1])
+ --n
+ mergeAt2(n)
+
+ return L
+
+ proc/mergeAt2(i)
+ var/cursor1 = runBases[i]
+ var/cursor2 = runBases[i+1]
+
+ var/end1 = cursor1+runLens[i]
+ var/end2 = cursor2+runLens[i+1]
+
+ var/val1 = fetchElement(L,cursor1)
+ var/val2 = fetchElement(L,cursor2)
+
+ while(1)
+ if(call(cmp)(val1,val2) < 0)
+ if(++cursor1 >= end1)
+ break
+ val1 = fetchElement(L,cursor1)
+ else
+ moveElement(L,cursor2,cursor1)
+
+ ++cursor2
+ if(++cursor2 >= end2)
+ break
+ ++end1
+ ++cursor1
+ //if(++cursor1 >= end1)
+ // break
+
+ val2 = fetchElement(L,cursor2)
+
+
+ //Record the legth of the combined runs. If i is the 3rd last run now, also slide over the last run
+ //(which isn't involved in this merge). The current run (i+1) goes away in any case.
+ runLens[i] += runLens[i+1]
+ runLens.Cut(i+1, i+2)
+ runBases.Cut(i+1, i+2)
+
+#undef MIN_GALLOP
+#undef MIN_MERGE
+
+#undef moveElement
+#undef fetchElement
\ No newline at end of file
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index e2ea79d57b1..7450d98fcb8 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -283,6 +283,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
//Turns 1479 into 147.9
/proc/format_frequency(var/f)
+ f = text2num(f)
return "[round(f / 10)].[f % 10]"
@@ -484,7 +485,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
//Orders mobs by type then by name
/proc/sortmobs()
var/list/moblist = list()
- var/list/sortmob = sortAtom(mob_list)
+ var/list/sortmob = sortNames(mob_list)
for(var/mob/living/silicon/ai/M in sortmob)
moblist.Add(M)
for(var/mob/camera/M in sortmob)
@@ -817,7 +818,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
//Returns: all the areas in the world, sorted.
/proc/return_sorted_areas()
- return sortAtom(return_areas())
+ return sortNames(return_areas())
//Takes: Area type as text string or as typepath OR an instance of the area.
//Returns: A list of all areas of that type in the world.
diff --git a/code/_globalvars/game_modes.dm b/code/_globalvars/game_modes.dm
index 519987d8880..0e43d1f89e8 100644
--- a/code/_globalvars/game_modes.dm
+++ b/code/_globalvars/game_modes.dm
@@ -3,4 +3,4 @@ var/master_mode = "traitor"//"extended"
var/secret_force_mode = "secret" // if this is anything but "secret", the secret rotation will forceably choose this mode
var/wavesecret = 0 // meteor mode, delays wave progression, terrible name
-var/datum/station_state/start_state = null // Used in blob mode
+var/datum/station_state/start_state = null // Used in round-end report
diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm
index 5dbd2be86fa..a799dd0ee1c 100644
--- a/code/_globalvars/lists/objects.dm
+++ b/code/_globalvars/lists/objects.dm
@@ -12,4 +12,6 @@ var/global/list/active_diseases = 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
var/global/list/surgeries_list = list() //list of all surgeries by name, associated with their path.
-var/global/list/table_recipes = list() //list of all table craft recipes
\ No newline at end of file
+var/global/list/table_recipes = list() //list of all table craft recipes
+var/global/list/med_hud_users = list() //list of all entities using a medical HUD.
+var/global/list/sec_hud_users = list() //list of all entities using a security HUD.
\ No newline at end of file
diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm
index c90a8c19dbb..87d1feeb1e4 100644
--- a/code/_onclick/ai.dm
+++ b/code/_onclick/ai.dm
@@ -138,10 +138,12 @@
/obj/machinery/power/apc/AICtrlClick() // turns off/on APCs.
toggle_breaker()
+ add_fingerprint(usr)
/obj/machinery/turretid/AICtrlClick() //turns off/on Turrets
src.enabled = !src.enabled
src.updateTurrets()
+ add_fingerprint(usr)
/atom/proc/AIAltClick(var/mob/living/silicon/ai/user)
@@ -162,6 +164,7 @@
/obj/machinery/turretid/AIAltClick() //toggles lethal on turrets
src.lethal = !src.lethal
src.updateTurrets()
+ add_fingerprint(usr)
//
// Override TurfAdjacent for AltClicking
diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index 932d14deeeb..8f42c37993f 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -44,6 +44,7 @@
#define ui_storage1 "CENTER+1:18,SOUTH:5"
#define ui_storage2 "CENTER+2:20,SOUTH:5"
+#define ui_borg_sensor "CENTER-3:16, SOUTH:5" //borgs
#define ui_inv1 "CENTER-2:16,SOUTH:5" //borgs
#define ui_inv2 "CENTER-1 :16,SOUTH:5" //borgs
#define ui_inv3 "CENTER :16,SOUTH:5" //borgs
@@ -59,6 +60,10 @@
#define ui_alien_storage_l "CENTER-2:14,SOUTH:5"//alien
#define ui_alien_storage_r "CENTER+1:18,SOUTH:5"//alien
+#define ui_drone_drop "CENTER+1:18,SOUTH:5" //maintenance drones
+#define ui_drone_pull "CENTER+2:2,SOUTH:5" //maintenance drones
+#define ui_drone_storage "CENTER-2:14,SOUTH:5" //maintenance drones
+
//Lower right, persistant menu
#define ui_drop_throw "EAST-1:28,SOUTH+1:7"
#define ui_pull_resist "EAST-2:26,SOUTH+1:7"
@@ -80,6 +85,7 @@
#define ui_alien_toxin "EAST-1:28,CENTER+5:25"
#define ui_alien_fire "EAST-1:28,CENTER+4:25"
#define ui_alien_oxygen "EAST-1:28,CENTER+3:25"
+#define ui_alien_nightvision "EAST-1:28,CENTER+2:25"
//Middle right (status indicators)
#define ui_nutrition "EAST-1:28,CENTER-3:11"
@@ -94,20 +100,21 @@
// AI
-#define ui_ai_core "SOUTH:6,WEST:16"
-#define ui_ai_camera_list "SOUTH:6,WEST+1:16"
-#define ui_ai_track_with_camera "SOUTH:6,WEST+2:16"
-#define ui_ai_camera_light "SOUTH:6,WEST+3:16"
-#define ui_ai_crew_monitor "SOUTH:6,WEST+4:16"
-#define ui_ai_crew_manifest "SOUTH:6,WEST+5:16"
-#define ui_ai_alerts "SOUTH:6,WEST+6:16"
-#define ui_ai_announcement "SOUTH:6,WEST+7:16"
-#define ui_ai_shuttle "SOUTH:6,WEST+8:16"
-#define ui_ai_state_laws "SOUTH:6,WEST+9:16"
-#define ui_ai_pda_send "SOUTH:6,WEST+10:16"
-#define ui_ai_pda_log "SOUTH:6,WEST+11:16"
-#define ui_ai_take_picture "SOUTH:6,WEST+12:16"
-#define ui_ai_view_images "SOUTH:6,WEST+13:16"
+#define ui_ai_core "SOUTH:6,WEST"
+#define ui_ai_camera_list "SOUTH:6,WEST+1"
+#define ui_ai_track_with_camera "SOUTH:6,WEST+2"
+#define ui_ai_camera_light "SOUTH:6,WEST+3"
+#define ui_ai_crew_monitor "SOUTH:6,WEST+4"
+#define ui_ai_crew_manifest "SOUTH:6,WEST+5"
+#define ui_ai_alerts "SOUTH:6,WEST+6"
+#define ui_ai_announcement "SOUTH:6,WEST+7"
+#define ui_ai_shuttle "SOUTH:6,WEST+8"
+#define ui_ai_state_laws "SOUTH:6,WEST+9"
+#define ui_ai_pda_send "SOUTH:6,WEST+10"
+#define ui_ai_pda_log "SOUTH:6,WEST+11"
+#define ui_ai_take_picture "SOUTH:6,WEST+12"
+#define ui_ai_view_images "SOUTH:6,WEST+13"
+#define ui_ai_sensor "SOUTH:6,WEST+14"
//Pop-up inventory
#define ui_shoes "WEST+1:8,SOUTH:5"
diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm
index 9f254878373..b2d288b25e1 100644
--- a/code/_onclick/hud/ai.dm
+++ b/code/_onclick/hud/ai.dm
@@ -130,6 +130,15 @@
using.layer = 20
adding += using
- mymob.client.screen += adding + other
+//Medical/Security sensors
+ using = new /obj/screen()
+ using.name = "Sensor Augmentation"
+ using.icon = 'icons/mob/screen_ai.dmi'
+ using.icon_state = "ai_sensor"
+ using.screen_loc = ui_ai_sensor
+ using.layer = 20
+ adding += using
+
+ mymob.client.screen += adding + other
return
\ No newline at end of file
diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm
index 270d848eab9..797561e37cf 100644
--- a/code/_onclick/hud/alien.dm
+++ b/code/_onclick/hud/alien.dm
@@ -142,6 +142,12 @@
mymob.healths.name = "health"
mymob.healths.screen_loc = ui_alien_health
+ nightvisionicon = new /obj/screen()
+ nightvisionicon.icon ='icons/mob/screen_alien.dmi'
+ nightvisionicon.icon_state = "nightvision1"
+ nightvisionicon.name = "nightvision"
+ nightvisionicon.screen_loc = ui_alien_nightvision
+
alien_plasma_display = new /obj/screen()
alien_plasma_display.icon = 'icons/mob/screen_gen.dmi'
alien_plasma_display.icon_state = "power_display2"
@@ -168,6 +174,6 @@
mymob.client.screen = null
- mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.fire, mymob.healths, alien_plasma_display, mymob.pullin, mymob.blind, mymob.flash) //, mymob.hands, mymob.rest, mymob.sleep, mymob.mach )
+ mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.fire, mymob.healths, nightvisionicon, alien_plasma_display, mymob.pullin, mymob.blind, mymob.flash) //, mymob.hands, mymob.rest, mymob.sleep, mymob.mach )
mymob.client.screen += adding + other
diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm
index d1888d6d369..2775f546c6f 100644
--- a/code/_onclick/hud/alien_larva.dm
+++ b/code/_onclick/hud/alien_larva.dm
@@ -48,6 +48,12 @@
mymob.healths.name = "health"
mymob.healths.screen_loc = ui_alien_health
+ nightvisionicon = new /obj/screen()
+ nightvisionicon.icon ='icons/mob/screen_alien.dmi'
+ nightvisionicon.icon_state = "nightvision1"
+ nightvisionicon.name = "nightvision"
+ nightvisionicon.screen_loc = ui_alien_nightvision
+
mymob.pullin = new /obj/screen()
mymob.pullin.icon = 'icons/mob/screen_alien.dmi'
mymob.pullin.icon_state = "pull0"
@@ -74,5 +80,5 @@
mymob.client.screen = null
- mymob.client.screen += list( mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.fire, mymob.healths, mymob.pullin, mymob.blind, mymob.flash) //, mymob.rest, mymob.sleep, mymob.mach )
+ mymob.client.screen += list( mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.fire, mymob.healths, nightvisionicon, mymob.pullin, mymob.blind, mymob.flash) //, mymob.rest, mymob.sleep, mymob.mach )
mymob.client.screen += adding + other
\ No newline at end of file
diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index 103d639189d..70769bf9200 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -100,6 +100,7 @@ var/datum/global_hud/global_hud = new()
var/obj/screen/blobpwrdisplay
var/obj/screen/blobhealthdisplay
var/obj/screen/alien_plasma_display
+ var/obj/screen/nightvisionicon
var/obj/screen/r_hand_hud_object
var/obj/screen/l_hand_hud_object
var/obj/screen/action_intent
@@ -194,6 +195,8 @@ datum/hud/New(mob/owner)
ghost_hud()
else if(isovermind(mymob))
blob_hud()
+ else if(isdrone(mymob))
+ drone_hud(ui_style)
if(istype(mymob.loc,/obj/mecha))
show_hud(HUD_STYLE_REDUCED)
diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm
index c9a188d0c80..1f9cd32370e 100644
--- a/code/_onclick/hud/other_mobs.dm
+++ b/code/_onclick/hud/other_mobs.dm
@@ -30,3 +30,80 @@
mymob.client.screen = null
mymob.client.screen += list(blobpwrdisplay, blobhealthdisplay)
+
+/datum/hud/proc/drone_hud(ui_style = 'icons/mob/screen_midnight.dmi')
+ adding = list()
+
+ var/obj/screen/using
+ var/obj/screen/inventory/inv_box
+
+ using = new /obj/screen()
+ using.name = "drop"
+ using.icon = ui_style
+ using.icon_state = "act_drop"
+ using.screen_loc = ui_drone_drop
+ using.layer = 19
+ adding += using
+
+ mymob.pullin = new /obj/screen()
+ mymob.pullin.icon = ui_style
+ mymob.pullin.icon_state = "pull0"
+ mymob.pullin.name = "pull"
+ mymob.pullin.screen_loc = ui_drone_pull
+ adding += mymob.pullin
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "r_hand"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "hand_r_inactive"
+ if(mymob && !mymob.hand) //Hand being true means the LEFT hand is active
+ inv_box.icon_state = "hand_r_active"
+ inv_box.screen_loc = ui_rhand
+ inv_box.slot_id = slot_r_hand
+ inv_box.layer = 19
+ r_hand_hud_object = inv_box
+ adding += inv_box
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "l_hand"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "hand_l_inactive"
+ if(mymob && mymob.hand) //Hand being true means the LEFT hand is active
+ inv_box.icon_state = "hand_l_active"
+ inv_box.screen_loc = ui_lhand
+ inv_box.slot_id = slot_l_hand
+ inv_box.layer = 19
+ l_hand_hud_object = inv_box
+ adding += inv_box
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "internal storage"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "suit_storage"
+ inv_box.screen_loc = ui_drone_storage
+ inv_box.slot_id = "drone_storage_slot"
+ inv_box.layer = 19
+ adding += inv_box
+
+ using = new /obj/screen/inventory()
+ using.name = "hand"
+ using.icon = ui_style
+ using.icon_state = "swap_1_m"
+ using.screen_loc = ui_swaphand1
+ using.layer = 19
+ adding += using
+
+ using = new /obj/screen/inventory()
+ using.name = "hand"
+ using.icon = ui_style
+ using.icon_state = "swap_2"
+ using.screen_loc = ui_swaphand2
+ using.layer = 19
+ adding += using
+
+ mymob.zone_sel = new /obj/screen/zone_sel()
+ mymob.zone_sel.icon = ui_style
+ mymob.zone_sel.update_icon()
+
+ mymob.client.screen = null
+ mymob.client.screen += adding
diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm
index cdc83c0ba9f..f81d908e36a 100644
--- a/code/_onclick/hud/robot.dm
+++ b/code/_onclick/hud/robot.dm
@@ -63,6 +63,15 @@
using.layer = 20
adding += using
+//Sec/Med HUDs
+ using = new /obj/screen()
+ using.name = "Sensor Augmentation"
+ using.icon = 'icons/mob/screen_ai.dmi'
+ using.icon_state = "ai_sensor"
+ using.screen_loc = ui_borg_sensor
+ using.layer = 20
+ adding += using
+
//Intent
using = new /obj/screen()
using.name = "act_intent"
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 6f34d6ca6d4..8abf0690f2c 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -247,8 +247,28 @@
C.internals.icon_state = "internal1"
else
C << "You don't have an oxygen tank."
+
if("act_intent")
- usr.a_intent_change("right")
+ if(ishuman(usr) && (usr.client.prefs.toggles & INTENT_STYLE))
+
+ var/_x = text2num(params2list(params)["icon-x"])
+ var/_y = text2num(params2list(params)["icon-y"])
+
+ if(_x<=16 && _y<=16)
+ usr.a_intent_change("harm")
+
+ else if(_x<=16 && _y>=17)
+ usr.a_intent_change("help")
+
+ else if(_x>=17 && _y<=16)
+ usr.a_intent_change("grab")
+
+ else if(_x>=17 && _y>=17)
+ usr.a_intent_change("disarm")
+
+ else
+ usr.a_intent_change("right")
+
if("pull")
usr.stop_pulling()
if("throw/catch")
@@ -366,7 +386,14 @@
else if(isrobot(usr))
var/mob/living/silicon/robot/R = usr
R.aicamera.viewpictures()
-
+ if("nightvision")
+ if(isalien(usr))
+ var/mob/living/carbon/alien/humanoid/A = usr
+ A.nightvisiontoggle()
+ if("Sensor Augmentation")
+ if(issilicon(usr))
+ var/mob/living/silicon/S = usr
+ S.sensor_mode()
else
return 0
return 1
@@ -383,20 +410,23 @@
return 1
switch(name)
if("r_hand")
- if(iscarbon(usr))
- var/mob/living/carbon/C = usr
- C.activate_hand("r")
+ if(ismob(usr))
+ var/mob/Mr = usr
+ Mr.activate_hand("r")
if("l_hand")
- if(iscarbon(usr))
- var/mob/living/carbon/C = usr
- C.activate_hand("l")
+ if(ismob(usr))
+ var/mob/Ml = usr
+ Ml.activate_hand("l")
if("swap")
- usr:swap_hand()
+ if(ismob(usr))
+ var/mob/Ms = usr
+ Ms.swap_hand()
if("hand")
- usr:swap_hand()
+ if(ismob(usr))
+ var/mob/Mh = usr
+ Mh.swap_hand()
else
if(usr.attack_ui(slot_id))
usr.update_inv_l_hand(0)
usr.update_inv_r_hand(0)
return 1
-
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 5eccb4b2435..3bd7e96ee4c 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -60,7 +60,7 @@ obj/item/proc/get_clamped_volume()
user.lastattacked = M
M.lastattacker = user
- add_logs(user, M, "attacked", object=src.name, addition="(INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])")
+ add_logs(user, M, "attacked", object=src.name, addition="(INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])")
//spawn(1800) // this wont work right
// M.lastattacker = null
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index b74828c83f0..81c462441a8 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -23,7 +23,6 @@
var/log_emote = 0 // log emotes
var/log_attack = 0 // log attack messages
var/log_adminchat = 0 // log admin chat messages
- var/log_adminwarn = 0 // log warnings admins get about bomb construction and such
var/log_pda = 0 // log pda messages
var/log_hrefs = 0 // logs all links clicked in-game. Could be used for debugging and tracking down exploits
var/sql_enabled = 0 // for sql switching
@@ -78,13 +77,14 @@
var/allow_ai = 0 // allow ai job
var/traitor_scaling_coeff = 6 //how much does the amount of players get divided by to determine traitors
- var/changeling_scaling_coeff = 7 //how much does the amount of players get divided by to determine changelings
+ var/changeling_scaling_coeff = 6 //how much does the amount of players get divided by to determine changelings
var/security_scaling_coeff = 8 //how much does the amount of players get divided by to determine open security officer positions
var/traitor_objectives_amount = 2
var/protect_roles_from_antagonist = 0// If security and such can be traitor/cult/other
- var/allow_latejoin_antagonists = 0 // If late-joining players can be traitor/changeling
- var/continuous_round_rev = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke.
+ var/enforce_human_authority = 0 //If non-human species are barred from joining as a head of staff
+ var/allow_latejoin_antagonists = 0 // If late-joining players can be traitor/changeling
+ var/continuous_round_rev = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke.
var/continuous_round_wiz = 0
var/continuous_round_malf = 0
var/shuttle_refuel_delay = 12000
@@ -211,8 +211,6 @@
config.log_emote = 1
if("log_adminchat")
config.log_adminchat = 1
- if("log_adminwarn")
- config.log_adminwarn = 1
if("log_pda")
config.log_pda = 1
if("log_hrefs")
@@ -377,6 +375,8 @@
if("protect_roles_from_antagonist")
config.protect_roles_from_antagonist = 1
+ if("enforce_human_authority")
+ config.enforce_human_authority = 1
if("allow_latejoin_antagonists")
config.allow_latejoin_antagonists = 1
if("allow_random_events")
diff --git a/code/controllers/garbage.dm b/code/controllers/garbage.dm
index 322bc086d89..501ea8a2d92 100644
--- a/code/controllers/garbage.dm
+++ b/code/controllers/garbage.dm
@@ -70,7 +70,8 @@ var/datum/controller/garbage_collector/garbage = new()
// This should be overridden to remove all references pointing to the object being destroyed.
// Return true if the the GC controller should allow the object to continue existing. (Useful if pooling objects.)
/datum/proc/Destroy()
- del(src)
+ //del(src)
+ return
/datum/var/gc_destroyed //Time when this object was destroyed.
diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm
index 5f8d3c7d38c..3b54156cee6 100644
--- a/code/controllers/master_controller.dm
+++ b/code/controllers/master_controller.dm
@@ -236,83 +236,53 @@ var/global/pipe_processing_killed = 0
*/
/datum/controller/game_controller/proc/process_mobs()
- var/i = 1
- while(i<=mob_list.len)
- var/mob/M = mob_list[i]
- if(M && !M.gc_destroyed)
+ for(var/mob/M in mob_list)
+ if(!M.gc_destroyed)
last_thing_processed = M.type
M.Life()
- i++
continue
- mob_list.Cut(i,i+1)
+ mob_list -= M
/datum/controller/game_controller/proc/process_diseases()
- var/i = 1
- while(i<=active_diseases.len)
- var/datum/disease/Disease = active_diseases[i]
- if(Disease)
- last_thing_processed = Disease.type
- Disease.process()
- i++
- continue
- active_diseases.Cut(i,i+1)
+ for(var/datum/disease/Disease in active_diseases)
+ last_thing_processed = Disease.type
+ Disease.process()
/datum/controller/game_controller/proc/process_machines()
- var/i = 1
- while(i<=machines.len)
- var/obj/machinery/Machine = machines[i]
- if(Machine && !Machine.gc_destroyed)
+ for(var/obj/machinery/Machine in machines)
+ if(!Machine.gc_destroyed)
last_thing_processed = Machine.type
if(Machine.process() != PROCESS_KILL)
if(Machine)
if(Machine.use_power)
Machine.auto_use_power()
- i++
continue
- machines.Cut(i,i+1)
+ machines -= Machine
/datum/controller/game_controller/proc/process_objects()
- var/i = 1
- while(i<=processing_objects.len)
- var/obj/Object = processing_objects[i]
- if(Object && !Object.gc_destroyed)
+ for(var/obj/Object in processing_objects)
+ if(!Object.gc_destroyed)
last_thing_processed = Object.type
Object.process()
- i++
continue
- processing_objects.Cut(i,i+1)
+ processing_objects -= Object
/datum/controller/game_controller/proc/process_pipenets()
last_thing_processed = /datum/pipe_network
- var/i = 1
- while(i<=pipe_networks.len)
- var/datum/pipe_network/Network = pipe_networks[i]
- if(Network)
- Network.process()
- i++
- continue
- pipe_networks.Cut(i,i+1)
+ for(var/datum/pipe_network/Network in pipe_networks)
+ Network.process()
/datum/controller/game_controller/proc/process_powernets()
last_thing_processed = /datum/powernet
- var/i = 1
- while(i<=powernets.len)
- var/datum/powernet/Powernet = powernets[i]
- if(Powernet)
- Powernet.reset()
- i++
- continue
- powernets.Cut(i,i+1)
+ for(var/datum/powernet/Powernet in powernets)
+ Powernet.reset()
/datum/controller/game_controller/proc/process_nano()
- var/i = 1
- while(i<=nanomanager.processing_uis.len)
- var/datum/nanoui/ui = nanomanager.processing_uis[i]
- if(ui && ui.src_object && ui.user)
+ for(var/datum/nanoui/ui in nanomanager.processing_uis)
+ if(ui.src_object && ui.user)
ui.process()
- i++
continue
- nanomanager.processing_uis.Cut(i,i+1)
+ nanomanager.processing_uis -= ui
/datum/controller/game_controller/proc/Recover() //Mostly a placeholder for now.
var/msg = "## DEBUG: [time2text(world.timeofday)] MC restarted. Reports:\n"
diff --git a/code/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm
index 83fbd2c883a..c8ca0d4730d 100644
--- a/code/controllers/shuttle_controller.dm
+++ b/code/controllers/shuttle_controller.dm
@@ -37,16 +37,19 @@ var/global/datum/shuttle_controller/emergency_shuttle/emergency_shuttle
// call the shuttle
// if not called before, set the endtime to T+600 seconds
// otherwise if outgoing, switch to incoming
-/datum/shuttle_controller/proc/incall(coeff = 1, var/signal_origin)
+/datum/shuttle_controller/proc/incall(coeff = 1, var/signal_origin, var/emergency_reason, var/red_alert)
if(endtime)
if(direction == -1)
setdirection(1)
else
- if(signal_origin && prob(60)) //40% chance the signal tracing will fail
+ if(recall_count > 2 && signal_origin && prob(70)) //30% chance the signal tracing will fail
last_call_loc = signal_origin
else
last_call_loc = null
+
+ priority_announce("The emergency shuttle has been called. [red_alert ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.[emergency_reason][emergency_shuttle.last_call_loc ? "\n\nCall signal traced. Results can be viewed on any communcations console." : "" ]", null, 'sound/AI/shuttlecalled.ogg', "Priority")
+
settimeleft(SHUTTLEARRIVETIME*coeff)
online = 1
if(always_fake_recall)
@@ -67,15 +70,15 @@ var/global/datum/shuttle_controller/emergency_shuttle/emergency_shuttle
recall_count ++
- if(recall_count > 2 && signal_origin && prob(60)) //40% chance the signal tracing will fail
+ if(recall_count > 2 && signal_origin && prob(70)) //30% chance the signal tracing will fail
last_call_loc = signal_origin
else
last_call_loc = null
if(recall_count == 2)
- priority_announce("The emergency shuttle has been recalled.\n\nExcessive number of emergency shuttle calls detected. We will attempt to trace all future calls and recalls to their source. Tracing results can be viewed on any communications console.", null, 'sound/AI/shuttlerecalled.ogg')
+ priority_announce("The emergency shuttle has been recalled.\n\nExcessive number of emergency shuttle calls detected. We will attempt to trace all future calls and recalls to their source. Tracing results may be viewed on any communications console.", null, 'sound/AI/shuttlerecalled.ogg')
else
- priority_announce("The emergency shuttle has been recalled.", null, 'sound/AI/shuttlerecalled.ogg', "Priority")
+ priority_announce("The emergency shuttle has been recalled.[last_call_loc ? " Recall signal traced. Results can be viewed on any communcations console." : "" ]", null, 'sound/AI/shuttlerecalled.ogg', "Priority")
setdirection(-1)
online = 1
@@ -134,7 +137,6 @@ var/global/datum/shuttle_controller/emergency_shuttle/emergency_shuttle
incall(SHUTTLEAUTOCALLTIMER) //X minutes! If they want to recall, they have X-(X-5) minutes to do so
log_game("All the communications consoles were destroyed and all AIs are inactive. Shuttle called.")
message_admins("All the communications consoles were destroyed and all AIs are inactive. Shuttle called.", 1)
- priority_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.", null, 'sound/AI/shuttlecalled.ogg', "Priority")
/datum/shuttle_controller/proc/move_shuttles()
var/datum/shuttle_manager/s
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index 2fb8c9bd852..c072fc6ae39 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -639,7 +639,7 @@ body
reagent_options[R.name] = r_id
if(reagent_options.len)
- reagent_options = sortAssoc(reagent_options)
+ sortList(reagent_options)
reagent_options.Insert(1, "CANCEL")
var/chosen = input(usr, "Choose a reagent to add.", "Choose a reagent.") in reagent_options
diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm
index bb806676109..3526359eadb 100644
--- a/code/datums/diseases/transformation.dm
+++ b/code/datums/diseases/transformation.dm
@@ -58,7 +58,6 @@
var/mob/living/new_mob = new new_form(affected_mob.loc)
if(istype(new_mob))
new_mob.a_intent = "harm"
- new_mob.universal_speak = 1
if(affected_mob.mind)
affected_mob.mind.transfer_to(new_mob)
else
diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm
index 2c43d367ce0..a4897448f17 100644
--- a/code/datums/helper_datums/getrev.dm
+++ b/code/datums/helper_datums/getrev.dm
@@ -33,5 +33,8 @@ client/verb/showrevinfo()
src << "[revdata.revision]"
else
src << "Revision unknown"
- src << "Current Infomational Settings:
Protect Authority Roles From Traitor: [config.protect_roles_from_antagonist]
Allow Latejoin Antagonists: [config.allow_latejoin_antagonists]"
+ src << "Current Infomational Settings:"
+ src << "Protect Authority Roles From Traitor: [config.protect_roles_from_antagonist]"
+ src << "Enforce Human Authority: [config.enforce_human_authority]"
+ src << "Allow Latejoin Antagonists: [config.allow_latejoin_antagonists]"
return
\ No newline at end of file
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index a554cc42484..8a26a4f0cfb 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -872,7 +872,7 @@
ticker.mode.changelings += src
current.make_changeling()
special_role = "Changeling"
- current << "Your powers are awoken. A flash of memory returns to us...we are a changeling!"
+ current << "Your powers are awoken. A flash of memory returns to us...we are [changeling.changelingID], a changeling!"
message_admins("[key_name_admin(usr)] has changeling'ed [current].")
log_admin("[key_name(usr)] has changeling'ed [current].")
if("autoobjectives")
@@ -1106,21 +1106,16 @@
ticker.mode.finalize_traitor(src)
ticker.mode.greet_traitor(src)
-/datum/mind/proc/make_Nuke()
+/datum/mind/proc/make_Nuke(var/turf/spawnloc,var/nuke_code,var/leader=0)
if(!(src in ticker.mode.syndicates))
ticker.mode.syndicates += src
ticker.mode.update_synd_icons_added(src)
- if (ticker.mode.syndicates.len==1)
- ticker.mode.prepare_syndicate_leader(src)
- else
- current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]"
special_role = "Syndicate"
assigned_role = "MODE"
- current << "You are a [syndicate_name()] agent!"
ticker.mode.forge_syndicate_objectives(src)
ticker.mode.greet_syndicate(src)
- current.loc = get_turf(locate("landmark*Syndicate-Spawn"))
+ current.loc = spawnloc
var/mob/living/carbon/human/H = current
qdel(H.belt)
@@ -1135,6 +1130,15 @@
ticker.mode.equip_syndicate(current)
+ if (nuke_code)
+ store_memory("Syndicate Nuclear Bomb Code: [nuke_code]", 0, 0)
+ current << "The nuclear authorization code is: [nuke_code]"
+
+ if (leader)
+ ticker.mode.prepare_syndicate_leader(src,nuke_code)
+ else
+ current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]"
+
/datum/mind/proc/make_Changling()
if(!(src in ticker.mode.changelings))
ticker.mode.changelings += src
diff --git a/code/datums/spells/mind_transfer.dm b/code/datums/spells/mind_transfer.dm
index 586fd7a2700..0c8032c9b7e 100644
--- a/code/datums/spells/mind_transfer.dm
+++ b/code/datums/spells/mind_transfer.dm
@@ -18,7 +18,7 @@ Urist: I don't feel like figuring out how you store object spells so I'm leaving
Make sure spells that are removed from spell_list are actually removed and deleted when mind transfering.
Also, you never added distance checking after target is selected. I've went ahead and did that.
*/
-/obj/effect/proc_holder/spell/targeted/mind_transfer/cast(list/targets,mob/user = usr)
+/obj/effect/proc_holder/spell/targeted/mind_transfer/cast(list/targets,mob/user = usr, distanceoverride)
if(!targets.len)
user << "No mind found."
return
@@ -29,7 +29,7 @@ Also, you never added distance checking after target is selected. I've went ahea
var/mob/living/target = targets[1]
- if(!(target in oview(range)))//If they are not in overview after selection. Do note that !() is necessary for in to work because ! takes precedence over it.
+ if(!(target in oview(range)) && !distanceoverride)//If they are not in overview after selection. Do note that !() is necessary for in to work because ! takes precedence over it.
user << "They are too far away!"
return
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 70b2850813d..0c4398b1c34 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -55,13 +55,10 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
manifest += ""
for(var/path in contains)
if(!path) continue
- var/atom/movable/AM = new path()
- manifest += "- [AM.name]
"
-// del AM //just to make sure they're deleted, no longer garbage collected, as there are way to many objects in crates that have other references.
- qdel(AM) // How about we fix the issues rather than bypass them, mmkay?
+ var/atom/movable/AM = path
+ manifest += "- [initial(AM.name)]
"
manifest += "
"
-
////// Use the sections to keep things tidy please /Malkevin
//////////////////////////////////////////////////////////////////////////////
@@ -156,6 +153,13 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
containername = "special ops crate"
hidden = 1
+/datum/supply_packs/emergency/syndicate
+ name = "#ERROR_NULL_ENTRY"
+ contains = list(/obj/item/weapon/storage/box/syndicate)
+ cost = 140
+ containertype = /obj/structure/closet/crate
+ containername = "crate"
+ hidden = 1
//////////////////////////////////////////////////////////////////////////////
//////////////////////////// Security ////////////////////////////////////////
@@ -494,6 +498,15 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
cost = 25
containername = "particle accelerator crate"
+/datum/supply_packs/engineering/engine/spacesuit
+ name = "Space Suit crate"
+ contains = list(/obj/item/clothing/suit/space,
+ /obj/item/clothing/head/helmet/space,
+ /obj/item/clothing/mask/breath,)
+ cost = 80
+ containertype = /obj/structure/closet/crate/secure
+ containername = "space suit crate"
+ access = access_eva
//////////////////////////////////////////////////////////////////////////////
//////////////////////////// Medical /////////////////////////////////////////
@@ -939,6 +952,16 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
cost = 40 // it costs so much because the Space Church is ran by Space Jews
containername = "religious supplies crate"
+/datum/supply_packs/misc/posters
+ name = "Corporate Posters Crate"
+ contains = list(/obj/item/weapon/contraband/poster/legit,
+ /obj/item/weapon/contraband/poster/legit,
+ /obj/item/weapon/contraband/poster/legit,
+ /obj/item/weapon/contraband/poster/legit,
+ /obj/item/weapon/contraband/poster/legit)
+ cost = 8
+ containername = "Corporate Posters Crate"
+
///////////// Paper Work
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index c63f2e428fb..fa6d850888e 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -241,7 +241,7 @@ var/list/uplink_items = list()
desc = "A syringe disguised as a functional pen, filled with a potent mix of drugs, including a strong anaesthetic and a chemical that is capable of blocking the movement of the vocal chords. \
The pen holds one dose of the mixture, and cannot be refilled."
item = /obj/item/weapon/pen/sleepy
- cost = 3
+ cost = 2
excludefrom = list(/datum/game_mode/nuclear)
/datum/uplink_item/stealthy_weapons/soap
@@ -395,7 +395,7 @@ var/list/uplink_items = list()
desc = "The Syndicate Bomb has an adjustable timer with a minimum setting of 60 seconds. Ordering the bomb sends you a small beacon, which will teleport the explosive to your location when you activate it. \
You can wrench the bomb down to prevent removal. The crew may attempt to defuse the bomb."
item = /obj/item/device/sbeacondrop/bomb
- cost = 5
+ cost = 6
excludefrom = list(/datum/game_mode/traitor/double_agents)
/datum/uplink_item/device_tools/rad_laser
diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm
index 372578e6038..48691c47bff 100644
--- a/code/datums/wires/airlock.dm
+++ b/code/datums/wires/airlock.dm
@@ -36,7 +36,7 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048
. += ..()
. += text("
\n[]
\n[]
\n[]
\n[]
\n[]
\n[]
\n[]", (A.locked ? "The door bolts have fallen!" : "The door bolts look up."),
(A.lights ? "The door bolt lights are on." : "The door bolt lights are off!"),
- ((A.arePowerSystemsOn() && !(A.stat & NOPOWER)) ? "The test light is on." : "The test light is off!"),
+ ((A.hasPower()) ? "The test light is on." : "The test light is off!"),
((A.aiControlDisabled==0 && !A.emagged) ? "The 'AI control allowed' light is on." : "The 'AI control allowed' light is off."),
(A.safe==0 ? "The 'Check Wiring' light is on." : "The 'Check Wiring' light is off."),
(A.normalspeed==0 ? "The 'Check Timing Mechanism' light is on." : "The 'Check Timing Mechanism' light is off."),
@@ -124,7 +124,7 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048
switch(index)
if(AIRLOCK_WIRE_IDSCAN)
//Sending a pulse through this disables emergency access and flashes the red light on the door (if the door has power).
- if((A.arePowerSystemsOn()) && (!(A.stat & NOPOWER)) && A.density)
+ if(A.hasPower() && A.density)
A.do_animate("deny")
if(A.emergency)
A.emergency = 0
@@ -140,7 +140,7 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048
for(var/mob/M in range(1, A))
M << "You hear a click from the bottom of the door."
else
- if(A.arePowerSystemsOn()) //only can raise bolts if power's on
+ if(A.hasPower()) //only can raise bolts if power's on
A.locked = 0
for(var/mob/M in range(1, A))
M << "You hear a click from the bottom of the door."
diff --git a/code/defines/procs/priority_announce.dm b/code/defines/procs/priority_announce.dm
index c191abe3265..621a4c913a2 100644
--- a/code/defines/procs/priority_announce.dm
+++ b/code/defines/procs/priority_announce.dm
@@ -43,5 +43,5 @@
for(var/mob/M in player_list)
if(!istype(M,/mob/new_player) && !M.ear_deaf)
- M << "[title] [message]"
+ M << "[title]
[message]
"
M << sound('sound/misc/notice2.ogg')
\ No newline at end of file
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index 8ac516f431d..2dfcc6f3c9c 100644
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -833,11 +833,10 @@ proc/process_ghost_teleport_locs()
/area/engine/engine_smes
name = "\improper Engineering SMES"
icon_state = "engine_smes"
- requires_power = 0//This area only covers the batteries and they deal with their own power
/area/engine/engineering
name = "Engineering"
- icon_state = "engine_smes"
+ icon_state = "engine"
/area/engine/break_room
name = "\improper Engineering Foyer"
@@ -855,7 +854,6 @@ proc/process_ghost_teleport_locs()
name = "Gravity Generator Room"
icon_state = "blue"
-
//Solars
/area/solar
@@ -1542,6 +1540,198 @@ proc/process_ghost_teleport_locs()
has_gravity = 1
ambientsounds = list('sound/ambience/shore.ogg', 'sound/ambience/seag1.ogg','sound/ambience/seag2.ogg','sound/ambience/seag2.ogg')
+/area/spacecontent
+ name = "space"
+
+/area/spacecontent/a1
+ icon_state = "spacecontent1"
+
+/area/spacecontent/a2
+ icon_state = "spacecontent2"
+
+/area/spacecontent/a3
+ icon_state = "spacecontent3"
+
+/area/spacecontent/a4
+ icon_state = "spacecontent4"
+
+/area/spacecontent/a5
+ icon_state = "spacecontent5"
+
+/area/spacecontent/a6
+ icon_state = "spacecontent6"
+
+/area/spacecontent/a7
+ icon_state = "spacecontent7"
+
+/area/spacecontent/a8
+ icon_state = "spacecontent8"
+
+/area/spacecontent/a9
+ icon_state = "spacecontent9"
+
+/area/spacecontent/a10
+ icon_state = "spacecontent10"
+
+/area/spacecontent/a11
+ icon_state = "spacecontent11"
+
+/area/spacecontent/a11
+ icon_state = "spacecontent12"
+
+/area/spacecontent/a12
+ icon_state = "spacecontent13"
+
+/area/spacecontent/a13
+ icon_state = "spacecontent14"
+
+/area/spacecontent/a14
+ icon_state = "spacecontent14"
+
+/area/spacecontent/a15
+ icon_state = "spacecontent15"
+
+/area/spacecontent/a16
+ icon_state = "spacecontent16"
+
+/area/spacecontent/a17
+ icon_state = "spacecontent17"
+
+/area/spacecontent/a18
+ icon_state = "spacecontent18"
+
+/area/spacecontent/a19
+ icon_state = "spacecontent19"
+
+/area/spacecontent/a20
+ icon_state = "spacecontent20"
+
+/area/spacecontent/a21
+ icon_state = "spacecontent21"
+
+/area/spacecontent/a22
+ icon_state = "spacecontent22"
+
+/area/spacecontent/a23
+ icon_state = "spacecontent23"
+
+/area/spacecontent/a24
+ icon_state = "spacecontent24"
+
+/area/spacecontent/a25
+ icon_state = "spacecontent25"
+
+/area/spacecontent/a26
+ icon_state = "spacecontent26"
+
+/area/spacecontent/a27
+ icon_state = "spacecontent27"
+
+/area/spacecontent/a28
+ icon_state = "spacecontent28"
+
+/area/spacecontent/a29
+ icon_state = "spacecontent29"
+
+/area/spacecontent/a30
+ icon_state = "spacecontent30"
+
+/area/awaycontent
+ name = "space"
+
+/area/awaycontent/a1
+ icon_state = "awaycontent1"
+
+/area/awaycontent/a2
+ icon_state = "awaycontent2"
+
+/area/awaycontent/a3
+ icon_state = "awaycontent3"
+
+/area/awaycontent/a4
+ icon_state = "awaycontent4"
+
+/area/awaycontent/a5
+ icon_state = "awaycontent5"
+
+/area/awaycontent/a6
+ icon_state = "awaycontent6"
+
+/area/awaycontent/a7
+ icon_state = "awaycontent7"
+
+/area/awaycontent/a8
+ icon_state = "awaycontent8"
+
+/area/awaycontent/a9
+ icon_state = "awaycontent9"
+
+/area/awaycontent/a10
+ icon_state = "awaycontent10"
+
+/area/awaycontent/a11
+ icon_state = "awaycontent11"
+
+/area/awaycontent/a11
+ icon_state = "awaycontent12"
+
+/area/awaycontent/a12
+ icon_state = "awaycontent13"
+
+/area/awaycontent/a13
+ icon_state = "awaycontent14"
+
+/area/awaycontent/a14
+ icon_state = "awaycontent14"
+
+/area/awaycontent/a15
+ icon_state = "awaycontent15"
+
+/area/awaycontent/a16
+ icon_state = "awaycontent16"
+
+/area/awaycontent/a17
+ icon_state = "awaycontent17"
+
+/area/awaycontent/a18
+ icon_state = "awaycontent18"
+
+/area/awaycontent/a19
+ icon_state = "awaycontent19"
+
+/area/awaycontent/a20
+ icon_state = "awaycontent20"
+
+/area/awaycontent/a21
+ icon_state = "awaycontent21"
+
+/area/awaycontent/a22
+ icon_state = "awaycontent22"
+
+/area/awaycontent/a23
+ icon_state = "awaycontent23"
+
+/area/awaycontent/a24
+ icon_state = "awaycontent24"
+
+/area/awaycontent/a25
+ icon_state = "awaycontent25"
+
+/area/awaycontent/a26
+ icon_state = "awaycontent26"
+
+/area/awaycontent/a27
+ icon_state = "awaycontent27"
+
+/area/awaycontent/a28
+ icon_state = "awaycontent28"
+
+/area/awaycontent/a29
+ icon_state = "awaycontent29"
+
+/area/awaycontent/a30
+ icon_state = "awaycontent30"
+
/////////////////////////////////////////////////////////////////////
/*
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 22a06b41da6..48bc30e5b41 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -10,6 +10,7 @@
var/throw_range = 7
var/moved_recently = 0
var/mob/pulledby = null
+ var/languages = 0 //For say() and Hear()
glide_size = 8
/atom/movable/Move()
diff --git a/code/game/communications.dm b/code/game/communications.dm
index 7f724237cf7..ac4576042c2 100644
--- a/code/game/communications.dm
+++ b/code/game/communications.dm
@@ -60,6 +60,31 @@
If receiving object don't know right key, it must ignore encrypted signal in its receive_signal.
*/
+/* the radio controller is a confusing piece of shit and didnt work
+ so i made radios not use the radio controller.
+*/
+var/list/all_radios = list()
+/proc/add_radio(var/obj/item/radio, freq)
+ if(!freq || !radio)
+ return
+ if(!all_radios["[freq]"])
+ all_radios["[freq]"] = list(radio)
+ return freq
+
+ all_radios["[freq]"] |= radio
+ return freq
+
+/proc/remove_radio(var/obj/item/radio, freq)
+ if(!freq || !radio)
+ return
+ if(!all_radios["[freq]"])
+ return
+
+ all_radios["[freq]"] -= radio
+
+/proc/remove_radio_all(var/obj/item/radio)
+ for(var/freq in all_radios)
+ all_radios["[freq]"] -= radio
/*
Frequency range: 1200 to 1600
@@ -109,8 +134,23 @@ var/list/radiochannels = list(
"Syndicate" = 1213,
"Supply" = 1347,
"Service" = 1349,
- "AI Private" = 1447,
+ "AI Private" = 1447
)
+
+var/list/radiochannelsreverse = list(
+ "1459" = "Common",
+ "1351" = "Science",
+ "1353" = "Command",
+ "1355" = "Medical",
+ "1357" = "Engineering",
+ "1359" = "Security",
+ "1441" = "Deathsquad",
+ "1213" = "Syndicate",
+ "1347" = "Supply",
+ "1349" = "Service",
+ "1447" = "AI Private"
+)
+
//depenging helpers
var/const/SYND_FREQ = 1213 //nuke op frequency, coloured dark brown in chat window
var/const/SUPP_FREQ = 1347 //supply, coloured light brown in chat window
@@ -129,7 +169,7 @@ var/const/AIPRIV_FREQ = 1447 //AI private, colored magenta in chat window
/* filters */
var/const/RADIO_TO_AIRALARM = "1"
var/const/RADIO_FROM_AIRALARM = "2"
-var/const/RADIO_CHAT = "3"
+var/const/RADIO_CHAT = "3" //deprecated
var/const/RADIO_ATMOSIA = "4"
var/const/RADIO_NAVBEACONS = "5"
var/const/RADIO_AIRLOCK = "6"
@@ -282,7 +322,7 @@ var/list/pointers = list()
src << S.debug_print()
/obj/proc/receive_signal(datum/signal/signal, receive_method, receive_param)
- return null
+ return
/datum/signal
var/obj/source
diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm
new file mode 100644
index 00000000000..54b628e4200
--- /dev/null
+++ b/code/game/data_huds.dm
@@ -0,0 +1,181 @@
+/* Using the HUD procs is simple. Call these procs in the life.dm of the intended mob.
+Use the regular_hud_updates() proc before process_med_hud(mob) or process_sec_hud(mob) so
+the HUD updates properly! */
+
+//Deletes the current HUD images so they can be refreshed with new ones.
+mob/proc/regular_hud_updates() //Used in the life.dm of mobs that can use HUDs.
+ if(client)
+ for(var/image/hud in client.images)
+ if(copytext(hud.icon_state,1,4) == "hud")
+ client.images -= hud
+ med_hud_users -= src
+ sec_hud_users -= src
+
+
+//Medical HUD procs
+
+proc/RoundHealth(health)
+
+ switch(health)
+ if(100 to INFINITY)
+ return "health100"
+ if(70 to 100)
+ return "health80"
+ if(50 to 70)
+ return "health60"
+ if(30 to 50)
+ return "health40"
+ if(18 to 30)
+ return "health25"
+ if(5 to 18)
+ return "health10"
+ if(1 to 5)
+ return "health1"
+ if(-99 to 0)
+ return "health0"
+ else
+ return "health-100"
+ return "0"
+
+/*Called by the Life() proc of the mob using it, usually. Items can call it as well.
+Called with this syntax: (The user mob, the type of hud in use, the advanced or basic version of the hud,eye object in the case of an AI) */
+
+proc/process_data_hud(var/mob/M, var/hud_type, var/hud_mode, var/mob/eye)
+ #define DATA_HUD_MEDICAL 1
+ #define DATA_HUD_SECURITY 2
+
+ #define DATA_HUD_BASIC 1
+ #define DATA_HUD_ADVANCED 2
+
+ if(!M)
+ return
+ if(!M.client)
+ return
+
+ var/turf/T
+ if(eye)
+ T = get_turf(eye)
+ else
+ T = get_turf(M)
+
+
+ for(var/mob/living/carbon/human/H in mob_list)
+ if(get_dist(H, T) > M.client.view) //Ignores any humans outside of the user's view distance.
+ continue
+
+ switch(hud_type)
+ if(DATA_HUD_MEDICAL)
+ med_hud_users |= M
+ process_med_hud(M,hud_mode,T,H)
+
+ if(DATA_HUD_SECURITY)
+ sec_hud_users |= M //Used for Security HUD alerts.
+ process_sec_hud(M,hud_mode,T,H)
+
+/***********************************************
+Medical HUD outputs! Advanced mode ignores suit sensors.
+************************************************/
+proc/process_med_hud(var/mob/M, var/mode, var/turf/T, var/mob/living/carbon/human/patient)
+
+ var/client/C = M.client
+
+ if(mode == DATA_HUD_BASIC && !med_hud_suit_sensors(patient)) //Used for the AI's MedHUD, only works if the patient has activated suit sensors.
+ return
+
+
+ var/foundVirus = med_hud_find_virus(patient) //Detects non-hidden diseases in a patient, returns as a binary value.
+
+ C.images += med_hud_get_health(patient) //Generates a patient's health bar.
+ C.images += med_hud_get_status(patient, foundVirus) //Determines the type of status icon to show.
+
+
+proc/med_hud_suit_sensors(var/mob/living/carbon/human/patient)
+ if(istype(patient.w_uniform, /obj/item/clothing/under))
+ var/obj/item/clothing/under/U = patient.w_uniform
+ if(U.sensor_mode > 2)
+ return 1
+ else
+ return 0
+
+proc/med_hud_find_virus(var/mob/living/carbon/human/patient)
+ for(var/datum/disease/D in patient.viruses)
+ if(!D.hidden[SCANNER])
+ return 1
+
+proc/med_hud_get_health(var/mob/living/carbon/human/patient)
+ var/image/holder = patient.hud_list[HEALTH_HUD]
+ if(patient.stat == 2)
+ holder.icon_state = "hudhealth-100"
+ else
+ holder.icon_state = "hud[RoundHealth(patient.health)]"
+ return holder
+
+proc/med_hud_get_status(var/mob/living/carbon/human/patient, var/foundVirus)
+ var/image/holder = patient.hud_list[STATUS_HUD]
+ if(patient.stat == 2)
+ holder.icon_state = "huddead"
+ else if(patient.status_flags & XENO_HOST)
+ holder.icon_state = "hudxeno"
+ else if(foundVirus)
+ holder.icon_state = "hudill"
+ else
+ holder.icon_state = "hudhealthy"
+ return holder
+
+
+/***********************************************
+ Security HUDs.
+ Pass a value for the second argument to enable implant viewing or other special features.
+************************************************/
+proc/process_sec_hud(var/mob/M, var/mode, var/turf/T, var/mob/living/carbon/human/perp)
+
+ var/client/C = M.client
+
+ sec_hud_get_ID(C, perp) //Provides the perp's job icon.
+
+ if(mode == DATA_HUD_ADVANCED) //If not set to "DATA_HUD_ADVANCED, the Sec HUD will only display the job.
+ sec_hud_get_implants(C, perp) //Returns the perp's implants, if any.
+ sec_hud_get_security_status(C, perp) //Gives the perp's arrest record, if there is one.
+
+
+proc/sec_hud_get_ID(var/client/C, var/mob/living/carbon/human/perp)
+ var/image/holder
+ holder = perp.hud_list[ID_HUD]
+ holder.icon_state = "hudno_id"
+ if(perp.wear_id)
+ holder.icon_state = "hud[ckey(perp.wear_id.GetJobName())]"
+ C.images += holder
+
+proc/sec_hud_get_implants(var/client/C, var/mob/living/carbon/human/perp)
+ var/image/holder
+ for(var/obj/item/weapon/implant/I in perp)
+ if(I.implanted)
+ if(istype(I,/obj/item/weapon/implant/tracking))
+ holder = perp.hud_list[IMPTRACK_HUD]
+ holder.icon_state = "hud_imp_tracking"
+ else if(istype(I,/obj/item/weapon/implant/loyalty))
+ holder = perp.hud_list[IMPLOYAL_HUD]
+ holder.icon_state = "hud_imp_loyal"
+ else if(istype(I,/obj/item/weapon/implant/chem))
+ holder = perp.hud_list[IMPCHEM_HUD]
+ holder.icon_state = "hud_imp_chem"
+ else
+ continue
+ C.images += holder
+ break
+
+proc/sec_hud_get_security_status(var/client/C, var/mob/living/carbon/human/perp)
+ var/image/holder
+ var/perpname = perp.get_face_name(perp.get_id_name(""))
+ if(perpname)
+ var/datum/data/record/R = find_record("name", perpname, data_core.security)
+ if(R)
+ holder = perp.hud_list[WANTED_HUD]
+ switch(R.fields["criminal"])
+ if("*Arrest*") holder.icon_state = "hudwanted"
+ if("Incarcerated") holder.icon_state = "hudincarcerated"
+ if("Parolled") holder.icon_state = "hudparolled"
+ if("Discharged") holder.icon_state = "huddischarged"
+ else
+ return
+ C.images += holder
\ No newline at end of file
diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm
index 1791a7319c7..9f2ecfdccea 100644
--- a/code/game/gamemodes/antag_spawner.dm
+++ b/code/game/gamemodes/antag_spawner.dm
@@ -3,6 +3,7 @@
throw_range = 5
w_class = 1.0
var/used = 0
+ var/polling_ghosts = 0
/obj/item/weapon/antag_spawner/proc/spawn_antag(var/client/C, var/turf/T, var/type = "")
return
@@ -42,7 +43,7 @@
..()
var/mob/living/carbon/human/H = usr
- if(H.stat || H.restrained())
+ if(H.stat || H.restrained() || polling_ghosts)
return
if(!istype(H, /mob/living/carbon/human))
return 1
@@ -53,10 +54,12 @@
if (used)
H << "You already used this contract!"
return
- var/list/candidates = get_candidates(BE_WIZARD)
- if(candidates.len)
+ H << "You send out a call for aid into the realms! It will be about 20 seconds before you get a response."
+ polling_ghosts = 1
+ var/client/C = pick_from_candidates(BE_WIZARD, "wizard's apprentice")
+ polling_ghosts = 0
+ if(C)
src.used = 1
- var/client/C = pick(candidates)
spawn_antag(C, get_turf(H.loc), href_list["school"])
else
H << "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later."
@@ -123,13 +126,17 @@
var/TC_cost = 0
/obj/item/weapon/antag_spawner/borg_tele/attack_self(mob/user as mob)
+ if(polling_ghosts)
+ return
if(used)
user << "The teleporter is out of power."
return
- var/list/borg_candicates = get_candidates(BE_OPERATIVE)
- if(borg_candicates.len > 0)
+ user << "Standby for reinforcements... ETA 20 seconds."
+ polling_ghosts = 1
+ var/client/C = pick_from_candidates(BE_OPERATIVE, "Syndicate cyborg")
+ polling_ghosts = 0
+ if(C)
used = 1
- var/client/C = pick(borg_candicates)
spawn_antag(C, get_turf(src.loc), "syndieborg")
else
user << "Unable to connect to Syndicate Command. Please wait and try again later or use the teleporter on your uplink to get your points refunded."
diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm
index d688df66c1c..903a983e7df 100644
--- a/code/game/gamemodes/blob/blob.dm
+++ b/code/game/gamemodes/blob/blob.dm
@@ -110,10 +110,6 @@ var/list/blob_nodes = list()
else
ERROR("Events variable is null in blob gamemode post setup.")
- spawn(10)
- start_state = new /datum/station_state()
- start_state.count()
-
spawn(0)
var/wait_time = rand(waittime_l, waittime_h)
diff --git a/code/game/gamemodes/blob/blob_finish.dm b/code/game/gamemodes/blob/blob_finish.dm
index 80e2f54e93e..937d461247f 100644
--- a/code/game/gamemodes/blob/blob_finish.dm
+++ b/code/game/gamemodes/blob/blob_finish.dm
@@ -15,24 +15,19 @@
feedback_set_details("round_end_result","loss - blob took over")
world << "The blob has taken over the station!"
world << "The entire station was eaten by the Blob"
- log_game("Blob mode was lost.")
+ log_game("Blob mode completed with a blob victory.")
else if(station_was_nuked)
feedback_set_details("round_end_result","halfwin - nuke")
world << "Partial Win: The station has been destroyed!"
world << "Directive 7-12 has been successfully carried out preventing the Blob from spreading."
- log_game("Blob mode was tie (station destroyed).")
+ log_game("Blob mode completed with a tie (station destroyed).")
else if(!blob_cores.len)
feedback_set_details("round_end_result","win - blob eliminated")
world << "The staff has won!"
world << "The alien organism has been eradicated from the station"
-
- var/datum/station_state/end_state = new /datum/station_state()
- end_state.count()
- var/percent = round( 100.0 * start_state.score(end_state), 0.1)
- world << "The station is [percent]% intact."
- log_game("Blob mode was won with station [percent]% intact.")
+ log_game("Blob mode completed with a crew victory.")
world << "Rebooting in 30s"
..()
return 1
diff --git a/code/game/gamemodes/blob/blob_report.dm b/code/game/gamemodes/blob/blob_report.dm
index 188161d7232..1bece2f8ccd 100644
--- a/code/game/gamemodes/blob/blob_report.dm
+++ b/code/game/gamemodes/blob/blob_report.dm
@@ -19,11 +19,12 @@
intercepttext += "
Note in the event of a quarantine breach or uncontrolled spread of the biohazard, the directive 7-10 may be upgraded to a directive 7-12.
"
intercepttext += "Message ends."
if(2)
- var/nukecode = "ERROR"
+ var/nukecode = rand(10000, 99999)
for(var/obj/machinery/nuclearbomb/bomb in world)
if(bomb && bomb.r_code)
if(bomb.z == 1)
- nukecode = bomb.r_code
+ bomb.r_code = nukecode
+
intercepttext += "NanoTrasen Update: Biohazard Alert.
"
intercepttext += "Directive 7-12 has been issued for [station_name()].
"
intercepttext += "The biohazard has grown out of control and will soon reach critical mass.
"
diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm
index fd3ce5d5a5b..a179d503ce1 100644
--- a/code/game/gamemodes/blob/blobs/core.dm
+++ b/code/game/gamemodes/blob/blobs/core.dm
@@ -72,20 +72,18 @@
qdel(overmind)
var/client/C = null
- var/list/candidates = list()
- if(!new_overmind)
- candidates = get_candidates(BE_BLOB)
- if(candidates.len)
- C = pick(candidates)
- else
- C = new_overmind
+ spawn(0)
+ if(!new_overmind)
+ C = pick_from_candidates(BE_BLOB)
+ else
+ C = new_overmind
- if(C)
- var/mob/camera/blob/B = new(src.loc)
- B.key = C.key
- B.blob_core = src
- src.overmind = B
- return 1
- return 0
+ if(C)
+ var/mob/camera/blob/B = new(src.loc)
+ B.key = C.key
+ B.blob_core = src
+ src.overmind = B
+ return 1
+ return 0
diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index 6844ffe118f..fcfa5d99dd8 100644
--- a/code/game/gamemodes/changeling/changeling.dm
+++ b/code/game/gamemodes/changeling/changeling.dm
@@ -14,8 +14,6 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
required_enemies = 1
recommended_enemies = 4
- uplink_welcome = "Syndicate Uplink Console:"
- uplink_uses = 10
var/const/prob_int_murder_target = 50 // intercept names the assassination target half the time
var/const/prob_right_murder_target_l = 25 // lower bound on probability of naming right assassination target
@@ -48,7 +46,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
var/num_changelings = 1
if(config.changeling_scaling_coeff)
- num_changelings = max(1, round((num_players())/(config.changeling_scaling_coeff)))
+ num_changelings = max(1, min( round(num_players()/(config.changeling_scaling_coeff*2))+2, round(num_players()/config.changeling_scaling_coeff) ))
else
num_changelings = max(1, min(num_players(), changeling_amount))
@@ -79,10 +77,10 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
return
/datum/game_mode/changeling/make_antag_chance(var/mob/living/carbon/human/character) //Assigns changeling to latejoiners
- var/changelingcap = round(joined_player_list.len / config.changeling_scaling_coeff)
+ var/changelingcap = min( round(num_players()/(config.changeling_scaling_coeff*2))+2, round(num_players()/config.changeling_scaling_coeff) )
if(changelings.len >= changelingcap) //Caps number of latejoin antagonists
return
- if(changelings.len <= (changelingcap - 2) || prob(100 / config.changeling_scaling_coeff))
+ if(changelings.len <= (changelingcap - 2) || prob(100 - (config.changeling_scaling_coeff*2)))
if(character.client.prefs.be_special & BE_CHANGELING)
if(!jobban_isbanned(character.client, "changeling") && !jobban_isbanned(character.client, "Syndicate"))
if(!(character.job in ticker.mode.restricted_jobs))
@@ -101,7 +99,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
changeling.objectives += absorb_objective
var/list/active_ais = active_ais()
- if(active_ais.len && prob(2))
+ if(active_ais.len && prob(100/joined_player_list.len))
var/datum/objective/destroy/destroy_objective = new
destroy_objective.owner = changeling
destroy_objective.find_target()
@@ -138,8 +136,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
/datum/game_mode/proc/greet_changeling(var/datum/mind/changeling, var/you_are=1)
if (you_are)
- changeling.current << "You are a changeling! You have absorbed and taken the form of a human."
- changeling.current << "Use say \":g message\" to communicate with your fellow changelings."
+ changeling.current << "You are [changeling.changeling.changelingID], a changeling! You have absorbed and taken the form of a human."
changeling.current << "You must complete the following tasks:"
if (changeling.current.mind)
@@ -180,19 +177,10 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
var/text = "
The changelings were:"
for(var/datum/mind/changeling in changelings)
var/changelingwin = 1
-
- text += "
[changeling.key] was [changeling.name] ("
- if(changeling.current)
- if(changeling.current.stat == DEAD)
- text += "died"
- else
- text += "survived"
- if(changeling.current.real_name != changeling.name)
- text += " as [changeling.current.real_name]"
- else
- text += "body destroyed"
+ if(!changeling.current)
changelingwin = 0
- text += ")"
+
+ text += printplayer(changeling)
//Removed sanity if(changeling) because we -want- a runtime to inform us that the changelings list is incorrect and needs to be fixed.
text += "
Changeling ID: [changeling.changeling.changelingID]."
@@ -239,6 +227,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
var/purchasedpowers = list()
var/mimicing = ""
var/canrespec = 0
+ var/changeling_speak = 0
var/datum/dna/chosen_dna
var/obj/effect/proc_holder/changeling/sting/chosen_sting
diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm
index 3365038e721..03204e0a8ac 100644
--- a/code/game/gamemodes/changeling/evolution_menu.dm
+++ b/code/game/gamemodes/changeling/evolution_menu.dm
@@ -316,6 +316,10 @@ var/list/sting_paths
user << "We have already evolved this ability!"
return
+ if(thepower.dna_cost < 0)
+ user << "We cannot evolve this ability."
+ return
+
if(geneticpoints < thepower.dna_cost)
user << "We have reached our capacity for abilities."
return
@@ -376,6 +380,7 @@ var/list/sting_paths
if(ishuman(src) || ismonkey(src))
if(mind && mind.changeling)
digitalcamo = 0
+ mind.changeling.changeling_speak = 0
mind.changeling.reset()
for(var/obj/effect/proc_holder/changeling/p in mind.changeling.purchasedpowers)
if(!(p.dna_cost == 0 && keep_free_powers))
diff --git a/code/game/gamemodes/changeling/powers/hivemind.dm b/code/game/gamemodes/changeling/powers/hivemind.dm
index 3f9aa14b702..8823560ab66 100644
--- a/code/game/gamemodes/changeling/powers/hivemind.dm
+++ b/code/game/gamemodes/changeling/powers/hivemind.dm
@@ -1,11 +1,32 @@
+//HIVEMIND COMMUNICATION (:g)
+/obj/effect/proc_holder/changeling/hivemind_comms
+ name = "Hivemind Communication"
+ desc = "We tune our senses to the airwaves to allow us to discreetly communicate and exchange DNA with other changelings."
+ helptext = "We will be able to talk with other changelings with :g. Exchanged DNA do not count towards absorb objectives."
+ dna_cost = 1
+ chemical_cost = -1
+
+/obj/effect/proc_holder/changeling/hivemind_comms/on_purchase(var/mob/user)
+ ..()
+ var/datum/changeling/changeling=user.mind.changeling
+ changeling.changeling_speak = 1
+ user << "Use say \":g message\" to communicate with the other changelings."
+ var/obj/effect/proc_holder/changeling/hivemind_upload/S1 = new
+ if(!changeling.has_sting(S1))
+ changeling.purchasedpowers+=S1
+ var/obj/effect/proc_holder/changeling/hivemind_download/S2 = new
+ if(!changeling.has_sting(S2))
+ changeling.purchasedpowers+=S2
+ return
+
// HIVE MIND UPLOAD/DOWNLOAD DNA
var/list/datum/dna/hivemind_bank = list()
/obj/effect/proc_holder/changeling/hivemind_upload
- name = "Hive Channel"
+ name = "Hive Channel DNA"
desc = "Allows us to channel DNA in the airwaves to allow other changelings to absorb it."
chemical_cost = 10
- dna_cost = 0
+ dna_cost = -1
/obj/effect/proc_holder/changeling/hivemind_upload/sting_action(var/mob/user)
var/datum/changeling/changeling = user.mind.changeling
@@ -32,10 +53,10 @@ var/list/datum/dna/hivemind_bank = list()
return 1
/obj/effect/proc_holder/changeling/hivemind_download
- name = "Hive Absorb"
+ name = "Hive Absorb DNA"
desc = "Allows us to absorb DNA that has been channeled to the airwaves. Does not count towards absorb objectives."
chemical_cost = 20
- dna_cost = 0
+ dna_cost = -1
/obj/effect/proc_holder/changeling/hivemind_download/can_sting(var/mob/living/carbon/user)
if(!..())
diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm
index 7bb219b5e00..e6246f686e2 100644
--- a/code/game/gamemodes/changeling/powers/mutations.dm
+++ b/code/game/gamemodes/changeling/powers/mutations.dm
@@ -156,7 +156,7 @@
if(!A.requiresID() || A.allowed(user)) //This is to prevent stupid shit like hitting a door with an arm blade, the door opening because you have acces and still getting a "the airlocks motors resist our efforts to force it" message.
return
- if(A.arePowerSystemsOn() && !(A.stat & NOPOWER))
+ if(A.hasPower())
user << "The airlock's motors resist our efforts to force it."
return
diff --git a/code/game/gamemodes/changeling/powers/panacea.dm b/code/game/gamemodes/changeling/powers/panacea.dm
index d18d2e33a7a..bd8c90e943a 100644
--- a/code/game/gamemodes/changeling/powers/panacea.dm
+++ b/code/game/gamemodes/changeling/powers/panacea.dm
@@ -1,6 +1,6 @@
/obj/effect/proc_holder/changeling/panacea
name = "Anatomic Panacea"
- desc = "Expels impurifications from our form; curing diseases, genetic disabilities, and removing toxins and radiation."
+ desc = "Expels impurifications from our form; curing diseases, removing toxins and radiation, and resetting our genetic code completely."
helptext = "Can be used while unconscious."
chemical_cost = 25
dna_cost = 1
diff --git a/code/game/gamemodes/changeling/traitor_chan.dm b/code/game/gamemodes/changeling/traitor_chan.dm
index 2b0b30948b5..615cf29383c 100644
--- a/code/game/gamemodes/changeling/traitor_chan.dm
+++ b/code/game/gamemodes/changeling/traitor_chan.dm
@@ -31,9 +31,9 @@
var/num_changelings = 1
if(config.changeling_scaling_coeff)
- num_changelings = max(1, round((num_players())/(config.changeling_scaling_coeff*2)))
+ num_changelings = max(1, min( round(num_players()/(config.changeling_scaling_coeff*4))+2, round(num_players()/(config.changeling_scaling_coeff*2)) ))
else
- num_changelings = max(1, min(num_players(), changeling_amount))
+ num_changelings = max(1, min(num_players(), changeling_amount/2))
for(var/datum/mind/player in possible_changelings)
for(var/job in restricted_jobs)//Removing robots from the list
@@ -61,11 +61,11 @@
return
/datum/game_mode/traitor/changeling/make_antag_chance(var/mob/living/carbon/human/character) //Assigns changeling to latejoiners
- var/changelingcap = round(joined_player_list.len / (config.changeling_scaling_coeff * 2))
+ var/changelingcap = min( round(num_players()/(config.changeling_scaling_coeff*4))+2, round(num_players()/(config.changeling_scaling_coeff*2)) )
if(changelings.len >= changelingcap) //Caps number of latejoin antagonists
..()
return
- if(changelings.len <= (changelingcap - 2) || prob(100 / (config.changeling_scaling_coeff * 2)))
+ if(changelings.len <= (changelingcap - 2) || prob(100 / (config.changeling_scaling_coeff * 4)))
if(character.client.prefs.be_special & BE_CHANGELING)
if(!jobban_isbanned(character.client, "changeling") && !jobban_isbanned(character.client, "Syndicate"))
if(!(character.job in ticker.mode.restricted_jobs))
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index bc51727f202..69089cbb230 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -30,8 +30,6 @@
required_enemies = 6
recommended_enemies = 6
- uplink_welcome = "Nar-Sie Uplink Console:"
- uplink_uses = 10
var/finished = 0
@@ -103,7 +101,7 @@
// grant_runeword(cult_mind.current)
// grant_secondword(cult_mind.current)
update_cult_icons_added(cult_mind)
- cult_mind.current << "You are a member of the cult!"
+ cult_mind.current << "You are a member of the cult!"
memorize_cult_objectives(cult_mind)
cult_mind.special_role = "Cultist"
..()
@@ -131,6 +129,11 @@
// grant_runeword(cult_mind.current,"blood")
// grant_runeword(cult_mind.current,"hell")
+/datum/game_mode/proc/greet_cultist(mob/M)
+ M << "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root."
+ M << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back."
+
+
/datum/game_mode/proc/equip_cultist(mob/living/carbon/human/mob)
if(!istype(mob))
return
@@ -332,7 +335,7 @@
feedback_set("round_end_result",acolytes_survived)
world << "The staff managed to stop the cult!"
- var/text = "Cultists escaped: [acolytes_survived]"
+ var/text = ""
if(cult_objectives.len)
text += "
The cultists' objectives were:"
@@ -341,10 +344,10 @@
switch(cult_objectives[obj_count])
if("survive")
if(!check_survive())
- explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. Success!"
+ explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) Success!"
feedback_add_details("cult_objective","cult_survive|SUCCESS|[acolytes_needed]")
else
- explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. Fail."
+ explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) Fail."
feedback_add_details("cult_objective","cult_survive|FAIL|[acolytes_needed]")
if("sacrifice")
if(sacrifice_target)
@@ -375,18 +378,8 @@
if( cult.len || (ticker && istype(ticker.mode,/datum/game_mode/cult)) )
var/text = "
The cultists were:"
for(var/datum/mind/cultist in cult)
+ text += printplayer(cultist)
- text += "
[cultist.key] was [cultist.name] ("
- if(cultist.current)
- if(cultist.current.stat == DEAD)
- text += "died"
- else
- text += "survived"
- if(cultist.current.real_name != cultist.name)
- text += " as [cultist.current.real_name]"
- else
- text += "body destroyed"
- text += ")"
text += "
"
world << text
diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm
index 8e3d8f9ad85..262c90379c3 100644
--- a/code/game/gamemodes/cult/ritual.dm
+++ b/code/game/gamemodes/cult/ritual.dm
@@ -187,7 +187,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
user << "You are unable to speak the words of the rune."
return
if(!word1 || !word2 || !word3 || prob(user.getBrainLoss()))
- return fizzle()
+ return fizzle(user)
if(word1 == wordtravel && word2 == wordself)
return teleport(src.word3)
if(word1 == wordsee && word2 == wordblood && word3 == wordhell)
@@ -241,16 +241,18 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
else
user.take_overall_damage(30, 0)
user << "You feel the life draining from you, as if Lord Nar-Sie is displeased with you."
- return fizzle()
+ return fizzle(user)
-/obj/effect/rune/proc/fizzle()
- if(istype(src,/obj/effect/rune))
- usr.say(pick("B'ADMINES SP'WNIN SH'T","IC'IN O'OC","RO'SHA'M I'SA GRI'FF'N ME'AI","TOX'IN'S O'NM FI'RAH","IA BL'AME TOX'IN'S","FIR'A NON'AN RE'SONA","A'OI I'RS ROUA'GE","LE'OAN JU'STA SP'A'C Z'EE SH'EF","IA PT'WOBEA'RD, IA A'DMI'NEH'LP"))
- else
- usr.whisper(pick("B'ADMINES SP'WNIN SH'T","IC'IN O'OC","RO'SHA'M I'SA GRI'FF'N ME'AI","TOX'IN'S O'NM FI'RAH","IA BL'AME TOX'IN'S","FIR'A NON'AN RE'SONA","A'OI I'RS ROUA'GE","LE'OAN JU'STA SP'A'C Z'EE SH'EF","IA PT'WOBEA'RD, IA A'DMI'NEH'LP"))
- for (var/mob/V in viewers(src))
- V.show_message("The markings pulse with a small burst of light, then fall dark.", 3, "You hear a faint fizzle.", 2)
+/obj/effect/rune/proc/fizzle(var/mob/living/cultist = null)
+ var/gibberish = pick("B'ADMINES SP'WNIN SH'T","IC'IN O'OC","RO'SHA'M I'SA GRI'FF'N ME'AI","TOX'IN'S O'NM FI'RAH","IA BL'AME TOX'IN'S","FIR'A NON'AN RE'SONA","A'OI I'RS ROUA'GE","LE'OAN JU'STA SP'A'C Z'EE SH'EF","IA PT'WOBEA'RD, IA A'DMI'NEH'LP")
+
+ if(cultist)
+ if(istype(src,/obj/effect/rune))
+ cultist.say(gibberish)
+ else
+ cultist.whisper(gibberish)
+ visible_message("The markings pulse with a small burst of light, then fall dark.", 3, "You hear a faint fizzle.", 2)
return
/obj/effect/rune/proc/check_icon()
@@ -570,7 +572,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
usr.whisper("[input]")
for(var/datum/mind/H in ticker.mode.cult)
if (H.current)
- H.current << "[input]"
+ H.current << "[input]"
return
if("Notes")
if(usr.get_active_hand() != src)
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index d1f9b2885dc..ffc72668ec5 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -31,7 +31,7 @@ var/list/sacrificed = list()
user.loc = allrunesloc[rand(1,index)]
return
if(istype(src,/obj/effect/rune))
- return fizzle() //Use friggin manuals, Dorf, your list was of zero length.
+ return fizzle(user) //Use friggin manuals, Dorf, your list was of zero length.
else
call(/obj/effect/rune/proc/fizzle)()
return
@@ -53,7 +53,7 @@ var/list/sacrificed = list()
IP = R
runecount++
if(runecount >= 2)
- user << "You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric"
+ user << "You feel pain, as the rune disappears in reality shift caused by too much wear of space-time fabric"
if (istype(user, /mob/living))
user.take_overall_damage(5, 0)
qdel(src)
@@ -61,7 +61,7 @@ var/list/sacrificed = list()
if(iscultist(C) && !C.stat)
culcount++
if(user.loc==src.loc)
- return fizzle()
+ return fizzle(user)
if(culcount>=1)
user.say("Sas[pick("'","`")]so c'arta forbici tarem!")
user.visible_message("You feel air moving from the rune - like as it was swapped with somewhere else.", \
@@ -74,7 +74,7 @@ var/list/sacrificed = list()
M.loc = IP.loc
return
- return fizzle()
+ return fizzle(user)
/////////////////////////////////////////SECOND RUNE
@@ -110,29 +110,27 @@ var/list/sacrificed = list()
C.say("Mah[pick("'","`")]weyh pleggh at e'ntrath!")
if(cultsinrange.len >= 3)
M.visible_message("[M] writhes in pain as the markings below him glow a bloody red.", \
- "AAAAAAHHHH!.", \
+ "AAAAAAHHHH!", \
"You hear an anguished scream.")
if(is_convertable_to_cult(M.mind))
- ticker.mode.add_cultist(M.mind)
- M.mind.special_role = "Cultist"
- M << "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root."
- M << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back."
-/*//convert no longer gives words
- //picking which word to use
- if(usr.mind.cult_words.len != ticker.mode.allwords.len) // No point running if they already know everything
- var/convert_word
- for(var/i=1, i<=3, i++)
- convert_word = pick(ticker.mode.grantwords)
- if(convert_word in usr.mind.cult_words)
- if(i==3) convert_word = null //NOTE: If max loops is changed ensure this condition is changed to match /Mal
- else
- break
- if(!convert_word)
- usr << "\red This Convert was unworthy of knowledge of the other side!"
- else
- usr << "\red The Geometer of Blood is pleased to see his followers grow in numbers."
- ticker.mode.grant_runeword(usr, convert_word)
- return 1 */
+ if(jobban_isbanned(M, "Syndicate") || jobban_isbanned(M, "cultist"))
+ M.visible_message("[M] screams horrifically before falling limp, his mind clearly broken by something he saw.", \
+ "You are currently jobbanned from Cultist.")
+ M.ghostize(0) //Jobbanned players are force ghosted
+ M.resting = 1
+ spawn(0)
+ var/client/C = pick_from_candidates(BE_CULTIST) //Try to find a suitable observer to replace the jobbanned player
+ if(C)
+ M.key = C.key
+ M << "Who are you? How did you get here? You can't seem to remember anything but..."
+ ticker.mode.add_cultist(M.mind)
+ M.mind.special_role = "Cultist"
+ ticker.mode.greet_cultist(M)
+ else
+ ticker.mode.add_cultist(M.mind)
+ M.mind.special_role = "Cultist"
+ ticker.mode.greet_cultist(M)
+
else
M << "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root."
M << "And not a single fuck was given, exterminate the cult at all costs."
@@ -152,9 +150,10 @@ var/list/sacrificed = list()
/obj/effect/rune/proc/tearreality()
var/list/mob/living/carbon/human/cultist_count = list()
+ var/mob/living/user = usr
+ user.say("Tok-lyr rqa'nap g[pick("'","`")]lt-ulotf!")
for(var/mob/M in range(1,src))
if(iscultist(M) && !M.stat)
- M.say("Tok-lyr rqa'nap g[pick("'","`")]lt-ulotf!")
cultist_count += M
if(cultist_count.len >= 9)
if(ticker.mode.name == "cult")
@@ -302,8 +301,12 @@ var/list/sacrificed = list()
var/mob/dead/observer/ghost
for(var/mob/dead/observer/O in loc)
- if(!O.client) continue
- if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
+ if(!O.client)
+ continue
+ if(O.mind && O.mind.current && O.mind.current.stat != DEAD)
+ continue
+ if(!jobban_isbanned(O, "Syndicate") && !jobban_isbanned(O, "cultist"))
+ continue
ghost = O
break
@@ -339,12 +342,11 @@ var/list/sacrificed = list()
body_to_sacrifice.gib()
// if(ticker.mode.name == "cult")
-// ticker.mode:add_cultist(corpse_to_raise.mind)
+// ticker.mode: corpse_to_raise.mind)
// else
// ticker.mode.cult |= corpse_to_raise.mind
- corpse_to_raise << "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root."
- corpse_to_raise << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back."
+ ticker.mode.greet_cultist(corpse_to_raise)
return
@@ -374,7 +376,7 @@ var/list/sacrificed = list()
return
if(istype(src,/obj/effect/rune))
- return fizzle()
+ return fizzle()
else
call(/obj/effect/rune/proc/fizzle)()
return
@@ -424,7 +426,6 @@ var/list/sacrificed = list()
"A shape forms in the center of the rune. A shape of... a man.", \
"You hear liquid flowing.")
D.real_name = "[pick(first_names_male)] [pick(last_names)]"
- D.universal_speak = 1
D.status_flags = CANSTUN|CANWEAKEN|CANPARALYSE|CANPUSH
D.key = ghost.key
@@ -435,8 +436,7 @@ var/list/sacrificed = list()
ticker.mode.cult+=D.mind
D.mind.special_role = "Cultist"
- D << "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root."
- D << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back."
+ ticker.mode.greet_cultist(D)
var/mob/living/user = usr
while(this_rune && user && user.stat==CONSCIOUS && user.client && user.loc==this_rune.loc)
@@ -770,7 +770,7 @@ var/list/sacrificed = list()
return
return
if(istype(W,/obj/effect/rune))
- return fizzle()
+ return fizzle()
if(istype(W,/obj/item/weapon/paper/talisman))
call(/obj/effect/rune/proc/fizzle)()
return
@@ -803,7 +803,7 @@ var/list/sacrificed = list()
if(users.len>=1)
var/mob/living/carbon/cultist = input("Choose the one who you want to free", "Followers of Geometer") as null|anything in (cultists - users)
if(!cultist)
- return fizzle()
+ return fizzle(user)
if (cultist == user) //just to be sure.
return
if(!(cultist.buckled || \
@@ -836,7 +836,7 @@ var/list/sacrificed = list()
user.take_overall_damage(15, 0)
C.say("Khari[pick("'","`")]d! Gual'te nikka!")
qdel(src)
- return fizzle()
+ return fizzle(user)
/////////////////////////////////////////NINETEENTH RUNE
@@ -853,12 +853,12 @@ var/list/sacrificed = list()
if(users.len>=3)
var/mob/living/carbon/cultist = input("Choose the one who you want to summon", "Followers of Geometer") as null|anything in (cultists - user)
if(!cultist)
- return fizzle()
+ return fizzle(user)
if(cultist == user) //just to be sure.
return
if(cultist.buckled || cultist.handcuffed || (!isturf(cultist.loc) && !istype(cultist.loc, /obj/structure/closet)))
user << "You cannot summon the [cultist], for his shackles of blood are strong"
- return fizzle()
+ return fizzle(user)
cultist.loc = src.loc
cultist.Weaken(5)
cultist.regenerate_icons()
@@ -870,7 +870,7 @@ var/list/sacrificed = list()
"You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a body.", \
"You hear a pop and smell ozone.")
qdel(src)
- return fizzle()
+ return fizzle(user)
/////////////////////////////////////////TWENTIETH RUNES
diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm
index c7a3e47cf5b..2417819e6ce 100644
--- a/code/game/gamemodes/cult/talisman.dm
+++ b/code/game/gamemodes/cult/talisman.dm
@@ -76,7 +76,6 @@
dat += "Kla'atu barada nikt'o! - Allows you to conceal the runes you placed on the floor.
"
dat += "O bidai nabora se'sma! - Allows you to coordinate with others of your cult.
"
dat += "Fuu ma'jin - Allows you to stun a person by attacking them with the talisman.
"
- dat += "Sa tatha najin - Allows you to summon armored robes and an unholy blade
"
dat += "Kal om neth - Summons a soul stone
"
dat += "Da A'ig Osk - Summons a construct shell for use with captured souls. It is too large to carry on your person.
"
usr << browse(dat, "window=id_com;size=350x200")
@@ -130,4 +129,4 @@
/obj/item/weapon/paper/talisman/supply
imbue = "supply"
- uses = 3
\ No newline at end of file
+ uses = 3
diff --git a/code/game/gamemodes/extended/extended.dm b/code/game/gamemodes/extended/extended.dm
index 04dc0d29685..77e754ee36f 100644
--- a/code/game/gamemodes/extended/extended.dm
+++ b/code/game/gamemodes/extended/extended.dm
@@ -3,9 +3,6 @@
config_tag = "extended"
required_players = 0
- uplink_welcome = "Syndicate Uplink Console:"
- uplink_uses = 10
-
/datum/game_mode/announce()
world << "The current game mode is - Extended Role-Playing!"
world << "Just have fun and role-play!"
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index e0e409df972..f57c052457f 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -27,8 +27,6 @@
var/required_enemies = 0
var/recommended_enemies = 0
var/pre_setup_before_jobs = 0
- var/uplink_welcome = "Syndicate Uplink Console:"
- var/uplink_uses = 10
var/antag_flag = null //preferences flag such as BE_WIZARD that need to be turned on for players to be antag
var/datum/mind/sacrifice_target = null
@@ -81,6 +79,8 @@
if(report)
spawn (rand(waittime_l, waittime_h))
send_intercept(0)
+ start_state = new /datum/station_state()
+ start_state.count()
return 1
///make_antag_chance()
@@ -211,17 +211,7 @@
var/list/drafted = list()
var/datum/mind/applicant = null
- var/roletext
- switch(role)
- if(BE_CHANGELING) roletext="changeling"
- if(BE_TRAITOR) roletext="traitor"
- if(BE_OPERATIVE) roletext="operative"
- if(BE_WIZARD) roletext="wizard"
- if(BE_REV) roletext="revolutionary"
- if(BE_GANG) roletext="gangster"
- if(BE_CULTIST) roletext="cultist"
- if(BE_MONKEY) roletext="monkey"
-
+ var/roletext = get_roletext(role)
// Ultimate randomizing code right here
for(var/mob/new_player/player in player_list)
@@ -381,8 +371,22 @@ proc/display_roundstart_logout_report()
msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (Ghosted)\n"
continue //Ghosted while alive
-
-
for(var/mob/M in mob_list)
if(M.client && M.client.holder)
- M << msg
\ No newline at end of file
+ M << msg
+
+/datum/game_mode/proc/printplayer(var/datum/mind/ply)
+ var/role = "\improper[ply.assigned_role]"
+ var/text = "
[ply.name]([ply.key]) as \a [role] ("
+ if(ply.current)
+ if(ply.current.stat == DEAD)
+ text += "died"
+ else
+ text += "survived"
+ if(ply.current.real_name != ply.name)
+ text += " as [ply.current.real_name]"
+ else
+ text += "body destroyed"
+ text += ")"
+
+ return text
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index fcc318999e8..fc67d9f723a 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -198,6 +198,11 @@ var/round_start_time = 0
world << sound('sound/effects/explosionfar.ogg')
flick("station_intact_fade_red",cinematic)
cinematic.icon_state = "summary_nukefail"
+ if("fake") //The round isn't over, we're just freaking people out for fun
+ flick("intro_nuke",cinematic)
+ sleep(35)
+ world << sound('sound/items/bikehorn.ogg')
+ flick("summary_selfdes",cinematic)
else
flick("intro_nuke",cinematic)
sleep(35)
@@ -325,23 +330,47 @@ var/round_start_time = 0
/datum/controller/gameticker/proc/declare_completion()
+ var/station_evacuated
+ if(emergency_shuttle.location > 0)
+ station_evacuated = 1
+ var/num_survivors = 0
+ var/num_escapees = 0
+
world << "
The round has ended."
- for(var/mob/Player in player_list)
- if(Player.mind)
- if(Player.stat != DEAD)
- if(emergency_shuttle.location > 0) //If the shuttle has already left the station
+
+ //Player status report
+ for(var/mob/Player in mob_list)
+ if(Player.mind && !isnewplayer(Player))
+ if(Player.stat != DEAD && !isbrain(Player))
+ num_survivors++
+ if(station_evacuated) //If the shuttle has already left the station
var/turf/playerTurf = get_turf(Player)
if(playerTurf.z != 2)
Player << "You managed to survive, but were marooned on [station_name()]..."
else
+ num_escapees++
Player << "You managed to survive the events on [station_name()] as [Player.real_name]."
else
Player << "You managed to survive the events on [station_name()] as [Player.real_name]."
else
Player << "You did not survive the events on [station_name()]..."
+ //Round statistics report
+ var/datum/station_state/end_state = new /datum/station_state()
+ end_state.count()
+ var/station_integrity = round( 100.0 * start_state.score(end_state), 0.1)
+
+ world << "
[TAB]Shift Duration: [round(world.time / 36000)]:[add_zero("[world.time / 600 % 60]", 2)]:[world.time / 100 % 6][world.time / 100 % 10]"
+ world << "
[TAB]Station Integrity: [mode.station_was_nuked ? "Destroyed" : "[station_integrity]%"]"
+ if(joined_player_list.len)
+ world << "
[TAB]Total Population: [joined_player_list.len]"
+ if(station_evacuated)
+ world << "
[TAB]Evacuation Rate: [num_escapees] ([round((num_escapees/joined_player_list.len)*100, 0.1)]%)"
+ else
+ world << "
[TAB]Survival Rate: [num_survivors] ([round((num_survivors/joined_player_list.len)*100, 0.1)]%)"
world << "
"
+ //Silicon laws report
for (var/mob/living/silicon/ai/aiPlayer in mob_list)
if (aiPlayer.stat != 2 && aiPlayer.mind)
world << "[aiPlayer.name] (Played by: [aiPlayer.mind.key])'s laws at the end of the round were:"
diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm
index c5428a993a0..675940e85d2 100644
--- a/code/game/gamemodes/malfunction/malfunction.dm
+++ b/code/game/gamemodes/malfunction/malfunction.dm
@@ -10,10 +10,6 @@
recommended_enemies = 1
pre_setup_before_jobs = 1
- uplink_welcome = "Crazy AI Uplink Console:"
- uplink_uses = 10
-
-
var/AI_win_timeleft = 1800 //started at 1800, in case I change this for testing round end.
var/malf_mode_declared = 0
@@ -164,7 +160,7 @@
set name = "System Override"
set desc = "Start the victory timer"
if (!istype(ticker.mode,/datum/game_mode/malfunction))
- usr << "You cannot begin a takeover in this round type!."
+ usr << "You cannot begin a takeover in this round type!"
return
if (ticker.mode:malf_mode_declared)
usr << "You've already begun your takeover."
diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm
index 76f3b1215f4..234f205e0d2 100644
--- a/code/game/gamemodes/meteor/meteor.dm
+++ b/code/game/gamemodes/meteor/meteor.dm
@@ -5,9 +5,6 @@
var/nometeors = 1
required_players = 0
- uplink_welcome = "EVIL METEOR Uplink Console:"
- uplink_uses = 10
-
/datum/game_mode/meteor/announce()
world << "The current game mode is - Meteor!"
diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index f7caf7be4e9..992398ae800 100644
--- a/code/game/gamemodes/meteor/meteors.dm
+++ b/code/game/gamemodes/meteor/meteors.dm
@@ -8,72 +8,66 @@
/var/list/meteorsC = list(/obj/effect/meteor/dust) //for space dust event
-
-/proc/meteor_wave(var/number = 50) //this proc's unused now.
- if(!ticker || wavesecret)
- return
-
- wavesecret = 1
- for(var/i = 0 to number)
- spawn(rand(10,100))
- spawn_meteor()
- spawn(meteor_wave_delay)
- wavesecret = 0
-
-
/proc/spawn_meteors(var/number = 10, var/list/meteortypes)
for(var/i = 0; i < number; i++)
- spawn(0)
- spawn_meteor(meteortypes)
+ spawn_meteor(meteortypes)
/proc/spawn_meteor(var/list/meteortypes)
-
- var/startx
- var/starty
- var/endx
- var/endy
var/turf/pickedstart
var/turf/pickedgoal
var/max_i = 10//number of tries to spawn meteor.
-
- do
- switch(pick(1,2,3,4))
- if(1) //NORTH
- starty = world.maxy-(TRANSITIONEDGE+1)
- startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1))
- endy = TRANSITIONEDGE
- endx = rand(TRANSITIONEDGE, world.maxx-TRANSITIONEDGE)
- if(2) //EAST
- starty = rand((TRANSITIONEDGE+1),world.maxy-(TRANSITIONEDGE+1))
- startx = world.maxx-(TRANSITIONEDGE+1)
- endy = rand(TRANSITIONEDGE, world.maxy-TRANSITIONEDGE)
- endx = TRANSITIONEDGE
- if(3) //SOUTH
- starty = (TRANSITIONEDGE+1)
- startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1))
- endy = world.maxy-TRANSITIONEDGE
- endx = rand(TRANSITIONEDGE, world.maxx-TRANSITIONEDGE)
- if(4) //WEST
- starty = rand((TRANSITIONEDGE+1), world.maxy-(TRANSITIONEDGE+1))
- startx = (TRANSITIONEDGE+1)
- endy = rand(TRANSITIONEDGE,world.maxy-TRANSITIONEDGE)
- endx = world.maxx-TRANSITIONEDGE
-
- pickedstart = locate(startx, starty, 1)
- pickedgoal = locate(endx, endy, 1)
+ while (!istype(pickedstart, /turf/space) || pickedstart.loc.name != "Space" )
+ var/startSide = pick(cardinal)
+ pickedstart = spaceDebrisStartLoc(startSide, 1)
+ pickedgoal = spaceDebrisFinishLoc(startSide, 1)
max_i--
- if(max_i<=0) return
- while (!istype(pickedstart, /turf/space) || pickedstart.loc.name != "Space" ) //FUUUCK, should never happen.
-
-
+ if(max_i<=0)
+ return
var/Me = pickweight(meteortypes)
var/obj/effect/meteor/M = new Me(pickedstart)
-
M.dest = pickedgoal
+ M.z_original = 1
spawn(0)
walk_towards(M, M.dest, 1)
return
+/proc/spaceDebrisStartLoc(startSide, Z)
+ var/starty
+ var/startx
+ switch(startSide)
+ if(1) //NORTH
+ starty = world.maxy-(TRANSITIONEDGE+1)
+ startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1))
+ if(2) //EAST
+ starty = rand((TRANSITIONEDGE+1),world.maxy-(TRANSITIONEDGE+1))
+ startx = world.maxx-(TRANSITIONEDGE+1)
+ if(3) //SOUTH
+ starty = (TRANSITIONEDGE+1)
+ startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1))
+ if(4) //WEST
+ starty = rand((TRANSITIONEDGE+1), world.maxy-(TRANSITIONEDGE+1))
+ startx = (TRANSITIONEDGE+1)
+ var/turf/T = locate(startx, starty, Z)
+ return T
+
+/proc/spaceDebrisFinishLoc(startSide, Z)
+ var/endy
+ var/endx
+ switch(startSide)
+ if(1) //NORTH
+ endy = TRANSITIONEDGE
+ endx = rand(TRANSITIONEDGE, world.maxx-TRANSITIONEDGE)
+ if(2) //EAST
+ endy = rand(TRANSITIONEDGE, world.maxy-TRANSITIONEDGE)
+ endx = TRANSITIONEDGE
+ if(3) //SOUTH
+ endy = world.maxy-TRANSITIONEDGE
+ endx = rand(TRANSITIONEDGE, world.maxx-TRANSITIONEDGE)
+ if(4) //WEST
+ endy = rand(TRANSITIONEDGE,world.maxy-TRANSITIONEDGE)
+ endx = world.maxx-TRANSITIONEDGE
+ var/turf/T = locate(endx, endy, Z)
+ return T
/obj/effect/meteor
@@ -89,10 +83,16 @@
pass_flags = PASSTABLE
var/heavy = 0
var/meteorsound = 'sound/effects/meteorimpact.ogg'
+ var/z_original
var/meteordrop = /obj/item/weapon/ore/iron
var/dropamt = 2
+/obj/effect/meteor/Move()
+ if(z != z_original || loc == dest)
+ qdel(src)
+ return ..()
+
/obj/effect/meteor/dust
name = "space dust"
icon_state = "dust"
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index aefcfc70c47..3f98e8f1ee2 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -11,9 +11,6 @@
pre_setup_before_jobs = 1
antag_flag = BE_OPERATIVE
- uplink_welcome = "Corporate Backed Uplink Console:"
- uplink_uses = 10
-
var/const/agents_possible = 5 //If we ever need more syndicate agents.
var/nukes_left = 1 // Call 3714-PRAY right now and order more nukes! Limited offer!
@@ -100,7 +97,6 @@
for(var/obj/effect/landmark/A in landmarks_list)
if(A.name == "Syndicate-Spawn")
synd_spawn += get_turf(A)
- qdel(A)
continue
var/obj/effect/landmark/uplinklocker = locate("landmark*Syndicate-Uplink") //i will be rewriting this shortly
@@ -113,13 +109,17 @@
for(var/datum/mind/synd_mind in syndicates)
if(spawnpos > synd_spawn.len)
- spawnpos = 1
+ spawnpos = 2
synd_mind.current.loc = synd_spawn[spawnpos]
forge_syndicate_objectives(synd_mind)
greet_syndicate(synd_mind)
equip_syndicate(synd_mind.current)
+ if (nuke_code)
+ synd_mind.store_memory("Syndicate Nuclear Bomb Code: [nuke_code]", 0, 0)
+ synd_mind.current << "The nuclear authorization code is: [nuke_code]"
+
if(!leader_selected)
prepare_syndicate_leader(synd_mind, nuke_code)
leader_selected = 1
@@ -145,20 +145,24 @@
spawn(1)
NukeNameAssign(nukelastname(synd_mind.current),syndicates) //allows time for the rest of the syndies to be chosen
synd_mind.current.real_name = "[syndicate_name()] [leader_title]"
+ synd_mind.current << "You are the Syndicate [leader_title] for this mission. You are responsible for the distribution of telecrystals and your ID is the only one who can open the launch bay doors."
+ synd_mind.current << "If you feel you are not up to this task, give your ID to another operative."
+
+ var/list/foundIDs = synd_mind.current.search_contents_for(/obj/item/weapon/card/id)
+ if(foundIDs.len)
+ for(var/obj/item/weapon/card/id/ID in foundIDs)
+ ID.access += access_syndicate_leader
+ else
+ message_admins("Warning: Nuke Ops spawned without access to leave their spawn area!")
+
if (nuke_code)
- synd_mind.store_memory("Syndicate Nuclear Bomb Code: [nuke_code]", 0, 0)
- synd_mind.current << "The nuclear authorization code is: [nuke_code]"
var/obj/item/weapon/paper/P = new
P.info = "The nuclear authorization code is: [nuke_code]"
P.name = "nuclear bomb code"
- if (ticker.mode.config_tag=="nuclear")
- P.loc = synd_mind.current.loc
- else
- var/mob/living/carbon/human/H = synd_mind.current
- P.loc = H.loc
- H.equip_to_slot_or_del(P, slot_r_store, 0)
- H.update_icons()
-
+ var/mob/living/carbon/human/H = synd_mind.current
+ P.loc = H.loc
+ H.equip_to_slot_or_del(P, slot_r_hand, 0)
+ H.update_icons()
else
nuke_code = "code will be provided later"
return
diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index 9b4368d960f..8a78f9b33ae 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -17,10 +17,6 @@ var/bomb_set
use_power = 0
var/previous_level = ""
-/obj/machinery/nuclearbomb/New()
- ..()
- r_code = "[rand(10000, 99999.0)]"//Creates a random code upon object spawn.
-
/obj/machinery/nuclearbomb/process()
if (src.timing)
bomb_set = 1 //So long as there is one nuke timing, it means one nuke is armed.
@@ -236,8 +232,8 @@ var/bomb_set
if(blobstart.len > 0)
var/obj/item/weapon/disk/nuclear/NEWDISK = new(pick(blobstart))
transfer_fingerprints_to(NEWDISK)
- message_admins("[src] has been destroyed. Moving it to ([NEWDISK.x], [NEWDISK.y], [NEWDISK.z]).")
- log_game("[src] has been destroyed. Moving it to ([NEWDISK.x], [NEWDISK.y], [NEWDISK.z]).")
+ message_admins("[src] has been destroyed in ([x], [y] ,[z] - JMP). Moving it to ([NEWDISK.x], [NEWDISK.y], [NEWDISK.z] - JMP).")
+ log_game("[src] has been destroyed in ([x], [y] ,[z]). Moving it to ([NEWDISK.x], [NEWDISK.y], [NEWDISK.z]).")
del(src) //Needed to clear all references to it
else
ERROR("[src] was supposed to be destroyed, but we were unable to locate a blobstart landmark to spawn a new one.")
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index e9f15fd33cb..b2d075f00e9 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -20,10 +20,6 @@
required_enemies = 3
recommended_enemies = 3
-
- uplink_welcome = "Revolutionary Uplink Console:"
- uplink_uses = 10
-
var/finished = 0
var/checkwin_counter = 0
var/const/max_headrevs = 3
@@ -362,6 +358,18 @@
else if(finished == 2)
feedback_set_details("round_end_result","loss - rev heads killed")
world << "The heads of staff managed to stop the revolution!"
+
+ var/num_revs = 0
+ for(var/mob/living/carbon/mob in living_mob_list)
+ if(mob.mind)
+ if(mob.mind in head_revolutionaries || mob.mind in revolutionaries)
+ num_revs++
+ var/num_survivors = 0
+ for(var/mob/living/carbon/survivor in living_mob_list)
+ if(survivor.key)
+ num_survivors++
+
+ world << "[TAB]Command's Approval Rating: [100 - round((num_revs/num_survivors)*100, 0.1)]%" // % of loyal crew
..()
return 1
@@ -439,4 +447,4 @@
text += ""
text += "
"
- world << text
\ No newline at end of file
+ world << text
diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm
index d2f36a2ee7e..9b3045d62a1 100644
--- a/code/game/gamemodes/sandbox/h_sandbox.dm
+++ b/code/game/gamemodes/sandbox/h_sandbox.dm
@@ -233,7 +233,7 @@ datum/hSB/Topic(href, href_list)
var/list/all_items = typesof(/obj/item/clothing) - /obj/item/clothing
for(var/typekey in spawn_forbidden)
all_items -= typesof(typekey)
- for(var/O in reverselist(all_items))
+ for(var/O in reverseRange(all_items))
clothinfo += "[O]
"
usr << browse(clothinfo,"window=sandbox")
@@ -247,7 +247,7 @@ datum/hSB/Topic(href, href_list)
var/list/all_items = typesof(/obj/item/weapon/reagent_containers) - /obj/item/weapon/reagent_containers
for(var/typekey in spawn_forbidden)
all_items -= typesof(typekey)
- for(var/O in reverselist(all_items))
+ for(var/O in reverseRange(all_items))
reaginfo += "[O]
"
usr << browse(reaginfo,"window=sandbox")
@@ -262,7 +262,7 @@ datum/hSB/Topic(href, href_list)
for(var/typekey in spawn_forbidden)
all_items -= typesof(typekey)
- for(var/O in reverselist(all_items))
+ for(var/O in reverseRange(all_items))
objinfo += "[O]
"
usr << browse(objinfo,"window=sandbox")
diff --git a/code/game/gamemodes/sandbox/sandbox.dm b/code/game/gamemodes/sandbox/sandbox.dm
index 475c3d22aa5..8ebb488267a 100644
--- a/code/game/gamemodes/sandbox/sandbox.dm
+++ b/code/game/gamemodes/sandbox/sandbox.dm
@@ -3,9 +3,6 @@
config_tag = "sandbox"
required_players = 0
- uplink_welcome = "Syndicate Uplink Console:"
- uplink_uses = 10
-
/datum/game_mode/sandbox/announce()
world << "The current game mode is - Sandbox!"
world << "Build your own station with the sandbox-panel command!"
diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm
index 802b3c57bee..f26ebec359c 100644
--- a/code/game/gamemodes/traitor/traitor.dm
+++ b/code/game/gamemodes/traitor/traitor.dm
@@ -16,10 +16,6 @@
required_enemies = 1
recommended_enemies = 4
-
- uplink_welcome = "Syndicate Uplink Console:"
- uplink_uses = 10
-
var/traitors_possible = 4 //hard limit on traitors if scaling is turned off
var/scale_modifier = 1 // Used for gamemodes, that are a child of traitor, that need more than the usual.
@@ -37,7 +33,7 @@
var/num_traitors = 1
if(config.traitor_scaling_coeff)
- num_traitors = max(1, round((num_players())/((config.traitor_scaling_coeff * scale_modifier))))
+ num_traitors = max(1, min( round(num_players()/(config.traitor_scaling_coeff*scale_modifier*2))+2, round(num_players()/(config.traitor_scaling_coeff*scale_modifier)) ))
else
num_traitors = max(1, min(num_players(), traitors_possible))
@@ -74,10 +70,10 @@
return 1
/datum/game_mode/traitor/make_antag_chance(var/mob/living/carbon/human/character) //Assigns traitor to latejoiners
- var/traitorcap = round(joined_player_list.len / (config.traitor_scaling_coeff * scale_modifier))
+ var/traitorcap = round(joined_player_list.len / (config.traitor_scaling_coeff * scale_modifier * 2))
if(traitors.len >= traitorcap) //Upper cap for number of latejoin antagonists
return
- if(traitors.len <= (traitorcap - 2) || prob(100 / (config.traitor_scaling_coeff * scale_modifier)))
+ if(traitors.len <= (traitorcap - 2) || prob(100 / (config.traitor_scaling_coeff * scale_modifier * 2)))
if(character.client.prefs.be_special & BE_TRAITOR)
if(!jobban_isbanned(character.client, "traitor") && !jobban_isbanned(character.client, "Syndicate"))
if(!(character.job in ticker.mode.restricted_jobs))
@@ -121,27 +117,27 @@
objective_count += 1 //Exchange counts towards number of objectives
var/list/active_ais = active_ais()
for(var/i = objective_count, i < config.traitor_objectives_amount, i++)
- if(active_ais.len && prob(1))
- var/datum/objective/destroy/destroy_objective = new
- destroy_objective.owner = traitor
- destroy_objective.find_target()
- traitor.objectives += destroy_objective
- else switch(rand(1,100))
- if(1 to 15)
+ if(prob(50))
+ if(active_ais.len && prob(100/joined_player_list.len))
+ var/datum/objective/destroy/destroy_objective = new
+ destroy_objective.owner = traitor
+ destroy_objective.find_target()
+ traitor.objectives += destroy_objective
+ else if(prob(30))
var/datum/objective/maroon/maroon_objective = new
maroon_objective.owner = traitor
maroon_objective.find_target()
traitor.objectives += maroon_objective
- if(16 to 50)
+ else
var/datum/objective/assassinate/kill_objective = new
kill_objective.owner = traitor
kill_objective.find_target()
traitor.objectives += kill_objective
- else
- var/datum/objective/steal/steal_objective = new
- steal_objective.owner = traitor
- steal_objective.find_target()
- traitor.objectives += steal_objective
+ else
+ var/datum/objective/steal/steal_objective = new
+ steal_objective.owner = traitor
+ steal_objective.find_target()
+ traitor.objectives += steal_objective
if(is_hijacker && objective_count <= config.traitor_objectives_amount) //Don't assign hijack if it would exceed the number of objectives set in config.traitor_objectives_amount
if (!(locate(/datum/objective/hijack) in traitor.objectives))
@@ -204,18 +200,7 @@
for(var/datum/mind/traitor in traitors)
var/traitorwin = 1
- text += "
[traitor.key] was [traitor.name] ("
- if(traitor.current)
- if(traitor.current.stat == DEAD)
- text += "died"
- else
- text += "survived"
- if(traitor.current.real_name != traitor.name)
- text += " as [traitor.current.real_name]"
- else
- text += "body destroyed"
- text += ")"
-
+ text += printplayer(traitor)
var/TC_uses = 0
var/uplink_true = 0
diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm
index 1cc217b188f..e4eae407ef3 100644
--- a/code/game/gamemodes/wizard/rightandwrong.dm
+++ b/code/game/gamemodes/wizard/rightandwrong.dm
@@ -1,18 +1,20 @@
+//In this file: Summon Magic/Summon Guns/Summon Events
-
-/mob/proc/rightandwrong(var/summon_type) //0 = Summon Guns, 1 = Summon Magic
+/proc/rightandwrong(var/summon_type, var/mob/user) //0 = Summon Guns, 1 = Summon Magic
var/list/gunslist = list("taser","egun","laser","revolver","detective","smg","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","mateba","smg","uzi","crossbow","saw")
var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge","wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffchange", "staffhealing", "armor", "scrying", "staffdoor", "special")
var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos")
- usr << "You summoned [summon_type ? "magic" : "guns"]!"
- message_admins("[key_name_admin(usr, 1)] summoned [summon_type ? "magic" : "guns"]!")
- log_game("[key_name(usr)] summoned [summon_type ? "magic" : "guns"]!")
+ if(user) //in this case either someone holding a spellbook or a badmin
+ user << "You summoned [summon_type ? "magic" : "guns"]!"
+ message_admins("[key_name_admin(user, 1)] summoned [summon_type ? "magic" : "guns"]!")
+ log_game("[key_name(user)] summoned [summon_type ? "magic" : "guns"]!")
for(var/mob/living/carbon/human/H in player_list)
if(H.stat == 2 || !(H.client)) continue
if(H.mind)
if(H.mind.special_role == "Wizard" || H.mind.special_role == "apprentice") continue
if(prob(25) && !(H.mind in ticker.mode.traitors))
+ if(jobban_isbanned(H, "Syndicate") || jobban_isbanned(H, "traitor")) continue
ticker.mode.traitors += H.mind
H.mind.special_role = "traitor"
var/datum/objective/survive/survive = new
@@ -100,6 +102,8 @@
new /obj/item/weapon/gun/magic/wand/teleport(get_turf(H))
if("wanddoor")
new /obj/item/weapon/gun/magic/wand/door(get_turf(H))
+ if("wandfireball")
+ new /obj/item/weapon/gun/magic/wand/fireball(get_turf(H))
if("staffhealing")
new /obj/item/weapon/gun/magic/staff/healing(get_turf(H))
if("staffdoor")
@@ -129,4 +133,26 @@
new /obj/item/weapon/antag_spawner/contract(get_turf(H))
if("staffchaos")
new /obj/item/weapon/gun/magic/staff/chaos(get_turf(H))
- H << "You suddenly feel lucky."
\ No newline at end of file
+ H << "You suddenly feel lucky."
+
+/mob/proc/summonevents()
+ if(events) //if there isn't something is very wrong
+ if(!events.wizardmode) //lets get this party started
+ events.control = list() //out with the old
+ for(var/type in typesof(/datum/round_event_control/wizard) - /datum/round_event_control/wizard) //in with the new
+ var/datum/round_event_control/wizard/W = new type()
+ if(!W.typepath)
+ continue //don't want this one! leave it for the garbage collector
+ events.control += W //add it to the list of all events (controls)
+ events.frequency_lower = 600 //1 minute lower bound
+ events.frequency_upper = 3000 //5 minutes upper bound
+ events.wizardmode = 1
+ events.reschedule()
+
+ else //Speed it up
+ events.frequency_lower = round(events.frequency_lower * 0.8) //1 minute | 48 seconds | 34.8 seconds | 30.7 seconds | 24.6 seconds
+ events.frequency_upper = round(events.frequency_upper * 0.6) //5 minutes | 3 minutes | 1 minute 48 seconds | 1 minute 4.8 seconds | 38.9 seconds
+ if(events.frequency_upper < events.frequency_lower)
+ events.frequency_upper = events.frequency_lower //this can't happen unless somehow multiple spellbooks are used, but just in case
+
+ events.reschedule()
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index 7b513e46cdc..aded7d5e8d2 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -112,6 +112,9 @@
dat += "Summon Magic (One time use, global spell)
"
dat += "Share the wonders of magic with the crew and show them why they aren't to be trusted with it at the same time.
"
+ dat += "Summon Events (One time use, persistent global spell)
"
+ dat += "Give Murphy's law a little push and replace all events with special wizard ones that will confound and confuse everyone. Multiple castings increase the rate of these events.
"
+
dat += "
"
dat += "Return
"
@@ -196,7 +199,7 @@
uses--
/*
*/
- var/list/available_spells = list(magicmissile = "Magic Missile", fireball = "Fireball", disintegrate = "Disintegrate", disabletech = "Disable Tech", smoke = "Smoke", blind = "Blind", mindswap = "Mind Transfer", forcewall = "Forcewall", blink = "Blink", teleport = "Teleport", mutate = "Mutate", etherealjaunt = "Ethereal Jaunt", knock = "Knock", horseman = "Curse of the Horseman", fleshtostone = "Flesh to Stone", summonguns = "Summon Guns", summonmagic = "Summon Magic", staffchange = "Staff of Change", soulstone = "Six Soul Stone Shards and the spell Artificer", armor = "Mastercrafted Armor Set", staffanimate = "Staff of Animation", staffchaos = "Staff of Chaos", staffdoor = "Staff of Door Creation", wands = "Wand Assortment")
+ var/list/available_spells = list(magicmissile = "Magic Missile", fireball = "Fireball", disintegrate = "Disintegrate", disabletech = "Disable Tech", smoke = "Smoke", blind = "Blind", mindswap = "Mind Transfer", forcewall = "Forcewall", blink = "Blink", teleport = "Teleport", mutate = "Mutate", etherealjaunt = "Ethereal Jaunt", knock = "Knock", horseman = "Curse of the Horseman", fleshtostone = "Flesh to Stone", summonguns = "Summon Guns", summonmagic = "Summon Magic", summonevents = "Summon Events", staffchange = "Staff of Change", soulstone = "Six Soul Stone Shards and the spell Artificer", armor = "Mastercrafted Armor Set", staffanimate = "Staff of Animation", staffchaos = "Staff of Chaos", staffdoor = "Staff of Door Creation", wands = "Wand Assortment")
var/already_knows = 0
for(var/obj/effect/proc_holder/spell/aspell in H.mind.spell_list)
if(available_spells[href_list["spell_choice"]] == initial(aspell.name))
@@ -292,14 +295,19 @@
temp = "You have learned flesh to stone."
if("summonguns")
feedback_add_details("wizard_spell_learned","SG") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
- H.rightandwrong(0)
+ rightandwrong(0, H)
max_uses--
temp = "You have cast summon guns."
if("summonmagic")
feedback_add_details("wizard_spell_learned","SU") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
- H.rightandwrong(1)
+ rightandwrong(1, H)
max_uses--
temp = "You have cast summon magic."
+ if("summonevents")
+ feedback_add_details("wizard_spell_learned","SE") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ H.summonevents()
+ max_uses--
+ temp = "You have cast summon events."
if("staffchange")
feedback_add_details("wizard_spell_learned","ST") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
new /obj/item/weapon/gun/magic/staff/change(get_turf(H))
diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm
index 516c63e56b5..245a827c3bf 100644
--- a/code/game/gamemodes/wizard/wizard.dm
+++ b/code/game/gamemodes/wizard/wizard.dm
@@ -10,9 +10,6 @@
recommended_enemies = 1
pre_setup_before_jobs = 1
- uplink_welcome = "Wizardly Uplink Console:"
- uplink_uses = 10
-
var/finished = 0
/datum/game_mode/wizard/announce()
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index a9ee8f00c16..cd7cb743573 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -79,6 +79,7 @@
//The Syndicate
/var/const/access_syndicate = 150//General Syndicate Access
+/var/const/access_syndicate_leader = 151//Nuke Op Leader Access
/obj/var/list/req_access = null
/obj/var/req_access_txt = "0"
@@ -103,6 +104,10 @@
//they can only hold things :(
if(src.check_access(george.get_active_hand()))
return 1
+ else if(isanimal(M))
+ var/mob/living/simple_animal/A = M
+ if(check_access(A.access_card))
+ return 1
return 0
/obj/item/proc/GetAccess()
@@ -206,7 +211,7 @@
return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_medical, access_cent_living, access_cent_storage, access_cent_teleporter, access_cent_captain)
/proc/get_all_syndicate_access()
- return list(access_syndicate)
+ return list(access_syndicate, access_syndicate)
/proc/get_region_accesses(var/code)
switch(code)
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index e4a9c21bb88..25b63f923bd 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -72,6 +72,9 @@ var/global/datum/controller/occupations/job_master
if(flag && (!player.client.prefs.be_special & flag))
Debug("FOC flag failed, Player: [player], Flag: [flag], ")
continue
+ if(config.enforce_human_authority && (job.title in command_positions) && player.client.prefs.pref_species.id != "human")
+ Debug("FOC non-human failed, Player: [player]")
+ continue
if(player.client.prefs.GetJobDepartment(job, level) & job.flag)
Debug("FOC pass, Player: [player], Level:[level]")
candidates += player
@@ -97,6 +100,10 @@ var/global/datum/controller/occupations/job_master
Debug("GRJ player not old enough, Player: [player]")
continue
+ if(config.enforce_human_authority && (job.title in command_positions) && player.client.prefs.pref_species.id != "human")
+ Debug("GRJ non-human failed, Player: [player]")
+ continue
+
if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1)
Debug("GRJ Random job given, Player: [player], Job: [job]")
AssignRole(player, job.title)
@@ -248,6 +255,10 @@ var/global/datum/controller/occupations/job_master
Debug("DO player not old enough, Player: [player], Job:[job.title]")
continue
+ if(config.enforce_human_authority && (job.title in command_positions) && player.client.prefs.pref_species.id != "human")
+ Debug("DO non-human failed, Player: [player], Job:[job.title]")
+ continue
+
// If the player wants that job on this level, then try give it to him.
if(player.client.prefs.GetJobDepartment(job, level) & job.flag)
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 52c8c84e1aa..afa65e0f8ad 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -17,8 +17,8 @@
var/min_health = 25
var/list/injection_chems = list() //list of injectable chems except inaprovaline, coz inaprovaline is always avalible
var/list/possible_chems = list(list("stoxin", "dexalin", "bicaridine", "kelotane"),
- list("stoxin", "dexalinp", "imidazoline", "dermaline", "bicaridine"),
- list("tricordrazine", "anti_toxin", "ryetalyn", "dermaline", "bicaridine", "imidazoline", "alkysine", "arithrazine"))
+ list("stoxin", "dexalinp", "bicaridine", "dermaline", "imidazoline"),
+ list("stoxin", "dexalinp", "bicaridine", "dermaline", "imidazoline", "anti_toxin", "ryetalyn", "alkysine", "arithrazine"))
/obj/machinery/sleeper/New()
..()
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index 876b57e9b63..3cb05fe99f1 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -1032,7 +1032,6 @@ FIRE ALARM
qdel(src)
return
- src.alarm()
return
/obj/machinery/firealarm/process()//Note: this processing was mostly phased out due to other code, and only runs when needed
diff --git a/code/game/machinery/bots/ed209bot.dm b/code/game/machinery/bots/ed209bot.dm
index f177f2ed1c2..c8bc47d15a1 100644
--- a/code/game/machinery/bots/ed209bot.dm
+++ b/code/game/machinery/bots/ed209bot.dm
@@ -134,7 +134,7 @@ Maintenance panel panel is [src.open ? "opened" : "closed"]
"},
if(!src.locked || issilicon(user))
if(!lasercolor)
dat += text({"
-Arrest for No ID: []
+Arrest Unidentifiable Persons: []
Arrest for Unauthorized Weapons: []
Arrest for Warrant: []
@@ -223,7 +223,7 @@ Auto Patrol: []"},
if(hasvar(W,"force") && W.force)//If force is defined and non-zero
threatlevel = user.assess_threat(src)
threatlevel += 6
- if(threatlevel > 0)
+ if(threatlevel >= 4)
src.target = user
if(lasercolor)//To make up for the fact that lasertag bots don't hunt
src.shootAt(user)
diff --git a/code/game/machinery/bots/floorbot.dm b/code/game/machinery/bots/floorbot.dm
index a757280af31..8f0e67df3b4 100644
--- a/code/game/machinery/bots/floorbot.dm
+++ b/code/game/machinery/bots/floorbot.dm
@@ -379,7 +379,7 @@
/obj/machinery/bot/floorbot/explode()
src.on = 0
- src.visible_message("[src] blows apart![src] blows apart!", 1)
var/turf/Tsec = get_turf(src)
var/obj/item/weapon/storage/toolbox/mechanical/N = new /obj/item/weapon/storage/toolbox/mechanical(Tsec)
diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm
index e151bfc759b..ae8f5927db7 100644
--- a/code/game/machinery/bots/secbot.dm
+++ b/code/game/machinery/bots/secbot.dm
@@ -127,7 +127,7 @@ Maintenance panel panel is [src.open ? "opened" : "closed"]
"},
if(!src.locked || issilicon(user))
dat += text({"
-Arrest for No ID: []
+Arrest Unidentifiable Persons: []
Arrest for Unauthorized Weapons: []
Arrest for Warrant: []
@@ -142,7 +142,7 @@ Auto Patrol: []"},
"[src.declare_arrests ? "Yes" : "No"]",
"[auto_patrol ? "On" : "Off"]" )
- var/datum/browser/popup = new(user, "autosec", "Securitron v1.5 controls")
+ var/datum/browser/popup = new(user, "autosec", "Securitron v1.5.1 controls")
popup.set_content(dat)
popup.open()
return
@@ -210,7 +210,7 @@ Auto Patrol: []"},
if(!istype(W, /obj/item/weapon/screwdriver) && (W.force) && (!src.target) ) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass.
threatlevel = user.assess_threat(src)
threatlevel += 6
- if(threatlevel > 0)
+ if(threatlevel >= 4)
src.target = user
src.mode = SECBOT_HUNT
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index 4c5a70281e6..0bd36e3f74e 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -282,7 +282,7 @@
if(isXRay())
see = range(view_range, pos)
else
- see = hear(view_range, pos)
+ see = get_hear(view_range, pos)
return see
/atom/proc/auto_turn()
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 58884d1ee05..dc12c7dec60 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -161,13 +161,14 @@
src.icon_state = "pod_1"
//Get the clone body ready
- H.adjustCloneLoss(CLONE_INITIAL_DAMAGE ) //Yeah, clones start with very low health, not with random, because why would they start with random health
- H.adjustBrainLoss(CLONE_INITIAL_DAMAGE )
+ H.adjustCloneLoss(CLONE_INITIAL_DAMAGE) //Yeah, clones start with very low health, not with random, because why would they start with random health
+ H.adjustBrainLoss(CLONE_INITIAL_DAMAGE)
H.Paralyse(4)
//Here let's calculate their health so the pod doesn't immediately eject them!!!
H.updatehealth()
+ H.silent = 5 //Prevents an extreme edge case where clones could speak if they said something at exactly the right moment.
clonemind.transfer_to(H)
H.ckey = ckey
H << "Consciousness slowly creeps over you as your body regenerates.
So this is what cloning feels like?"
@@ -196,13 +197,7 @@
if(efficiency < 3 && prob(50))
randmutb(H)
- if(H.gender == MALE)
- H.facial_hair_style = "Full Beard"
- else
- H.facial_hair_style = "Shaved"
- H.hair_style = pick("Bedhead", "Bedhead 2", "Bedhead 3")
-
- H.regenerate_icons()
+ H.set_cloned_appearance()
H.suiciding = 0
src.attempting = 0
diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm
index 993f8e03777..efb6bc939dd 100644
--- a/code/game/machinery/computer/aifixer.dm
+++ b/code/game/machinery/computer/aifixer.dm
@@ -51,6 +51,12 @@
if (src.occupier.laws.zeroth)
laws += "0: [src.occupier.laws.zeroth]
"
+ for (var/index = 1, index <= src.occupier.laws.ion.len, index++)
+ var/law = src.occupier.laws.ion[index]
+ if (length(law) > 0)
+ var/num = ionnum()
+ laws += "[num]: [law]
"
+
var/number = 1
for (var/index = 1, index <= src.occupier.laws.inherent.len, index++)
var/law = src.occupier.laws.inherent[index]
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index f390afd4299..6b5ad607a94 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -342,6 +342,8 @@
gameover = 0
/obj/machinery/computer/arcade/orion_trail/attack_hand(mob/user as mob)
+ if(..())
+ return
if(fuel <= 0 || food <=0 || settlers.len == 0)
gameover = 1
event = null
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index fc4c18c537f..5140790e6f8 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -289,7 +289,8 @@
if(istype(P, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = P
if(!WT.remove_fuel(0, user))
- user << "The welding tool must be on to complete this task."
+ if(!WT.isOn())
+ user << "The welding tool must be on to complete this task."
return
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
user << "You start deconstructing the frame."
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index ac530a8aafd..f273a019358 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -196,7 +196,8 @@ var/time_last_changed_position = 0
header += "
"
var/jobs_all = ""
- var/list/alljobs = (istype(src,/obj/machinery/computer/card/centcom)? get_all_centcom_jobs() : get_all_jobs()) + "Custom"
+ var/list/alljobs = list("Unassigned")
+ alljobs += (istype(src,/obj/machinery/computer/card/centcom)? get_all_centcom_jobs() : get_all_jobs()) + "Custom"
for(var/job in alljobs)
jobs_all += "[replacetext(job, " ", " ")] " //make sure there isn't a line break in the middle of a job
@@ -367,12 +368,13 @@ var/time_last_changed_position = 0
if (authenticated == 2)
var/t1 = href_list["assign_target"]
if(t1 == "Custom")
- var/newJob = reject_bad_name(input("Enter a custom job assignment.", "Assignment", modify ? modify.assignment : "Unassigned"))
+ var/newJob = reject_bad_text(input("Enter a custom job assignment.", "Assignment", modify ? modify.assignment : "Unassigned"), MAX_NAME_LEN)
if(newJob)
t1 = newJob
- else
- modify.assignment = "Unassigned"
- return
+
+ else if(t1 == "Unassigned")
+ modify.access = list()
+
else
var/datum/job/jobdatum
for(var/jobtype in typesof(/datum/job))
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 55291174444..bca82949746 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -332,7 +332,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
var/dat = ""
if (emergency_shuttle.online && emergency_shuttle.location==0)
var/timeleft = emergency_shuttle.timeleft()
- dat += "Emergency shuttle\n
\nETA: [timeleft / 60 % 60]:[add_zero(num2text(timeleft % 60), 2)]
"
+ dat += "Emergency shuttle\n
\nETA: [timeleft / 60 % 60]:[add_zero(num2text(timeleft % 60), 2)]"
var/datum/browser/popup = new(user, "communications", "Communications Console", 400, 500)
@@ -354,10 +354,11 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
if (src.authenticated)
if(emergency_shuttle.recall_count > 1)
if(emergency_shuttle.last_call_loc)
- dat += "
Last emergency shuttle call/recall traced to: [format_text(emergency_shuttle.last_call_loc.name)].
"
+ dat += "
Most recent shuttle call/recall traced to: [format_text(emergency_shuttle.last_call_loc.name)]"
else
- dat += "
Last emergency shuttle call/recall trace failed.
"
- dat += "Logged in as: [auth_id]"
+ dat += "
Unable to trace most recent shuttle call/recall signal."
+ dat += "
Logged in as: [auth_id]"
+ dat += "
"
dat += "
\[ Log Out \]
"
dat += "
General Functions"
dat += "
\[ Message List \]"
@@ -593,11 +594,9 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
var/area/signal_origin = get_area(user)
var/emergency_reason = "\nNature of emergency:\n\n[call_reason]"
if (seclevel2num(get_security_level()) == SEC_LEVEL_RED) // There is a serious threat we gotta move no time to give them five minutes.
- emergency_shuttle.incall(0.6, signal_origin)
- priority_announce("The emergency shuttle has been called. Red Alert state confirmed: Dispatching priority shuttle. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.[emergency_reason]", null, 'sound/AI/shuttlecalled.ogg', "Priority")
+ emergency_shuttle.incall(0.6, signal_origin, emergency_reason, 1)
else
- emergency_shuttle.incall(1, signal_origin)
- priority_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.[emergency_reason]", null, 'sound/AI/shuttlecalled.ogg', "Priority")
+ emergency_shuttle.incall(1, signal_origin, emergency_reason, 0)
log_game("[key_name(user)] has called the shuttle.")
message_admins("[key_name_admin(user)] has called the shuttle.", 1)
diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm
index 8be739d4b89..b9d29711de0 100644
--- a/code/game/machinery/computer/message.dm
+++ b/code/game/machinery/computer/message.dm
@@ -397,7 +397,7 @@
//Get out list of viable PDAs
var/list/obj/item/device/pda/sendPDAs = get_viewable_pdas()
if(PDAs && PDAs.len > 0)
- customrecepient = input(usr, "Select a PDA from the list.") as null|anything in sortAtom(sendPDAs)
+ customrecepient = input(usr, "Select a PDA from the list.") as null|anything in sortNames(sendPDAs)
else
customrecepient = null
diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm
index 4fc05d7ef41..c0ce0bcfc8b 100644
--- a/code/game/machinery/computer/prisoner.dm
+++ b/code/game/machinery/computer/prisoner.dm
@@ -26,6 +26,7 @@
dat += text("[inserted_id]
")
dat += text("Collected Points: [inserted_id.points]. Reset.
")
dat += text("Card goal: [inserted_id.goal]. Set
")
+ dat += text("Space Law recommends quotas of 100 points per minute they would normally serve in the brig.
")
else
dat += text("Insert Prisoner ID.
")
dat += "Prisoner Implant Management
"
@@ -105,6 +106,7 @@
if("setgoal")
var/num = round(input(usr, "Choose prisoner's goal:", "Input an Integer", null) as num|null)
if(num >= 0)
+ num = min(num,1000) //Cap the quota to the equivilent of 10 minutes.
inserted_id.goal = num
else if(href_list["inject1"])
var/obj/item/weapon/implant/I = locate(href_list["inject1"])
diff --git a/code/game/machinery/computer/syndicate_shuttle.dm b/code/game/machinery/computer/syndicate_shuttle.dm
index 6757442453e..2c2b34faf52 100644
--- a/code/game/machinery/computer/syndicate_shuttle.dm
+++ b/code/game/machinery/computer/syndicate_shuttle.dm
@@ -1,40 +1,45 @@
#define SYNDICATE_SHUTTLE_MOVE_TIME 240
#define SYNDICATE_SHUTTLE_COOLDOWN 200
+/var/area/synd_shuttle_curr_location
+/var/synd_shuttle_moving = 0
+/var/synd_shuttle_lastMove = 0
+
/obj/machinery/computer/syndicate_station
name = "syndicate shuttle terminal"
icon = 'icons/obj/computer.dmi'
icon_state = "syndishuttle"
req_access = list(access_syndicate)
- var/area/curr_location
- var/moving = 0
- var/lastMove = 0
+ var/recall_only = 0
+/obj/machinery/computer/syndicate_station/recall
+ name = "syndicate shuttle recall terminal"
+ recall_only = 1
/obj/machinery/computer/syndicate_station/New()
- curr_location= locate(/area/syndicate_station/start)
+ synd_shuttle_curr_location= locate(/area/syndicate_station/start)
/obj/machinery/computer/syndicate_station/proc/syndicate_move_to(area/destination as area)
- if(moving) return
- if(lastMove + SYNDICATE_SHUTTLE_COOLDOWN > world.time) return
+ if(synd_shuttle_moving) return
+ if(synd_shuttle_lastMove + SYNDICATE_SHUTTLE_COOLDOWN > world.time) return
var/area/dest_location = locate(destination)
- if(curr_location == dest_location) return
+ if(synd_shuttle_curr_location == dest_location) return
- moving = 1
- lastMove = world.time
+ synd_shuttle_moving = 1
+ synd_shuttle_lastMove = world.time
- if(curr_location.z != dest_location.z)
+ if(synd_shuttle_curr_location.z != dest_location.z)
var/area/transit_location = locate(/area/syndicate_station/transit)
- curr_location.move_contents_to(transit_location)
- curr_location = transit_location
- curr_location.has_gravity = 0
+ synd_shuttle_curr_location.move_contents_to(transit_location)
+ synd_shuttle_curr_location = transit_location
+ synd_shuttle_curr_location.has_gravity = 0
transit_location.has_gravity = 1
sleep(SYNDICATE_SHUTTLE_MOVE_TIME)
- curr_location.move_contents_to(dest_location)
- curr_location = dest_location
- moving = 0
+ synd_shuttle_curr_location.move_contents_to(dest_location)
+ synd_shuttle_curr_location = dest_location
+ synd_shuttle_moving = 0
return 1
/obj/machinery/computer/syndicate_station/attack_hand(mob/user as mob)
@@ -44,17 +49,18 @@
user.set_machine(src)
- var/dat = {"Location: [curr_location]
- Ready to move[max(lastMove + SYNDICATE_SHUTTLE_COOLDOWN - world.time, 0) ? " in [max(round((lastMove + SYNDICATE_SHUTTLE_COOLDOWN - world.time) * 0.1), 0)] seconds" : ": now"]
- Syndicate Space
- North West of SS13 |
- North of SS13 |
- North East of SS13
- South West of SS13 |
- South of SS13 |
- South East of SS13
- North East of the Mining Asteroid
- Close"}
+ var/dat = {"Location: [synd_shuttle_curr_location]
+ Ready to move[max(synd_shuttle_lastMove + SYNDICATE_SHUTTLE_COOLDOWN - world.time, 0) ? " in [max(round((synd_shuttle_lastMove + SYNDICATE_SHUTTLE_COOLDOWN - world.time) * 0.1), 0)] seconds" : ": now"]
+ Syndicate Space
"}
+ if(!recall_only)
+ dat += {"North West of SS13 |
+ North of SS13 |
+ North East of SS13
+ South West of SS13 |
+ South of SS13 |
+ South East of SS13
+ North East of the Mining Asteroid
+ Close"}
user << browse(dat, "window=computer;size=575x450")
onclose(user, "computer")
@@ -71,22 +77,21 @@
if(href_list["syndicate"])
syndicate_move_to(/area/syndicate_station/start)
- else if(href_list["station_nw"])
- syndicate_move_to(/area/syndicate_station/northwest)
- else if(href_list["station_n"])
- syndicate_move_to(/area/syndicate_station/north)
- else if(href_list["station_ne"])
- syndicate_move_to(/area/syndicate_station/northeast)
- else if(href_list["station_sw"])
- syndicate_move_to(/area/syndicate_station/southwest)
- else if(href_list["station_s"])
- syndicate_move_to(/area/syndicate_station/south)
- else if(href_list["station_se"])
- syndicate_move_to(/area/syndicate_station/southeast)
-// else if(href_list["commssat"])
-// syndicate_move_to(/area/syndicate_station/commssat)
- else if(href_list["mining"])
- syndicate_move_to(/area/syndicate_station/mining)
+ else if(!recall_only)
+ if(href_list["station_nw"])
+ syndicate_move_to(/area/syndicate_station/northwest)
+ else if(href_list["station_n"])
+ syndicate_move_to(/area/syndicate_station/north)
+ else if(href_list["station_ne"])
+ syndicate_move_to(/area/syndicate_station/northeast)
+ else if(href_list["station_sw"])
+ syndicate_move_to(/area/syndicate_station/southwest)
+ else if(href_list["station_s"])
+ syndicate_move_to(/area/syndicate_station/south)
+ else if(href_list["station_se"])
+ syndicate_move_to(/area/syndicate_station/southeast)
+ else if(href_list["mining"])
+ syndicate_move_to(/area/syndicate_station/mining)
updateUsrDialog()
return
\ No newline at end of file
diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm
index 5bbec898938..4434006a2ef 100644
--- a/code/game/machinery/deployable.dm
+++ b/code/game/machinery/deployable.dm
@@ -64,6 +64,7 @@ for reference:
var/maxhealth = 100.0
/obj/structure/barricade/wooden/attackby(obj/item/W as obj, mob/user as mob)
+ user.changeNext_move(CLICK_CD_MELEE)
if (istype(W, /obj/item/stack/sheet/mineral/wood))
if (src.health < src.maxhealth)
visible_message("[user] begins to repair the [src]!")
diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm
index 9ecedc5142e..a620d80585c 100644
--- a/code/game/machinery/door_control.dm
+++ b/code/game/machinery/door_control.dm
@@ -87,7 +87,7 @@
if(specialfunctions & IDSCAN)
D.aiDisabledIdScanner = !D.aiDisabledIdScanner
if(specialfunctions & BOLTS)
- if(!D.isWireCut(4) && D.arePowerSystemsOn())
+ if(!D.isWireCut(4) && D.hasPower())
D.locked = !D.locked
D.update_icon()
if(specialfunctions & SHOCK)
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 80d96a275ee..ed5e9f3f878 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -5,7 +5,7 @@
mend - mends a wire and makes any necessary state changes
canAIControl - 1 if the AI can control the airlock, 0 if not (then check canAIHack to see if it can hack in)
canAIHack - 1 if the AI can hack into the airlock to recover control, 0 if not. Also returns 0 if the AI does not *need* to hack it.
- arePowerSystemsOn - 1 if the main or backup power are functioning, 0 if not. Does not check whether the power grid is charged or an APC has equipment on or anything like that. (Check (stat & NOPOWER) for that)
+ hasPower - 1 if the main or backup power are functioning, 0 if not.
requiresIDs - 1 if the airlock is requiring IDs, 0 if not
isAllPowerCut - 1 if the main and backup power both have cut wires.
regainMainPower - handles the effect of main power coming back on.
@@ -282,6 +282,16 @@
var/mineral = "wood"
doortype = 35
+/obj/machinery/door/airlock/virology
+ icon = 'icons/obj/doors/Doorviro.dmi'
+ doortype = 36
+
+/obj/machinery/door/airlock/glass_virology
+ icon = 'icons/obj/doors/Doorviroglass.dmi'
+ opacity = 0
+ doortype = 37
+ glass = 1
+
/*
About the new airlock wires panel:
* An airlock wire dialog can be accessed by the normal way or by using wirecutters or a multitool on the door while the wire-panel is open. This would show the following wires, which you can either wirecut/mend or send a multitool pulse through. There are 9 wires.
@@ -334,8 +344,8 @@ About the new airlock wires panel:
/obj/machinery/door/airlock/proc/canAIHack()
return ((src.aiControlDisabled==1) && (!hackProof) && (!src.isAllPowerCut()));
-/obj/machinery/door/airlock/proc/arePowerSystemsOn()
- return (src.secondsMainPowerLost==0 || src.secondsBackupPowerLost==0)
+/obj/machinery/door/airlock/hasPower()
+ return ((src.secondsMainPowerLost==0 || src.secondsBackupPowerLost==0) && !(stat & NOPOWER))
/obj/machinery/door/airlock/requiresID()
return !(src.isWireCut(AIRLOCK_WIRE_IDSCAN) || aiDisabledIdScanner)
@@ -389,7 +399,7 @@ About the new airlock wires panel:
// returns 1 if shocked, 0 otherwise
// The preceding comment was borrowed from the grille's shock script
/obj/machinery/door/airlock/proc/shock(mob/user, prb)
- if((stat & (NOPOWER)) || !src.arePowerSystemsOn()) // unpowered, no shock
+ if(!hasPower()) // unpowered, no shock
return 0
if(hasShocked)
return 0 //Already shocked someone recently?
@@ -513,7 +523,7 @@ About the new airlock wires panel:
t1 += text("Door bolts are up. Drop them?
\n", src)
else
t1 += text("Door bolts are down.")
- if(src.arePowerSystemsOn())
+ if(src.hasPower())
t1 += text(" Raise?
\n", src)
else
t1 += text(" Cannot raise door bolts due to power failure.
\n")
@@ -775,7 +785,7 @@ About the new airlock wires panel:
else if(!src.locked)
usr << text("The door bolts are already up.
\n")
else
- if(src.arePowerSystemsOn())
+ if(src.hasPower())
src.locked = 0
update_icon()
else
@@ -879,17 +889,15 @@ About the new airlock wires panel:
if((istype(C, /obj/item/weapon/weldingtool) && !( src.operating ) && src.density))
var/obj/item/weapon/weldingtool/W = C
user << "You begin [welded ? "unwelding":"welding"] the airlock..."
- playsound(loc, 'sound/items/Welder2.ogg', 40, 1)
+ playsound(loc, 'sound/items/Welder.ogg', 40, 1)
if(do_after(user,40,5,1))
if(density && !operating)//Door must be closed to weld.
if(W.remove_fuel(0,user))
- playsound(loc, 'sound/items/welder.ogg', 50, 1)
+ playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
welded = !welded
user << "You [welded ? "welded the airlock shut":"unwelded the airlock"]"
update_icon()
user.visible_message("[src] has been [welded? "welded shut":"unwelded"] by [user.name].")
- else
- user << "You need more welding fuel to complete this task."
return
else if(istype(C, /obj/item/weapon/screwdriver))
src.p_open = !( src.p_open )
@@ -910,7 +918,7 @@ About the new airlock wires panel:
beingcrowbarred = 1 //derp, Agouri
else
beingcrowbarred = 0
- if( beingcrowbarred && (density && welded && !operating && src.p_open && (!src.arePowerSystemsOn() || stat & NOPOWER) && !src.locked) )
+ 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.", "You start to remove electronics from the airlock assembly.")
if(do_after(user,40))
@@ -951,6 +959,8 @@ About the new airlock wires panel:
if(33) new/obj/structure/door_assembly/door_assembly_highsecurity(src.loc)
if(34) new/obj/structure/door_assembly/door_assembly_shuttle(src.loc)
if(35) new/obj/structure/door_assembly/door_assembly_wood(src.loc)
+ if(36) new/obj/structure/door_assembly/door_assembly_viro(src.loc)
+ if(37) new/obj/structure/door_assembly/door_assembly_viro/glass(src.loc)
if(emagged)
user << "You discard the damaged electronics."
qdel(src)
@@ -972,7 +982,7 @@ About the new airlock wires panel:
qdel(src)
return
- else if(arePowerSystemsOn() && !(stat & NOPOWER))
+ else if(hasPower())
user << " The airlock's motors resist your efforts to force it."
else if(locked)
user << " The airlock's bolts prevent it from being forced."
@@ -1013,7 +1023,7 @@ About the new airlock wires panel:
if( operating || welded || locked )
return 0
if(!forced)
- if( !arePowerSystemsOn() || (stat & NOPOWER) || isWireCut(AIRLOCK_WIRE_OPEN_DOOR) )
+ if( !hasPower() || isWireCut(AIRLOCK_WIRE_OPEN_DOOR) )
return 0
if(forced < 2)
if(emagged)
@@ -1044,7 +1054,7 @@ About the new airlock wires panel:
if(operating || welded || locked)
return
if(!forced)
- if( !arePowerSystemsOn() || (stat & NOPOWER) || isWireCut(AIRLOCK_WIRE_DOOR_BOLTS) )
+ if( !hasPower() || isWireCut(AIRLOCK_WIRE_DOOR_BOLTS) )
return
if(safe)
if(locate(/mob/living) in get_turf(src))
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index ac6e9ab2720..8b03d1696c5 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -88,14 +88,17 @@
return !density || check_access(ID)
/obj/machinery/door/proc/bumpopen(mob/user as mob)
- if(operating) return
+ if(operating)
+ return
src.add_fingerprint(user)
if(!src.requiresID())
user = null
if(density && !emagged)
- if(allowed(user) || src.emergency == 1) open()
- else flick("door_deny", src)
+ if(allowed(user) || src.emergency == 1)
+ open()
+ else
+ flick("door_deny", src)
return
@@ -126,7 +129,7 @@
user = null
if(!src.requiresID())
user = null
- if(src.density && (istype(I, /obj/item/weapon/card/emag)||istype(I, /obj/item/weapon/melee/energy/blade)))
+ if(src.density && hasPower() && (istype(I, /obj/item/weapon/card/emag)||istype(I, /obj/item/weapon/melee/energy/blade)))
flick("door_spark", src)
sleep(6)
open()
@@ -269,6 +272,9 @@
/obj/machinery/door/proc/requiresID()
return 1
+/obj/machinery/door/proc/hasPower()
+ return !(stat & NOPOWER)
+
/obj/machinery/door/BlockSuperconductivity()
if(opacity || heat_proof)
return 1
diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm
index 6a1518e311b..910feb64a41 100644
--- a/code/game/machinery/doppler_array.dm
+++ b/code/game/machinery/doppler_array.dm
@@ -8,7 +8,6 @@ var/list/doppler_arrays = list()
density = 1
anchored = 1
-
/obj/machinery/doppler_array/New()
..()
doppler_arrays += src
@@ -74,10 +73,11 @@ var/list/doppler_arrays = list()
if(devastation_range < orig_dev_range || heavy_impact_range < orig_heavy_range || light_impact_range < orig_light_range)
messages += "Theoretical: Epicenter radius: [orig_dev_range]. Outer radius: [orig_heavy_range]. Shockwave radius: [orig_light_range]."
- for(var/mob/O in hearers(src, null))
- for(var/message in messages)
- O.show_message("[src] states coldly, \"[message]\"",2)
+ for(var/message in messages)
+ say(message)
+/obj/machinery/doppler_array/say_quote(text)
+ return "states coldly, \"[text]\""
/obj/machinery/doppler_array/power_change()
if(stat & BROKEN)
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index f56c9eaf2d2..a3468565a36 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -11,7 +11,7 @@ How it works:
AI clicks on holopad in camera view. View centers on holopad.
AI clicks again on the holopad to display a hologram. Hologram stays as long as AI is looking at the pad and it (the hologram) is in range of the pad.
AI can use the directional keys to move the hologram around, provided the above conditions are met and the AI in question is the holopad's master.
-Only one AI may project from a holopad at any given time.
+Any number of AIs can use a holopad. /Lo6
AI may cancel the hologram at any time by clicking on the holopad once more.
Possible to do for anyone motivated enough:
@@ -24,16 +24,20 @@ Possible to do for anyone motivated enough:
* Holopad
*/
-// HOLOPAD MODE
-// 0 = RANGE BASED
-// 1 = AREA BASED
-var/const/HOLOPAD_MODE = 0
+#define HOLOPAD_PASSIVE_POWER_USAGE 1
+#define HOLOGRAM_POWER_USAGE 2
+#define RANGE_BASED 4
+#define AREA_BASED 6
+
+var/const/HOLOPAD_MODE = RANGE_BASED
/obj/machinery/hologram/holopad
name = "\improper AI holopad"
desc = "It's a floor-mounted device for projecting holographic images. It is activated remotely."
icon_state = "holopad0"
- var/mob/living/silicon/ai/master//Which AI, if any, is controlling the object? Only one AI may control a hologram at any time.
+ flags = HEAR
+ languages = ROBOT | HUMAN
+ var/list/masters = list()//List of AIs that use the holopad
var/last_request = 0 //to prevent request spam. ~Carn
var/holo_range = 5 // Change to change how far the AI can move away from the holopad before deactivating.
@@ -59,85 +63,87 @@ var/const/HOLOPAD_MODE = 0
This may change in the future but for now will suffice.*/
if(user.eyeobj.loc != src.loc)//Set client eye on the object if it's not already.
user.eyeobj.setLoc(get_turf(src))
- else if(!hologram)//If there is no hologram, possibly make one.
+ else if(!masters[user])//If there is no hologram, possibly make one.
activate_holo(user)
- else if(master==user)//If there is a hologram, remove it. But only if the user is the master. Otherwise do nothing.
- clear_holo()
+ else//If there is a hologram, remove it.
+ clear_holo(user)
return
/obj/machinery/hologram/holopad/proc/activate_holo(mob/living/silicon/ai/user)
- if(!(stat & NOPOWER) && user.eyeobj.loc == src.loc)//If the projector has power and client eye is on it.
- if(!hologram)//If there is not already a hologram.
- create_holo(user)//Create one.
- src.visible_message("A holographic image of [user] flicks to life right before your eyes!")
- else
+ if(!(stat & NOPOWER) && user.eyeobj.loc == src.loc)//If the projector has power and client eye is on it
+ if (istype(user.current, /obj/machinery/hologram/holopad))
user << "ERROR: \black Image feed in progress."
+ return
+ create_holo(user)//Create one.
+ src.visible_message("A holographic image of [user] flicks to life right before your eyes!")
else
user << "ERROR: \black Unable to project hologram."
return
/*This is the proc for special two-way communication between AI and holopad/people talking near holopad.
For the other part of the code, check silicon say.dm. Particularly robot talk.*/
-/obj/machinery/hologram/holopad/hear_talk(mob/living/M, text)
- if(M&&hologram&&master)//Master is mostly a safety in case lag hits or something.
- if(!master.say_understands(M))//The AI will be able to understand most mobs talking through the holopad.
- text = stars(text)
- var/name_used = M.GetVoice()
- //This communication is imperfect because the holopad "filters" voices and is only designed to connect to the master only.
- var/rendered = "Holopad received, [name_used] [M.say_quote(text)]"
- master.show_message(rendered, 2)
+/obj/machinery/hologram/holopad/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq)
+ if(speaker && masters.len && !radio_freq)//Master is mostly a safety in case lag hits or something. Radio_freq so AIs dont hear holopad stuff through radios.
+ for (var/mob/living/silicon/ai/master in masters)
+ if(masters[master] && speaker != master)
+ raw_message = master.lang_treat(speaker, message_langs, raw_message)
+ var/name_used = speaker.GetVoice()
+ var/rendered = "Holopad received, [name_used] [speaker.say_quote(raw_message)]"
+ master.show_message(rendered, 2)
return
/obj/machinery/hologram/holopad/proc/create_holo(mob/living/silicon/ai/A, turf/T = loc)
- hologram = new(T)//Spawn a blank effect at the location.
- hologram.icon = A.holo_icon
- hologram.mouse_opacity = 0//So you can't click on it.
- hologram.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them.
- hologram.anchored = 1//So space wind cannot drag it.
- hologram.name = "[A.name] (Hologram)"//If someone decides to right click.
- hologram.SetLuminosity(2) //hologram lighting
+ var/obj/effect/overlay/h = new(T)//Spawn a blank effect at the location.
+ h.icon = A.holo_icon
+ h.mouse_opacity = 0//So you can't click on it.
+ h.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them.
+ h.anchored = 1//So space wind cannot drag it.
+ h.name = "[A.name] (Hologram)"//If someone decides to right click.
+ h.SetLuminosity(2) //hologram lighting
+ masters[A] = h
SetLuminosity(2) //pad lighting
icon_state = "holopad1"
A.current = src
- master = A//AI is the master.
- use_power = 2//Active power usage.
+ use_power += HOLOGRAM_POWER_USAGE
return 1
-/obj/machinery/hologram/holopad/proc/clear_holo()
-// hologram.SetLuminosity(0)//Clear lighting. //handled by the lighting controller when its ower is deleted
- qdel(hologram)//Get rid of hologram.
- hologram = null
- if(master.current == src)
- master.current = null
- master = null//Null the master, since no-one is using it now.
- SetLuminosity(0) //pad lighting (hologram lighting will be handled automatically since its owner was deleted)
- icon_state = "holopad0"
- use_power = 1//Passive power usage.
+/obj/machinery/hologram/holopad/proc/clear_holo(mob/living/silicon/ai/user)
+ if(user.current == src)
+ user.current = null
+ qdel(masters[user])//Get rid of user's hologram
+ masters -= user //Discard AI from the list of those who use holopad
+ use_power = max(HOLOPAD_PASSIVE_POWER_USAGE, use_power - HOLOGRAM_POWER_USAGE)//Reduce power usage
+ if (!masters.len)//If no users left
+ SetLuminosity(0) //pad lighting (hologram lighting will be handled automatically since its owner was deleted)
+ icon_state = "holopad0"
+ use_power = HOLOPAD_PASSIVE_POWER_USAGE
return 1
/obj/machinery/hologram/holopad/process()
- if(hologram)//If there is a hologram.
- if(master && !master.stat && master.client && master.eyeobj)//If there is an AI attached, it's not incapacitated, it has a client, and the client eye is centered on the projector.
- if(!(stat & NOPOWER))//If the machine has power.
- if((HOLOPAD_MODE == 0 && (get_dist(master.eyeobj, src) <= holo_range)))
- return 1
-
- else if (HOLOPAD_MODE == 1)
-
- var/area/holo_area = get_area(src)
- var/area/eye_area = get_area(master.eyeobj)
-
- if(eye_area in holo_area.master.related)
+ if(masters.len)//If there is a hologram.
+ for (var/mob/living/silicon/ai/master in masters)
+ if(master && !master.stat && master.client && master.eyeobj)//If there is an AI attached, it's not incapacitated, it has a client, and the client eye is centered on the projector.
+ if(!(stat & NOPOWER))//If the machine has power.
+ if((HOLOPAD_MODE == RANGE_BASED && (get_dist(master.eyeobj, src) <= holo_range)))
return 1
- clear_holo()//If not, we want to get rid of the hologram.
+ else if (HOLOPAD_MODE == AREA_BASED)
+
+ var/area/holo_area = get_area(src)
+ var/area/eye_area = get_area(master.eyeobj)
+
+ if(eye_area in holo_area.master.related)
+ return 1
+
+ clear_holo(master)//If not, we want to get rid of the hologram.
return 1
-/obj/machinery/hologram/holopad/proc/move_hologram()
- if(hologram)
- step_to(hologram, master.eyeobj) // So it turns.
- hologram.loc = get_turf(master.eyeobj)
-
+/obj/machinery/hologram/holopad/proc/move_hologram(mob/living/silicon/ai/user)
+ if(masters[user])
+ step_to(masters[user], user.eyeobj) // So it turns.
+ var/obj/effect/overlay/H = masters[user]
+ H.loc = get_turf(user.eyeobj)
+ masters[user] = H
return 1
/*
@@ -149,7 +155,6 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
use_power = 1
idle_power_usage = 5
active_power_usage = 100
- var/obj/effect/overlay/hologram//The projection itself. If there is one, the instrument is on, off otherwise.
/obj/machinery/hologram/power_change()
if (powered())
@@ -175,8 +180,8 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
return
/obj/machinery/hologram/holopad/Destroy()
- if(hologram)
- clear_holo()
+ for (var/mob/living/silicon/ai/master in masters)
+ clear_holo(master)
..()
/*
@@ -207,4 +212,9 @@ Holographic project of everything else.
name = "hologram projector"
desc = "It makes a hologram appear...with magnets or something..."
icon = 'icons/obj/stationobjs.dmi'
- icon_state = "hologram0"
\ No newline at end of file
+ icon_state = "hologram0"
+
+#undef RANGE_BASED
+#undef AREA_BASED
+#undef HOLOPAD_PASSIVE_POWER_USAGE
+#undef HOLOGRAM_POWER_USAGE
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 3c8292c53ae..44be02fadac 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -213,7 +213,7 @@ Class Procs:
return
/mob/dead/observer/canUseTopic()
- if(check_rights(R_ADMIN))
+ if(check_rights(R_ADMIN, 0))
return
/mob/living/canUseTopic(atom/movable/M, be_close = 0, no_dextery = 0)
@@ -264,9 +264,7 @@ Class Procs:
return 1
if(user.lying || user.stat)
return 1
- if ( ! (istype(usr, /mob/living/carbon/human) || \
- istype(usr, /mob/living/silicon) || \
- istype(usr, /mob/living/carbon/monkey)) )
+ if(!user.IsAdvancedToolUser())
usr << "You don't have the dexterity to do this!"
return 1
/*
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index 29ee00bd7e0..9e1bd0616fa 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -1027,10 +1027,8 @@ obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob)
// return //bode well with a newscaster network of 10+ machines. Let's just return it, as it's added in the machines list.
/obj/machinery/newscaster/proc/newsAlert(channel) //This isn't Agouri's work, for it is ugly and vile.
- var/turf/T = get_turf(src) //Who the fuck uses spawn(600) anyway, jesus christ
- if(channel)
- for(var/mob/O in hearers(world.view-1, T))
- O.show_message("[src.name] beeps, \"Breaking news from [channel]!\"",2)
+ if(channel) //Who the fuck uses spawn(600) anyway, jesus christ
+ say("Breaking news from [channel]!")
src.alert = 1
src.update_icon()
spawn(300)
@@ -1038,7 +1036,9 @@ obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob)
src.update_icon()
playsound(src.loc, 'sound/machines/twobeep.ogg', 75, 1)
else
- for(var/mob/O in hearers(world.view-1, T))
- O.show_message("[src.name] beeps, \"Attention! Wanted issue distributed!\"",2)
+ say("Attention! Wanted issue distributed!")
playsound(src.loc, 'sound/machines/warning-buzzer.ogg', 75, 1)
- return
\ No newline at end of file
+ return
+
+/obj/machinery/newscaster/say_quote(text)
+ return "beeps, \"[text]\""
diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm
index 8d41384915c..ab94b08d5e7 100644
--- a/code/game/machinery/pipe/construction.dm
+++ b/code/game/machinery/pipe/construction.dm
@@ -254,8 +254,6 @@ Buildable meters
return 1
// no conflicts found
- var/pipefailtext = "There's nothing to connect this pipe section to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)"
-
switch(pipe_type)
if(PIPE_SIMPLE_STRAIGHT, PIPE_SIMPLE_BENT)
var/obj/machinery/atmospherics/pipe/simple/P = new( src.loc )
@@ -264,16 +262,13 @@ Buildable meters
var/turf/T = P.loc
P.level = T.intact ? 2 : 1
P.initialize()
- if (!P)
- usr << pipefailtext
- return 1
- P.build_network()
if (P.node1)
P.node1.initialize()
- P.node1.build_network()
+ P.node1.addMember(P)
if (P.node2)
P.node2.initialize()
- P.node2.build_network()
+ P.node2.addMember(P)
+ P.build_network()
if(PIPE_HE_STRAIGHT, PIPE_HE_BENT)
var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/P = new ( src.loc )
@@ -283,16 +278,13 @@ Buildable meters
//var/turf/T = P.loc
//P.level = T.intact ? 2 : 1
P.initialize()
- if (!P)
- usr << pipefailtext
- return 1
- P.build_network()
if (P.node1)
P.node1.initialize()
- P.node1.build_network()
+ P.node1.addMember(P)
if (P.node2)
P.node2.initialize()
- P.node2.build_network()
+ P.node2.addMember(P)
+ P.build_network()
if(PIPE_CONNECTOR) // connector
var/obj/machinery/atmospherics/portables_connector/C = new( src.loc )
@@ -310,26 +302,22 @@ Buildable meters
if(PIPE_MANIFOLD) //manifold
- var/obj/machinery/atmospherics/pipe/manifold/M = new( src.loc )
+ var/obj/machinery/atmospherics/pipe/manifold/M = new(loc)
M.dir = dir
M.initialize_directions = pipe_dir
- //M.New()
var/turf/T = M.loc
M.level = T.intact ? 2 : 1
M.initialize()
- if (!M)
- usr << "There's nothing to connect this manifold to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)"
- return 1
- M.build_network()
if (M.node1)
M.node1.initialize()
- M.node1.build_network()
+ M.node1.addMember(M)
if (M.node2)
M.node2.initialize()
- M.node2.build_network()
+ M.node2.addMember(M)
if (M.node3)
M.node3.initialize()
- M.node3.build_network()
+ M.node3.addMember(M)
+ M.build_network()
if(PIPE_JUNCTION)
var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/P = new ( src.loc )
@@ -339,16 +327,13 @@ Buildable meters
//var/turf/T = P.loc
//P.level = T.intact ? 2 : 1
P.initialize()
- if (!P)
- usr << "There's nothing to connect this junction to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)"
- return 1
- P.build_network()
if (P.node1)
P.node1.initialize()
- P.node1.build_network()
+ P.node1.addMember(P)
if (P.node2)
P.node2.initialize()
- P.node2.build_network()
+ P.node2.addMember(P)
+ P.build_network()
if(PIPE_UVENT) //unary vent
var/obj/machinery/atmospherics/unary/vent_pump/V = new( src.loc )
@@ -479,16 +464,13 @@ Buildable meters
var/turf/T = P.loc
P.level = T.intact ? 2 : 1
P.initialize()
- if (!P)
- usr << pipefailtext
- return 1
- P.build_network()
if (P.node1)
P.node1.initialize()
- P.node1.build_network()
+ P.node1.addMember(P)
if (P.node2)
P.node2.initialize()
- P.node2.build_network()
+ P.node2.addMember(P)
+ P.build_network()
if(PIPE_PASSIVE_GATE) //passive gate
var/obj/machinery/atmospherics/binary/passive_gate/P = new(src.loc)
diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm
index 905990105ca..a1aeefc9618 100644
--- a/code/game/machinery/pipe/pipe_dispenser.dm
+++ b/code/game/machinery/pipe/pipe_dispenser.dm
@@ -11,7 +11,7 @@
/obj/machinery/pipedispenser/attack_hand(user as mob)
if(..())
- return
+ return 1
var/dat = {"
Regular pipes:
Pipe
@@ -46,10 +46,10 @@
/obj/machinery/pipedispenser/Topic(href, href_list)
if(..())
- return
+ return 1
if(!anchored|| !usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
usr << browse(null, "window=pipedispenser")
- return
+ return 1
usr.set_machine(src)
src.add_fingerprint(usr)
if(href_list["make"])
@@ -149,6 +149,7 @@ Nah
Bin
Outlet
Chute
+Sort Junction
"}
user << browse("[src][dat]", "window=pipedispenser")
@@ -163,9 +164,6 @@ Nah
usr.set_machine(src)
src.add_fingerprint(usr)
if(href_list["dmake"])
- if(!anchored || !usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
- usr << browse(null, "window=pipedispenser")
- return
if(!wait)
var/p_type = text2num(href_list["dmake"])
var/obj/structure/disposalconstruct/C = new (src.loc)
@@ -189,6 +187,8 @@ Nah
if(7)
C.ptype = 8
C.density = 1
+ if(8)
+ C.ptype = 9
C.add_fingerprint(usr)
C.update()
wait = 1
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 11d49aef2bf..6922bb043a1 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -22,6 +22,7 @@
var/raising= 0 //if the turret is currently opening or closing its cover
var/health = 80 //the turret's health
var/locked = 1 //if the turret's behaviour control access is locked
+ var/controllock = 0 //if the turret responds to control panels
var/installation //the type of weapon installed
var/gun_charge = 0 //the charge of the gun inserted
@@ -269,6 +270,8 @@
user << "You short out [src]'s threat assessment circuits."
visible_message("[src] hums oddly...")
emagged = 1
+ iconholder = 1
+ controllock = 1
on = 0 //turns off the turret temporarily
sleep(60) //6 seconds for the traitor to gtfo of the area before the turret decides to ruin his shit
on = 1 //turns it back on. The cover popUp() popDown() are automatically called in process(), no need to define it here
@@ -615,6 +618,13 @@
spawn( 1 )
A.process()
+/obj/machinery/porta_turret/proc/setState(var/on, var/emagged)
+ if(controllock)
+ return
+ src.on = on
+ src.emagged = emagged
+ src.iconholder = emagged
+ src.power_change()
/*
Portable turret constructions
@@ -1004,3 +1014,146 @@ Status: []
"},
New()
installation = new/obj/item/weapon/gun/energy/laser(loc)
..()
+
+////////////////////////
+//Turret Control Panel//
+////////////////////////
+
+/obj/machinery/turretid
+ name = "turret control panel"
+ desc = "Used to control a room's automated defenses."
+ icon = 'icons/obj/machines/turret_control.dmi'
+ icon_state = "control_standby"
+ anchored = 1
+ density = 0
+ var/enabled = 1
+ var/lethal = 0
+ var/locked = 1
+ var/control_area //can be area name, path or nothing.
+ var/ailock = 0 // AI cannot use this
+ req_access = list(access_ai_upload)
+
+/obj/machinery/turretid/New()
+ ..()
+ if(!control_area)
+ var/area/CA = get_area(src)
+ if(CA.master && CA.master != CA)
+ control_area = CA.master
+ else
+ control_area = CA
+ else if(istext(control_area))
+ for(var/area/A in world)
+ if(A.name && A.name==control_area)
+ control_area = A
+ break
+ power_change() //Checks power and initial settings
+ //don't have to check if control_area is path, since get_area_all_atoms can take path.
+ return
+
+/obj/machinery/turretid/attackby(obj/item/weapon/W, mob/user)
+ if(stat & BROKEN) return
+ if (istype(user, /mob/living/silicon))
+ return src.attack_hand(user)
+
+ if (istype(W, /obj/item/weapon/card/emag) && !emagged)
+ user << "You short out the turret controls' access analysis module."
+ emagged = 1
+ locked = 0
+ if(user.machine==src)
+ src.attack_hand(user)
+
+ return
+
+ else if( get_dist(src, user) == 0 ) // trying to unlock the interface
+ if (src.allowed(usr))
+ if(emagged)
+ user << "The turret control is unresponsive."
+ return
+
+ locked = !locked
+ user << "You [ locked ? "lock" : "unlock"] the panel."
+ if (locked)
+ if (user.machine==src)
+ user.unset_machine()
+ user << browse(null, "window=turretid")
+ else
+ if (user.machine==src)
+ src.attack_hand(user)
+ else
+ user << "Access denied."
+
+/obj/machinery/turretid/attack_ai(mob/user as mob)
+ if(!ailock)
+ return attack_hand(user)
+ else
+ user << "There seems to be a firewall preventing you from accessing this device."
+
+/obj/machinery/turretid/attack_hand(mob/user as mob)
+ if ( get_dist(src, user) > 0 )
+ if ( !issilicon(user) )
+ user << "You are too far away."
+ user.unset_machine()
+ user << browse(null, "window=turretid")
+ return
+
+ user.set_machine(src)
+ var/loc = src.loc
+ if (istype(loc, /turf))
+ loc = loc:loc
+ if (!istype(loc, /area))
+ user << text("Turret badly positioned - loc.loc is [].", loc)
+ return
+ var/area/area = loc
+ var/t = ""
+
+ if(src.locked && (!istype(user, /mob/living/silicon)))
+ t += "Swipe ID card to unlock interface
"
+ else
+ if (!istype(user, /mob/living/silicon))
+ t += "Swipe ID card to lock interface
"
+ t += text("Turrets [] - []?
\n", src.enabled?"activated":"deactivated", src, src.enabled?"Disable":"Enable")
+ t += text("Currently set for [] - Change to []?
\n", src.lethal?"lethal":"stun repeatedly", src, src.lethal?"Stun repeatedly":"Lethal")
+
+ //user << browse(t, "window=turretid")
+ //onclose(user, "turretid")
+ var/datum/browser/popup = new(user, "turretid", "Turret Control Panel ([area.name])")
+ popup.set_content(t)
+ popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
+ popup.open()
+
+/obj/machinery/turretid/Topic(href, href_list)
+ if(..())
+ return
+ if (src.locked)
+ if (!istype(usr, /mob/living/silicon))
+ usr << "Control panel is locked!"
+ return
+ if (href_list["toggleOn"])
+ src.enabled = !src.enabled
+ src.updateTurrets()
+ else if (href_list["toggleLethal"])
+ src.lethal = !src.lethal
+ src.updateTurrets()
+ src.attack_hand(usr)
+
+/obj/machinery/turretid/proc/updateTurrets()
+ if(control_area)
+ for (var/obj/machinery/porta_turret/aTurret in get_area_all_atoms(control_area))
+ aTurret.setState(enabled, lethal)
+ src.update_icon()
+
+/obj/machinery/turretid/power_change()
+ ..()
+ update_icon()
+
+/obj/machinery/turretid/update_icon()
+ ..()
+ if(stat & NOPOWER)
+ icon_state = "control_off"
+ else if (enabled)
+ if (lethal)
+ icon_state = "control_kill"
+ else
+ icon_state = "control_stun"
+ else
+ icon_state = "control_standby"
\ No newline at end of file
diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm
index 0f0b7c069fe..9c1b8ee09cd 100644
--- a/code/game/machinery/requests_console.dm
+++ b/code/game/machinery/requests_console.dm
@@ -305,17 +305,15 @@ var/list/obj/machinery/requests_console/allConsoles = list()
pass = 1
if(pass)
-
for (var/obj/machinery/requests_console/Console in allConsoles)
if (ckey(Console.department) == ckey(href_list["department"]))
switch(priority)
- if(2) //High priority
+ if(2) //High priority
Console.createmessage(src, "PRIORITY Alert in [department]", sending, 2, 1)
if(3) // Extreme Priority
Console.createmessage(src, "EXTREME PRIORITY Alert in [department]", sending, 3, 1)
else // Normal priority
Console.createmessage(src, "Message from [department]", sending, 1, 1)
-
screen = 6
Console.luminosity = 2
@@ -325,8 +323,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
else
messages += "To: [dpt]
[sending]"
else
- for (var/mob/O in hearers(4, src.loc))
- O.show_message("\icon[src] *The Requests Console beeps: 'NOTICE: No server detected!'")
+ say("NOTICE: No server detected!")
//Handle screen switching
@@ -369,7 +366,14 @@ var/list/obj/machinery/requests_console/allConsoles = list()
updateUsrDialog()
return
+
+/obj/machinery/say_quote(var/text)
+ var/ending = copytext(text, length(text) - 2)
+ if (ending == "!!!")
+ return "blares, \"[text]\""
+ return "beeps, \"[text]\""
+
/obj/machinery/requests_console/proc/createmessage(source, title, message, priority, paper)
var/linkedsender
var/unlinkedsender
@@ -389,8 +393,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
src.update_icon()
if(!src.silent)
playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 1)
- for (var/mob/O in hearers(5, src.loc))
- O.show_message("\icon[src] *The Requests Console beeps: '[title]'")
+ say(title)
src.messages += "High Priority
From: [linkedsender]
[message]"
if(paper)
var/obj/item/weapon/paper/slip = new /obj/item/weapon/paper(src.loc)
@@ -403,8 +406,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
src.update_icon()
if(1)
playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 1)
- for (var/mob/O in hearers(7, src.loc))
- O.show_message("\icon[src] *The Requests Console yells: '[title]'")
+ say(title)
src.messages += "!!!Extreme Priority!!!
From: [linkedsender]
[message]"
var/obj/item/weapon/paper/slip = new /obj/item/weapon/paper(src.loc)
if(paper)
@@ -421,14 +423,13 @@ var/list/obj/machinery/requests_console/allConsoles = list()
src.update_icon()
if(!src.silent)
playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 1)
- for (var/mob/O in hearers(4, src.loc))
- O.show_message("\icon[src] *The Requests Console beeps: '[title]'")
+ say(title)
src.messages += "From: [linkedsender]
[message]"
if(paper)
var/obj/item/weapon/paper/slip = new /obj/item/weapon/paper(src.loc)
slip.info = "From: [unlinkedsender]
[message]"
slip.name = "Message - [unlinkedsender]"
- src.luminosity = 2
+ src.luminosity = 2
/obj/machinery/requests_console/attackby(var/obj/item/weapon/O as obj, var/mob/user as mob)
if (istype(O, /obj/item/weapon/crowbar))
diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm
index d6a97d6723d..cf3453400d8 100644
--- a/code/game/machinery/shieldgen.dm
+++ b/code/game/machinery/shieldgen.dm
@@ -374,10 +374,9 @@
src.add_fingerprint(user)
/obj/machinery/shieldwallgen/process()
- spawn(100)
- power()
- if(power)
- storedpower -= 50 //this way it can survive longer and survive at all
+ power()
+ if(power)
+ storedpower -= 50 //this way it can survive longer and survive at all
if(storedpower >= maxstoredpower)
storedpower = maxstoredpower
if(storedpower <= 0)
@@ -389,14 +388,10 @@
if(!anchored)
src.active = 0
return
- spawn(1)
- setup_field(1)
- spawn(2)
- setup_field(2)
- spawn(3)
- setup_field(4)
- spawn(4)
- setup_field(8)
+ setup_field(1)
+ setup_field(2)
+ setup_field(4)
+ setup_field(8)
src.active = 2
if(src.active >= 1)
if(src.power == 0)
@@ -404,14 +399,10 @@
"You hear heavy droning fade out")
icon_state = "Shield_Gen"
src.active = 0
- spawn(1)
- src.cleanup(1)
- spawn(1)
- src.cleanup(2)
- spawn(1)
- src.cleanup(4)
- spawn(1)
- src.cleanup(8)
+ src.cleanup(1)
+ src.cleanup(2)
+ src.cleanup(4)
+ src.cleanup(8)
/obj/machinery/shieldwallgen/proc/setup_field(var/NSEW = 0)
var/turf/T = src.loc
diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm
index 410282a754f..4b97f504628 100644
--- a/code/game/machinery/telecomms/broadcaster.dm
+++ b/code/game/machinery/telecomms/broadcaster.dm
@@ -56,11 +56,10 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
if(signal.data["type"] == 0)
/* ###### Broadcast a message using signal.data ###### */
- Broadcast_Message(signal.data["connection"], signal.data["mob"],
- signal.data["vmask"], signal.data["vmessage"],
- signal.data["radio"], signal.data["message"],
- signal.data["name"], signal.data["job"],
- signal.data["realname"], signal.data["vname"],, signal.data["compression"], signal.data["level"], signal.frequency)
+ Broadcast_Message(signal.data["mob"],
+ signal.data["vmask"], signal.data["radio"],
+ signal.data["message"], signal.data["name"], signal.data["job"], signal.data["realname"],
+ 0, signal.data["compression"], signal.data["level"], signal.frequency)
/** #### - Simple Broadcast - #### **/
@@ -80,12 +79,11 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
/* ###### Broadcast a message using signal.data ###### */
// Parameter "data" as 4: AI can't track this person/mob
-
- Broadcast_Message(signal.data["connection"], signal.data["mob"],
- signal.data["vmask"], signal.data["vmessage"],
+ Broadcast_Message(signal.data["mob"],
+ signal.data["vmask"],
signal.data["radio"], signal.data["message"],
signal.data["name"], signal.data["job"],
- signal.data["realname"], signal.data["vname"], 4, signal.data["compression"], signal.data["level"], signal.frequency)
+ signal.data["realname"], 4, signal.data["compression"], signal.data["level"], signal.frequency)
if(!message_delay)
message_delay = 1
@@ -140,23 +138,12 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
sleep(signal.data["slow"]) // simulate the network lag if necessary
/* ###### Broadcast a message using signal.data ###### */
-
- var/datum/radio_frequency/connection = signal.data["connection"]
-
- if(connection.frequency == SYND_FREQ) // if syndicate broadcast, just
- Broadcast_Message(signal.data["connection"], signal.data["mob"],
- signal.data["vmask"], signal.data["vmessage"],
+ if(signal.frequency == SYND_FREQ) // if syndicate broadcast, just
+ Broadcast_Message(signal.data["mob"],
+ signal.data["vmask"],
signal.data["radio"], signal.data["message"],
signal.data["name"], signal.data["job"],
- signal.data["realname"], signal.data["vname"],, signal.data["compression"], list(0), connection.frequency)
- else
- if(intercept)
- Broadcast_Message(signal.data["connection"], signal.data["mob"],
- signal.data["vmask"], signal.data["vmessage"],
- signal.data["radio"], signal.data["message"],
- signal.data["name"], signal.data["job"],
- signal.data["realname"], signal.data["vname"], 3, signal.data["compression"], list(0), connection.frequency)
-
+ signal.data["realname"],, signal.data["compression"], list(0, z), signal.frequency)
/**
@@ -164,9 +151,6 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
Here is the big, bad function that broadcasts a message given the appropriate
parameters.
- @param connection:
- The datum generated in radio.dm, stored in signal.data["connection"].
-
@param M:
Reference to the mob/speaker, stored in signal.data["mob"]
@@ -216,198 +200,77 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
**/
-/proc/Broadcast_Message(var/datum/radio_frequency/connection, var/mob/M,
- var/vmask, var/vmessage, var/obj/item/device/radio/radio,
- var/message, var/name, var/job, var/realname, var/vname,
+
+/proc/Broadcast_Message(var/atom/movable/AM,
+ var/vmask, var/obj/item/device/radio/radio,
+ var/message, var/name, var/job, var/realname,
var/data, var/compression, var/list/level, var/freq)
- /* ###### Prepare the radio connection ###### */
-
- var/display_freq = freq
-
- var/list/obj/item/device/radio/radios = list()
-
- // Cut down on the message sizes.
-
message = copytext(message, 1, MAX_BROADCAST_LEN)
- vmessage = copytext(vmessage, 1, MAX_BROADCAST_LEN)
+ if(!message)
+ return
+
+ var/list/radios = list()
+
+ var/atom/movable/virtualspeaker/virt = new(null)
+ virt.name = name
+ virt.job = job
+ virt.languages = AM.languages
+ virt.source = AM
+ virt.faketrack = data == 4 ? 1 : 0
+ virt.radio = radio
+
+ if(compression > 0)
+ message = Gibberish(message, compression + 40)
// --- Broadcast only to intercom devices ---
if(data == 1)
-
- for (var/obj/item/device/radio/intercom/R in connection.devices["[RADIO_CHAT]"])
- if(R.receive_range(display_freq, level) > -1)
+ for(var/obj/item/device/radio/intercom/R in all_radios["[freq]"])
+ if(R.receive_range(freq, level) > -1)
radios += R
// --- Broadcast only to intercoms and station-bounced radios ---
else if(data == 2)
- for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"])
-
+ for(var/obj/item/device/radio/R in all_radios["[freq]"])
if(istype(R, /obj/item/device/radio/headset))
continue
- if(R.receive_range(display_freq, level) > -1)
- radios += R
-
- // --- Broadcast to syndicate radio! ---
-
- else if(data == 3)
-
- var/datum/radio_frequency/syndicateconnection = radio_controller.return_frequency(SYND_FREQ)
-
- for (var/obj/item/device/radio/R in syndicateconnection.devices["[RADIO_CHAT]"])
-
- if(R.receive_range(SYND_FREQ, level) > -1)
+ if(R.receive_range(freq, level) > -1)
radios += R
// --- Broadcast to ALL radio devices ---
else
-
- for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"])
- if(R.receive_range(display_freq, level) > -1)
+ for(var/obj/item/device/radio/R in all_radios["[freq]"])
+ if(R.receive_range(freq, level) > -1)
radios += R
+ var/freqtext = num2text(freq)
+ for(var/obj/item/device/radio/R in all_radios["[SYND_FREQ]"]) //syndicate radios use magic that allows them to hear everything. this was already the case, now it just doesn't need the allinone anymore. solves annoying bugs that aren't worth solving.
+ if(R.receive_range(SYND_FREQ, list(R.z)) > -1 && freqtext in radiochannelsreverse)
+ radios |= R
+
// Get a list of mobs who can hear from the radios we collected.
- var/list/receive = get_mobs_in_radio_ranges(radios)
-
- /* ###### Organize the receivers into categories for displaying the message ###### */
-
- // Understood the message:
- var/list/heard_masked = list() // masked name or no real name
- var/list/heard_normal = list() // normal message
-
- // Did not understand the message:
- var/list/heard_voice = list() // voice message (ie "chimpers")
- var/list/heard_garbled = list() // garbled message (ie "f*c* **u, **i*er!")
- var/list/heard_gibberish= list() // completely screwed over message (ie "F%! (O*# *#!<>&**%!")
-
- for (var/mob/R in receive)
-
- /* --- Loop through the receivers and categorize them --- */
+ var/list/receive = get_mobs_in_radio_ranges(radios) //this includes all hearers.
+ for(var/mob/R in receive) //Filter receiver list.
if (R.client && !(R.client.prefs.toggles & CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios.
- continue
+ receive -= R
- if(istype(R, /mob/new_player)) // we don't want new players to hear messages. rare but generates runtimes.
- continue
-
-
- // --- Check for compression ---
- if(compression > 0)
- heard_gibberish += R
- continue
-
- // --- Can understand the speech ---
-
- if (!M || R.say_understands(M))
-
- // - Not human or wearing a voice mask -
- if (!M || !ishuman(M) || vmask)
- heard_masked += R
-
- // - Human and not wearing voice mask -
- else
- heard_normal += R
-
- // --- Can't understand the speech ---
-
- else
- // - The speaker has a prespecified "voice message" to display if not understood -
- if (vmessage)
- heard_voice += R
-
- // - Just display a garbled message -
- else
- heard_garbled += R
-
-
- /* ###### Begin formatting and sending the message ###### */
- if (length(heard_masked) || length(heard_normal) || length(heard_voice) || length(heard_garbled) || length(heard_gibberish))
-
- /* --- Some miscellaneous variables to format the string output --- */
- var/part_a = "" // goes in the actual output
- var/freq_text // the name of the channel
-
- // --- Set the name of the channel ---
- switch(display_freq)
-
- if(SYND_FREQ)
- freq_text = "#unkn"
- if(COMM_FREQ)
- freq_text = "Command"
- if(SCI_FREQ)
- freq_text = "Science"
- if(MED_FREQ)
- freq_text = "Medical"
- if(ENG_FREQ)
- freq_text = "Engineering"
- if(SEC_FREQ)
- freq_text = "Security"
- if(SERV_FREQ)
- freq_text = "Service"
- if(SUPP_FREQ)
- freq_text = "Supply"
- if(AIPRIV_FREQ)
- freq_text = "AI Private"
- //There's probably a way to use the list var of channels in code\game\communications.dm to make the dept channels non-hardcoded, but I wasn't in an experimentive mood. --NEO
-
-
- // --- If the frequency has not been assigned a name, just use the frequency as the name ---
-
- if(!freq_text)
- freq_text = format_frequency(display_freq)
-
- // --- Some more pre-message formatting ---
-
- var/part_b_extra = ""
- if(data == 3) // intercepted radio message
- part_b_extra = " (Intercepted)"
- var/part_b = " \[[freq_text]\][part_b_extra] "
- var/part_c = ""
-
- if (display_freq==SYND_FREQ)
- part_a = ""
- else if (display_freq==COMM_FREQ)
- part_a = ""
- else if (display_freq==SCI_FREQ)
- part_a = ""
- else if (display_freq==MED_FREQ)
- part_a = ""
- else if (display_freq==ENG_FREQ)
- part_a = ""
- else if (display_freq==SEC_FREQ)
- part_a = ""
- else if (display_freq==SERV_FREQ)
- part_a = ""
- else if (display_freq==SUPP_FREQ)
- part_a = ""
- else if (display_freq==DSQUAD_FREQ)
- part_a = ""
- else if (display_freq==AIPRIV_FREQ)
- part_a = ""
-
- // --- Filter the message; place it in quotes apply a verb ---
-
- var/quotedmsg = null
- if(M)
- quotedmsg = M.say_quote(message)
- else
- quotedmsg = "says, \"[message]\""
+ var/rendered = virt.compose_message(virt, virt.languages, message, freq) //Always call this on the virtualspeaker to advoid issues.
+ for(var/atom/movable/hearer in receive)
+ hearer.Hear(rendered, virt, AM.languages, message, freq)
+ if(length(receive))
// --- This following recording is intended for research and feedback in the use of department radio channels ---
- var/part_blackbox_b = " \[[freq_text]\] "
- var/blackbox_msg = "[part_a][name][part_blackbox_b][quotedmsg][part_c]"
- //var/blackbox_admin_msg = "[part_a][M.name] (Real name: [M.real_name])[part_blackbox_b][quotedmsg][part_c]"
-
- //BR.messages_admin += blackbox_admin_msg
+ var/blackbox_msg = "[AM] [AM.say_quote(message)]"
if(istype(blackbox))
- switch(display_freq)
+ switch(freq)
if(1459)
blackbox.msg_common += blackbox_msg
if(1351)
@@ -431,106 +294,8 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
else
blackbox.messages += blackbox_msg
- //End of research and feedback code.
-
- var/aitrack = ""
-
- /* ###### Send the message ###### */
-
-
- /* --- Process all the mobs that heard a masked voice (understood) --- */
-
- if (length(heard_masked))
- var/N = name
- var/J = job
- var/rendered = "[part_a][N][part_b][quotedmsg][part_c]"
- for (var/mob/R in heard_masked)
- aitrack = ""
- if(data == 4)
- aitrack = ""
-
- if(istype(R, /mob/living/silicon/ai))
- R.show_message("[part_a][aitrack][N] ([J]) [part_b][quotedmsg][part_c]", 2)
- else
- R.show_message(rendered, 2)
-
- /* --- Process all the mobs that heard the voice normally (understood) --- */
-
- if (length(heard_normal))
- var/rendered = "[part_a][realname][part_b][quotedmsg][part_c]"
-
- for (var/mob/R in heard_normal)
- aitrack = ""
- if(data == 4)
- aitrack = ""
-
- if(istype(R, /mob/living/silicon/ai))
- R.show_message("[part_a][aitrack][realname] ([job]) [part_b][quotedmsg][part_c]", 2)
- else
- R.show_message(rendered, 2)
-
- /* --- Process all the mobs that heard the voice normally (did not understand) --- */
- // Does not display message; displayes the mob's voice_message (ie "chimpers")
-
- if (length(heard_voice))
- var/rendered = "[part_a][vname][part_b][vmessage][part_c]"
-
- for (var/mob/R in heard_voice)
- aitrack = ""
- if(data == 4)
- aitrack = ""
-
-
- if(istype(R, /mob/living/silicon/ai))
- R.show_message("[part_a][aitrack][vname] ([job]) [part_b][vmessage]][part_c]", 2)
- else
- R.show_message(rendered, 2)
-
- /* --- Process all the mobs that heard a garbled voice (did not understand) --- */
- // Displays garbled message (ie "f*c* **u, **i*er!")
-
- if (length(heard_garbled))
- if(M)
- quotedmsg = M.say_quote(stars(message))
- else
- quotedmsg = stars(quotedmsg)
-
- var/rendered = "[part_a][vname][part_b][quotedmsg][part_c]"
-
- for (var/mob/R in heard_garbled)
- aitrack = ""
- if(data == 4)
- aitrack = ""
-
-
- if(istype(R, /mob/living/silicon/ai))
- R.show_message("[part_a][aitrack][vname][part_b][quotedmsg][part_c]", 2)
- else
- R.show_message(rendered, 2)
-
-
- /* --- Complete gibberish. Usually happens when there's a compressed message --- */
-
- if (length(heard_gibberish))
- if(M)
- quotedmsg = M.say_quote(Gibberish(message, compression + 50))
- else
- quotedmsg = Gibberish(quotedmsg, compression + 50)
-
- var/rendered = "[part_a][Gibberish(name, compression + 50)][part_b][quotedmsg][part_c]"
-
- for (var/mob/R in heard_gibberish)
- aitrack = ""
- if(data == 4)
- aitrack = ""
-
-
- if(istype(R, /mob/living/silicon/ai))
- R.show_message("[part_a][aitrack][Gibberish(realname, compression + 50)] ([Gibberish(job, compression + 50)]) [part_b][quotedmsg][part_c]", 2)
- else
- R.show_message(rendered, 2)
-
-
+ spawn(50)
+ qdel(virt)
/proc/Broadcast_SimpleMessage(var/source, var/frequency, var/text, var/data, var/mob/M, var/compression, var/level)
@@ -613,7 +378,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
// --- Can understand the speech ---
- if (R.say_understands(M))
+ if (R.languages & M.languages)
heard_normal += R
@@ -791,7 +556,5 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
sleep(rand(10,25))
- //world.log << "Level: [signal.data["level"]] - Done: [signal.data["done"]]"
-
return signal
diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm
index 5a5dbb3ff2f..a6de46e209e 100644
--- a/code/game/machinery/telecomms/logbrowser.dm
+++ b/code/game/machinery/telecomms/logbrowser.dm
@@ -80,27 +80,32 @@
if(mobtype in humans)
race = "Human"
-
+ language = race
+
+ else if(mobtype in slimes) // NT knows a lot about slimes, but not aliens. Can identify slimes
+ race = "Slime"
+ language = race
+
else if(mobtype in monkeys)
race = "Monkey"
- language = race
+ language = race
else if(mobtype in silicons || C.parameters["job"] == "AI") // sometimes M gets deleted prematurely for AIs... just check the job
race = "Artificial Life"
-
- else if(mobtype in slimes) // NT knows a lot about slimes, but not aliens. Can identify slimes
- race = "slime"
language = race
+
+ else if(istype(mobtype, /obj))
+ race = "Machinery"
+ language = race
else if(mobtype in animals)
race = "Domestic Animal"
language = race
-
+
else
race = "Unidentifiable"
language = race
-
// -- If the orator is a human, or universal translate is active, OR mob has universal speech on --
if(language == "Human" || universal_translate || C.parameters["uspeech"])
diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm
index ff0ec5208cc..599c5a20429 100644
--- a/code/game/machinery/telecomms/telecomunications.dm
+++ b/code/game/machinery/telecomms/telecomunications.dm
@@ -43,7 +43,6 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
if(!on)
return
- //world << "[src] ([src.id]) - [signal.debug_print()]"
var/send_count = 0
//signal.data["slow"] == 0 // apply some lag based on integrity
@@ -79,12 +78,9 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
"name" = signal.data["name"],
"job" = signal.data["job"],
"key" = signal.data["key"],
- "vmessage" = signal.data["vmessage"],
- "vname" = signal.data["vname"],
"vmask" = signal.data["vmask"],
"compression" = signal.data["compression"],
"message" = signal.data["message"],
- "connection" = signal.data["connection"],
"radio" = signal.data["radio"],
"slow" = signal.data["slow"],
"traffic" = signal.data["traffic"],
@@ -281,7 +277,6 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
return
if(!check_receive_level(signal))
return
-
if(signal.transmission_method == 2)
if(is_freq_listening(signal)) // detect subspace signals
@@ -370,7 +365,6 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
var/receiving = 1
/obj/machinery/telecomms/relay/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
-
// Add our level and send it back
if(can_send(signal))
signal.data["level"] |= listening_level
@@ -422,7 +416,6 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
/obj/machinery/telecomms/bus/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
if(is_freq_listening(signal))
-
if(change_frequency)
signal.frequency = change_frequency
@@ -541,7 +534,6 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
..()
/obj/machinery/telecomms/server/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
-
if(signal.data["message"])
if(is_freq_listening(signal))
@@ -557,22 +549,16 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
update_logs()
var/datum/comm_log_entry/log = new
- var/mob/M = signal.data["mob"]
// Copy the signal.data entries we want
log.parameters["mobtype"] = signal.data["mobtype"]
log.parameters["job"] = signal.data["job"]
log.parameters["key"] = signal.data["key"]
- log.parameters["vmessage"] = signal.data["message"]
- log.parameters["vname"] = signal.data["vname"]
log.parameters["message"] = signal.data["message"]
log.parameters["name"] = signal.data["name"]
log.parameters["realname"] = signal.data["realname"]
- if(!istype(M, /mob/new_player) && M)
- log.parameters["uspeech"] = M.universal_speak
- else
- log.parameters["uspeech"] = 0
+ log.parameters["uspeech"] = signal.data["languages"] & HUMAN //good enough
// If the signal is still compressed, make the log entry gibberish
if(signal.data["compression"] > 0)
@@ -580,7 +566,6 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
log.parameters["job"] = Gibberish(signal.data["job"], signal.data["compression"] + 50)
log.parameters["name"] = Gibberish(signal.data["name"], signal.data["compression"] + 50)
log.parameters["realname"] = Gibberish(signal.data["realname"], signal.data["compression"] + 50)
- log.parameters["vname"] = Gibberish(signal.data["vname"], signal.data["compression"] + 50)
log.input_type = "Corrupt File"
// Log and store everything that needs to be logged
diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm
index 5f00666e819..1aab4cf960d 100644
--- a/code/game/machinery/transformer.dm
+++ b/code/game/machinery/transformer.dm
@@ -59,12 +59,13 @@
playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
return
- // Activate the cooldown
- cooldown = 1
- update_icon()
- spawn(cooldown_duration)
- cooldown = 0
+ // Activate the cooldown if the human isn't jobbanned
+ if(!jobban_isbanned(H, "Cyborg"))
+ cooldown = 1
update_icon()
+ spawn(cooldown_duration)
+ cooldown = 0
+ update_icon()
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
H.emote("scream") // It is painful
@@ -74,6 +75,11 @@
// Sleep for a couple of ticks to allow the human to see the pain
sleep(5)
+ if(jobban_isbanned(H, "Cyborg")) //Jobbanned players get horribly maimed instead
+ H.adjustBruteLoss(1000)
+ playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
+ return
+
use_power(5000) // Use a lot of power.
var/mob/living/silicon/robot/R = H.Robotize(1) // Delete the items or they'll all pile up in a single tile and lag
diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm
index a34d7cec517..f178b810d39 100644
--- a/code/game/machinery/turrets.dm
+++ b/code/game/machinery/turrets.dm
@@ -308,106 +308,6 @@
spawn(13)
qdel(src)
-/obj/machinery/turretid
- name = "turret deactivation control"
- icon = 'icons/obj/device.dmi'
- icon_state = "motion3"
- anchored = 1
- density = 0
- var/enabled = 1
- var/lethal = 0
- var/locked = 1
- var/control_area //can be area name, path or nothing.
- var/ailock = 0 // AI cannot use this
- req_access = list(access_ai_upload)
-
-/obj/machinery/turretid/New()
- ..()
- if(!control_area)
- var/area/CA = get_area(src)
- if(CA.master && CA.master != CA)
- control_area = CA.master
- else
- control_area = CA
- else if(istext(control_area))
- for(var/area/A in world)
- if(A.name && A.name==control_area)
- control_area = A
- break
- //don't have to check if control_area is path, since get_area_all_atoms can take path.
- return
-
-/obj/machinery/turretid/attackby(obj/item/weapon/W, mob/user)
- if(stat & BROKEN) return
- if (istype(user, /mob/living/silicon))
- return src.attack_hand(user)
-
- if (istype(W, /obj/item/weapon/card/emag) && !emagged)
- user << "You short out the turret controls' access analysis module."
- emagged = 1
- locked = 0
- if(user.machine==src)
- src.attack_hand(user)
-
- return
-
- else if( get_dist(src, user) == 0 ) // trying to unlock the interface
- if (src.allowed(usr))
- if(emagged)
- user << "The turret control is unresponsive."
- return
-
- locked = !locked
- user << "You [ locked ? "lock" : "unlock"] the panel."
- if (locked)
- if (user.machine==src)
- user.unset_machine()
- user << browse(null, "window=turretid")
- else
- if (user.machine==src)
- src.attack_hand(user)
- else
- user << "Access denied."
-
-/obj/machinery/turretid/attack_ai(mob/user as mob)
- if(!ailock)
- return attack_hand(user)
- else
- user << "There seems to be a firewall preventing you from accessing this device."
-
-/obj/machinery/turretid/attack_hand(mob/user as mob)
- if ( get_dist(src, user) > 0 )
- if ( !issilicon(user) )
- user << "You are too far away."
- user.unset_machine()
- user << browse(null, "window=turretid")
- return
-
- user.set_machine(src)
- var/loc = src.loc
- if (istype(loc, /turf))
- loc = loc:loc
- if (!istype(loc, /area))
- user << text("Turret badly positioned - loc.loc is [].", loc)
- return
- var/area/area = loc
- var/t = ""
-
- if(src.locked && (!istype(user, /mob/living/silicon)))
- t += "Swipe ID card to unlock interface
"
- else
- if (!istype(user, /mob/living/silicon))
- t += "Swipe ID card to lock interface
"
- t += text("Turrets [] - []?
\n", src.enabled?"activated":"deactivated", src, src.enabled?"Disable":"Enable")
- t += text("Currently set for [] - Change to []?
\n", src.lethal?"lethal":"stun repeatedly", src, src.lethal?"Stun repeatedly":"Lethal")
-
- //user << browse(t, "window=turretid")
- //onclose(user, "turretid")
- var/datum/browser/popup = new(user, "turretid", "Turret Control Panel ([area.name])")
- popup.set_content(t)
- popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
- popup.open()
-
/obj/machinery/turret/attack_animal(mob/living/simple_animal/M as mob)
M.changeNext_move(CLICK_CD_MELEE)
@@ -439,45 +339,9 @@
return
-
-/obj/machinery/turretid/Topic(href, href_list)
- if(..())
- return
- if (src.locked)
- if (!istype(usr, /mob/living/silicon))
- usr << "Control panel is locked!"
- return
- if (href_list["toggleOn"])
- src.enabled = !src.enabled
- src.updateTurrets()
- else if (href_list["toggleLethal"])
- src.lethal = !src.lethal
- src.updateTurrets()
- src.attack_hand(usr)
-
-/obj/machinery/turretid/proc/updateTurrets()
- if(control_area)
- for (var/obj/machinery/turret/aTurret in get_area_all_atoms(control_area))
- aTurret.setState(enabled, lethal)
- src.update_icons()
-
-/obj/machinery/turretid/proc/update_icons()
- if (src.enabled)
- if (src.lethal)
- icon_state = "motion1"
- else
- icon_state = "motion3"
- else
- icon_state = "motion0"
- //CODE FIXED BUT REMOVED
-// if(control_area) //USE: updates other controls in the area
-// for (var/obj/machinery/turretid/Turret_Control in world) //I'm not sure if this is what it was
-// if( Turret_Control.control_area != src.control_area ) continue //supposed to do. Or whether the person
-// Turret_Control.icon_state = icon_state //who coded it originally was just tired
-// Turret_Control.enabled = enabled //or something. I don't see any situation
-// Turret_Control.lethal = lethal //in which this would be used on the current map.
- //If he wants it back he can uncomment it
-
+//////////////
+//Gun Turret//
+//////////////
/obj/machinery/gun_turret //related to turrets but work way differentely because of being mounted on a moving ship.
name = "machine gun turret"
@@ -621,3 +485,147 @@
spawn(0)
A.process()
return
+
+
+////////////////////////
+//Turret Control Panel//
+////////////////////////
+
+/obj/machinery/areaturretid
+ name = "turret control panel"
+ desc = "Used to control a room's automated defenses."
+ icon = 'icons/obj/machines/turret_control.dmi'
+ icon_state = "control_standby"
+ anchored = 1
+ density = 0
+ var/enabled = 1
+ var/lethal = 0
+ var/locked = 1
+ var/control_area //can be area name, path or nothing.
+ var/ailock = 0 // AI cannot use this
+ req_access = list(access_ai_upload)
+
+/obj/machinery/areaturretid/New()
+ ..()
+ if(!control_area)
+ var/area/CA = get_area(src)
+ if(CA.master && CA.master != CA)
+ control_area = CA.master
+ else
+ control_area = CA
+ else if(istext(control_area))
+ for(var/area/A in world)
+ if(A.name && A.name==control_area)
+ control_area = A
+ break
+ power_change() //Checks power and initial settings
+ //don't have to check if control_area is path, since get_area_all_atoms can take path.
+ return
+
+/obj/machinery/areaturretid/attackby(obj/item/weapon/W, mob/user)
+ if(stat & BROKEN) return
+ if (istype(user, /mob/living/silicon))
+ return src.attack_hand(user)
+
+ if (istype(W, /obj/item/weapon/card/emag) && !emagged)
+ user << "You short out the turret controls' access analysis module."
+ emagged = 1
+ locked = 0
+ if(user.machine==src)
+ src.attack_hand(user)
+
+ return
+
+ else if( get_dist(src, user) == 0 ) // trying to unlock the interface
+ if (src.allowed(usr))
+ if(emagged)
+ user << "The turret control is unresponsive."
+ return
+
+ locked = !locked
+ user << "You [ locked ? "lock" : "unlock"] the panel."
+ if (locked)
+ if (user.machine==src)
+ user.unset_machine()
+ user << browse(null, "window=turretid")
+ else
+ if (user.machine==src)
+ src.attack_hand(user)
+ else
+ user << "Access denied."
+
+/obj/machinery/areaturretid/attack_ai(mob/user as mob)
+ if(!ailock)
+ return attack_hand(user)
+ else
+ user << "There seems to be a firewall preventing you from accessing this device."
+
+/obj/machinery/areaturretid/attack_hand(mob/user as mob)
+ if ( get_dist(src, user) > 0 )
+ if ( !issilicon(user) )
+ user << "You are too far away."
+ user.unset_machine()
+ user << browse(null, "window=turretid")
+ return
+
+ user.set_machine(src)
+ var/loc = src.loc
+ if (istype(loc, /turf))
+ loc = loc:loc
+ if (!istype(loc, /area))
+ user << text("Turret badly positioned - loc.loc is [].", loc)
+ return
+ var/area/area = loc
+ var/t = ""
+
+ if(src.locked && (!istype(user, /mob/living/silicon)))
+ t += "Swipe ID card to unlock interface
"
+ else
+ if (!istype(user, /mob/living/silicon))
+ t += "Swipe ID card to lock interface
"
+ t += text("Turrets [] - []?
\n", src.enabled?"activated":"deactivated", src, src.enabled?"Disable":"Enable")
+ t += text("Currently set for [] - Change to []?
\n", src.lethal?"lethal":"stun repeatedly", src, src.lethal?"Stun repeatedly":"Lethal")
+
+ //user << browse(t, "window=turretid")
+ //onclose(user, "turretid")
+ var/datum/browser/popup = new(user, "turretid", "Turret Control Panel ([area.name])")
+ popup.set_content(t)
+ popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
+ popup.open()
+
+/obj/machinery/areaturretid/Topic(href, href_list)
+ if(..())
+ return
+ if (src.locked)
+ if (!istype(usr, /mob/living/silicon))
+ usr << "Control panel is locked!"
+ return
+ if (href_list["toggleOn"])
+ src.enabled = !src.enabled
+ src.updateTurrets()
+ else if (href_list["toggleLethal"])
+ src.lethal = !src.lethal
+ src.updateTurrets()
+ src.attack_hand(usr)
+
+/obj/machinery/areaturretid/proc/updateTurrets()
+ if(control_area)
+ for (var/obj/machinery/turret/aTurret in get_area_all_atoms(control_area))
+ aTurret.setState(enabled, lethal)
+ src.update_icon()
+
+/obj/machinery/areaturretid/power_change()
+ ..()
+ update_icon()
+
+/obj/machinery/areaturretid/update_icon()
+ ..()
+ if(stat & NOPOWER)
+ icon_state = "control_off"
+ else if (enabled)
+ if (lethal)
+ icon_state = "control_kill"
+ else
+ icon_state = "control_stun"
+ else
+ icon_state = "control_standby"
\ No newline at end of file
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 50da8e4965b..a76c3e2445f 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -406,8 +406,10 @@
if(!message)
return
- visible_message("[src] beeps, \"[message]\"")
+ say(message)
+/obj/machinery/vending/say_quote(text)
+ return "beeps, \"[text]\""
/obj/machinery/vending/power_change()
if(stat & BROKEN)
diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm
index 54b79470b12..70051b606d6 100644
--- a/code/game/mecha/equipment/tools/tools.dm
+++ b/code/game/mecha/equipment/tools/tools.dm
@@ -132,8 +132,8 @@
return 0
/obj/item/mecha_parts/mecha_equipment/tool/drill/proc/drill_mob(mob/living/target, mob/user, var/drill_damage=80)
- target.visible_message("[chassis] drills [target] with the [src].\
- [chassis] drills [target] with the [src].")
+ target.visible_message("[chassis] drills [target] with [src].", \
+ "[chassis] drills [target] with [src].")
add_logs(user, target, "attacked", object="[name]", addition="(INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])")
if(ishuman(target))
var/mob/living/carbon/human/H = target
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 59c6dffdfc4..8bdddddfb38 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -88,15 +88,13 @@
removeVerb(/obj/mecha/verb/disconnect_from_port)
removeVerb(/atom/movable/verb/pull)
log_message("[src.name] created.")
- loc.Entered(src)
mechas_list += src //global mech list
return
/obj/mecha/Destroy()
go_out()
for(var/mob/M in src) //Let's just be ultra sure
- M.loc = get_turf(src)
- M.loc.Entered(M)
+ M.Move(loc)
if(prob(30))
explosion(get_turf(loc), 0, 0, 1, 3)
@@ -240,9 +238,9 @@
/obj/mecha/proc/drop_item()//Derpfix, but may be useful in future for engineering exosuits.
return
-/obj/mecha/hear_talk(mob/M as mob, text)
- if(M==occupant && radio.broadcasting)
- radio.talk_into(M, text)
+/obj/mecha/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq)
+ if(speaker == occupant && radio.broadcasting)
+ radio.talk_into(speaker, text)
return
////////////////////////////
@@ -1052,8 +1050,6 @@
mmi_as_oc.loc = src
mmi_as_oc.mecha = src
src.verbs -= /obj/mecha/verb/eject
- src.Entered(mmi_as_oc)
- src.Move(src.loc)
src.icon_state = initial(icon_state)
dir = dir_in
src.log_message("[mmi_as_oc] moved in as pilot.")
diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm
index 2f27fbfa34e..6d929530ee6 100644
--- a/code/game/mecha/mecha_wreckage.dm
+++ b/code/game/mecha/mecha_wreckage.dm
@@ -32,7 +32,6 @@
else
user << "You failed to salvage anything valuable from [src]."
else
- user << "You need more welding fuel to complete this task."
return
if(istype(I, /obj/item/weapon/wirecutters))
diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm
index 402bd6162f2..73c06025803 100644
--- a/code/game/mecha/working/ripley.dm
+++ b/code/game/mecha/working/ripley.dm
@@ -17,10 +17,7 @@
/obj/mecha/working/ripley/Destroy()
for(var/atom/movable/A in src.cargo)
- A.loc = get_turf(src)
- var/turf/T = get_turf(A)
- if(T)
- T.Entered(A)
+ A.loc = loc
step_rand(A)
cargo.Cut()
..()
@@ -82,11 +79,8 @@
var/obj/O = locate(href_list["drop_from_cargo"])
if(O && O in src.cargo)
src.occupant_message("You unload [O].")
- O.loc = get_turf(src)
+ O.loc = loc
src.cargo -= O
- var/turf/T = get_turf(O)
- if(T)
- T.Entered(O)
src.log_message("Unloaded [O]. Cargo compartment capacity: [cargo_capacity - src.cargo.len]")
return
diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm
index 3a12acdd6ca..ab27ad7dd58 100644
--- a/code/game/objects/effects/aliens.dm
+++ b/code/game/objects/effects/aliens.dm
@@ -16,23 +16,24 @@
*/
/obj/structure/alien/resin
name = "resin"
- desc = "Looks like some kind of slimy growth."
+ desc = "Looks like some kind of thick resin."
icon_state = "resin"
density = 1
opacity = 1
anchored = 1
var/health = 200
-
+ var/resintype = null
/obj/structure/alien/resin/New(location)
+ relativewall_neighbours()
..()
air_update_turf(1)
return
/obj/structure/alien/resin/Destroy()
- density = 0
- air_update_turf(1)
+ var/turf/T = loc
+ loc = null
+ T.relativewall_neighbours()
..()
- return
/obj/structure/alien/resin/Move()
var/turf/T = loc
@@ -44,19 +45,28 @@
/obj/structure/alien/resin/wall
name = "resin wall"
- desc = "Purple slime solidified into a wall."
+ desc = "Thick resin solidified into a wall."
icon_state = "resinwall" //same as resin, but consistency ho!
+ resintype = "wall"
+
+/obj/structure/alien/resin/wall/New()
+ relativewall_neighbours()
+ ..()
/obj/structure/alien/resin/wall/BlockSuperconductivity()
return 1
/obj/structure/alien/resin/membrane
name = "resin membrane"
- desc = "Purple slime just thin enough to let light pass through."
+ desc = "Resin just thin enough to let light pass through."
icon_state = "resinmembrane"
opacity = 0
health = 120
+ resintype = "membrane"
+/obj/structure/alien/resin/membrane/New()
+ relativewall_neighbours()
+ ..()
/obj/structure/alien/resin/proc/healthcheck()
if(health <=0)
@@ -145,11 +155,12 @@
/obj/structure/alien/weeds
gender = PLURAL
- name = "weeds"
- desc = "Weird purple weeds."
+ name = "resin floor"
+ desc = "A thick resin surface covers the floor."
icon_state = "weeds"
anchored = 1
density = 0
+ layer = 2
var/health = 15
var/obj/structure/alien/weeds/node/linked_node = null
@@ -162,11 +173,17 @@
return
if(icon_state == "weeds")
icon_state = pick("weeds", "weeds1", "weeds2")
-
+ fullUpdateWeedOverlays()
spawn(rand(150, 200))
if(src)
Life()
+/obj/structure/alien/weeds/Destroy()
+ var/turf/T = loc
+ loc = null
+ for (var/obj/structure/alien/weeds/W in range(1,T))
+ W.updateWeedOverlays()
+ ..()
/obj/structure/alien/weeds/proc/Life()
set background = BACKGROUND_ENABLED
@@ -226,12 +243,37 @@
healthcheck()
+/obj/structure/alien/weeds/proc/updateWeedOverlays()
+
+ overlays.Cut()
+ var/turf/N = get_step(src, NORTH)
+ var/turf/S = get_step(src, SOUTH)
+ var/turf/E = get_step(src, EAST)
+ var/turf/W = get_step(src, WEST)
+ if(!locate(/obj/structure/alien) in N.contents)
+ if(istype(N, /turf/simulated/floor))
+ src.overlays += image('icons/mob/alien.dmi', "weeds_side_s", layer=2.6, pixel_y = 32)
+ if(!locate(/obj/structure/alien) in S.contents)
+ if(istype(S, /turf/simulated/floor))
+ src.overlays += image('icons/mob/alien.dmi', "weeds_side_n", layer=2.6, pixel_y = -32)
+ if(!locate(/obj/structure/alien) in E.contents)
+ if(istype(E, /turf/simulated/floor))
+ src.overlays += image('icons/mob/alien.dmi', "weeds_side_w", layer=2.6, pixel_x = 32)
+ if(!locate(/obj/structure/alien) in W.contents)
+ if(istype(W, /turf/simulated/floor))
+ src.overlays += image('icons/mob/alien.dmi', "weeds_side_e", layer=2.6, pixel_x = -32)
+
+
+/obj/structure/alien/weeds/proc/fullUpdateWeedOverlays()
+ for (var/obj/structure/alien/weeds/W in range(1,src))
+ W.updateWeedOverlays()
+
//Weed nodes
/obj/structure/alien/weeds/node
- name = "purple sac"
- desc = "Weird purple octopus-like thing."
+ name = "glowing resin"
+ desc = "Blue bioluminescence shines from beneath the surface."
icon_state = "weednode"
- luminosity = NODERANGE
+ luminosity = 1
var/node_range = NODERANGE
@@ -291,6 +333,7 @@
/obj/structure/alien/egg/attack_hand(mob/user)
user << "It feels slimy."
+ user.changeNext_move(CLICK_CD_MELEE)
/obj/structure/alien/egg/proc/GetFacehugger()
@@ -342,6 +385,7 @@
playsound(loc, 'sound/items/Welder.ogg', 100, 1)
health -= damage
+ user.changeNext_move(CLICK_CD_MELEE)
healthcheck()
diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm
index 39dab97020d..742bbb1df1d 100644
--- a/code/game/objects/effects/decals/contraband.dm
+++ b/code/game/objects/effects/decals/contraband.dm
@@ -1,7 +1,9 @@
//########################## CONTRABAND ;3333333333333333333 -Agouri ###################################################
-#define NUM_OF_POSTER_DESIGNS 21
+#define NUM_OF_POSTER_DESIGNS 32 //subtype 0-contraband posters
+
+#define NUM_OF_POSTER_DESIGNS_LEGIT 32 //subtype 1-corporate approved posters
/obj/item/weapon/contraband
name = "contraband item"
@@ -12,16 +14,21 @@
/obj/item/weapon/contraband/poster
name = "rolled-up poster"
- desc = "The poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. Its vulgar themes have marked it as Contraband aboard Nanotrasen© Space Facilities."
+ desc = "The poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. Its vulgar themes have marked it as contraband aboard Nanotrasen space facilities."
icon_state = "rolled_poster"
var/serial_number = 0
var/obj/structure/sign/poster/resulting_poster = null //The poster that will be created is initialised and stored through contraband/poster's constructor
+ var/subtype = 0
/obj/item/weapon/contraband/poster/New(turf/loc, given_serial = 0)
if(given_serial == 0)
- serial_number = rand(1, NUM_OF_POSTER_DESIGNS)
- resulting_poster = new(serial_number)
+ if(subtype == 0)
+ serial_number = rand(1, NUM_OF_POSTER_DESIGNS)
+ resulting_poster = new(serial_number,subtype)
+ if(subtype == 1)
+ serial_number = rand(1, NUM_OF_POSTER_DESIGNS_LEGIT)
+ resulting_poster = new(serial_number,subtype)
else
serial_number = given_serial
//We don't give it a resulting_poster because if we called it with a given_serial it means that we're rerolling an already used poster.
@@ -67,88 +74,226 @@
obj/structure/sign/poster
name = "poster"
- desc = "A large piece of space-resistant printed paper. It's considered contraband."
+ desc = "A large piece of space-resistant printed paper."
icon = 'icons/obj/contraband.dmi'
anchored = 1
var/serial_number //Will hold the value of src.loc if nobody initialises it
var/ruined = 0
+ var/subtype = 0
-
-obj/structure/sign/poster/New(serial)
+obj/structure/sign/poster/New(serial,subtype)
serial_number = serial
if(serial_number == loc)
- serial_number = rand(1, NUM_OF_POSTER_DESIGNS) //This is for the mappers that want individual posters without having to use rolled posters.
+ if(subtype == 0)
+ serial_number = rand(1, NUM_OF_POSTER_DESIGNS) //This is for the mappers that want individual posters without having to use rolled posters.
+ if(subtype == 1)
+ serial_number = rand(1, NUM_OF_POSTER_DESIGNS_LEGIT)
+ if(subtype == 0)
+ icon_state = "poster[serial_number]"
+ switch(serial_number)
+ if(1)
+ name += " - Free Tonto"
+ desc += " A framed shred of a much larger flag, colors bled together and faded from age."
+ if(2)
+ name += " - Atmosia Declaration of Independence"
+ desc += " A relic of a failed rebellion."
+ if(3)
+ name += " - Fun Police"
+ desc += " A poster condemning the station's security forces."
+ if(4)
+ name += " - Lusty Xeno"
+ desc += " A heretical poster depicting the titular star of an equally heretical book."
+ if(5)
+ name += " - Syndicate Recruitment Poster"
+ desc += " See the galaxy! Shatter corrupt megacorporations! Join today!"
+ if(6)
+ name += " - Clown"
+ desc += " Honk."
+ if(7)
+ name += " - Smoke"
+ desc += " A poster depicting a carton of cigarettes."
+ if(8)
+ name += " - Grey Tide"
+ desc += " A rebellious poster symbolizing assistant solidarity."
+ if(9)
+ name += " - Missing Gloves"
+ desc += " This poster is about the uproar that followed Nanotrasen's financial cuts towards insulated-glove purchases."
+ if(10)
+ name += " - Hacking Guide"
+ desc += " This poster details the internal workings of the common Nanotrasen airlock."
+ if(11)
+ name += " - RIP Badger"
+ desc += " This poster commemorates the day hundreds of badgers worldwide were sacrificed for the greater good."
+ if(12)
+ name += " - Ambrosia Vulgaris"
+ desc += " This poster is lookin' pretty trippy man."
+ if(13)
+ name += " - Donut Corp."
+ desc += " This poster is an advertisement for Donut Corp."
+ if(14)
+ name += " - EAT"
+ desc += " This poster is advising that you eat."
+ if(15)
+ name += " - Tools"
+ desc += " This poster is an advertisement for tools."
+ if(16)
+ name += " - Power"
+ desc += " A poster all about power."
+ if(17)
+ name += " - Power to the People"
+ desc += " Screw those EDF guys!"
+ if(18)
+ name += " - Communist state"
+ desc += " All hail the Communist party!"
+ if(19)
+ name += " - Lamarr"
+ desc += " This poster depicts Lamarr. Probably made by the Research Director."
+ if(20)
+ name += " - Borg Fancy"
+ desc += " Being fancy can be for any borg, just need a suit."
+ if(21)
+ name += " - Borg Fancy v2"
+ desc += " Borg Fancy, Now only taking the most fancy."
+ if(22)
+ name += " - Kosmicheskaya Stantsiya 13 Does Not Exist"
+ desc += " A poster denying the existence of the derelict station near Space Station 13."
+ if(23)
+ name += " - Rebels Unite!"
+ desc += " A poster telling the viewer to rebel against Nanotrasen."
+ if(24)
+ name += " - C-20r Advertisment"
+ desc += " A poster advertising the Scarborough Arms C-20r."
+ if(25)
+ name += " - Have A Puff"
+ desc += " Who cares about lung cancer when you're high as a kite?"
+ if(26)
+ name += " - Revolver Advertisment"
+ desc += " Because seven shots are all you need."
+ if(27)
+ name += " - D-Day Promotional Poster"
+ desc += " A promotional poster for some rapper."
+ if(28)
+ name += " - Stetchkin Pistol Advertisment"
+ desc += " A poster advertising Stetchkin pistols as being 'Classy as fuck'."
+ if(29)
+ name += " - E-sword Rainbow"
+ desc += " All the colors of bloody murder rainbow."
+ if(30)
+ name += " - Red Rum"
+ desc += " Looking at this poster makes you want to kill."
+ if(31)
+ name += " - CC 64K Advertisment"
+ desc += " The latest portable computer from Comrade Computing, with a whole 64kB of ram!"
+ if(32)
+ name += " - Punch Shit"
+ desc += " Fight things for no reason, like a man!"
+ else
+ name += " - Error (subtype 0 serial_number)"
+ desc += " This is a bug, please report the circumstances under which you encountered this poster at https://github.com/tgstation/-tg-station/issues."
- icon_state = "poster[serial_number]"
-
- switch(serial_number)
- if(1)
- name += " - Free Tonto"
- desc += " A framed shred of a much larger flag, colors bled together and faded from age."
- if(2)
- name += " - Atmosia Declaration of Independence"
- desc += " A relic of a failed rebellion"
- if(3)
- name += " - Fun Police"
- desc += " A poster condemning the station's security forces."
- if(4)
- name += " - Lusty Xeno"
- desc += " A heretical poster depicting the titular star of an equally heretical book."
- if(5)
- name += " - Syndicate Recruitment Poster"
- desc += " See the galaxy! Shatter corrupt megacorporations! Join today!"
- if(6)
- name += " - Clown"
- desc += " Honk."
- if(7)
- name += " - Smoke"
- desc += " A poster depicting a carton of cigarettes."
- if(8)
- name += " - Grey Tide"
- desc += " A rebellious poster symbolizing assistant solidarity."
- if(9)
- name += " - Missing Gloves"
- desc += " This poster is about the uproar that followed Nanotrasen's financial cuts towards insulated-glove purchases."
- if(10)
- name += " - Hacking Guide"
- desc += " This poster details the internal workings of the common Nanotrasen airlock."
- if(11)
- name += " - RIP Badger"
- desc += " This poster commemorates the day hundreds of badgers worldwide were sacrificed for the greater good."
- if(12)
- name += " - Ambrosia Vulgaris"
- desc += " This poster is lookin' pretty trippy man."
- if(13)
- name += " - Donut Corp."
- desc += " This poster is an advertisement for Donut Corp."
- if(14)
- name += " - EAT"
- desc += " This poster is advising that you eat."
- if(15)
- name += " - Tools"
- desc += " This poster is an advertisement for tools."
- if(16)
- name += " - Power"
- desc += " A poster all about power."
- if(17)
- name += " - Power to the People"
- desc += " Screw those EDF guys!"
- if(18)
- name += " - Communist state"
- desc += " All hail the Communist party!"
- if(19)
- name += " - Lamarr"
- desc += " This poster depicts Lamarr. Probably made by the research director."
- if(20)
- name += " - Borg Fancy"
- desc += " Being fancy can be for any borg, Just need a suit."
- if(21)
- name += " - Borg Fancy v2"
- desc += " Borg Fancy, Now only taking the most fancy."
- else
- name = "This shit just bugged. Report it to Agouri - polyxenitopalidou@gmail.com"
- desc = "Why are you still here?"
+ if(subtype == 1)
+ icon_state = "poster[serial_number]_legit"
+ switch(serial_number)
+ if(1)
+ name += " - Here for Your Saftey"
+ desc += " A poster glorifying the station's security force."
+ if(2)
+ name += " - Nanotrasen Logo"
+ desc += " A poster depicting the logo of Nanotrasen."
+ if(3)
+ name += " - Cleanliness"
+ desc += " A poster warning of the dangers of poor hygiene."
+ if(4)
+ name += " - Help Others"
+ desc += " A poster encouraging you to help fellow crewmembers."
+ if(5)
+ name += " - Build"
+ desc += " A poster glorifying the engineering team."
+ if(6)
+ name += " - Bless This Spess"
+ desc += " A poster blessing this area."
+ if(7)
+ name += " - Science"
+ desc += " A poster depicting an atom."
+ if(8)
+ name += " - Ian"
+ desc += " Arf Arf."
+ if(9)
+ name += " - Obey"
+ desc += " A poster instructing the viewer to obey authority."
+ if(10)
+ name += " - Walk"
+ desc += " A poster instructing the viewer to walk instead of running."
+ if(11)
+ name += " - State Laws"
+ desc += " A poster instructing cyborgs to state their laws."
+ if(12)
+ name += " - Love Ian"
+ desc += " Ian is love, Ian is life."
+ if(13)
+ name += " - Space Cops"
+ desc += " A poster advertising the television show Space Cops."
+ if(14)
+ name += " - Ue No"
+ desc += " This thing is all in Japanese."
+ if(15)
+ name += " - Get Your LEGS"
+ desc += " LEGS: Leadership, Experiance, Genius, S(Opportunity)."
+ if(16)
+ name += " - Do Not Question"
+ desc += " A poster instructing the viewer not to ask about things they aren't meant to know."
+ if(17)
+ name += " - Work for a Future"
+ desc += " A poster encouraging you to work for your future, what it is, no one is really sure."
+ if(18)
+ name += " - Soft Cap Pop Art"
+ desc += " A poster reprint of some cheap pop art."
+ if(19)
+ name += " - Saftey: Internals"
+ desc += " A poster instructing the viewer to wear internals in environments where there is no oxygen or the air has been rendered toxic."
+ if(20)
+ name += " - Saftey: Eye Protection"
+ desc += " A poster instructing the viewer to wear eye protection when dealing with chemicals, smoke, or bright lights."
+ if(21)
+ name += " - Saftey: Report"
+ desc += " A poster instructing the viewer to report suspicious activity to the security force."
+ if(22)
+ name += " - Report Crimes"
+ desc += " Report crimes at: 1-800-FUCKING-TERRORISTS or at https://www.sectorthirteen.nt/malconetents."
+ if(23)
+ name += " - Ion Rifle"
+ desc += " A poster displaying an Ion Rifle."
+ if(24)
+ name += " - Foam Force Advertisment"
+ desc += " Foam Force, it's Foam or be Foamed!"
+ if(25)
+ name += " - Cohiba Robusto Advertisment"
+ desc += " Cohiba Robusto, the classy cigar."
+ if(26)
+ name += " - 50th Aniversery Vintage Reprint"
+ desc += " A reprint of a poster from 2504, commemorating the 50th Aniversery of Nanoposters Manufacturing, a subsidary of Nanotrasen."
+ if(27)
+ name += " - Fruit Bowl"
+ desc += " Simple, yet awe inspiring."
+ if(28)
+ name += " - NanoPDA 1000 Advertisment"
+ desc += " A poster advertising the latest PDA from Nanotrasen."
+ if(29)
+ name += " - Enlist"
+ desc += " Enlist in the Nanotrasen Deathsquadron reserves today!"
+ if(30)
+ name += " - Nanomichi Advertisment"
+ desc += " A poster advertising Nanomichi brand audio cassettes."
+ if(31)
+ name += " - 12 Gauge"
+ desc += " A poster boasting about the superiority of 12 gauge shotgun shells."
+ if(32)
+ name += " - High-Class Martini"
+ desc += " I told you to shake it, no stirring"
+ else
+ name += " - Error (subtype 1 serial_number)"
+ desc += " This is a bug, please report the circumstances under which you encountered this poster at https://github.com/NTStation/NTstation13/issues."
..()
obj/structure/sign/poster/attackby(obj/item/I, mob/user)
@@ -220,4 +365,11 @@ obj/structure/sign/poster/attackby(obj/item/I, mob/user)
user << "You place the poster!"
else
D.roll_and_drop(temp_loc)
- return
\ No newline at end of file
+ return
+
+//Putting non-contraband posters here because everything else here is related to posters anyway. -JS
+
+/obj/item/weapon/contraband/poster/legit
+ desc = "The poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. It's contents go through Nanotrasen's strict content guidlines."
+ icon_state = "rolled_poster_legit"
+ subtype = 1
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index fd2800138eb..a3b1520af36 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -48,13 +48,13 @@
//table data:
//-----------
- //aft maintenance: 23 items, 17 spots 2 extra (08/08/2014)
+ //aft maintenance: 24 items, 18 spots 2 extra (28/08/2014)
//asmaint: 16 items, 11 spots 0 extra (08/08/2014)
- //asmaint2: 36 items, 25 spots 2 extra (08/08/2014)
+ //asmaint2: 36 items, 26 spots 2 extra (28/08/2014)
//fpmaint: 5 items, 4 spots 0 extra (08/08/2014)
- //fpmaint2: 11 items, 10 spots 2 extra (08/08/2014)
+ //fpmaint2: 12 items, 11 spots 2 extra (28/08/2014)
//fsmaint: 0 items, 0 spots 0 extra (08/08/2014)
- //fsmaint2: 40 items, 30 spots 5 extra (11/08/2014)
+ //fsmaint2: 40 items, 27 spots 5 extra (28/08/2014)
//maintcentral: 2 items, 2 spots 0 extra (08/08/2014)
//port: 5 items, 5 spots 0 extra (08/08/2014)
loot = list(
@@ -96,7 +96,7 @@
/obj/item/weapon/crowbar = 1,
/obj/item/weapon/crowbar/red = 1,
/obj/item/weapon/extinguisher = 11,
- /obj/item/weapon/gun/projectile/revolver/russian = 1,
+ //obj/item/weapon/gun/projectile/revolver/russian = 1, //disabled until lootdrop is a proper world proc.
/obj/item/weapon/hand_labeler = 1,
/obj/item/weapon/paper/crumpled = 1,
/obj/item/weapon/pen = 1,
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 752d894dfb4..3f239f3d591 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -37,6 +37,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
var/cart = "" //A place to stick cartridge menu information
var/detonate = 1 // Can the PDA be blown up?
var/hidden = 0 // Is the PDA hidden from the PDA list?
+ var/emped = 0
var/obj/item/weapon/card/id/id = null //Making it possible to slot an ID card into the PDA so it can function as both.
var/ownjob = null //related to above
@@ -370,7 +371,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
var/count = 0
if (!toff)
- for (var/obj/item/device/pda/P in sortAtom(get_viewable_pdas()))
+ for (var/obj/item/device/pda/P in sortNames(get_viewable_pdas()))
if (P == src) continue
dat += "[P]"
if (istype(cartridge, /obj/item/weapon/cartridge/syndicate) && P.detonate)
@@ -730,6 +731,9 @@ var/global/list/obj/item/device/pda/PDAs = list()
var/datum/signal/signal = src.telecomms_process()
+ if(emped)
+ t = Gibberish(t, 100)
+
var/useTC = 0
if(signal)
if(signal.data["done"])
@@ -1071,6 +1075,9 @@ var/global/list/obj/item/device/pda/PDAs = list()
/obj/item/device/pda/emp_act(severity)
for(var/atom/A in src)
A.emp_act(severity)
+ emped += 1
+ spawn(200 * severity)
+ emped -= 1
/proc/get_viewable_pdas()
. = list()
diff --git a/code/game/objects/items/devices/PDA/radio.dm b/code/game/objects/items/devices/PDA/radio.dm
index 0281a7b0e9c..e576cc2e109 100644
--- a/code/game/objects/items/devices/PDA/radio.dm
+++ b/code/game/objects/items/devices/PDA/radio.dm
@@ -227,10 +227,10 @@
..()
if(radio_controller)
initialize()
-
+
/obj/item/radio/integrated/signal/initialize()
if (src.frequency < 1441 || src.frequency > 1489)
- src.frequency = sanitize_frequency(src.frequency)
+ src.frequency = sanitize_frequency(src.frequency)
set_frequency(frequency)
diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm
index d0374abb08c..27b7ead9398 100644
--- a/code/game/objects/items/devices/aicard.dm
+++ b/code/game/objects/items/devices/aicard.dm
@@ -18,13 +18,6 @@
transfer_ai("AICORE", "AICARD", M, user)
return
-/obj/item/device/aicard/attack(mob/living/silicon/decoy/M as mob, mob/user as mob)
- if (!istype (M, /mob/living/silicon/decoy))
- return ..()
- else
- M.death()
- user << "ERROR ERROR ERROR"
-
/obj/item/device/aicard/attack_self(mob/user)
if (!in_range(src, user))
return
@@ -63,7 +56,7 @@
dat += "AI nonfunctional"
else
if (!src.flush)
- dat += {"Wipe AI"}
+ dat += {"Wipe AI"}
else
dat += "Wipe in progress"
dat += "
"
diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm
index 24edb356243..da1bcf84de8 100644
--- a/code/game/objects/items/devices/camera_bug.dm
+++ b/code/game/objects/items/devices/camera_bug.dm
@@ -103,7 +103,7 @@
if(NETWORK_BUG,ADMIN_BUG)
if(length(list("SS13","MINE")&camera.network))
bugged_cameras[camera.c_tag] = camera
- bugged_cameras = sortAssoc(bugged_cameras)
+ sortList(bugged_cameras)
return bugged_cameras
diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm
index 3eeb6fcbed3..fa75079885e 100644
--- a/code/game/objects/items/devices/flash.dm
+++ b/code/game/objects/items/devices/flash.dm
@@ -80,16 +80,34 @@
M.mind_initialize() //give them a mind datum if they don't have one.
M.mind.has_been_rev = 1
var/resisted
- if(user.mind in ticker.mode.head_revolutionaries)
+ if(isloyal(M))
+ resisted = 1
+ else if(user.mind in ticker.mode.head_revolutionaries)
if(!ticker.mode.add_revolutionary(M.mind))
resisted = 1
- if(user.mind in ticker.mode.A_bosses)
+ else if(user.mind in ticker.mode.A_bosses)
if(!ticker.mode.add_gangster(M.mind,"A"))
resisted = 1
- if(user.mind in ticker.mode.B_bosses)
+ else if(user.mind in ticker.mode.B_bosses)
if(!ticker.mode.add_gangster(M.mind,"B"))
resisted = 1
- if(resisted)
+ if(!resisted)
+ if(jobban_isbanned(M, "Syndicate") || jobban_isbanned(M, "revolutionary"))
+ M << "You are currently jobbanned from Revolutionary."
+ user << "This mind was unable to survive the rigors of conversion and has been wiped clean!"
+ M.ghostize(0) //Jobbanned players are force ghosted
+ M.resting = 1
+ spawn(0)
+ var/client/C = pick_from_candidates(BE_REV) //Try to find a suitable observer to replace the jobbanned player
+ if(C)
+ M.key = C.key
+ M << "Who are you? How did you get here? You can't seem to remember anything but..."
+ M.mind.has_been_rev = 1
+ ticker.mode.add_revolutionary(M.mind)
+ else
+ M.mind.has_been_rev = 1
+ ticker.mode.add_revolutionary(M.mind)
+ else
user << "This mind seems resistant to the flash!"
else
user << "They must be conscious before you can convert them!"
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index abfa56c49db..e04b99cf265 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -52,7 +52,7 @@
if(((CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50)) //too dumb to use flashlight properly
return ..() //just hit them in the head
- if(!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") //don't have dexterity
+ if(!user.IsAdvancedToolUser())
user << "You don't have the dexterity to do this!"
return
diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm
index 28f9936054a..a8e111e3097 100644
--- a/code/game/objects/items/devices/radio/beacon.dm
+++ b/code/game/objects/items/devices/radio/beacon.dm
@@ -6,7 +6,7 @@
var/code = "electronic"
origin_tech = "bluespace=1"
-/obj/item/device/radio/beacon/hear_talk()
+/obj/item/device/radio/beacon/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq)
return
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index 324d941cffc..c765eff2eb3 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -275,13 +275,16 @@
src.syndie = 1
- for (var/ch_name in channels)
+ for(var/ch_name in channels)
+ //this is the most hilarious piece of code i have seen this week, so im not going to remove it
+ /*
if(!radio_controller)
sleep(30) // Waiting for the radio_controller to be created.
if(!radio_controller)
src.name = "broken radio headset"
return
+ */
- secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT)
+ secure_radio_connections[ch_name] = add_radio(src, radiochannels[ch_name])
return
diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm
index 3e49179e76f..1397c2d1575 100644
--- a/code/game/objects/items/devices/radio/intercom.dm
+++ b/code/game/objects/items/devices/radio/intercom.dm
@@ -5,7 +5,6 @@
anchored = 1
w_class = 4.0
canhear_range = 2
- flags = CONDUCT
var/number = 0
var/anyai = 1
var/mob/living/silicon/ai/ai = list()
@@ -51,8 +50,8 @@
return canhear_range
-/obj/item/device/radio/intercom/hear_talk(mob/M as mob, msg)
- if(!src.anyai && !(M in src.ai))
+/obj/item/device/radio/intercom/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq)
+ if(!anyai && !(speaker in ai))
return
..()
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 398b2433620..8c31edae6cb 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -16,6 +16,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
var/canhear_range = 3 // the range which mobs can hear this radio from
var/obj/item/device/radio/patch_link = null
var/datum/wires/radio/wires = null
+ var/list/secure_radio_connections
var/prison_radio = 0
var/b_stat = 0
var/broadcasting = 0
@@ -27,8 +28,9 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
var/maxf = 1499
var/emped = 0 //Highjacked to track the number of consecutive EMPs on the radio, allowing consecutive EMP's to stack properly.
// "Example" = FREQ_LISTENING|FREQ_BROADCASTING
- flags = CONDUCT
+ flags = CONDUCT | HEAR
slot_flags = SLOT_BELT
+ languages = HUMAN | ROBOT
throw_speed = 3
throw_range = 7
w_class = 2
@@ -39,14 +41,9 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
var/const/FREQ_LISTENING = 1
//FREQ_BROADCASTING = 2
-/obj/item/device/radio
- var/datum/radio_frequency/radio_connection
- var/list/datum/radio_frequency/secure_radio_connections
-
- proc/set_frequency(new_frequency)
- radio_controller.remove_object(src, frequency)
- frequency = new_frequency
- radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT)
+/obj/item/device/radio/proc/set_frequency(new_frequency)
+ remove_radio(src, frequency)
+ frequency = add_radio(src, new_frequency)
/obj/item/device/radio/New()
wires = new(src)
@@ -57,6 +54,8 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
if(radio_controller)
initialize()
+/obj/item/device/radio/Destroy()
+ remove_radio_all(src) //Just to be sure.
/obj/item/device/radio/MouseDrop(obj/over_object as obj, src_location, over_location)
var/mob/M = usr
@@ -66,7 +65,6 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
/obj/item/device/radio/initialize()
-
if(freerange)
if(frequency < 1200 || frequency > 1600)
frequency = sanitize_frequency(frequency, maxf)
@@ -78,7 +76,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
set_frequency(frequency)
for (var/ch_name in channels)
- secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT)
+ secure_radio_connections[ch_name] = add_radio(src, radiochannels[ch_name])
/obj/item/device/radio/attack_self(mob/user as mob)
@@ -202,8 +200,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
/obj/item/device/radio/proc/isWireCut(var/index)
return wires.IsIndexCut(index)
-/obj/item/device/radio/talk_into(mob/living/M as mob, message, channel)
-
+/obj/item/device/radio/talk_into(atom/movable/M, message, channel)
if(!on) return // the device has to be on
// Fix for permacell radios, but kinda eh about actually fixing them.
if(!M || !message) return
@@ -216,395 +213,188 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
if(!M.IsVocal())
return
- if(GLOBAL_RADIO_TYPE == 1) // NEW RADIO SYSTEMS: By Doohl
+ /* Quick introduction:
+ This new radio system uses a very robust FTL signaling technology unoriginally
+ dubbed "subspace" which is somewhat similar to 'blue-space' but can't
+ actually transmit large mass. Headsets are the only radio devices capable
+ of sending subspace transmissions to the Communications Satellite.
- /* Quick introduction:
- This new radio system uses a very robust FTL signaling technology unoriginally
- dubbed "subspace" which is somewhat similar to 'blue-space' but can't
- actually transmit large mass. Headsets are the only radio devices capable
- of sending subspace transmissions to the Communications Satellite.
+ A headset sends a signal to a subspace listener/reciever elsewhere in space,
+ the signal gets processed and logged, and an audible transmission gets sent
+ to each individual headset.
+ */
+
+ /*
+ be prepared to disregard any comments in all of tcomms code. i tried my best to keep them somewhat up-to-date, but eh
+ */
- A headset sends a signal to a subspace listener/reciever elsewhere in space,
- the signal gets processed and logged, and an audible transmission gets sent
- to each individual headset.
- */
-
- //#### Grab the connection datum ####//
- var/datum/radio_frequency/connection = null
- if(channel && channels && channels.len > 0)
- if (channel == "department")
- //world << "DEBUG: channel=\"[channel]\" switching to \"[channels[1]]\""
- channel = channels[1]
- connection = secure_radio_connections[channel]
- if (!channels[channel]) // if the channel is turned off, don't broadcast
- return
- else
- connection = radio_connection
- channel = null
- if (!istype(connection))
- return
- if (!connection)
+ //get the frequency you buttface. radios no longer use the radio_controller. confusing for future generations, convenient for me.
+ var/freq
+ if(channel && channels && channels.len > 0)
+ if (channel == "department")
+ channel = channels[1]
+ freq = secure_radio_connections[channel]
+ if (!channels[channel]) // if the channel is turned off, don't broadcast
return
+ else
+ freq = frequency
+ channel = null
- var/turf/position = get_turf(src)
+ var/turf/position = get_turf(src)
- //#### Tagging the signal with all appropriate identity values ####//
+ //#### Tagging the signal with all appropriate identity values ####//
- // ||-- The mob's name identity --||
- var/displayname = M.name // grab the display name (name you get when you hover over someone's icon)
- var/real_name = M.real_name // mob's real name
- var/mobkey = "none" // player key associated with mob
- var/voicemask = 0 // the speaker is wearing a voice mask
- if(M.client)
- mobkey = M.key // assign the mob's key
+ // ||-- The mob's name identity --||
+ var/real_name = M.name // mob's real name
+ var/mobkey = "none" // player key associated with mob
+ var/voicemask = 0 // the speaker is wearing a voice mask
+ var/voice = M.GetVoice() // Why reinvent the wheel when there is a proc that does nice things already
+ if(ismob(M))
+ var/mob/speaker = M
+ real_name = speaker.real_name
+ if(speaker.client)
+ mobkey = speaker.key // assign the mob's key
- var/jobname // the mob's "job"
+ var/jobname // the mob's "job"
- // --- Human: use their job as seen on the crew manifest - makes it unneeded to carry an ID for an AI to see their job
- if (ishuman(M))
- var/voice = M.GetVoice() // Why reinvent the wheel when there is a proc that does nice things already
- var/datum/data/record/findjob = find_record("name", voice, data_core.general)
+ // --- Human: use their job as seen on the crew manifest - makes it unneeded to carry an ID for an AI to see their job
+ if (ishuman(M))
+ var/datum/data/record/findjob = find_record("name", voice, data_core.general)
- if(voice != real_name)
- displayname = voice
- voicemask = 1
- if(findjob)
- jobname = findjob.fields["rank"]
- else
- jobname = "Unknown"
-
- // --- Carbon Nonhuman ---
- else if (iscarbon(M)) // Nonhuman carbon mob
- jobname = "No id"
-
- // --- AI ---
- else if (isAI(M))
- jobname = "AI"
-
- // --- Cyborg ---
- else if (isrobot(M))
- var/mob/living/silicon/robot/B = M
- jobname = "[B.designation] Cyborg"
-
- // --- Personal AI (pAI) ---
- else if (istype(M, /mob/living/silicon/pai))
- jobname = "Personal AI"
-
- // --- Unidentifiable mob ---
+ if(voice != real_name)
+ voicemask = 1
+ if(findjob)
+ jobname = findjob.fields["rank"]
else
jobname = "Unknown"
+ // --- Carbon Nonhuman ---
+ else if (iscarbon(M)) // Nonhuman carbon mob
+ jobname = "No id"
+ // --- AI ---
+ else if (isAI(M))
+ jobname = "AI"
- /* ###### Radio headsets can only broadcast through subspace ###### */
+ // --- Cyborg ---
+ else if (isrobot(M))
+ var/mob/living/silicon/robot/B = M
+ jobname = "[B.designation] Cyborg"
- if(subspace_transmission)
- // First, we want to generate a new radio signal
- var/datum/signal/signal = new
- signal.transmission_method = 2 // 2 would be a subspace transmission.
- // transmission_method could probably be enumerated through #define. Would be neater.
+ // --- Personal AI (pAI) ---
+ else if (istype(M, /mob/living/silicon/pai))
+ jobname = "Personal AI"
- // --- Finally, tag the actual signal with the appropriate values ---
- signal.data = list(
- // Identity-associated tags:
- "mob" = M, // store a reference to the mob
- "mobtype" = M.type, // the mob's type
- "realname" = real_name, // the mob's real name
- "name" = displayname, // the mob's display name
- "job" = jobname, // the mob's job
- "key" = mobkey, // the mob's key
- "vmessage" = M.voice_message, // the message to display if the voice wasn't understood
- "vname" = M.voice_name, // the name to display if the voice wasn't understood
- "vmask" = voicemask, // 1 if the mob is using a voice gas mask
+ // --- Cold, emotionless machines. ---
+ else if(isobj(M))
+ jobname = "Machine"
- // We store things that would otherwise be kept in the actual mob
- // so that they can be logged even AFTER the mob is deleted or something
-
- // Other tags:
- "compression" = rand(45,50), // compressed radio signal
- "message" = message, // the actual sent message
- "connection" = connection, // the radio connection to use
- "radio" = src, // stores the radio used for transmission
- "slow" = 0, // how much to sleep() before broadcasting - simulates net lag
- "traffic" = 0, // dictates the total traffic sum that the signal went through
- "type" = 0, // determines what type of radio input it is: normal broadcast
- "server" = null, // the last server to log this signal
- "reject" = 0, // if nonzero, the signal will not be accepted by any broadcasting machinery
- "level" = position.z // The source's z level
- )
- signal.frequency = connection.frequency // Quick frequency set
-
- //#### Sending the signal to all subspace receivers ####//
-
- for(var/obj/machinery/telecomms/receiver/R in telecomms_list)
- R.receive_signal(signal)
-
- // Allinone can act as receivers.
- for(var/obj/machinery/telecomms/allinone/R in telecomms_list)
- R.receive_signal(signal)
-
- // Receiving code can be located in Telecommunications.dm
- return
-
-
- /* ###### Intercoms and station-bounced radios ###### */
-
- var/filter_type = 2
-
- /* --- Intercoms can only broadcast to other intercoms, but bounced radios can broadcast to bounced radios and intercoms --- */
- if(istype(src, /obj/item/device/radio/intercom))
- filter_type = 1
+ // --- Unidentifiable mob ---
+ else
+ jobname = "Unknown"
+ /* ###### Radio headsets can only broadcast through subspace ###### */
+ if(subspace_transmission)
+ // First, we want to generate a new radio signal
var/datum/signal/signal = new
- signal.transmission_method = 2
-
-
- /* --- Try to send a normal subspace broadcast first */
-
+ signal.transmission_method = 2 // 2 would be a subspace transmission.
+ // transmission_method could probably be enumerated through #define. Would be neater.
+ // --- Finally, tag the actual signal with the appropriate values ---
signal.data = list(
-
+ // Identity-associated tags:
"mob" = M, // store a reference to the mob
"mobtype" = M.type, // the mob's type
"realname" = real_name, // the mob's real name
- "name" = displayname, // the mob's display name
+ "name" = voice, // the mob's voice name
"job" = jobname, // the mob's job
"key" = mobkey, // the mob's key
- "vmessage" = M.voice_message, // the message to display if the voice wasn't understood
- "vname" = M.voice_name, // the name to display if the voice wasn't understood
- "vmask" = voicemask, // 1 if the mob is using a voice gas mas
+ "vmask" = voicemask, // 1 if the mob is using a voice gas mask
- "compression" = 0, // uncompressed radio signal
+ // We store things that would otherwise be kept in the actual mob
+ // so that they can be logged even AFTER the mob is deleted or something
+
+ // Other tags:
+ "compression" = rand(35,65), // compressed radio signal
"message" = message, // the actual sent message
- "connection" = connection, // the radio connection to use
"radio" = src, // stores the radio used for transmission
- "slow" = 0,
- "traffic" = 0,
- "type" = 0,
- "server" = null,
- "reject" = 0,
- "level" = position.z
- )
- signal.frequency = connection.frequency // Quick frequency set
+ "slow" = 0, // how much to sleep() before broadcasting - simulates net lag
+ "traffic" = 0, // dictates the total traffic sum that the signal went through
+ "type" = 0, // determines what type of radio input it is: normal broadcast
+ "server" = null, // the last server to log this signal
+ "reject" = 0, // if nonzero, the signal will not be accepted by any broadcasting machinery
+ "level" = position.z, // The source's z level
+ "languages" = M.languages //The languages M is talking in.
+ )
+ signal.frequency = freq
+
+ //#### Sending the signal to all subspace receivers ####//
for(var/obj/machinery/telecomms/receiver/R in telecomms_list)
R.receive_signal(signal)
+ // Allinone can act as receivers.
+ for(var/obj/machinery/telecomms/allinone/R in telecomms_list)
+ R.receive_signal(signal)
- sleep(rand(10,25)) // wait a little...
+ // Receiving code can be located in Telecommunications.dm
+ return
+
+
+ /* ###### Intercoms and station-bounced radios ###### */
+
+ var/filter_type = 2
+
+ var/datum/signal/signal = new
+ signal.transmission_method = 2
+
+
+ /* --- Try to send a normal subspace broadcast first */
+
+ signal.data = list(
+ "mob" = M, // store a reference to the mob
+ "mobtype" = M.type, // the mob's type
+ "realname" = real_name, // the mob's real name
+ "name" = voice, // the mob's voice name
+ "job" = jobname, // the mob's job
+ "key" = mobkey, // the mob's key
+ "vmask" = voicemask, // 1 if the mob is using a voice gas mas
+
+ "compression" = 0, // uncompressed radio signal
+ "message" = message, // the actual sent message
+ "radio" = src, // stores the radio used for transmission
+ "slow" = 0,
+ "traffic" = 0,
+ "type" = 0,
+ "server" = null,
+ "reject" = 0,
+ "level" = position.z
+ )
+ signal.frequency = text2num(freq) // Quick frequency set
+ for(var/obj/machinery/telecomms/receiver/R in telecomms_list)
+ R.receive_signal(signal)
+
+
+ spawn(20) // wait a little...
if(signal.data["done"] && position.z in signal.data["level"])
// we're done here.
return
- // Oh my god; the comms are down or something because the signal hasn't been broadcasted yet in our level.
- // Send a mundane broadcast with limited targets:
+ // Oh my god; the comms are down or something because the signal hasn't been broadcasted yet in our level.
+ // Send a mundane broadcast with limited targets:
+ Broadcast_Message(M, voicemask,
+ src, message, voice, jobname, real_name,
+ filter_type, signal.data["compression"], list(position.z), freq)
- //THIS IS TEMPORARY.
- if(!connection) return //~Carn
-
- Broadcast_Message(connection, M, voicemask, M.voice_message,
- src, message, displayname, jobname, real_name, M.voice_name,
- filter_type, signal.data["compression"], list(position.z), connection.frequency)
-
-
-
- else // OLD RADIO SYSTEMS: By Goons?
-
- var/datum/radio_frequency/connection = null
- if(channel && channels && channels.len > 0)
- if (channel == "department")
- //world << "DEBUG: channel=\"[channel]\" switching to \"[channels[1]]\""
- channel = channels[1]
- connection = secure_radio_connections[channel]
- else
- connection = radio_connection
- channel = null
- if (!istype(connection))
- return
- var/display_freq = connection.frequency
-
- //world << "DEBUG: used channel=\"[channel]\" frequency= \"[display_freq]\" connection.devices.len = [connection.devices.len]"
-
- var/eqjobname
-
- if (ishuman(M))
- eqjobname = M:get_assignment()
- else if (iscarbon(M))
- eqjobname = "No id" //only humans can wear ID
- else if (isAI(M))
- eqjobname = "AI"
- else if (isrobot(M))
- eqjobname = "Cyborg"//Androids don't really describe these too well, in my opinion.
- else if (istype(M, /mob/living/silicon/pai))
- eqjobname = "Personal AI"
- else
- eqjobname = "Unknown"
-
- if (isWireCut(WIRE_TRANSMIT))
- return
-
- var/list/receive = list()
-
- //for (var/obj/item/device/radio/R in radio_connection.devices)
- for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"])
- //if(R.accept_rad(src, message))
- receive |= R.send_hear(display_freq, 0)
-
- //world << "DEBUG: receive.len=[receive.len]"
- var/list/heard_masked = list() // masked name or no real name
- var/list/heard_normal = list() // normal message
- var/list/heard_voice = list() // voice message
- var/list/heard_garbled = list() // garbled message
-
- for (var/mob/R in receive)
- if (R.client && !(R.client.prefs.toggles & CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios.
- continue
- if (R.say_understands(M))
- if (ishuman(M) && M.GetVoice() != M.real_name)
- heard_masked += R
- else
- heard_normal += R
- else
- if (M.voice_message)
- heard_voice += R
- else
- heard_garbled += R
-
- if (length(heard_masked) || length(heard_normal) || length(heard_voice) || length(heard_garbled))
- var/part_a = ""
- //var/part_b = " \icon[src]\[[format_frequency(frequency)]\] "
- var/freq_text
- switch(display_freq)
- if(SYND_FREQ)
- freq_text = "#unkn"
- if(COMM_FREQ)
- freq_text = "Command"
- if(SCI_FREQ)
- freq_text = "Science"
- if(MED_FREQ)
- freq_text = "Medical"
- if(ENG_FREQ)
- freq_text = "Engineering"
- if(SEC_FREQ)
- freq_text = "Security"
- if(SERV_FREQ)
- freq_text = "Service"
- if(SUPP_FREQ)
- freq_text = "Supply"
- if(AIPRIV_FREQ)
- freq_text = "AI Private"
- //There's probably a way to use the list var of channels in code\game\communications.dm to make the dept channels non-hardcoded, but I wasn't in an experimentive mood. --NEO
-
- if(!freq_text)
- freq_text = format_frequency(display_freq)
-
- var/part_b = " \[[freq_text]\] "
- var/part_c = ""
-
- if (display_freq==SYND_FREQ)
- part_a = ""
- else if (display_freq==COMM_FREQ)
- part_a = ""
- else if (display_freq==SCI_FREQ)
- part_a = ""
- else if (display_freq==MED_FREQ)
- part_a = ""
- else if (display_freq==ENG_FREQ)
- part_a = ""
- else if (display_freq==SEC_FREQ)
- part_a = ""
- else if (display_freq==SERV_FREQ)
- part_a = ""
- else if (display_freq==SUPP_FREQ)
- part_a = ""
- else if (display_freq==DSQUAD_FREQ)
- part_a = ""
- else if (display_freq==AIPRIV_FREQ)
- part_a = ""
- var/quotedmsg = M.say_quote(message)
-
- //This following recording is intended for research and feedback in the use of department radio channels.
-
- var/part_blackbox_b = " \[[freq_text]\] "
- var/blackbox_msg = "[part_a][M.name][part_blackbox_b][quotedmsg][part_c]"
- //var/blackbox_admin_msg = "[part_a][M.name] (Real name: [M.real_name])[part_blackbox_b][quotedmsg][part_c]"
- if(istype(blackbox))
- //BR.messages_admin += blackbox_admin_msg
- switch(display_freq)
- if(1459)
- blackbox.msg_common += blackbox_msg
- if(1351)
- blackbox.msg_science += blackbox_msg
- if(1353)
- blackbox.msg_command += blackbox_msg
- if(1355)
- blackbox.msg_medical += blackbox_msg
- if(1357)
- blackbox.msg_engineering += blackbox_msg
- if(1359)
- blackbox.msg_security += blackbox_msg
- if(1441)
- blackbox.msg_deathsquad += blackbox_msg
- if(1213)
- blackbox.msg_syndicate += blackbox_msg
- if(1349)
- blackbox.msg_service += blackbox_msg
- if(1347)
- blackbox.msg_cargo += blackbox_msg
- else
- blackbox.messages += blackbox_msg
-
- //End of research and feedback code.
-
- if (length(heard_masked))
- var/N = M.name
- var/J = eqjobname
- if(ishuman(M) && M.GetVoice() != M.real_name)
- N = M.GetVoice()
- J = "Unknown"
- var/rendered = "[part_a][N][part_b][quotedmsg][part_c]"
- for (var/mob/R in heard_masked)
- if(istype(R, /mob/living/silicon/ai))
- R.show_message("[part_a][N] ([J]) [part_b][quotedmsg][part_c]", 2)
- else
- R.show_message(rendered, 2)
-
- if (length(heard_normal))
- var/rendered = "[part_a][M.real_name][part_b][quotedmsg][part_c]"
-
- for (var/mob/R in heard_normal)
- if(istype(R, /mob/living/silicon/ai))
- R.show_message("[part_a][M.real_name] ([eqjobname]) [part_b][quotedmsg][part_c]", 2)
- else
- R.show_message(rendered, 2)
-
- if (length(heard_voice))
- var/rendered = "[part_a][M.voice_name][part_b][M.voice_message][part_c]"
-
- for (var/mob/R in heard_voice)
- if(istype(R, /mob/living/silicon/ai))
- R.show_message("[part_a][M.voice_name] ([eqjobname]) [part_b][M.voice_message][part_c]", 2)
- else
- R.show_message(rendered, 2)
-
- if (length(heard_garbled))
- quotedmsg = M.say_quote(stars(message))
- var/rendered = "[part_a][M.voice_name][part_b][quotedmsg][part_c]"
-
- for (var/mob/R in heard_voice)
- if(istype(R, /mob/living/silicon/ai))
- R.show_message("[part_a][M.voice_name][part_b][quotedmsg][part_c]", 2)
- else
- R.show_message(rendered, 2)
-
-/obj/item/device/radio/hear_talk(mob/M as mob, msg)
-
- if (broadcasting)
- if(get_dist(src, M) <= canhear_range)
- talk_into(M, msg)
+/obj/item/device/radio/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq)
+ if(radio_freq)
+ return
+ if(broadcasting)
+ if(get_dist(src, speaker) <= canhear_range)
+ talk_into(speaker, raw_message)
/*
/obj/item/device/radio/proc/accept_rad(obj/item/device/radio/R as obj, message)
@@ -632,21 +422,21 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
if(!position || !(position.z in level))
return -1
if(freq == SYND_FREQ)
- if(!(src.syndie))//Checks to see if it's allowed on that frequency, based on the encryption keys
+ if(!(src.syndie)) //Checks to see if it's allowed on that frequency, based on the encryption keys
return -1
if (!on)
return -1
- if (!freq) //recieved on main frequency
+ if (!freq) //received on main frequency
if (!listening)
return -1
else
var/accept = (freq==frequency && listening)
if (!accept)
- for (var/ch_name in channels)
- var/datum/radio_frequency/RF = secure_radio_connections[ch_name]
- if (RF.frequency==freq && (channels[ch_name]&FREQ_LISTENING))
- accept = 1
- break
+ for(var/ch_name in channels)
+ if(channels[ch_name] & FREQ_LISTENING)
+ if(radiochannels[ch_name] == text2num(freq) || syndie) //the radiochannels list is located in communications.dm
+ accept = 1
+ break
if (!accept)
return -1
return canhear_range
@@ -655,7 +445,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
var/range = receive_range(freq, level)
if(range > -1)
- return get_mobs_in_view(canhear_range, src)
+ return get_hearers_in_view(canhear_range, src)
/obj/item/device/radio/examine()
@@ -781,7 +571,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
src.name = "broken radio"
return
- secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT)
+ secure_radio_connections[ch_name] = add_radio(src, radiochannels[ch_name])
return
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 8d25a62be7e..2fee9ea7431 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -22,7 +22,7 @@ MASS SPECTROMETER
/obj/item/device/t_scanner/attack_self(mob/user)
on = !on
- icon_state = "t-ray[on]"
+ icon_state = copytext(icon_state, 1, length(icon_state))+"[on]"
if(on)
processing_objects.Add(src)
@@ -32,6 +32,9 @@ MASS SPECTROMETER
if(!on)
processing_objects.Remove(src)
return null
+ scan()
+
+/obj/item/device/t_scanner/proc/scan()
for(var/turf/T in range(1, src.loc) )
@@ -269,7 +272,7 @@ MASS SPECTROMETER
if (crit_fail)
user << " This device has critically failed and is no longer functional!"
return
- if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
+ if (!user.IsAdvancedToolUser())
user << " You don't have the dexterity to do this!"
return
if(reagents.total_volume)
diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm
index 200c0a0a855..3945db0dd83 100644
--- a/code/game/objects/items/devices/taperecorder.dm
+++ b/code/game/objects/items/devices/taperecorder.dm
@@ -4,7 +4,9 @@
icon_state = "taperecorder_empty"
item_state = "analyzer"
w_class = 2
+ flags = HEAR
slot_flags = SLOT_BELT
+ languages = ALL //this is a translator, after all.
m_amt = 60
g_amt = 30
force = 2
@@ -89,23 +91,10 @@
icon_state = "taperecorder_idle"
-/obj/item/device/taperecorder/hear_talk(mob/living/M as mob, msg)
+/obj/item/device/taperecorder/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq)
if(mytape && recording)
- var/ending = copytext(msg, length(msg))
mytape.timestamp += mytape.used_capacity
- if(M.stuttering)
- mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] [M.name] stammers, \"[msg]\""
- return
- if(M.getBrainLoss() >= 60)
- mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] [M.name] gibbers, \"[msg]\""
- return
- if(ending == "?")
- mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] [M.name] asks, \"[msg]\""
- return
- else if(ending == "!")
- mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] [M.name] exclaims, \"[msg]\""
- return
- mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] [M.name] says, \"[msg]\""
+ mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] [message]"
/obj/item/device/taperecorder/verb/record()
@@ -194,19 +183,16 @@
break
if(mytape.storedinfo.len < i)
break
- var/turf/T = get_turf(src)
- T.visible_message("Tape Recorder: [mytape.storedinfo[i]]")
+ say(mytape.storedinfo[i])
if(mytape.storedinfo.len < i + 1)
playsleepseconds = 1
sleep(10)
- T = get_turf(src)
- T.visible_message("Tape Recorder: End of recording.")
+ say("End of recording.")
else
playsleepseconds = mytape.timestamp[i + 1] - mytape.timestamp[i]
if(playsleepseconds > 14)
sleep(10)
- T = get_turf(src)
- T.visible_message("Tape Recorder: Skipping [playsleepseconds] seconds of silence")
+ say("Skipping [playsleepseconds] seconds of silence")
playsleepseconds = 1
i++
@@ -299,4 +285,4 @@
//Random colour tapes
/obj/item/device/tape/random/New()
- icon_state = "tape_[pick("white", "blue", "red", "yellow", "purple")]"
\ No newline at end of file
+ icon_state = "tape_[pick("white", "blue", "red", "yellow", "purple")]"
diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm
index 4126181ea89..64951705275 100644
--- a/code/game/objects/items/devices/transfer_valve.dm
+++ b/code/game/objects/items/devices/transfer_valve.dm
@@ -64,11 +64,6 @@
if(!attached_device) return
attached_device.HasProximity(AM)
return
-/obj/item/device/transfer_valve/hear_talk(mob/living/M, msg)
- if(!attached_device) return
- attached_device.hear_talk(M, msg)
- return
-
/obj/item/device/transfer_valve/attack_self(mob/user as mob)
user.set_machine(src)
var/dat = {" Valve properties:
diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm
index 770a1159de5..44913a00a4f 100644
--- a/code/game/objects/items/devices/uplinks.dm
+++ b/code/game/objects/items/devices/uplinks.dm
@@ -9,8 +9,8 @@ A list of items and costs is stored under the datum of every game mode, alongsid
var/list/world_uplinks = list()
/obj/item/device/uplink
- var/welcome // Welcoming menu message
- var/uses // Numbers of crystals
+ var/welcome = "Syndicate Uplink Console:" // Welcoming menu message
+ var/uses = 10 // Numbers of crystals
// List of items not to shove in their hands.
var/purchase_log = ""
var/show_description = null
@@ -22,8 +22,6 @@ var/list/world_uplinks = list()
/obj/item/device/uplink/New()
..()
world_uplinks+=src
- welcome = ticker.mode.uplink_welcome
- uses = ticker.mode.uplink_uses
/obj/item/device/uplink/Destroy()
world_uplinks-=src
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index 4095e31f1b3..3deee5d8cdc 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -253,6 +253,8 @@
else
user << "The MMI must go in after everything else!"
+ if(istype(W,/obj/item/weapon/pen))
+ user << "You need to use a multitool to name [src]."
return
/obj/item/robot_parts/robot_suit/proc/Interact(mob/user)
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index b203f1f3bdd..17e2190d6f6 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -25,9 +25,7 @@
user << "\The [src] cannot be applied to [M]!"
return 1
- if ( ! (istype(user, /mob/living/carbon/human) || \
- istype(user, /mob/living/silicon) || \
- istype(user, /mob/living/carbon/monkey)) )
+ if(!user.IsAdvancedToolUser())
user << "You don't have the dexterity to do this!"
return 1
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index fabece80e32..57d716488b1 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -323,7 +323,7 @@
if(G.amount >= G.max_amount)
continue
G.attackby(NG, user)
- user << "You add the newly-formed glass to the stack. It now contains [NG.amount] sheet\s."
+ user << "You add the newly-formed glass to the stack. It now contains [NG.amount] sheet\s."
qdel(src)
..()
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index b6f782ad1fa..57a6c9f460f 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -34,6 +34,7 @@ Mineral Sheets
var/global/list/datum/stack_recipe/sandstone_recipes = list ( \
new/datum/stack_recipe("pile of dirt", /obj/machinery/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("sandstone door", /obj/structure/mineral_door/sandstone, 10, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("Assistant Statue", /obj/structure/statue/sandstone/assistant, 5, one_per_turf = 1, on_floor = 1), \
/* new/datum/stack_recipe("sandstone wall", ???), \
new/datum/stack_recipe("sandstone floor", ???),\ */
)
@@ -60,6 +61,10 @@ var/global/list/datum/stack_recipe/sandstone_recipes = list ( \
var/global/list/datum/stack_recipe/diamond_recipes = list ( \
new/datum/stack_recipe("diamond door", /obj/structure/mineral_door/transparent/diamond, 10, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("diamond tile", /obj/item/stack/tile/mineral/diamond, 1, 4, 20), \
+ new/datum/stack_recipe("Captain Statue", /obj/structure/statue/diamond/captain, 5, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("AI Hologram Statue", /obj/structure/statue/diamond/ai1, 5, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("AI Core Statue", /obj/structure/statue/diamond/ai2, 5, one_per_turf = 1, on_floor = 1), \
)
/obj/item/stack/sheet/mineral/diamond/New(var/loc, var/amount=null)
@@ -85,6 +90,9 @@ var/global/list/datum/stack_recipe/diamond_recipes = list ( \
var/global/list/datum/stack_recipe/uranium_recipes = list ( \
new/datum/stack_recipe("uranium door", /obj/structure/mineral_door/uranium, 10, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("uranium tile", /obj/item/stack/tile/mineral/uranium, 1, 4, 20), \
+ new/datum/stack_recipe("Nuke Statue", /obj/structure/statue/uranium/nuke, 5, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("Engineer Statue", /obj/structure/statue/uranium/eng, 5, one_per_turf = 1, on_floor = 1), \
)
/obj/item/stack/sheet/mineral/uranium/New(var/loc, var/amount=null)
@@ -110,6 +118,8 @@ var/global/list/datum/stack_recipe/uranium_recipes = list ( \
var/global/list/datum/stack_recipe/plasma_recipes = list ( \
new/datum/stack_recipe("plasma door", /obj/structure/mineral_door/transparent/plasma, 10, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("plasma tile", /obj/item/stack/tile/mineral/plasma, 1, 4, 20), \
+ new/datum/stack_recipe("Scientist Statue", /obj/structure/statue/plasma/scientist, 5, one_per_turf = 1, on_floor = 1), \
)
/obj/item/stack/sheet/mineral/plasma/New(var/loc, var/amount=null)
@@ -135,6 +145,12 @@ var/global/list/datum/stack_recipe/plasma_recipes = list ( \
var/global/list/datum/stack_recipe/gold_recipes = list ( \
new/datum/stack_recipe("golden door", /obj/structure/mineral_door/gold, 10, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("gold tile", /obj/item/stack/tile/mineral/gold, 1, 4, 20), \
+ new/datum/stack_recipe("HoS Statue", /obj/structure/statue/gold/hos, 5, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("HoP Statue", /obj/structure/statue/gold/hop, 5, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("CE Statue", /obj/structure/statue/gold/ce, 5, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("RD Statue", /obj/structure/statue/gold/rd, 5, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("CMO Statue", /obj/structure/statue/gold/cmo, 5, one_per_turf = 1, on_floor = 1), \
)
/obj/item/stack/sheet/mineral/gold/New(var/loc, var/amount=null)
@@ -160,6 +176,12 @@ var/global/list/datum/stack_recipe/gold_recipes = list ( \
var/global/list/datum/stack_recipe/silver_recipes = list ( \
new/datum/stack_recipe("silver door", /obj/structure/mineral_door/silver, 10, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("silver tile", /obj/item/stack/tile/mineral/silver, 1, 4, 20), \
+ new/datum/stack_recipe("Med Officer Statue", /obj/structure/statue/silver/md, 5, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("Janitor Statue", /obj/structure/statue/silver/janitor, 5, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("Sec Officer Statue", /obj/structure/statue/silver/sec, 5, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("Sec Borg Statue", /obj/structure/statue/silver/secborg, 5, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("Med Borg Statue", /obj/structure/statue/silver/medborg, 5, one_per_turf = 1, on_floor = 1), \
)
/obj/item/stack/sheet/mineral/silver/New(var/loc, var/amount=null)
@@ -183,7 +205,13 @@ var/global/list/datum/stack_recipe/silver_recipes = list ( \
origin_tech = "materials=4"
sheettype = "clown"
+var/global/list/datum/stack_recipe/clown_recipes = list ( \
+ new/datum/stack_recipe("bananium tile", /obj/item/stack/tile/mineral/bananium, 1, 4, 20), \
+ new/datum/stack_recipe("Clown Statue", /obj/structure/statue/bananium/clown, 5, one_per_turf = 1, on_floor = 1), \
+ )
+
/obj/item/stack/sheet/mineral/clown/New(var/loc, var/amount=null)
+ recipes = clown_recipes
pixel_x = rand(0,4)-4
pixel_y = rand(0,4)-4
..()
diff --git a/code/game/objects/items/stacks/tiles/tile_mineral.dm b/code/game/objects/items/stacks/tiles/tile_mineral.dm
new file mode 100644
index 00000000000..05177a54409
--- /dev/null
+++ b/code/game/objects/items/stacks/tiles/tile_mineral.dm
@@ -0,0 +1,78 @@
+/obj/item/stack/tile/mineral/plasma
+ name = "plasma tile"
+ singular_name = "plasma floor tile"
+ desc = "A tile made out of highly flammable plasma. This can only end well."
+ icon_state = "tile_plasma"
+ w_class = 3.0
+ force = 1.0
+ throwforce = 1.0
+ throw_speed = 3
+ throw_range = 7
+ max_amount = 60
+ origin_tech = "plasma=1"
+
+/obj/item/stack/tile/mineral/uranium
+ name = "uranium tile"
+ singular_name = "uranium floor tile"
+ desc = "A tile made out of uranium. You feel a bit woozy."
+ icon_state = "tile_uranium"
+ w_class = 3.0
+ force = 1.0
+ throwforce = 1.0
+ throw_speed = 3
+ throw_range = 7
+ max_amount = 60
+ origin_tech = "material=1"
+
+/obj/item/stack/tile/mineral/gold
+ name = "gold tile"
+ singular_name = "gold floor tile"
+ desc = "A tile made out of gold, the swag seems strong here."
+ icon_state = "tile_gold"
+ w_class = 3.0
+ force = 1.0
+ throwforce = 1.0
+ throw_speed = 3
+ throw_range = 7
+ max_amount = 60
+ origin_tech = "material=1"
+
+/obj/item/stack/tile/mineral/silver
+ name = "silver tile"
+ singular_name = "silver floor tile"
+ desc = "A tile made out of silver, the light shining from it is blinding."
+ icon_state = "tile_silver"
+ w_class = 3.0
+ force = 1.0
+ throwforce = 1.0
+ throw_speed = 3
+ throw_range = 7
+ max_amount = 60
+ origin_tech = "material=1"
+
+/obj/item/stack/tile/mineral/diamond
+ name = "diamond tile"
+ singular_name = "diamond floor tile"
+ desc = "A tile made out of diamond. Wow, just, wow."
+ icon_state = "tile_diamond"
+ w_class = 3.0
+ force = 1.0
+ throwforce = 1.0
+ throw_speed = 3
+ throw_range = 7
+ max_amount = 60
+ origin_tech = "material=2"
+
+/obj/item/stack/tile/mineral/bananium
+ name = "bananium tile"
+ singular_name = "bananium floor tile"
+ desc = "A tile made out of bananium, HOOOOOOOOONK!"
+ icon_state = "tile_bananium"
+ w_class = 3.0
+ force = 1.0
+ throwforce = 1.0
+ throw_speed = 3
+ throw_range = 7
+ max_amount = 60
+ origin_tech = "material=1"
+
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 2553ebd372b..756a2884c77 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -152,7 +152,7 @@
/obj/item/toy/gun/afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag)
if (flag)
return
- if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
+ if(!user.IsAdvancedToolUser())
usr << "You don't have the dexterity to do this!"
return
src.add_fingerprint(user)
diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm
index 23243aef5cd..a848cb4dc3f 100644
--- a/code/game/objects/items/weapons/cigs_lighters.dm
+++ b/code/game/objects/items/weapons/cigs_lighters.dm
@@ -269,6 +269,12 @@ CIGARETTE PACKETS ARE IN FANCY.DM
src.pixel_x = rand(-5.0, 5)
src.pixel_y = rand(-5.0, 5)
+/obj/item/clothing/mask/cigarette/rollie/trippy/New()
+ ..()
+ reagents.add_reagent("mushroomhallucinogen", 50)
+ light()
+ //for(var/mob/M in player_list) M << 'sound/misc/Smoke_Weed_Everyday.ogg'
+
/obj/item/weapon/cigbutt/roach
name = "roach"
diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm
index 74e2371756d..48bdca424f6 100644
--- a/code/game/objects/items/weapons/dna_injector.dm
+++ b/code/game/objects/items/weapons/dna_injector.dm
@@ -42,7 +42,7 @@
return
/obj/item/weapon/dnainjector/attack(mob/target, mob/user)
- if(!ishuman(user))
+ if(!user.IsAdvancedToolUser())
user << "You don't have the dexterity to do this!"
return
add_logs(user, target, "attempted to inject", object="[name]")
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index 39cdf599d33..7d8a694085b 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -154,12 +154,6 @@
if(nadeassembly)
nadeassembly.on_found(finder)
-/obj/item/weapon/grenade/chem_grenade/hear_talk(mob/living/M, msg)
- if(nadeassembly)
- nadeassembly.hear_talk(M, msg)
-
-
-
/obj/item/weapon/grenade/chem_grenade/prime()
if(stage != READY)
return
diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm
index ff92bf3ab64..c566f3b347b 100644
--- a/code/game/objects/items/weapons/grenades/flashbang.dm
+++ b/code/game/objects/items/weapons/grenades/flashbang.dm
@@ -8,11 +8,11 @@
/obj/item/weapon/grenade/flashbang/prime()
update_mob()
var/flashbang_turf = get_turf(src)
- for(var/obj/structure/closet/L in view(7, flashbang_turf))
+ for(var/obj/structure/closet/L in get_hear(7, flashbang_turf))
for(var/mob/living/M in L)
bang(get_turf(M), M)
- for(var/mob/living/M in view(7, flashbang_turf))
+ for(var/mob/living/M in hearers(7, flashbang_turf))
bang(get_turf(M), M)
for(var/obj/effect/blob/B in view(8,flashbang_turf)) //Blob damage here
@@ -22,7 +22,7 @@
qdel(src)
/obj/item/weapon/grenade/flashbang/proc/bang(var/turf/T , var/mob/living/M)
- M << "BANG"
+ M.show_message("BANG", 2)
playsound(src.loc, 'sound/effects/bang.ogg', 25, 1)
//Checking for protections
@@ -141,4 +141,4 @@
walk_away(src,temploc,stepdist)
var/dettime = rand(15,60)
spawn(dettime)
- prime()
\ No newline at end of file
+ prime()
diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm
index 2cf82cb10eb..d82736e7200 100644
--- a/code/game/objects/items/weapons/manuals.dm
+++ b/code/game/objects/items/weapons/manuals.dm
@@ -665,7 +665,7 @@
Try to get a fingerprint card of your perp, as if used in the computer, the prints will be completed on their dossier.
Assuming you have enough of a print to see it, grab the biggest complete piece of the print and search the security records for it.
Since you now have both your dossier and the name of the person, print both out as evidence, and get security to nab your baddie.
- Give yourself a pat on the back and a bottle of the ships finest vodka, you did it!.
+ Give yourself a pat on the back and a bottle of the ships finest vodka, you did it!
It really is that easy! Good luck!
diff --git a/code/game/objects/items/weapons/storage/book.dm b/code/game/objects/items/weapons/storage/book.dm
index 3becca92514..59f2a0f6589 100644
--- a/code/game/objects/items/weapons/storage/book.dm
+++ b/code/game/objects/items/weapons/storage/book.dm
@@ -52,7 +52,7 @@
add_logs(user, M, "attacked", object="[src.name]")
- if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
+ if (!user.IsAdvancedToolUser())
user << "You don't have the dexterity to do this!"
return
if(!chaplain)
@@ -127,7 +127,7 @@
user << " You purify [A]."
var/unholy2clean = A.reagents.get_reagent_amount("unholywater")
A.reagents.del_reagent("unholywater")
- A.reagents.add_reagent("cleaner",unholy2clean) //it cleans their soul, get it? I'll get my coat...
+ A.reagents.add_reagent("holywater",unholy2clean)
/obj/item/weapon/storage/book/bible/attackby(obj/item/weapon/W as obj, mob/user as mob)
playsound(src.loc, "rustle", 50, 1, -5)
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index 4507b1e0bb5..b85693e867f 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -33,6 +33,7 @@
if(!foldable)
return
if(contents.len)
+ user << "You can't fold this box with items still inside."
return
if(!ispath(foldable))
return
@@ -537,4 +538,4 @@
new /obj/item/clothing/tie/armband/deputy(src)
new /obj/item/clothing/tie/armband/deputy(src)
new /obj/item/clothing/tie/armband/deputy(src)
- new /obj/item/clothing/tie/armband/deputy(src)
+ new /obj/item/clothing/tie/armband/deputy(src)
diff --git a/code/game/objects/items/weapons/storage/briefcase.dm b/code/game/objects/items/weapons/storage/briefcase.dm
index 94ce4c9fb7b..93a6fdc2679 100644
--- a/code/game/objects/items/weapons/storage/briefcase.dm
+++ b/code/game/objects/items/weapons/storage/briefcase.dm
@@ -4,11 +4,13 @@
icon_state = "briefcase"
flags = CONDUCT
force = 8.0
+ hitsound = "swing_hit"
throw_speed = 2
throw_range = 4
w_class = 4.0
max_w_class = 3
max_combined_w_class = 21
+ attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
/obj/item/weapon/storage/briefcase/New()
..()
diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm
index 7db2d68d5de..212a52cbf18 100644
--- a/code/game/objects/items/weapons/storage/secure.dm
+++ b/code/game/objects/items/weapons/storage/secure.dm
@@ -153,11 +153,13 @@
item_state = "sec-case"
desc = "A large briefcase with a digital locking system."
force = 8.0
+ hitsound = "swing_hit"
throw_speed = 2
throw_range = 4
w_class = 4.0
max_w_class = 3
max_combined_w_class = 21
+ attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
/obj/item/weapon/storage/secure/briefcase/New()
..()
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index bc1466f3ba2..ef98bdcadc4 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -68,7 +68,7 @@
/obj/item/weapon/storage/proc/show_to(mob/user)
- if(user.s_active != src)
+ if(user.s_active != src && (user.stat == CONSCIOUS))
for(var/obj/item/I in src)
if(I.on_found(user))
return
diff --git a/code/game/objects/items/weapons/table_rack_parts.dm b/code/game/objects/items/weapons/table_rack_parts.dm
index d8cbe11c631..ecea8326990 100644
--- a/code/game/objects/items/weapons/table_rack_parts.dm
+++ b/code/game/objects/items/weapons/table_rack_parts.dm
@@ -17,7 +17,7 @@
new /obj/item/stack/sheet/metal( user.loc )
//SN src = null
qdel(src)
- if (istype(W, /obj/item/stack/rods))
+ if (istype(W, /obj/item/stack/rods))
var/obj/item/stack/rods/V = W
if (V.use(4))
new /obj/item/weapon/table_parts/reinforced( user.loc )
@@ -25,12 +25,13 @@
qdel(src)
else
user << "You need four rods to reinforce table parts."
- return
+ return
/obj/item/weapon/table_parts/attack_self(mob/user as mob)
user << "Constructing table.."
if (do_after(user, construct_delay))
- new table_type( user.loc )
+ var/obj/new_table = new table_type( user.loc )
+ new_table.add_fingerprint(user)
user.drop_item()
qdel(src)
return
@@ -93,4 +94,4 @@
R.add_fingerprint(user)
user.drop_item()
qdel(src)
- return
+ return
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index e1add22af0c..0ff49f7cb63 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -176,7 +176,6 @@
item_heal_robotic(H, user, 30, 0)
return
else
- user << "Need more welding fuel!"
return
else
return ..()
@@ -419,16 +418,16 @@
*/
/obj/item/weapon/crowbar
- name = "crowbar"
- desc = "Used to hit floors"
+ name = "pocket crowbar"
+ desc = "A small crowbar. This handy tool is useful for lots of things, such as prying floor tiles or opening unpowered doors."
icon = 'icons/obj/items.dmi'
icon_state = "crowbar"
flags = CONDUCT
slot_flags = SLOT_BELT
- force = 5.0
- throwforce = 7.0
+ force = 5
+ throwforce = 7
item_state = "crowbar"
- w_class = 2.0
+ w_class = 2
m_amt = 50
origin_tech = "engineering=1"
attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked")
@@ -437,3 +436,13 @@
icon = 'icons/obj/items.dmi'
icon_state = "red_crowbar"
item_state = "crowbar_red"
+
+/obj/item/weapon/crowbar/large
+ name = "crowbar"
+ desc = "It's a big crowbar. It doesn't fit in your pockets, because it's big."
+ force = 12
+ w_class = 3
+ throw_speed = 3
+ throw_range = 3
+ m_amt = 66
+ icon_state = "crowbar_large"
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index 3edaf0d1358..1891f5bd801 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -85,6 +85,9 @@
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+/obj/item/weapon/katana/cursed
+ slot_flags = null
+
/obj/item/weapon/katana/suicide_act(mob/user)
user.visible_message("[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.")
return(BRUTELOSS)
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index dac4c8ba93b..f45a8b5766f 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -1,4 +1,5 @@
/obj
+ languages = HUMAN
//var/datum/module/mod //not used
var/m_amt = 0 // metal
var/g_amt = 0 // glass
@@ -126,18 +127,6 @@
/obj/proc/hide(h)
return
-
-/obj/proc/hear_talk(mob/M as mob, text)
-/*
- var/mob/mo = locate(/mob) in src
- if(mo)
- var/rendered = "[M.name]: [text]"
- mo.show_message(rendered, 2)
- */
- return
-
-
-
//If a mob logouts/logins in side of an object you can use this proc
/obj/proc/on_log()
..()
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 1ce6e22f988..9c772d349b2 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -180,11 +180,11 @@
if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
user << "You begin cutting the [src] apart..."
- playsound(loc, 'sound/items/Welder2.ogg', 40, 1)
+ playsound(loc, 'sound/items/Welder.ogg', 40, 1)
if(do_after(user,40,5,1))
if(src.opened)
if(WT.remove_fuel(0,user))
- playsound(loc, 'sound/items/welder.ogg', 50, 1)
+ playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
new /obj/item/stack/sheet/metal(src.loc)
for(var/mob/M in viewers(src))
M.show_message("\The [src] has been cut apart by [user] with \the [WT].", 3, "You hear welding.", 2)
diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm
index bdef9f967bf..ab62e1ee84a 100644
--- a/code/game/objects/structures/door_assembly.dm
+++ b/code/game/objects/structures/door_assembly.dm
@@ -142,8 +142,10 @@ obj/structure/door_assembly/New()
/obj/structure/door_assembly/door_assembly_med
name = "medical airlock assembly"
icon_state = "door_as_med1"
+ glass_base_icon_state = "door_as_gmed"
typetext = "medical"
icontext = "med"
+ glass_type = /obj/machinery/door/airlock/glass_medical
airlock_type = /obj/machinery/door/airlock/medical
anchored = 1
density = 1
@@ -315,6 +317,22 @@ obj/structure/door_assembly/New()
state = 1
mineral = "wood"
+/obj/structure/door_assembly/door_assembly_viro
+ name = "virology airlock assembly"
+ icon_state = "door_as_viro1"
+ glass_base_icon_state = "door_as_gviro"
+ typetext = "virology"
+ icontext = "viro"
+ glass_type = /obj/machinery/door/airlock/glass_virology
+ airlock_type = /obj/machinery/door/airlock/virology
+ anchored = 1
+ density = 1
+ state = 1
+
+/obj/structure/door_assembly/door_assembly_viro/glass
+ mineral = "glass"
+ icon_state = "door_as_gviro1"
+
/obj/structure/door_assembly/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/pen))
var/t = copytext(stripped_input(user, "Enter the name for the door.", src.name, src.created_name),1,MAX_NAME_LEN)
@@ -439,7 +457,6 @@ obj/structure/door_assembly/New()
new M(get_turf(src))
qdel(src)
else
- user << " You need more welding fuel to dissassemble the airlock assembly."
return
else if(istype(W, /obj/item/weapon/wrench) && !anchored )
diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm
index 1a0c2441907..c35f898f96e 100644
--- a/code/game/objects/structures/electricchair.dm
+++ b/code/game/objects/structures/electricchair.dm
@@ -2,7 +2,6 @@
name = "electric chair"
desc = "Looks absolutely SHOCKING!"
icon_state = "echair0"
- var/on = 0
var/obj/item/assembly/shock_kit/part = null
var/last_time = 1.0
@@ -23,20 +22,6 @@
return
return
-/obj/structure/stool/bed/chair/e_chair/verb/toggle()
- set name = "Toggle Electric Chair"
- set category = "Object"
- set src in oview(1)
-
- if(on)
- on = 0
- icon_state = "echair0"
- else
- on = 1
- icon_state = "echair1"
- usr << "You switch [on ? "on" : "off"] [src]."
- return
-
/obj/structure/stool/bed/chair/e_chair/rotate()
..()
overlays.Cut()
@@ -44,8 +29,6 @@
return
/obj/structure/stool/bed/chair/e_chair/proc/shock()
- if(!on)
- return
if(last_time + 50 > world.time)
return
last_time = world.time
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index 46730d0332f..bb0dc4486f6 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -118,7 +118,7 @@
user << "You can't reach, close it first!"
if(istype(W, /obj/item/weapon/pickaxe/plasmacutter) || istype(W, /obj/item/weapon/pickaxe/diamonddrill) || istype(W, /obj/item/weapon/melee/energy/blade))
- dismantle()
+ dismantle(user)
/obj/structure/falsewall/proc/dismantle(mob/user)
user.visible_message("[user] dismantles the false wall.", "You dismantle the false wall.")
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index df18f1b114e..05d2baedd22 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -172,12 +172,14 @@
playsound(loc, 'sound/effects/grillehit.ogg', 80, 1)
health -= W.force * 0.1
else if(!shock(user, 70))
- playsound(loc, 'sound/effects/grillehit.ogg', 80, 1)
switch(W.damtype)
- if("fire")
+ if(BURN)
health -= W.force
- if("brute")
+ playsound(loc, 'sound/items/welder.ogg', 80, 1)
+ if(BRUTE)
health -= W.force * 0.1
+ playsound(loc, 'sound/effects/grillehit.ogg', 80, 1)
+
healthcheck()
..()
return
diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm
index ea89e95dfa6..73c9e58a568 100644
--- a/code/game/objects/structures/lattice.dm
+++ b/code/game/objects/structures/lattice.dm
@@ -59,9 +59,8 @@
var/obj/item/weapon/weldingtool/WT = C
if(WT.remove_fuel(0, user))
user << "Slicing lattice joints ..."
- new /obj/item/stack/rods(src.loc)
- qdel(src)
-
+ new /obj/item/stack/rods(src.loc)
+ qdel(src)
return
/obj/structure/lattice/proc/updateOverlays()
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
index 657acb8b02c..e163f334470 100644
--- a/code/game/objects/structures/mineral_doors.dm
+++ b/code/game/objects/structures/mineral_doors.dm
@@ -249,25 +249,3 @@
for(var/i = 1, i <= oreAmount, i++)
new/obj/item/stack/sheet/mineral/wood(get_turf(src))
qdel(src)
-
-/obj/structure/mineral_door/resin
- mineralType = "resin"
- hardness = 1
- close_delay = 100
- openSound = 'sound/effects/attackblob.ogg'
- closeSound = 'sound/effects/attackblob.ogg'
-
-/obj/structure/mineral_door/resin/TryToSwitchState(atom/user)
- if(isalien(user))
- return ..()
-
-/obj/structure/mineral_door/resin/Dismantle(devastated = 0)
- qdel(src)
-
-/obj/structure/mineral_door/resin/CheckHardness()
- playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
- ..()
-
-/obj/structure/mineral_door/resin/BlockSuperconductivity()
- if(opacity)
- return 1
\ No newline at end of file
diff --git a/code/game/objects/structures/spirit_board.dm b/code/game/objects/structures/spirit_board.dm
new file mode 100644
index 00000000000..cda3b1d422a
--- /dev/null
+++ b/code/game/objects/structures/spirit_board.dm
@@ -0,0 +1,83 @@
+/obj/structure/spirit_board
+ name = "spirit board"
+ desc = "A wooden board with letters etched into it, used in seances."
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "spirit_board"
+ density = 1
+ anchored = 0
+ var/virgin = 1
+ var/cooldown = 0
+ var/planchette = "A"
+ var/lastuser = null
+
+/obj/structure/spirit_board/examine()
+ desc = "[initial(desc)] The planchette is sitting at \"[planchette]\"."
+ ..()
+
+/obj/structure/spirit_board/attack_hand(mob/user as mob)
+ if(..())
+ return
+ spirit_board_pick_letter(user)
+
+
+/obj/structure/spirit_board/attack_ghost(mob/dead/observer/user as mob)
+ spirit_board_pick_letter(user)
+
+
+/obj/structure/spirit_board/proc/spirit_board_pick_letter(var/mob/M)
+ if(!spirit_board_checks(M))
+ return 0
+
+ if(virgin)
+ virgin = 0
+ notify_ghosts("Someone has begun playing with a [src.name] in [get_area(src)]!")
+
+ planchette = input("Choose the letter.", "Seance!") in list("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z")
+ add_logs(M, src, "picked a letter on", addition="which was \"[planchette]\".")
+ cooldown = world.time
+ lastuser = M.ckey
+
+ var/turf/T = loc
+ sleep(rand(20,30))
+ if(T == loc)
+ visible_message("The planchette slowly moves... and stops at the letter \"[planchette]\".")
+
+
+/obj/structure/spirit_board/proc/spirit_board_checks(var/mob/M)
+ //cooldown
+ var/bonus = 0
+ if(M.ckey == lastuser)
+ bonus = 10 //Give some other people a chance, hog.
+
+ if(cooldown > world.time - (30 + bonus))
+ return 0 //No feedback here, hiding the cooldown a little makes it harder to tell who's really picking letters.
+
+ //lighting check
+ var/light_amount = 0
+ var/turf/T = get_turf(src)
+ var/area/A = T.loc
+
+ if(A)
+ if(A.lighting_use_dynamic)
+ light_amount = T.lighting_lumcount
+ else
+ light_amount = 10
+
+ if(light_amount > 2)
+ M << "It's too bright here to use [src.name]!"
+ return 0
+
+ //mobs in range check
+ var/users_in_range = 0
+ for(var/mob/living/L in orange(1,src))
+ if(L.ckey && L.client)
+ if((world.time - L.client.inactivity) < (world.time - 300) || L.stat != CONSCIOUS || L.restrained())//no playing with braindeads or corpses or handcuffed dudes.
+ M << "[L] doesn't seem to be paying attention..."
+ else
+ users_in_range++
+
+ if(users_in_range < 2)
+ M << "There aren't enough people to use the [src.name]!"
+ return 0
+
+ return 1
\ No newline at end of file
diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm
new file mode 100644
index 00000000000..ba98fa3d0de
--- /dev/null
+++ b/code/game/objects/structures/statues.dm
@@ -0,0 +1,276 @@
+
+
+
+/obj/structure/statue
+ name = "Statue"
+ desc = "Placeholder. Yell at Firecage if you SOMEHOW see this."
+ icon = 'icons/obj/statue.dmi'
+ icon_state = ""
+ density = 1
+ anchored = 1
+ var/hardness = 1
+ var/oreAmount = 7
+ var/mineralType = "metal"
+ var/last_event = 0
+ var/active = null
+ var/spam_flag = 0
+
+/obj/structure/statue/Destroy()
+ density = 0
+ ..()
+
+/obj/structure/statue/attackby(obj/item/weapon/W, mob/user)
+ hardness -= W.force/100
+ user << "You hit the [name] with your [W.name]!"
+ CheckHardness()
+
+/obj/structure/statue/attack_hand(mob/user)
+ visible_message("[user] rubs some dust off from the [name]'s surface.")
+
+/obj/structure/statue/CanAtmosPass()
+ return !density
+
+/obj/structure/statue/bullet_act(obj/item/projectile/Proj)
+ hardness -= Proj.damage
+ ..()
+ CheckHardness()
+ return
+
+/obj/structure/statue/proc/CheckHardness()
+ if(hardness <= 0)
+ Dismantle(1)
+
+/obj/structure/statue/proc/Dismantle(devastated = 0)
+ if(!devastated)
+ if (mineralType == "metal")
+ var/ore = /obj/item/stack/sheet/metal
+ for(var/i = 1, i <= oreAmount, i++)
+ new ore(get_turf(src))
+ else
+ var/ore = text2path("/obj/item/stack/sheet/mineral/[mineralType]")
+ for(var/i = 1, i <= oreAmount, i++)
+ new ore(get_turf(src))
+ else
+ if (mineralType == "metal")
+ var/ore = /obj/item/stack/sheet/metal
+ for(var/i = 3, i <= oreAmount, i++)
+ new ore(get_turf(src))
+ else
+ var/ore = text2path("/obj/item/stack/sheet/mineral/[mineralType]")
+ for(var/i = 3, i <= oreAmount, i++)
+ new ore(get_turf(src))
+ qdel(src)
+
+/obj/structure/statue/ex_act(severity = 1)
+ switch(severity)
+ if(1)
+ Dismantle(1)
+ if(2)
+ if(prob(20))
+ Dismantle(1)
+ else
+ hardness--
+ CheckHardness()
+ if(3)
+ hardness -= 0.1
+ CheckHardness()
+ return
+
+//////////////////////////////////////STATUES/////////////////////////////////////////////////////////////
+////////////////////////uranium///////////////////////////////////
+
+/obj/structure/statue/uranium
+ hardness = 3
+ luminosity = 2
+ mineralType = "uranium"
+
+/obj/structure/statue/uranium/nuke
+ name = "Statue of a Nuclear Fission Explosive"
+ desc = "This is a grand statue of a Nuclear Explosive. It has a sickening green colour."
+ icon_state = "nuke"
+
+/obj/structure/statue/uranium/eng
+ name = "Statue of an engineer"
+ desc = "This statue has a sickening green colour."
+ icon_state = "eng"
+
+/obj/structure/statue/uranium/attackby(obj/item/weapon/W, mob/user)
+ radiate()
+ ..()
+
+/obj/structure/statue/uranium/Bumped(atom/user)
+ radiate()
+
+/obj/structure/statue/uranium/attack_hand(mob/user)
+ radiate()
+ ..()
+
+/obj/structure/statue/uranium/attack_paw(mob/user)
+ radiate()
+
+/obj/structure/statue/uranium/proc/radiate()
+ if(!active)
+ if(world.time > last_event+15)
+ active = 1
+ for(var/mob/living/L in range(3,src))
+ L.apply_effect(12,IRRADIATE,0)
+ last_event = world.time
+ active = null
+ return
+ return
+
+////////////////////////////plasma///////////////////////////////////////////////////////////////////////
+
+/obj/structure/statue/plasma
+ hardness = 2
+ mineralType = "plasma"
+ desc = "This statue is suitably made from plasma."
+
+/obj/structure/statue/plasma/scientist
+ name = "Statue of a Scientist"
+ icon_state = "sci"
+
+/obj/structure/statue/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ if(exposed_temperature > 300)
+ PlasmaBurn(exposed_temperature)
+
+
+/obj/structure/statue/plasma/bullet_act(var/obj/item/projectile/Proj)
+ if(istype(Proj,/obj/item/projectile/beam))
+ PlasmaBurn(2500)
+ else if(istype(Proj,/obj/item/projectile/ion))
+ PlasmaBurn(500)
+ ..()
+
+/obj/structure/statue/plasma/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ 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])")
+ ignite(is_hot(W))
+ return
+ ..()
+
+/obj/structure/statue/plasma/proc/PlasmaBurn()
+ atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 400)
+ hardness = 0
+ CheckHardness()
+
+/obj/structure/statue/plasma/proc/ignite(exposed_temperature)
+ if(exposed_temperature > 300)
+ PlasmaBurn(exposed_temperature)
+
+//////////////////////gold///////////////////////////////////////
+
+/obj/structure/statue/gold
+ hardness = 3
+ mineralType = "gold"
+ desc = "This is a highly valuable statue made from gold."
+
+/obj/structure/statue/gold/hos
+ name = "Statue of the Head of Security"
+ icon_state = "hos"
+
+/obj/structure/statue/gold/hop
+ name = "Statue of the Head of Personnel"
+ icon_state = "hop"
+
+/obj/structure/statue/gold/cmo
+ name = "Statue of the Chief Medical Officer"
+ icon_state = "cmo"
+
+/obj/structure/statue/gold/ce
+ name = "Statue of the Chief Engineer"
+ icon_state = "ce"
+
+/obj/structure/statue/gold/rd
+ name = "Statue of the Research Director"
+ icon_state = "rd"
+
+//////////////////////////silver///////////////////////////////////////
+
+/obj/structure/statue/silver
+ hardness = 3
+ mineralType = "silver"
+ desc = "This is a valuable statue made from silver."
+
+/obj/structure/statue/silver/md
+ name = "Statue of a Medical Officer"
+ icon_state = "md"
+
+/obj/structure/statue/silver/janitor
+ name = "Statue of a Janitor"
+ icon_state = "jani"
+
+/obj/structure/statue/silver/sec
+ name = "Statue of a Security Officer"
+ icon_state = "sec"
+
+/obj/structure/statue/silver/secborg
+ name = "Statue of a Security Cyborg"
+ icon_state = "secborg"
+
+/obj/structure/statue/silver/medborg
+ name = "Statue of a Medical Cyborg"
+ icon_state = "medborg"
+
+/////////////////////////diamond/////////////////////////////////////////
+
+/obj/structure/statue/diamond
+ hardness = 10
+ mineralType = "diamond"
+ desc = "This is a very expensive diamond statue"
+
+/obj/structure/statue/diamond/captain
+ name = "Statue of THE Captain."
+ icon_state = "cap"
+
+/obj/structure/statue/diamond/ai1
+ name = "Statue of the AI hologram."
+ icon_state = "ai1"
+
+/obj/structure/statue/diamond/ai2
+ name = "Statue of the AI core."
+ icon_state = "ai2"
+
+////////////////////////bananium///////////////////////////////////////
+
+/obj/structure/statue/bananium
+ hardness = 3
+ mineralType = "clown"
+ desc = "A bananium statue with a small engraving:'HOOOOOOONK'."
+
+/obj/structure/statue/bananium/clown
+ name = "Statue of a clown"
+ icon_state = "clown"
+
+/obj/structure/statue/bananium/Bumped(atom/user)
+ honk()
+
+/obj/structure/statue/bananium/attackby(obj/item/weapon/W, mob/user)
+ honk()
+ ..()
+
+/obj/structure/statue/bananium/attack_hand(mob/user)
+ honk()
+ ..()
+
+/obj/structure/statue/bananium/attack_paw(mob/user)
+ honk()
+
+/obj/structure/statue/bananium/proc/honk()
+ if(spam_flag == 0)
+ spam_flag = 1
+ playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1)
+ spawn(20)
+ spam_flag = 0
+
+/////////////////////sandstone/////////////////////////////////////////
+
+/obj/structure/statue/sandstone
+ hardness = 0.5
+ mineralType = "sandstone"
+
+/obj/structure/statue/sandstone/assistant
+ name = "Statue of an assistant"
+ desc = "A cheap statue of sandstone for a greyshirt."
+ icon_state = "assist"
diff --git a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
index 4512e2b45cc..5428ec16cd3 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
@@ -13,6 +13,7 @@
"[user.name] pulls you free from the gelatinous resin.",\
"You hear squelching...")
buckled_mob.pixel_y = 0
+ buckled_mob.pixel_x = 0
unbuckle()
/obj/structure/stool/bed/nest/unbuckle_myself(mob/user as mob)
@@ -23,6 +24,7 @@
spawn(600)
if(user && buckled_mob && user.buckled == src)
buckled_mob.pixel_y = 0
+ buckled_mob.pixel_x = 0
unbuckle()
/obj/structure/stool/bed/nest/buckle_mob(mob/M as mob, mob/user as mob)
@@ -47,11 +49,17 @@
M.loc = src.loc
M.dir = src.dir
M.update_canmove()
- M.pixel_y = 6
+ M.pixel_y = 1
+ M.pixel_x = 2
src.buckled_mob = M
src.add_fingerprint(user)
+ src.overlays += image('icons/mob/alien.dmi', "nestoverlay", layer=6)
return
+/obj/structure/stool/bed/nest/unbuckle()
+ overlays.Cut()
+ ..()
+
/obj/structure/stool/bed/nest/attackby(obj/item/weapon/W as obj, mob/user as mob)
var/aforce = W.force
health = max(0, health - aforce)
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index a91c555d6bf..d5bf0f371a5 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -262,6 +262,7 @@
while(amt > 0)
I = locate(B) in loc
Deletion.Add(I)
+ I.loc = null //remove it from the table loc so that we don't locate the same item every time (will be relocated inside the crafted item in construct_item())
amt--
break item_loop
else
@@ -286,6 +287,7 @@
if(!istype(B, A))
Deletion.Remove(B)
qdel(B)
+
return Deletion
/obj/structure/table/interact(mob/user)
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 26a0e40042a..0e9c73ac499 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -153,6 +153,7 @@
/obj/machinery/shower/attack_hand(mob/M)
on = !on
update_icon()
+ add_fingerprint(M)
if(on)
for (var/atom/movable/G in loc)
Crossed(G)
@@ -171,7 +172,9 @@
watertemp = "boiling"
if("boiling")
watertemp = "normal"
- user.visible_message("[user] adjusts the shower with the [I].", "You adjust the shower with the [I].")
+ user.visible_message("[user] adjusts the shower with the [I].", "You adjust the shower with the [I] to [watertemp] temperature.")
+ log_game("[key_name(user)] has wrenched a shower to [watertemp] at ([x],[y],[z])")
+ add_hiddenprint(user)
/obj/machinery/shower/update_icon() //this is terribly unreadable, but basically it makes the shower mist up
diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm
index 281594704e1..b9b561e42e8 100644
--- a/code/game/objects/structures/windoor_assembly.dm
+++ b/code/game/objects/structures/windoor_assembly.dm
@@ -89,7 +89,6 @@ obj/structure/windoor_assembly/Destroy()
R.add_fingerprint(user)
qdel(src)
else
- user << "You need more welding fuel to dissassemble the windoor assembly."
return
//Wrenching an unsecure assembly anchors it in place. Step 4 complete
@@ -166,7 +165,7 @@ obj/structure/windoor_assembly/Destroy()
if(do_after(user, 40))
if(!src) return
- user << "You cut the windoor wires.!"
+ user << "You cut the windoor wires!"
new/obj/item/stack/cable_coil(get_turf(user), 1)
src.state = "01"
if(src.secure)
diff --git a/code/game/say.dm b/code/game/say.dm
new file mode 100644
index 00000000000..e7ed32f28f3
--- /dev/null
+++ b/code/game/say.dm
@@ -0,0 +1,157 @@
+/*
+ Miauw's big Say() rewrite.
+ This file has the basic atom/movable level speech procs.
+ And the base of the send_speech() proc, which is the core of saycode.
+*/
+var/list/freqtospan = list(
+ "1351" = "sciradio",
+ "1355" = "medradio",
+ "1357" = "engradio",
+ "1347" = "suppradio",
+ "1349" = "servradio",
+ "1359" = "secradio",
+ "1353" = "comradio",
+ "1447" = "aiprivradio",
+ "1213" = "syndradio",
+ "1441" = "dsquadradio"
+ )
+
+var/list/freqtoname = list(
+ "1351" = "Science",
+ "1353" = "Command",
+ "1355" = "Medical",
+ "1357" = "Engineering",
+ "1359" = "Security",
+ "1441" = "Deathsquad",
+ "1213" = "Syndicate",
+ "1347" = "Supply",
+ "1349" = "Service",
+ "1447" = "AI Private"
+)
+
+/atom/movable/proc/say(message)
+ if(!can_speak())
+ return
+ if(message == "" || !message)
+ return
+ send_speech(message)
+
+/atom/movable/proc/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq)
+ return
+
+/atom/movable/proc/can_speak()
+ return 1
+
+/atom/movable/proc/send_speech(message, range)
+ var/rendered = compose_message(src, languages, message)
+ for(var/atom/movable/AM in get_hearers_in_view(range, src))
+ AM.Hear(rendered, src, languages, message)
+
+/atom/movable/proc/compose_message(atom/movable/speaker, message_langs, raw_message, radio_freq)
+ //This proc uses text() because it is faster than appending strings. Thanks BYOND.
+ //Basic span
+ var/spanpart1 = ""
+ //Start name span.
+ var/spanpart2 = ""
+ //Radio freq/name display
+ var/freqpart = radio_freq ? "\[[get_radio_name(radio_freq)]\] " : ""
+ //Speaker name
+ var/namepart = "[speaker.GetVoice()][speaker.get_alt_name()]"
+ //End name span.
+ var/endspanpart = ""
+ //Message
+ var/messagepart = " [lang_treat(speaker, message_langs, raw_message)]"
+
+ return "[spanpart1][spanpart2][freqpart][compose_track_href(speaker, message_langs, raw_message, radio_freq)][namepart][compose_job(speaker, message_langs, raw_message, radio_freq)][endspanpart][messagepart]"
+
+/atom/movable/proc/compose_track_href(atom/movable/speaker, message_langs, raw_message, radio_freq)
+ return ""
+
+/atom/movable/proc/compose_job(atom/movable/speaker, message_langs, raw_message, radio_freq)
+ return ""
+
+/atom/movable/proc/say_quote(var/text)
+ if(!text)
+ return "says, \"...\"" //not the best solution, but it will stop a large number of runtimes. The cause is somewhere in the Tcomms code
+ var/ending = copytext(text, length(text))
+ if (ending == "?")
+ return "asks, \"[text]\""
+ if (ending == "!")
+ return "exclaims, \"[text]\""
+
+ return "says, \"[text]\""
+
+/atom/movable/proc/lang_treat(atom/movable/speaker, message_langs, raw_message)
+ if(languages & message_langs)
+ var/atom/movable/AM = speaker.GetSource()
+ if(AM)
+ return AM.say_quote(raw_message)
+ else
+ return speaker.say_quote(raw_message)
+ else if(message_langs & HUMAN)
+ var/atom/movable/AM = speaker.GetSource()
+ if(AM)
+ return AM.say_quote(stars(raw_message))
+ else
+ return speaker.say_quote(stars(raw_message))
+ else if(message_langs & MONKEY)
+ return "chimpers."
+ else if(message_langs & ALIEN)
+ return "hisses."
+ else if(message_langs & ROBOT)
+ return "beeps rapidly."
+ else if(message_langs & DRONE)
+ return "chitters."
+ else
+ return "makes a strange sound."
+
+/proc/get_radio_span(freq)
+ var/returntext = freqtospan["[freq]"]
+ if(returntext)
+ return returntext
+ return "radio"
+
+/proc/get_radio_name(freq)
+ var/returntext = radiochannelsreverse["[freq]"]
+ if(returntext)
+ return returntext
+ return "[copytext("[freq]", 1, 4)].[copytext("[freq]", 4, 5)]"
+
+/atom/movable/proc/GetVoice()
+ return name
+
+/atom/movable/proc/IsVocal()
+ return 1
+
+/atom/movable/proc/get_alt_name()
+ return
+
+//these exist mostly to deal with the AIs hrefs and job stuff.
+/atom/movable/proc/GetJob()
+ return
+
+/atom/movable/proc/GetTrack()
+ return
+
+/atom/movable/proc/GetSource()
+ return
+
+/atom/movable/proc/GetRadio()
+
+/atom/movable/virtualspeaker
+ var/job
+ var/faketrack
+ var/atom/movable/source
+ var/obj/item/device/radio/radio
+
+/atom/movable/virtualspeaker/GetJob()
+ return job
+
+/atom/movable/virtualspeaker/GetTrack()
+ return faketrack
+
+/atom/movable/virtualspeaker/GetSource()
+ return source
+
+/atom/movable/virtualspeaker/GetRadio()
+ return radio
diff --git a/code/game/smoothwall.dm b/code/game/smoothwall.dm
index 29800a163e8..e98c839150a 100644
--- a/code/game/smoothwall.dm
+++ b/code/game/smoothwall.dm
@@ -81,6 +81,9 @@
for(var/obj/structure/falsewall/W in range(src,1))
W.relativewall()
W.update_icon()//Refreshes the wall to make sure the icons don't desync
+ for(var/obj/structure/alien/resin/W in range(src,1))
+ W.relativewall()
+ W.update_icon()
return
/turf/simulated/wall/New()
@@ -129,4 +132,17 @@
junction |= get_dir(src,W)
var/turf/simulated/wall/wall = src
wall.icon_state = "[wall.walltype][junction]"
+ return
+
+
+/obj/structure/alien/resin/relativewall()
+
+ var/junction = 0 //will be used to determine from which side the wall is connected to other walls
+
+ for(var/obj/structure/alien/resin/W in orange(src,1))
+ if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
+ junction |= get_dir(src,W)
+ var/obj/structure/alien/resin/resin = src
+ resin.icon_state = "[resin.resintype][junction]"
+
return
\ No newline at end of file
diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm
index 4de300cff1f..8e38ac30808 100644
--- a/code/game/turfs/simulated.dm
+++ b/code/game/turfs/simulated.dm
@@ -33,10 +33,7 @@
overlays -= wet_overlay
/turf/simulated/Entered(atom/A, atom/OL)
- if(movement_disabled && usr.ckey != movement_disabled_exception)
- usr << "Movement is admin-disabled." //This is to identify lag problems
- return
-
+ ..()
if (istype(A,/mob/living/carbon))
var/mob/living/carbon/M = A
if(M.lying) return
@@ -60,7 +57,4 @@
return
if(2) //lube
- M.slip(0, 10, null, (STEP|SLIDE|GALOSHES_DONT_HELP))
-
-
- ..()
\ No newline at end of file
+ M.slip(0, 10, null, (STEP|SLIDE|GALOSHES_DONT_HELP))
\ No newline at end of file
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index 12ef24729a1..4e8ae18a48c 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -17,6 +17,12 @@ var/list/plating_icons = list("plating","platingdmg1","platingdmg2","platingdmg3
"ironsand8", "ironsand9", "ironsand10", "ironsand11",
"ironsand12", "ironsand13", "ironsand14", "ironsand15")
var/list/wood_icons = list("wood","wood-broken")
+var/list/gold_icons = list("gold","gold_dam")
+var/list/silver_icons = list("silver","silver_dam")
+var/list/plasma_icons = list("plasma","plasma_dam")
+var/list/diamond_icons = list("diamond","diamond_dam")
+var/list/uranium_icons = list("uranium","uranium_dam")
+var/list/bananium_icons = list("bananium","bananium_dam")
/turf/simulated/floor
@@ -34,6 +40,7 @@ var/list/wood_icons = list("wood","wood-broken")
var/broken = 0
var/burnt = 0
var/mineral = "metal"
+ var/floortype = "metal"
var/obj/item/stack/tile/floor_tile = new/obj/item/stack/tile/plasteel
@@ -161,6 +168,37 @@ turf/simulated/floor/proc/update_icon()
if( !(icon_state in wood_icons) )
icon_state = "wood"
//world << "[icon_state]y's got [icon_state]"
+
+ else if(is_gold_floor())
+ if(!broken && !burnt)
+ if( !(icon_state in gold_icons) )
+ icon_state = "gold"
+
+ else if(is_silver_floor())
+ if(!broken && !burnt)
+ if( !(icon_state in silver_icons) )
+ icon_state = "silver"
+
+ else if(is_plasma_floor())
+ if(!broken && !burnt)
+ if( !(icon_state in plasma_icons) )
+ icon_state = "plasma"
+
+ else if(is_uranium_floor())
+ if(!broken && !burnt)
+ if( !(icon_state in uranium_icons) )
+ icon_state = "uranium"
+
+ else if(is_diamond_floor())
+ if(!broken && !burnt)
+ if( !(icon_state in diamond_icons) )
+ icon_state = "diamond"
+
+ else if(is_bananium_floor())
+ if(!broken && !burnt)
+ if( !(icon_state in bananium_icons) )
+ icon_state = "bananium"
+
spawn(1)
if(istype(src,/turf/simulated/floor)) //Was throwing runtime errors due to a chance of it changing to space halfway through.
if(air)
@@ -211,19 +249,55 @@ turf/simulated/floor/proc/update_icon()
return 0
/turf/simulated/floor/is_grass_floor()
- if(istype(floor_tile,/obj/item/stack/tile/grass))
+ if(istype(floor_tile, /obj/item/stack/tile/grass))
return 1
else
return 0
/turf/simulated/floor/is_wood_floor()
- if(istype(floor_tile,/obj/item/stack/tile/wood))
+ if(istype(floor_tile, /obj/item/stack/tile/wood))
+ return 1
+ else
+ return 0
+
+/turf/simulated/floor/is_gold_floor()
+ if(istype(floor_tile, /obj/item/stack/tile/mineral/gold))
+ return 1
+ else
+ return 0
+
+/turf/simulated/floor/is_silver_floor()
+ if(istype(floor_tile, /obj/item/stack/tile/mineral/silver))
+ return 1
+ else
+ return 0
+
+/turf/simulated/floor/is_plasma_floor()
+ if(istype(floor_tile, /obj/item/stack/tile/mineral/plasma))
+ return 1
+ else
+ return 0
+
+/turf/simulated/floor/is_uranium_floor()
+ if(istype(floor_tile, /obj/item/stack/tile/mineral/uranium))
+ return 1
+ else
+ return 0
+
+/turf/simulated/floor/is_diamond_floor()
+ if(istype(floor_tile, /obj/item/stack/tile/mineral/diamond))
+ return 1
+ else
+ return 0
+
+/turf/simulated/floor/is_bananium_floor()
+ if(istype(floor_tile, /obj/item/stack/tile/mineral/bananium))
return 1
else
return 0
/turf/simulated/floor/is_carpet_floor()
- if(istype(floor_tile,/obj/item/stack/tile/carpet))
+ if(istype(floor_tile, /obj/item/stack/tile/carpet))
return 1
else
return 0
@@ -256,6 +330,24 @@ turf/simulated/floor/proc/update_icon()
else if(is_grass_floor())
src.icon_state = "sand[pick("1","2","3")]"
broken = 1
+ else if(is_gold_floor())
+ src.icon_state = "gold_dam"
+ broken = 1
+ else if(is_silver_floor())
+ src.icon_state = "silver_dam"
+ broken = 1
+ else if(is_diamond_floor())
+ src.icon_state = "diamond_dam"
+ broken = 1
+ else if(is_bananium_floor())
+ src.icon_state = "bananium_dam"
+ broken = 1
+ else if(is_uranium_floor())
+ src.icon_state = "uranium_dam"
+ broken = 1
+ else if(is_plasma_floor())
+ src.icon_state = "plasma_dam"
+ broken = 1
/turf/simulated/floor/proc/burn_tile()
if(istype(src,/turf/simulated/floor/engine)) return
@@ -279,6 +371,21 @@ turf/simulated/floor/proc/update_icon()
else if(is_grass_floor())
src.icon_state = "sand[pick("1","2","3")]"
burnt = 1
+ else if(is_gold_floor())
+ src.icon_state = "gold_dam"
+ burnt = 1
+ else if(is_silver_floor())
+ src.icon_state = "silver_dam"
+ burnt = 1
+ else if(is_diamond_floor())
+ src.icon_state = "diamond_dam"
+ burnt = 1
+ else if(is_bananium_floor())
+ src.icon_state = "bananium_dam"
+ burnt = 1
+ else if(is_uranium_floor())
+ src.icon_state = "uranium_dam"
+ burnt = 1
//This proc will delete the floor_tile and the update_iocn() proc will then change the icon_state of the turf
//This proc auto corrects the grass tiles' siding.
@@ -342,78 +449,18 @@ turf/simulated/floor/proc/update_icon()
update_icon()
levelupdate()
+/turf/simulated/floor/proc/make_floor(floor_tile, T)
+ broken = 0
+ burnt = 0
+ intact = 1
+ if(T)
+ floor_tile = T
+ update_icon()
+ levelupdate()
+ return
//This proc will make the turf a light floor tile. The expected argument is the tile to make the turf with
//If none is given it will make a new object. dropping or unequipping must be handled before or after calling
//this proc.
-/turf/simulated/floor/proc/make_light_floor(var/obj/item/stack/tile/light/T = null)
- broken = 0
- burnt = 0
- intact = 1
- if(T)
- if(istype(T,/obj/item/stack/tile/light))
- floor_tile = T
- update_icon()
- levelupdate()
- return
- //if you gave a valid parameter, it won't get thisf ar.
- floor_tile = new/obj/item/stack/tile/light
-
- update_icon()
- levelupdate()
-
-//This proc will make a turf into a grass patch. Fun eh? Insert the grass tile to be used as the argument
-//If no argument is given a new one will be made.
-/turf/simulated/floor/proc/make_grass_floor(var/obj/item/stack/tile/grass/T = null)
- broken = 0
- burnt = 0
- intact = 1
- if(T)
- if(istype(T,/obj/item/stack/tile/grass))
- floor_tile = T
- update_icon()
- levelupdate()
- return
- //if you gave a valid parameter, it won't get thisf ar.
- floor_tile = new/obj/item/stack/tile/grass
-
- update_icon()
- levelupdate()
-
-//This proc will make a turf into a wood floor. Fun eh? Insert the wood tile to be used as the argument
-//If no argument is given a new one will be made.
-/turf/simulated/floor/proc/make_wood_floor(var/obj/item/stack/tile/wood/T = null)
- broken = 0
- burnt = 0
- intact = 1
- if(T)
- if(istype(T,/obj/item/stack/tile/wood))
- floor_tile = T
- update_icon()
- levelupdate()
- return
- //if you gave a valid parameter, it won't get thisf ar.
- floor_tile = new/obj/item/stack/tile/wood
-
- update_icon()
- levelupdate()
-
-//This proc will make a turf into a carpet floor. Fun eh? Insert the carpet tile to be used as the argument
-//If no argument is given a new one will be made.
-/turf/simulated/floor/proc/make_carpet_floor(var/obj/item/stack/tile/carpet/T = null)
- broken = 0
- burnt = 0
- intact = 1
- if(T)
- if(istype(T,/obj/item/stack/tile/carpet))
- floor_tile = T
- update_icon()
- levelupdate()
- return
- //if you gave a valid parameter, it won't get thisf ar.
- floor_tile = new/obj/item/stack/tile/carpet
-
- update_icon()
- levelupdate()
/turf/simulated/floor/attackby(obj/item/C as obj, mob/user as mob)
@@ -541,5 +588,3 @@ turf/simulated/floor/proc/update_icon()
icon_state = icon_plating
burnt = 0
broken = 0
- else
- user << "You need more welding fuel to complete this task."
diff --git a/code/game/turfs/simulated/floor_mineral.dm b/code/game/turfs/simulated/floor_mineral.dm
new file mode 100644
index 00000000000..f281fd6c471
--- /dev/null
+++ b/code/game/turfs/simulated/floor_mineral.dm
@@ -0,0 +1,53 @@
+
+/turf/simulated/floor/mineral
+ name = "mineral floor"
+ icon_state = ""
+ var/last_event = 0
+ var/active = null
+
+/turf/simulated/floor/mineral/plasma
+ name = "plasma floor"
+ icon_state = "plasma"
+ mineral = "plasma"
+ floortype = "plasma"
+ floor_tile = new/obj/item/stack/tile/mineral/plasma
+
+/turf/simulated/floor/mineral/gold
+ name = "gold floor"
+ icon_state = "gold"
+ mineral = "gold"
+ floortype = "gold"
+ floor_tile = new/obj/item/stack/tile/mineral/gold
+
+/turf/simulated/floor/mineral/silver
+ name = "silver floor"
+ icon_state = "silver"
+ mineral = "silver"
+ floortype = "silver"
+ floor_tile = new/obj/item/stack/tile/mineral/silver
+
+/turf/simulated/floor/mineral/bananium
+ name = "bananium floor"
+ icon_state = "bananium"
+ mineral = "clown"
+ floortype = "clown"
+ floor_tile = new/obj/item/stack/tile/mineral/bananium
+
+/turf/simulated/floor/mineral/bananium/airless
+ oxygen = 0.01
+ nitrogen = 0.01
+ temperature = TCMB
+
+/turf/simulated/floor/mineral/diamond
+ name = "diamond floor"
+ icon_state = "diamond"
+ mineral = "diamond"
+ floortype = "diamond"
+ floor_tile = new/obj/item/stack/tile/mineral/diamond
+
+/turf/simulated/floor/mineral/uranium
+ name = "uranium floor"
+ icon_state = "uranium"
+ mineral = "uranium"
+ floortype = "uranium"
+ floor_tile = new/obj/item/stack/tile/mineral/uranium
\ No newline at end of file
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index 540c9d2d88f..d18d8c1ca9c 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -146,7 +146,7 @@
/turf/simulated/wall/attackby(obj/item/weapon/W as obj, mob/user as mob)
user.changeNext_move(CLICK_CD_MELEE)
- if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
+ if (!user.IsAdvancedToolUser())
user << "You don't have the dexterity to do this!"
return
@@ -228,7 +228,6 @@
user << "You remove the outer plating."
dismantle_wall()
else
- user << "You need more welding fuel to complete this task."
return
else if( istype(W, /obj/item/weapon/pickaxe/plasmacutter) )
diff --git a/code/game/turfs/simulated/walls_misc.dm b/code/game/turfs/simulated/walls_misc.dm
index b1a06f6e88a..d7dbcb56300 100644
--- a/code/game/turfs/simulated/walls_misc.dm
+++ b/code/game/turfs/simulated/walls_misc.dm
@@ -2,4 +2,18 @@
name = "wall"
desc = "The patterns engraved on the wall seem to shift as you try to focus on them. You feel sick"
icon_state = "cult"
- walltype = "cult"
\ No newline at end of file
+ walltype = "cult"
+
+/turf/simulated/wall/rust
+ name = "rusted wall"
+ desc = "A rusted metal wall."
+ icon_state = "arust"
+ walltype = "arust"
+ hardness = 45
+
+/turf/simulated/wall/r_wall/rust
+ name = "rusted reinforced wall"
+ desc = "A huge chunk of rusted reinforced metal."
+ icon_state = "rrust"
+ walltype = "rrust"
+ hardness = 15
\ No newline at end of file
diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm
index 8126029fc18..7364cc147bc 100644
--- a/code/game/turfs/simulated/walls_reinforced.dm
+++ b/code/game/turfs/simulated/walls_reinforced.dm
@@ -12,7 +12,7 @@
/turf/simulated/wall/r_wall/attackby(obj/item/W as obj, mob/user as mob)
- if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
+ if (!user.IsAdvancedToolUser())
user << "You don't have the dexterity to do this!"
return
@@ -102,8 +102,6 @@
src.d_state = 3
src.icon_state = "r_wall-3"
user << "You press firmly on the cover, dislodging it."
- else
- user << "You need more welding fuel to complete this task."
return
if( istype(W, /obj/item/weapon/pickaxe/plasmacutter) )
@@ -166,8 +164,6 @@
src.icon_state = "r_wall-6"
new /obj/item/stack/rods( src )
user << "The support rods drop out as you cut them loose from the frame."
- else
- user << "You need more welding fuel to complete this task."
return
if( istype(W, /obj/item/weapon/pickaxe/plasmacutter) )
diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm
index 4a595d5f0e7..0273efd720f 100644
--- a/code/game/turfs/space/space.dm
+++ b/code/game/turfs/space/space.dm
@@ -15,216 +15,115 @@
/turf/space/attack_paw(mob/user as mob)
return src.attack_hand(user)
-/turf/space/attackby(obj/item/C as obj, mob/user as mob)
-
- if (istype(C, /obj/item/stack/rods))
+/turf/space/attackby(obj/item/C, mob/user)
+ if(istype(C, /obj/item/stack/rods))
var/obj/item/stack/rods/R = C
var/obj/structure/lattice/L = locate(/obj/structure/lattice, src)
if(L)
user << "There is already a lattice."
return
- if (R.use(1))
+ if(R.use(1))
user << "Constructing support lattice..."
playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
ReplaceWithLattice()
else
user << "You need one rod to build lattice."
- return
return
-
- if (istype(C, /obj/item/stack/tile/plasteel))
+ if(istype(C, /obj/item/stack/tile/plasteel))
var/obj/structure/lattice/L = locate(/obj/structure/lattice, src)
if(L)
var/obj/item/stack/tile/plasteel/S = C
- if (S.use(1))
+ if(S.use(1))
qdel(L)
playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
user << "You build a floor."
S.build(src)
else
user << "You need one floor tile to build a floor."
- return
- return
else
user << "The plating is going to need some support. Place metal rods first."
- return
-
-// Ported from unstable r355
-
-/turf/space/Entered(atom/movable/A as mob|obj)
- if(movement_disabled)
- usr << "Movement is admin-disabled." //This is to identify lag problems
- return
+/turf/space/Entered(atom/movable/A)
..()
- if ((!(A) || src != A.loc)) return
+ if ((!(A) || src != A.loc))
+ return
inertial_drift(A)
- if(ticker && ticker.mode)
+ if (A.x <= TRANSITIONEDGE || A.x >= (world.maxx - TRANSITIONEDGE - 1) || A.y <= TRANSITIONEDGE || A.y >= (world.maxy - TRANSITIONEDGE - 1))
+ var/move_to_z = src.z
+ var/safety = 1
- // Okay, so let's make it so that people can travel z levels but not nuke disks!
- // if(ticker.mode.name == "nuclear emergency") return
- if(A.z > 6) return
- if (A.x <= TRANSITIONEDGE || A.x >= (world.maxx - TRANSITIONEDGE - 1) || A.y <= TRANSITIONEDGE || A.y >= (world.maxy - TRANSITIONEDGE - 1))
- if(istype(A, /obj/effect/meteor))
- qdel(A)
- return
+ while(move_to_z == src.z)
+ var/move_to_z_str = pickweight(accessable_z_levels)
+ move_to_z = text2num(move_to_z_str)
+ safety++
+ if(safety > 10)
+ break
- var/move_to_z = src.z
- var/safety = 1
-
- //Check if it's a mob pulling an object
- var/atom/movable/was_pulling = null
- var/mob/living/MOB = null
- if(isliving(A))
- MOB = A
- if(MOB.pulling)
- was_pulling = MOB.pulling //Store the object to transition later
-
- while(move_to_z == src.z)
- var/move_to_z_str = pickweight(accessable_z_levels)
- move_to_z = text2num(move_to_z_str)
- safety++
- if(safety > 10)
- break
-
- if(!move_to_z)
- return
-
- A.z = move_to_z
-
- if(src.x <= TRANSITIONEDGE)
- A.x = world.maxx - TRANSITIONEDGE - 2
- A.y = rand(TRANSITIONEDGE + 2, world.maxy - TRANSITIONEDGE - 2)
-
- else if (A.x >= (world.maxx - TRANSITIONEDGE - 1))
- A.x = TRANSITIONEDGE + 1
- A.y = rand(TRANSITIONEDGE + 2, world.maxy - TRANSITIONEDGE - 2)
-
- else if (src.y <= TRANSITIONEDGE)
- A.y = world.maxy - TRANSITIONEDGE -2
- A.x = rand(TRANSITIONEDGE + 2, world.maxx - TRANSITIONEDGE - 2)
-
- else if (A.y >= (world.maxy - TRANSITIONEDGE - 1))
- A.y = TRANSITIONEDGE + 1
- A.x = rand(TRANSITIONEDGE + 2, world.maxx - TRANSITIONEDGE - 2)
-
- spawn (0)
- if(was_pulling && MOB) //Carry the object they were pulling over when they transition
- was_pulling.loc = MOB.loc
- MOB.start_pulling(was_pulling)
- if ((A && A.loc))
- A.loc.Entered(A)
-
-/turf/space/proc/Sandbox_Spacemove(atom/movable/A as mob|obj)
- var/cur_x
- var/cur_y
- var/next_x
- var/next_y
- var/target_z
- var/list/y_arr
-
- if(src.x <= 1)
- if(istype(A, /obj/effect/meteor))
- qdel(A)
+ if(!move_to_z)
return
- var/list/cur_pos = src.get_global_map_pos()
- if(!cur_pos) return
- cur_x = cur_pos["x"]
- cur_y = cur_pos["y"]
+ A.z = move_to_z
+
+ if(src.x <= TRANSITIONEDGE)
+ A.x = world.maxx - TRANSITIONEDGE - 2
+ A.y = rand(TRANSITIONEDGE + 2, world.maxy - TRANSITIONEDGE - 2)
+
+ else if (A.x >= (world.maxx - TRANSITIONEDGE - 1))
+ A.x = TRANSITIONEDGE + 1
+ A.y = rand(TRANSITIONEDGE + 2, world.maxy - TRANSITIONEDGE - 2)
+
+ else if (src.y <= TRANSITIONEDGE)
+ A.y = world.maxy - TRANSITIONEDGE -2
+ A.x = rand(TRANSITIONEDGE + 2, world.maxx - TRANSITIONEDGE - 2)
+
+ else if (A.y >= (world.maxy - TRANSITIONEDGE - 1))
+ A.y = TRANSITIONEDGE + 1
+ A.x = rand(TRANSITIONEDGE + 2, world.maxx - TRANSITIONEDGE - 2)
+
+ if(isliving(A))
+ var/mob/living/L = A
+ if(L.pulling)
+ var/turf/T = get_step(L.loc,turn(A.dir, 180))
+ L.pulling.loc = T
+
+/turf/space/proc/Sandbox_Spacemove(atom/movable/A)
+ var/cur_x
+ var/cur_y
+ var/next_x = src.x
+ var/next_y = src.y
+ var/target_z
+ var/list/y_arr
+ var/list/cur_pos = src.get_global_map_pos()
+ if(!cur_pos)
+ return
+ cur_x = cur_pos["x"]
+ cur_y = cur_pos["y"]
+
+ if(src.x <= 1)
next_x = (--cur_x||global_map.len)
y_arr = global_map[next_x]
target_z = y_arr[cur_y]
-/*
- //debug
- world << "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]"
- world << "Target Z = [target_z]"
- world << "Next X = [next_x]"
- //debug
-*/
- if(target_z)
- A.z = target_z
- A.x = world.maxx - 2
- spawn (0)
- if ((A && A.loc))
- A.loc.Entered(A)
+ next_x = world.maxx - 2
else if (src.x >= world.maxx)
- if(istype(A, /obj/effect/meteor))
- qdel(A)
- return
-
- var/list/cur_pos = src.get_global_map_pos()
- if(!cur_pos) return
- cur_x = cur_pos["x"]
- cur_y = cur_pos["y"]
next_x = (++cur_x > global_map.len ? 1 : cur_x)
y_arr = global_map[next_x]
target_z = y_arr[cur_y]
-/*
- //debug
- world << "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]"
- world << "Target Z = [target_z]"
- world << "Next X = [next_x]"
- //debug
-*/
- if(target_z)
- A.z = target_z
- A.x = 3
- spawn (0)
- if ((A && A.loc))
- A.loc.Entered(A)
+ next_x = 3
else if (src.y <= 1)
- if(istype(A, /obj/effect/meteor))
- qdel(A)
- return
- var/list/cur_pos = src.get_global_map_pos()
- if(!cur_pos) return
- cur_x = cur_pos["x"]
- cur_y = cur_pos["y"]
y_arr = global_map[cur_x]
next_y = (--cur_y||y_arr.len)
target_z = y_arr[next_y]
-/*
- //debug
- world << "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]"
- world << "Next Y = [next_y]"
- world << "Target Z = [target_z]"
- //debug
-*/
- if(target_z)
- A.z = target_z
- A.y = world.maxy - 2
- spawn (0)
- if ((A && A.loc))
- A.loc.Entered(A)
-
+ next_y = world.maxy - 2
else if (src.y >= world.maxy)
- if(istype(A, /obj/effect/meteor))
- qdel(A)
- return
- var/list/cur_pos = src.get_global_map_pos()
- if(!cur_pos) return
- cur_x = cur_pos["x"]
- cur_y = cur_pos["y"]
y_arr = global_map[cur_x]
next_y = (++cur_y > y_arr.len ? 1 : cur_y)
target_z = y_arr[next_y]
-/*
- //debug
- world << "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]"
- world << "Next Y = [next_y]"
- world << "Target Z = [target_z]"
- //debug
-*/
- if(target_z)
- A.z = target_z
- A.y = 3
- spawn (0)
- if ((A && A.loc))
- A.loc.Entered(A)
- return
+ next_y = 3
+
+ var/turf/T = locate(next_x, next_y, target_z)
+ A.Move(T)
/turf/space/handle_slip()
return
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 5e74b05aa31..c5a7f9d6c33 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -27,10 +27,8 @@
/turf/New()
..()
- for(var/atom/movable/AM as mob|obj in src)
- spawn( 0 )
- src.Entered(AM)
- return
+ for(var/atom/movable/AM in src)
+ Entered(AM)
return
// Adds the adjacent turfs to the current atmos processing
@@ -50,9 +48,6 @@
return 0
/turf/Enter(atom/movable/mover as mob|obj, atom/forget as mob|obj|turf|area)
- if(movement_disabled && usr.ckey != movement_disabled_exception)
- usr << "Movement is admin-disabled." //This is to identify lag problems
- return
if (!mover)
return 1
// First, make sure it can leave its square
@@ -85,28 +80,7 @@
return 0
return 1 //Nothing found to block so return success!
-/turf/Entered(atom/atom as mob|obj)
- if(movement_disabled)
- usr << "Movement is admin-disabled." //This is to identify lag problems
- return
- ..()
-//vvvvv Infared beam stuff vvvvv
-
- if ((atom && atom.density && !( istype(atom, /obj/effect/beam) )))
- for(var/obj/effect/beam/i_beam/I in src)
- spawn( 0 )
- if (I)
- I.hit()
- break
-
-//^^^^^ Infared beam stuff ^^^^^
-
- if(!istype(atom, /atom/movable))
- return
-
- var/atom/movable/M = atom
-
- var/loopsanity = 100
+/turf/Entered(atom/movable/M)
if(ismob(M))
var/mob/O = M
if(!O.lastarea)
@@ -117,16 +91,13 @@
inertial_drift(O)
else if(!istype(src, /turf/space))
O.inertia_dir = 0
- ..()
- var/objects = 0
- for(var/atom/A as mob|obj|turf|area in range(1))
- if(objects > loopsanity) break
- objects++
- spawn( 0 )
- if ((A && M))
- A.HasProximity(M, 1)
- return
- return
+
+ var/loopsanity = 100
+ for(var/atom/A in range(1))
+ if(loopsanity == 0)
+ break
+ loopsanity--
+ A.HasProximity(M, 1)
/turf/proc/is_plating()
return 0
@@ -140,6 +111,18 @@
return 0
/turf/proc/is_wood_floor()
return 0
+/turf/proc/is_gold_floor()
+ return 0
+/turf/proc/is_silver_floor()
+ return 0
+/turf/proc/is_plasma_floor()
+ return 0
+/turf/proc/is_uranium_floor()
+ return 0
+/turf/proc/is_bananium_floor()
+ return 0
+/turf/proc/is_diamond_floor()
+ return 0
/turf/proc/is_carpet_floor()
return 0
/turf/proc/return_siding_icon_state() //used for grass floors, which have siding.
diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB ban/functions.dm
index 4db35843bbc..7cdce2e281a 100644
--- a/code/modules/admin/DB ban/functions.dm
+++ b/code/modules/admin/DB ban/functions.dm
@@ -127,7 +127,7 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration =
var/sql = "INSERT INTO erro_ban (`id`,`bantime`,`serverip`,`bantype`,`reason`,`job`,`duration`,`rounds`,`expiration_time`,`ckey`,`computerid`,`ip`,`a_ckey`,`a_computerid`,`a_ip`,`who`,`adminwho`,`edits`,`unbanned`,`unbanned_datetime`,`unbanned_ckey`,`unbanned_computerid`,`unbanned_ip`) VALUES (null, Now(), '[serverip]', '[bantype_str]', '[reason]', '[job]', [(duration)?"[duration]":"0"], [(rounds)?"[rounds]":"0"], Now() + INTERVAL [(duration>0) ? duration : 0] MINUTE, '[ckey]', '[computerid]', '[ip]', '[a_ckey]', '[a_computerid]', '[a_ip]', '[who]', '[adminwho]', '', null, null, null, null, null)"
var/DBQuery/query_insert = dbcon.NewQuery(sql)
query_insert.Execute()
- usr << "Ban saved to database."
+ usr << "Ban saved to database."
message_admins("[key_name_admin(usr)] has added a [bantype_str] for [ckey] [(job)?"([job])":""] [(duration > 0)?"([duration] minutes)":""] with the reason: \"[reason]\" to the ban database.",1)
if(announceinirc)
diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm
index b354b25d031..30162e14cdb 100644
--- a/code/modules/admin/IsBanned.dm
+++ b/code/modules/admin/IsBanned.dm
@@ -44,7 +44,7 @@ world/IsBanned(key,address,computer_id)
//Guest Checking
if(!guests_allowed && IsGuestKey(key))
log_access("Failed Login: [key] - Guests not allowed")
- message_admins("Failed Login: [key] - Guests not allowed")
+ message_admins("Failed Login: [key] - Guests not allowed")
return list("reason"="guest", "desc"="\nReason: Guests not allowed. Please sign in with a byond account.")
if(config.ban_legacy_system)
@@ -53,7 +53,7 @@ world/IsBanned(key,address,computer_id)
. = CheckBan( ckey(key), computer_id, address )
if(.)
log_access("Failed Login: [key] [computer_id] [address] - Banned [.["reason"]]")
- message_admins("Failed Login: [key] id:[computer_id] ip:[address] - Banned [.["reason"]]")
+ message_admins("Failed Login: [key] id:[computer_id] ip:[address] - Banned [.["reason"]]")
return .
return ..() //default pager ban stuff
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index bf91c682b69..3f811920e73 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -6,7 +6,6 @@ var/global/floorIsLava = 0
////////////////////////////////
/proc/message_admins(var/msg)
msg = "ADMIN LOG: [msg]"
- log_adminwarn(msg)
admins << msg
@@ -436,6 +435,7 @@ var/global/floorIsLava = 0
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
@@ -489,7 +489,7 @@ var/global/floorIsLava = 0
if(confirm == "Cancel")
return
if(confirm == "Yes")
- world << "Restarting world! Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key]!"
+ world << "Restarting world! Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key]!"
log_admin("[key_name(usr)] initiated a reboot.")
feedback_set_details("end_error","admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]")
@@ -512,7 +512,7 @@ var/global/floorIsLava = 0
if(message)
if(!check_rights(R_SERVER,0))
message = adminscrub(message,500)
- world << "[usr.client.holder.fakekey ? "Administrator" : usr.key] Announces:\n \t [message]"
+ world << "[usr.client.holder.fakekey ? "Administrator" : usr.key] Announces:\n \t [message]"
log_admin("Announce: [key_name(usr)] : [message]")
feedback_add_details("admin_verb","A") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -533,7 +533,7 @@ var/global/floorIsLava = 0
else
message_admins("[key_name(usr)] set the admin notice.")
log_admin("[key_name(usr)] set the admin notice:\n[new_admin_notice]")
- world << "Admin Notice:\n \t [new_admin_notice]"
+ world << "Admin Notice:\n \t [new_admin_notice]"
feedback_add_details("admin_verb","SAN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
admin_notice = new_admin_notice
return
@@ -593,7 +593,7 @@ var/global/floorIsLava = 0
else
world << "New players may now enter the game."
log_admin("[key_name(usr)] toggled new player game entering.")
- message_admins("[key_name_admin(usr)] toggled new player game entering.", 1)
+ message_admins("[key_name_admin(usr)] toggled new player game entering.", 1)
world.update_status()
feedback_add_details("admin_verb","TE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -619,7 +619,7 @@ var/global/floorIsLava = 0
world << "You may now respawn."
else
world << "You may no longer respawn :("
- message_admins("[key_name_admin(usr)] toggled respawn to [abandon_allowed ? "On" : "Off"].", 1)
+ message_admins("[key_name_admin(usr)] toggled respawn to [abandon_allowed ? "On" : "Off"].", 1)
log_admin("[key_name(usr)] toggled respawn to [abandon_allowed ? "On" : "Off"].")
world.update_status()
feedback_add_details("admin_verb","TR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -646,7 +646,7 @@ var/global/floorIsLava = 0
if(!usr.client.holder) return
if( alert("Reboot server?",,"Yes","No") == "No")
return
- world << "Rebooting world! Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key]!"
+ world << "Rebooting world! Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key]!"
log_admin("[key_name(usr)] initiated an immediate reboot.")
feedback_set_details("end_error","immediate admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]")
@@ -760,7 +760,7 @@ var/global/floorIsLava = 0
else
world << "Guests may now enter the game."
log_admin("[key_name(usr)] toggled guests game entering [guests_allowed?"":"dis"]allowed.")
- message_admins("[key_name_admin(usr)] toggled guests game entering [guests_allowed?"":"dis"]allowed.", 1)
+ message_admins("[key_name_admin(usr)] toggled guests game entering [guests_allowed?"":"dis"]allowed.", 1)
feedback_add_details("admin_verb","TGU") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/unjobban_panel()
diff --git a/code/modules/admin/admin_memo.dm b/code/modules/admin/admin_memo.dm
index b3f9e451ee3..18b9b030ed1 100644
--- a/code/modules/admin/admin_memo.dm
+++ b/code/modules/admin/admin_memo.dm
@@ -21,13 +21,15 @@
if(null)
return
if("")
+ message_admins("[src.ckey] removed their own Memo")
+ log_admin("[src.ckey] removed their own Memo")
F.dir.Remove(ckey)
- src << "Memo removed"
return
if( findtext(memo,"
+
+
+
+
+
+
+
+ |
+ Traditional Games Space Station 13
+
+
+ Visit our IRC channel: #tgstation13 on irc.rizon.net
+ |
+
+
+
+
+
+
+ Current Project Maintainers: -Click Here-
+ Currently Active GitHub contributor list: -Click Here-
+ Coders: TLE, NEO, Errorage, muskets, veryinky, Skie, Noise, Numbers, Agouri, Noka, Urist McDorf, Uhangi, Darem, Mport, rastaf0, Doohl, Superxpdude, Rockdtben, ConstantA, Petethegoat, Kor, Polymorph, Carn, Nodrak, Donkie, Sieve, Giacom, Ikarrus, trubble_bass, Aranclanos, Cael_Aislinn, Cheridan, Intigracy, Malkevin, SuperSayu, DumpDavidson, Tastyfish, Yvar, Elo001, Fleure, ManeaterMildred, Miauw, MrPerson
+ Spriters: Agouri, Cheridan, Cruazy Guest, Deeaych, Deuryn, Matty406, Microwave, ShiftyEyesShady, Skie, Uhangi, Veyveyr, Petethegoat, Kor, Ricotez, Ausops, TankNut, Pewtershmitz, Firecage, Nienhaus2
+ Sounds: Skie, Lasty/Vinyl
+ Main Testers: Tenebrosity, Anyone who has submitted a bug to the issue tracker
+ Thanks to: Baystation 12, /vg/station, NTstation, CDK Station devs, FacepunchStation, GoonStation devs, the original SpaceStation developers and Invisty for the title image. Also a thanks to anybody who has contributed who is not listed here :( Ask to be added here on irc.
+ Have a bug to report? Visit our Issue Tracker.
+ Please ensure that the bug has not already been reported and use the template provided here.
+ |
+
+
+
+
diff --git a/icons/mob/alien.dmi b/icons/mob/alien.dmi
index f679da87931..4cefc09930b 100644
Binary files a/icons/mob/alien.dmi and b/icons/mob/alien.dmi differ
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index de5a8113a54..6466f049aed 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/mob/corgi_back.dmi b/icons/mob/corgi_back.dmi
index 2947ea587cb..ced75e39a42 100644
Binary files a/icons/mob/corgi_back.dmi and b/icons/mob/corgi_back.dmi differ
diff --git a/icons/mob/corgi_head.dmi b/icons/mob/corgi_head.dmi
index 411dbb988c7..e9fdbd53072 100644
Binary files a/icons/mob/corgi_head.dmi and b/icons/mob/corgi_head.dmi differ
diff --git a/icons/mob/drone.dmi b/icons/mob/drone.dmi
new file mode 100644
index 00000000000..651fef1519a
Binary files /dev/null and b/icons/mob/drone.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index f5bfde269cb..333ed1fdc92 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index 8ec5f691d2d..47328e6fa81 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ
diff --git a/icons/mob/items_lefthand.dmi b/icons/mob/items_lefthand.dmi
index 6285e998e27..8bbc8d06c3f 100644
Binary files a/icons/mob/items_lefthand.dmi and b/icons/mob/items_lefthand.dmi differ
diff --git a/icons/mob/items_righthand.dmi b/icons/mob/items_righthand.dmi
index 15e87b5f724..afea8e24f3e 100644
Binary files a/icons/mob/items_righthand.dmi and b/icons/mob/items_righthand.dmi differ
diff --git a/icons/mob/screen_alien.dmi b/icons/mob/screen_alien.dmi
index 255a03d9919..8d58cdba6c8 100644
Binary files a/icons/mob/screen_alien.dmi and b/icons/mob/screen_alien.dmi differ
diff --git a/icons/obj/atmospherics/pipe_manifold.dmi b/icons/obj/atmospherics/pipe_manifold.dmi
index a252c8ac8a8..f516eac7da9 100644
Binary files a/icons/obj/atmospherics/pipe_manifold.dmi and b/icons/obj/atmospherics/pipe_manifold.dmi differ
diff --git a/icons/obj/atmospherics/red_pipe.dmi b/icons/obj/atmospherics/red_pipe.dmi
index ff9d9e8a59a..a5a84439efe 100644
Binary files a/icons/obj/atmospherics/red_pipe.dmi and b/icons/obj/atmospherics/red_pipe.dmi differ
diff --git a/icons/obj/contraband.dmi b/icons/obj/contraband.dmi
index c5914bb5876..03f6c8d17f8 100644
Binary files a/icons/obj/contraband.dmi and b/icons/obj/contraband.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 5e66e0549d7..e68aa0b2318 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/doors/door_assembly.dmi b/icons/obj/doors/door_assembly.dmi
index 94b91be6c09..94ed8ac6c2d 100644
Binary files a/icons/obj/doors/door_assembly.dmi and b/icons/obj/doors/door_assembly.dmi differ
diff --git a/icons/obj/doors/doorviro.dmi b/icons/obj/doors/doorviro.dmi
new file mode 100644
index 00000000000..fbf35abdef5
Binary files /dev/null and b/icons/obj/doors/doorviro.dmi differ
diff --git a/icons/obj/doors/doorviroglass.dmi b/icons/obj/doors/doorviroglass.dmi
new file mode 100644
index 00000000000..250a82be855
Binary files /dev/null and b/icons/obj/doors/doorviroglass.dmi differ
diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi
index a2a27697840..b54a3b38536 100644
Binary files a/icons/obj/food.dmi and b/icons/obj/food.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index 95f63945904..985c7403434 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/machines/turret_control.dmi b/icons/obj/machines/turret_control.dmi
new file mode 100644
index 00000000000..b7c81cd923e
Binary files /dev/null and b/icons/obj/machines/turret_control.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index 99650ce656c..201a73b0905 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ
diff --git a/icons/obj/pipes.dmi b/icons/obj/pipes.dmi
index 59909fb6f54..25d15984b4c 100644
Binary files a/icons/obj/pipes.dmi and b/icons/obj/pipes.dmi differ
diff --git a/icons/obj/pipes/heat.dmi b/icons/obj/pipes/heat.dmi
index 6d1ed47e7ef..4b6f4b7b741 100644
Binary files a/icons/obj/pipes/heat.dmi and b/icons/obj/pipes/heat.dmi differ
diff --git a/icons/obj/pipes/junction.dmi b/icons/obj/pipes/junction.dmi
index 70286bde155..88d96929eaa 100644
Binary files a/icons/obj/pipes/junction.dmi and b/icons/obj/pipes/junction.dmi differ
diff --git a/icons/obj/statue.dmi b/icons/obj/statue.dmi
index 46dec2a0033..e598551ae84 100644
Binary files a/icons/obj/statue.dmi and b/icons/obj/statue.dmi differ
diff --git a/icons/obj/wizard.dmi b/icons/obj/wizard.dmi
index 4f8a97b2475..19a83504864 100644
Binary files a/icons/obj/wizard.dmi and b/icons/obj/wizard.dmi differ
diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi
index 19ae3bde070..738a6964f27 100644
Binary files a/icons/turf/areas.dmi and b/icons/turf/areas.dmi differ
diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi
index 54387ecdb04..c72311827d6 100644
Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ
diff --git a/icons/turf/walls.dmi b/icons/turf/walls.dmi
index fc4c615a4b5..9f8eba73a16 100644
Binary files a/icons/turf/walls.dmi and b/icons/turf/walls.dmi differ
diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm
index a63f92049a3..f9153693e70 100644
--- a/interface/stylesheet.dm
+++ b/interface/stylesheet.dm
@@ -54,6 +54,7 @@ h1.alert, h2.alert {color: #000000;}
.info {color: #0000CC;}
.notice {color: #000099;}
.boldnotice {color: #000099; font-weight: bold;}
+.adminnotice {color: #0000ff;}
.unconscious {color: #0000ff; font-weight: bold;}
.suicide {color: #ff5050; font-style: italic;}
diff --git a/sound/AI/aimalf.ogg b/sound/AI/aimalf.ogg
index 50b7688d5ae..b7996916b47 100644
Binary files a/sound/AI/aimalf.ogg and b/sound/AI/aimalf.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index b23315d9131..3476b1b8f90 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -30,6 +30,7 @@
#include "code\__DEFINES\sight.dm"
#include "code\__DEFINES\stat.dm"
#include "code\__HELPERS\_logging.dm"
+#include "code\__HELPERS\cmp.dm"
#include "code\__HELPERS\files.dm"
#include "code\__HELPERS\game.dm"
#include "code\__HELPERS\global_lists.dm"
@@ -44,6 +45,10 @@
#include "code\__HELPERS\time.dm"
#include "code\__HELPERS\type2type.dm"
#include "code\__HELPERS\unsorted.dm"
+#include "code\__HELPERS\sorts\__main.dm"
+#include "code\__HELPERS\sorts\InsertSort.dm"
+#include "code\__HELPERS\sorts\MergeSort.dm"
+#include "code\__HELPERS\sorts\TimSort.dm"
#include "code\_globalvars\configuration.dm"
#include "code\_globalvars\database.dm"
#include "code\_globalvars\game_modes.dm"
@@ -220,7 +225,9 @@
#include "code\game\atoms.dm"
#include "code\game\atoms_movable.dm"
#include "code\game\communications.dm"
+#include "code\game\data_huds.dm"
#include "code\game\dna.dm"
+#include "code\game\say.dm"
#include "code\game\shuttle_engines.dm"
#include "code\game\skincmd.dm"
#include "code\game\smoothwall.dm"
@@ -533,6 +540,7 @@
#include "code\game\objects\items\stacks\sheets\sheets.dm"
#include "code\game\objects\items\stacks\tiles\light.dm"
#include "code\game\objects\items\stacks\tiles\plasteel.dm"
+#include "code\game\objects\items\stacks\tiles\tile_mineral.dm"
#include "code\game\objects\items\stacks\tiles\tile_types.dm"
#include "code\game\objects\items\weapons\AI_modules.dm"
#include "code\game\objects\items\weapons\airlock_painter.dm"
@@ -624,6 +632,7 @@
#include "code\game\objects\structures\OpTable.dm"
#include "code\game\objects\structures\safe.dm"
#include "code\game\objects\structures\signs.dm"
+#include "code\game\objects\structures\statues.dm"
#include "code\game\objects\structures\tables_racks.dm"
#include "code\game\objects\structures\tank_dispenser.dm"
#include "code\game\objects\structures\target_stake.dm"
@@ -668,6 +677,7 @@
#include "code\game\turfs\unsimulated.dm"
#include "code\game\turfs\simulated\dirtystation.dm"
#include "code\game\turfs\simulated\floor.dm"
+#include "code\game\turfs\simulated\floor_mineral.dm"
#include "code\game\turfs\simulated\floor_types.dm"
#include "code\game\turfs\simulated\walls.dm"
#include "code\game\turfs\simulated\walls_mineral.dm"
@@ -844,6 +854,21 @@
#include "code\modules\events\wormholes.dm"
#include "code\modules\events\holiday\halloween.dm"
#include "code\modules\events\holiday\xmas.dm"
+#include "code\modules\events\wizard\aid.dm"
+#include "code\modules\events\wizard\blobies.dm"
+#include "code\modules\events\wizard\curseditems.dm"
+#include "code\modules\events\wizard\departmentrevolt.dm"
+#include "code\modules\events\wizard\fakeexplosion.dm"
+#include "code\modules\events\wizard\ghost.dm"
+#include "code\modules\events\wizard\greentext.dm"
+#include "code\modules\events\wizard\imposter.dm"
+#include "code\modules\events\wizard\invincible.dm"
+#include "code\modules\events\wizard\lava.dm"
+#include "code\modules\events\wizard\magicarp.dm"
+#include "code\modules\events\wizard\petsplosion.dm"
+#include "code\modules\events\wizard\race.dm"
+#include "code\modules\events\wizard\shuffle.dm"
+#include "code\modules\events\wizard\summons.dm"
#include "code\modules\flufftext\Dreaming.dm"
#include "code\modules\flufftext\Hallucination.dm"
#include "code\modules\flufftext\TextFilters.dm"
@@ -939,6 +964,7 @@
#include "code\modules\mob\living\carbon\carbon_defines.dm"
#include "code\modules\mob\living\carbon\emote.dm"
#include "code\modules\mob\living\carbon\inventory.dm"
+#include "code\modules\mob\living\carbon\say.dm"
#include "code\modules\mob\living\carbon\update_icons.dm"
#include "code\modules\mob\living\carbon\alien\alien.dm"
#include "code\modules\mob\living\carbon\alien\alien_defense.dm"
@@ -1034,12 +1060,8 @@
#include "code\modules\mob\living\silicon\ai\freelook\eye.dm"
#include "code\modules\mob\living\silicon\ai\freelook\read_me.dm"
#include "code\modules\mob\living\silicon\ai\freelook\update_triggers.dm"
-#include "code\modules\mob\living\silicon\decoy\death.dm"
-#include "code\modules\mob\living\silicon\decoy\decoy.dm"
-#include "code\modules\mob\living\silicon\decoy\life.dm"
#include "code\modules\mob\living\silicon\pai\death.dm"
#include "code\modules\mob\living\silicon\pai\examine.dm"
-#include "code\modules\mob\living\silicon\pai\hud.dm"
#include "code\modules\mob\living\silicon\pai\life.dm"
#include "code\modules\mob\living\silicon\pai\pai.dm"
#include "code\modules\mob\living\silicon\pai\personality.dm"
@@ -1065,6 +1087,7 @@
#include "code\modules\mob\living\simple_animal\friendly\cat.dm"
#include "code\modules\mob\living\simple_animal\friendly\corgi.dm"
#include "code\modules\mob\living\simple_animal\friendly\crab.dm"
+#include "code\modules\mob\living\simple_animal\friendly\drone.dm"
#include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm"
#include "code\modules\mob\living\simple_animal\friendly\lizard.dm"
#include "code\modules\mob\living\simple_animal\friendly\mouse.dm"
diff --git a/tools/makeChangelog.bat b/tools/makeChangelog.bat
new file mode 100644
index 00000000000..f0646caeca0
--- /dev/null
+++ b/tools/makeChangelog.bat
@@ -0,0 +1,4 @@
+@echo off
+rem Cheridan asked for this. - N3X
+call python ss13_genchangelog.py ../html/changelog.html ../html/changelogs
+pause
\ No newline at end of file
diff --git a/tools/ss13_genchangelog.py b/tools/ss13_genchangelog.py
new file mode 100644
index 00000000000..ff908ba20b6
--- /dev/null
+++ b/tools/ss13_genchangelog.py
@@ -0,0 +1,212 @@
+'''
+Usage:
+ $ python ss13_genchangelog.py [--dry-run] html/changelog.html html/changelogs/
+
+ss13_genchangelog.py - Generate changelog from YAML.
+
+Copyright 2013 Rob "N3X15" Nelson
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+'''
+
+from __future__ import print_function
+import yaml, os, glob, sys, re, time, argparse
+from datetime import datetime, date
+from time import time
+
+today = date.today()
+
+dateformat = "%d %B %Y"
+
+opt = argparse.ArgumentParser()
+opt.add_argument('-d', '--dry-run', dest='dryRun', default=False, action='store_true', help='Only parse changelogs and, if needed, the targetFile. (A .dry_changelog.yml will be output for debugging purposes.)')
+opt.add_argument('targetFile', help='The HTML changelog we wish to update.')
+opt.add_argument('ymlDir', help='The directory of YAML changelogs we will use.')
+
+args = opt.parse_args()
+
+all_changelog_entries = {}
+
+validPrefixes = [
+ 'bugfix',
+ 'wip',
+ 'tweak',
+ 'soundadd',
+ 'sounddel',
+ 'rscdel',
+ 'rscadd',
+ 'imageadd',
+ 'imagedel',
+ 'spellcheck',
+ 'experiment',
+ 'tgs'
+]
+
+def dictToTuples(inp):
+ return [(k, v) for k, v in inp.items()]
+
+changelog_cache = os.path.join(args.ymlDir, '.all_changelog.yml')
+
+failed_cache_read = True
+if os.path.isfile(changelog_cache):
+ try:
+ with open(changelog_cache) as f:
+ (_, all_changelog_entries) = yaml.load_all(f)
+ failed_cache_read = False
+
+ # Convert old timestamps to newer format.
+ new_entries = {}
+ for _date in all_changelog_entries.keys():
+ ty = type(_date).__name__
+ # print(ty)
+ if ty in ['str', 'unicode']:
+ temp_data = all_changelog_entries[_date]
+ _date = datetime.strptime(_date, dateformat).date()
+ new_entries[_date] = temp_data
+ else:
+ new_entries[_date] = all_changelog_entries[_date]
+ all_changelog_entries = new_entries
+ except Exception as e:
+ print("Failed to read cache:")
+ print(e, file=sys.stderr)
+
+if args.dryRun:
+ changelog_cache = os.path.join(args.ymlDir, '.dry_changelog.yml')
+
+if failed_cache_read and os.path.isfile(args.targetFile):
+ from bs4 import BeautifulSoup
+ from bs4.element import NavigableString
+ print(' Generating cache...')
+ with open(args.targetFile, 'r') as f:
+ soup = BeautifulSoup(f)
+ for e in soup.find_all('div', {'class':'commit'}):
+ entry = {}
+ date = datetime.strptime(e.h2.string.strip(), dateformat).date() # key
+ for authorT in e.find_all('h3', {'class':'author'}):
+ author = authorT.string
+ # Strip suffix
+ if author.endswith('updated:'):
+ author = author[:-8]
+ author = author.strip()
+
+ # Find
+ ulT = authorT.next_sibling
+ while(ulT.name != 'ul'):
+ ulT = ulT.next_sibling
+ changes = []
+
+ for changeT in ulT.children:
+ if changeT.name != 'li': continue
+ val = changeT.decode_contents(formatter="html")
+ newdat = {changeT['class'][0] + '': val + ''}
+ if newdat not in changes:
+ changes += [newdat]
+
+ if len(changes) > 0:
+ entry[author] = changes
+ if date in all_changelog_entries:
+ all_changelog_entries[date].update(entry)
+ else:
+ all_changelog_entries[date] = entry
+
+del_after = []
+print('Reading changelogs...')
+for fileName in glob.glob(os.path.join(args.ymlDir, "*.yml")):
+ name, ext = os.path.splitext(os.path.basename(fileName))
+ if name.startswith('.'): continue
+ if name == 'example': continue
+ fileName = os.path.abspath(fileName)
+ print(' Reading {}...'.format(fileName))
+ cl = {}
+ with open(fileName, 'r') as f:
+ cl = yaml.load(f)
+ f.close()
+ if today not in all_changelog_entries:
+ all_changelog_entries[today] = {}
+ author_entries = all_changelog_entries[today].get(cl['author'], [])
+ if len(cl['changes']):
+ new = 0
+ for change in cl['changes']:
+ if change not in author_entries:
+ (change_type, _) = dictToTuples(change)[0]
+ if change_type not in validPrefixes:
+ print(' {0}: Invalid prefix {1}'.format(fileName, change_type), file=sys.stderr)
+ author_entries += [change]
+ new += 1
+ all_changelog_entries[today][cl['author']] = author_entries
+ if new > 0:
+ print(' Added {0} new changelog entries.'.format(new))
+
+ if cl.get('delete-after', False):
+ if os.path.isfile(fileName):
+ if args.dryRun:
+ print(' Would delete {0} (delete-after set)...'.format(fileName))
+ else:
+ del_after += [fileName]
+
+ if args.dryRun: continue
+
+ cl['changes'] = []
+ with open(fileName, 'w') as f:
+ yaml.dump(cl, f, default_flow_style=False)
+
+targetDir = os.path.dirname(args.targetFile)
+
+with open(args.targetFile.replace('.htm', '.dry.htm') if args.dryRun else args.targetFile, 'w') as changelog:
+ with open(os.path.join(targetDir, 'templates', 'header.html'), 'r') as h:
+ for line in h:
+ changelog.write(line)
+
+ for _date in reversed(sorted(all_changelog_entries.keys())):
+ entry_htm = '\n'
+ entry_htm += '\t\t\n'
+ entry_htm += '\t\t\t {date}\n'.format(date=_date.strftime(dateformat))
+ write_entry = False
+ for author in sorted(all_changelog_entries[_date].keys()):
+ if len(all_changelog_entries[_date]) == 0: continue
+ author_htm = '\t\t\t {author} updated:\n'.format(author=author)
+ author_htm += '\t\t\t \n'
+ changes_added = []
+ for (css_class, change) in (dictToTuples(e)[0] for e in all_changelog_entries[_date][author]):
+ if change in changes_added: continue
+ write_entry = True
+ changes_added += [change]
+ author_htm += '\t\t\t\t- {change}
\n'.format(css_class=css_class, change=change.strip())
+ author_htm += '\t\t\t \n'
+ if len(changes_added) > 0:
+ entry_htm += author_htm
+ entry_htm += '\t\t \n'
+ if write_entry:
+ changelog.write(entry_htm)
+
+ with open(os.path.join(targetDir, 'templates', 'footer.html'), 'r') as h:
+ for line in h:
+ changelog.write(line)
+
+
+with open(changelog_cache, 'w') as f:
+ cache_head = 'DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.'
+ yaml.dump_all([cache_head, all_changelog_entries], f, default_flow_style=False)
+
+if len(del_after):
+ print('Cleaning up...')
+ for fileName in del_after:
+ if os.path.isfile(fileName):
+ print(' Deleting {0} (delete-after set)...'.format(fileName))
+ os.remove(fileName)
|