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,"[memo]" message_admins("[key] set an admin memo:
    [memo]") + log_admin("[key] set an admin memo:[memo]") //show all memos /client/proc/admin_memo_show() @@ -35,7 +37,7 @@ var/savefile/F = new(MEMOFILE) if(F) for(var/ckey in F.dir) - src << "

    Admin Memo by [F[ckey]]
    " + src << "
    Admin Memo by [F[ckey]]
    " //delete your own or somebody else's memo /client/proc/admin_memo_delete() @@ -47,8 +49,10 @@ else ckey = src.ckey if(ckey) - F.dir.Remove(ckey) - src << "Removed Memo created by [ckey]." + for(var/memo in F.dir) + message_admins("[src.ckey] removed [ckey]'s Memo.") + log_admin("[src.ckey] removed Memo created by [F[memo]].") + F.dir.Remove(ckey) #undef MEMOFILE -#undef ENABLE_MEMOS \ No newline at end of file +#undef ENABLE_MEMOS diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 96db681687e..5db0a6bc7a0 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -314,7 +314,7 @@ var/list/admin_verbs_hideable = list( mob << "Invisimin off. Invisibility reset." else mob.invisibility = INVISIBILITY_OBSERVER - mob << "Invisimin on. You are now as invisible as a ghost." + mob << "Invisimin on. You are now as invisible as a ghost." /client/proc/player_panel() @@ -419,7 +419,7 @@ var/list/admin_verbs_hideable = list( var/light_impact_range = input("Light impact range (in tiles):") as num var/flash_range = input("Flash range (in tiles):") as num explosion(epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range) - message_admins("[ckey] creating an admin explosion at [epicenter.loc].") + message_admins("[ckey] creating an admin explosion at [epicenter.loc].") feedback_add_details("admin_verb","DB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/give_spell(mob/T as mob in mob_list) @@ -431,7 +431,7 @@ var/list/admin_verbs_hideable = list( return feedback_add_details("admin_verb","GS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] gave [key_name(T)] the spell [S].") - message_admins("[key_name_admin(usr)] gave [key_name(T)] the spell [S].", 1) + message_admins("[key_name_admin(usr)] gave [key_name(T)] the spell [S].", 1) if(T.mind) T.mind.spell_list += new S @@ -449,23 +449,24 @@ var/list/admin_verbs_hideable = list( T.contract_disease(new D, 1) feedback_add_details("admin_verb","GD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] gave [key_name(T)] the disease [D].") - message_admins("[key_name_admin(usr)] gave [key_name(T)] the disease [D].", 1) + message_admins("[key_name_admin(usr)] gave [key_name(T)] the disease [D].", 1) /client/proc/make_sound(var/obj/O in world) set category = "Special Verbs" - set name = "Make Sound" - set desc = "Display a message to everyone who can hear the target" - if(O) - var/message = input("What do you want the message to be?", "Make Sound") as text|null + set name = "Osay" + set desc = "Makes an object say something." + if(istype(O)) + var/message = input("What do you want the message to be?", "Make Sound") as text | null if(!message) return - for (var/mob/V in hearers(O)) - V.show_message(message, 2) - log_admin("[key_name(usr)] made [O] at [O.x], [O.y], [O.z]. make a sound") - message_admins("[key_name_admin(usr)] made [O] at [O.x], [O.y], [O.z]. make a sound", 1) + var/templanguages = O.languages + O.languages |= ALL + O.say(message) + O.languages = templanguages + log_admin("[key_name(usr)] made [O] at [O.x], [O.y], [O.z] say [message]") + message_admins("[key_name_admin(usr)] made [O] at [O.x], [O.y], [O.z]. say [message]", 1) feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - /client/proc/togglebuildmodeself() set name = "Toggle Build Mode Self" set category = "Special Verbs" @@ -496,7 +497,7 @@ var/list/admin_verbs_hideable = list( usr << "Disabled air processing." feedback_add_details("admin_verb","KA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] used 'kill air'.") - message_admins("[key_name_admin(usr)] used 'kill air'.", 1) + message_admins("[key_name_admin(usr)] used 'kill air'.", 1) /client/proc/deadmin_self() set name = "De-admin self" diff --git a/code/modules/admin/permissionverbs/permissionedit.dm b/code/modules/admin/permissionverbs/permissionedit.dm index 08b71af162f..0112aedabd8 100644 --- a/code/modules/admin/permissionverbs/permissionedit.dm +++ b/code/modules/admin/permissionverbs/permissionedit.dm @@ -87,14 +87,14 @@ insert_query.Execute() var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.`erro_admin_log` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Added new admin [adm_ckey] to rank [new_rank]');") log_query.Execute() - usr << "New admin added." + usr << "New admin added." else if(!isnull(admin_id) && isnum(admin_id)) var/DBQuery/insert_query = dbcon.NewQuery("UPDATE `erro_admin` SET rank = '[new_rank]' WHERE id = [admin_id]") insert_query.Execute() var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.`erro_admin_log` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Edited the rank of [adm_ckey] to [new_rank]');") log_query.Execute() - usr << "Admin rank changed." + usr << "Admin rank changed." /datum/admins/proc/log_admin_permission_modification(var/adm_ckey, var/new_permission) diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index ef4ef122644..0c85ba713a6 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -368,7 +368,7 @@ if (ticker && ticker.current_state >= GAME_STATE_PLAYING) var/dat = "Round Status

    Round Status

    " dat += "Current Game Mode: [ticker.mode.name]
    " - dat += "Round Duration: [round(world.time / 36000)]:[add_zero(world.time / 600 % 60, 2)]:[world.time / 100 % 6][world.time / 100 % 10]
    " + dat += "Round Duration: [round(world.time / 36000)]:[add_zero("[world.time / 600 % 60]", 2)]:[world.time / 100 % 6][world.time / 100 % 10]
    " dat += "Emergency shuttle
    " if (!emergency_shuttle.online) dat += "Call Shuttle
    " diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 5cdf733f71c..01687037f7d 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -2,7 +2,7 @@ ..() if(usr.client != src.owner || !check_rights(0)) - world << "[usr.key] has attempted to override the admin panel!" + world << "[usr.key] has attempted to override the admin panel!" log_admin("[key_name(usr)] tried to use the admin panel without authorization.") return @@ -185,9 +185,8 @@ if ((!( ticker ) || emergency_shuttle.location)) return emergency_shuttle.incall() - priority_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.", null,'sound/AI/shuttlecalled.ogg', "Priority") log_admin("[key_name(usr)] called the Emergency Shuttle") - message_admins("[key_name_admin(usr)] called the Emergency Shuttle to the station", 1) + message_admins("[key_name_admin(usr)] called the Emergency Shuttle to the station", 1) if("2") if ((!( ticker ) || emergency_shuttle.location || emergency_shuttle.direction == 0)) @@ -195,13 +194,12 @@ switch(emergency_shuttle.direction) if(-1) emergency_shuttle.incall() - priority_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.", null, 'sound/AI/shuttlerecalled.ogg', "Priority") log_admin("[key_name(usr)] called the Emergency Shuttle") - message_admins("[key_name_admin(usr)] called the Emergency Shuttle to the station", 1) + message_admins("[key_name_admin(usr)] called the Emergency Shuttle to the station", 1) if(1) emergency_shuttle.recall() log_admin("[key_name(usr)] sent the Emergency Shuttle back") - message_admins("[key_name_admin(usr)] sent the Emergency Shuttle back", 1) + message_admins("[key_name_admin(usr)] sent the Emergency Shuttle back", 1) href_list["secretsadmin"] = "check_antagonist" @@ -211,7 +209,7 @@ emergency_shuttle.settimeleft( input("Enter new shuttle duration (seconds):","Edit Shuttle Timeleft", emergency_shuttle.timeleft() ) as num ) log_admin("[key_name(usr)] edited the Emergency Shuttle's timeleft to [emergency_shuttle.timeleft()]") minor_announce("The emergency shuttle will reach its destination in [round(emergency_shuttle.timeleft()/60)] minutes.") - message_admins("[key_name_admin(usr)] edited the Emergency Shuttle's timeleft to [emergency_shuttle.timeleft()]", 1) + message_admins("[key_name_admin(usr)] edited the Emergency Shuttle's timeleft to [emergency_shuttle.timeleft()]", 1) href_list["secretsadmin"] = "check_antagonist" else if(href_list["delay_round_end"]) @@ -219,7 +217,7 @@ ticker.delay_end = !ticker.delay_end log_admin("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].") - message_admins("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) + message_admins("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) href_list["secretsadmin"] = "check_antagonist" else if(href_list["simplemake"]) @@ -236,7 +234,7 @@ if("Yes") delmob = 1 log_admin("[key_name(usr)] has used rudimentary transformation on [key_name(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]") - message_admins("[key_name_admin(usr)] has used rudimentary transformation on [key_name_admin(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]", 1) + message_admins("[key_name_admin(usr)] has used rudimentary transformation on [key_name_admin(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]", 1) switch(href_list["simplemake"]) if("observer") M.change_mob_type( /mob/dead/observer , null, null, delmob ) @@ -316,7 +314,7 @@ log_admin("[key_name(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]") ban_unban_log_save("[key_name(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]") - message_admins("[key_name_admin(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]", 1) + message_admins("[key_name_admin(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]", 1) Banlist.cd = "/base/[banfolder]" Banlist["reason"] << reason Banlist["temp"] << temp @@ -352,7 +350,7 @@ feedback_inc("ban_appearance_unban", 1) DB_ban_unban(M.ckey, BANTYPE_APPEARANCE) appearance_unban(M) - message_admins("[key_name_admin(usr)] removed [key_name_admin(M)]'s appearance ban", 1) + message_admins("[key_name_admin(usr)] removed [key_name_admin(M)]'s appearance ban", 1) M << "[usr.client.ckey] has removed your appearance ban." else switch(alert("Appearance ban [M.ckey]?",,"Yes","No", "Cancel")) @@ -366,7 +364,7 @@ DB_ban_record(BANTYPE_APPEARANCE, M, -1, reason) appearance_fullban(M, "[reason]; By [usr.ckey] on [time2text(world.realtime)]") notes_add(M.ckey, "Appearance banned - [reason]") - message_admins("[key_name_admin(usr)] appearance banned [key_name_admin(M)]", 1) + message_admins("[key_name_admin(usr)] appearance banned [key_name_admin(M)]", 1) M << "You have been appearance banned by [usr.client.ckey]." M << "The reason is: [reason]" M << "Appearance ban can be lifted only upon request." @@ -724,7 +722,7 @@ else msg += ", [job]" notes_add(M.ckey, "Banned from [msg] - [reason]") - message_admins("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg] for [mins] minutes", 1) + message_admins("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg] for [mins] minutes", 1) M << "You have been jobbanned by [usr.client.ckey] from: [msg]." M << "The reason is: [reason]" M << "This jobban will be lifted in [mins] minutes." @@ -744,7 +742,7 @@ if(!msg) msg = job else msg += ", [job]" notes_add(M.ckey, "Banned from [msg] - [reason]") - message_admins("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg]", 1) + message_admins("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg]", 1) M << "You have been jobbanned by [usr.client.ckey] from: [msg]." M << "The reason is: [reason]" M << "Jobban can be lifted only upon request." @@ -777,7 +775,7 @@ else continue if(msg) - message_admins("[key_name_admin(usr)] unbanned [key_name_admin(M)] from [msg]", 1) + message_admins("[key_name_admin(usr)] unbanned [key_name_admin(M)] from [msg]", 1) M << "You have been un-jobbanned by [usr.client.ckey] from [msg]." href_list["jobban2"] = 1 // lets it fall through and refresh return 1 @@ -790,7 +788,7 @@ return M << "You have been kicked from the server." log_admin("[key_name(usr)] booted [key_name(M)].") - message_admins("[key_name_admin(usr)] booted [key_name_admin(M)].", 1) + message_admins("[key_name_admin(usr)] booted [key_name_admin(M)].", 1) //M.client = null del(M.client) @@ -814,7 +812,7 @@ if(t) if((alert("Do you want to unjobban [t]?","Unjobban confirmation", "Yes", "No") == "Yes") && t) //No more misclicks! Unless you do it twice. log_admin("[key_name(usr)] removed [t]") - message_admins("[key_name_admin(usr)] removed [t]", 1) + message_admins("[key_name_admin(usr)] removed [t]", 1) jobban_remove(t) href_list["ban"] = 1 // lets it fall through and refresh var/t_split = text2list(t, " - ") @@ -851,7 +849,7 @@ else M << "No ban appeals URL has been set." log_admin("[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") - message_admins("usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") + message_admins("[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") del(M.client) //qdel(M) // See no reason why to delete mob. Important stuff can be lost. And ban can be lifted before round ends. @@ -873,7 +871,7 @@ M << "No ban appeals URL has been set." ban_unban_log_save("[usr.client.ckey] has permabanned [M.ckey]. - Reason: [reason] - This is a permanent ban.") log_admin("[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban.") - message_admins("usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban.") + message_admins("[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban.") feedback_inc("ban_perma",1) DB_ban_record(BANTYPE_PERMA, M, -1, reason) @@ -933,8 +931,8 @@ return alert(usr, "The game has already started.", null, null, null, null) master_mode = href_list["c_mode2"] log_admin("[key_name(usr)] set the mode as [master_mode].") - message_admins("[key_name_admin(usr)] set the mode as [master_mode].", 1) - world << "The mode is now: [master_mode]" + message_admins("[key_name_admin(usr)] set the mode as [master_mode].", 1) + world << "The mode is now: [master_mode]" Game() // updates the main game menu world.save_mode(master_mode) .(href, list("c_mode"=1)) @@ -948,7 +946,7 @@ return alert(usr, "The game mode has to be secret!", null, null, null, null) secret_force_mode = href_list["f_secret2"] log_admin("[key_name(usr)] set the forced secret mode as [secret_force_mode].") - message_admins("[key_name_admin(usr)] set the forced secret mode as [secret_force_mode].", 1) + message_admins("[key_name_admin(usr)] set the forced secret mode as [secret_force_mode].", 1) Game() // updates the main game menu .(href, list("f_secret"=1)) @@ -961,7 +959,7 @@ return log_admin("[key_name(usr)] attempting to monkeyize [key_name(H)]") - message_admins("[key_name_admin(usr)] attempting to monkeyize [key_name_admin(H)]", 1) + message_admins("[key_name_admin(usr)] attempting to monkeyize [key_name_admin(H)]", 1) H.monkeyize() else if(href_list["humanone"]) @@ -973,7 +971,7 @@ return log_admin("[key_name(usr)] attempting to humanize [key_name(Mo)]") - message_admins("[key_name_admin(usr)] attempting to humanize [key_name_admin(Mo)]", 1) + message_admins("[key_name_admin(usr)] attempting to humanize [key_name_admin(Mo)]", 1) Mo.humanize() else if(href_list["corgione"]) @@ -985,7 +983,7 @@ return log_admin("[key_name(usr)] attempting to corgize [key_name(H)]") - message_admins("[key_name_admin(usr)] attempting to corgize [key_name_admin(H)]", 1) + message_admins("[key_name_admin(usr)] attempting to corgize [key_name_admin(H)]", 1) H.corgize() @@ -1001,7 +999,7 @@ M.say(speech) speech = sanitize(speech) // Nah, we don't trust them log_admin("[key_name(usr)] forced [key_name(M)] to say: [speech]") - message_admins("[key_name_admin(usr)] forced [key_name_admin(M)] to say: [speech]") + message_admins("[key_name_admin(usr)] forced [key_name_admin(M)] to say: [speech]") else if(href_list["sendtoprison"]) if(!check_rights(R_ADMIN)) return @@ -1018,7 +1016,7 @@ return M.loc = pick(prisonwarp) - M << "You have been sent to Prison!" + M << "You have been sent to Prison!" log_admin("[key_name(usr)] has sent [key_name(M)] to Prison!") message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] Prison!", 1) @@ -1047,7 +1045,7 @@ sleep(5) M.loc = pick(tdome1) spawn(50) - M << "You have been sent to the Thunderdome." + M << "You have been sent to the Thunderdome." log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Team 1)") message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the thunderdome. (Team 1)", 1) @@ -1076,7 +1074,7 @@ sleep(5) M.loc = pick(tdome2) spawn(50) - M << "You have been sent to the Thunderdome." + M << "You have been sent to the Thunderdome." log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Team 2)") message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the thunderdome. (Team 2)", 1) @@ -1098,7 +1096,7 @@ sleep(5) M.loc = pick(tdomeadmin) spawn(50) - M << "You have been sent to the Thunderdome." + M << "You have been sent to the Thunderdome." log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Admin.)") message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the thunderdome. (Admin.)", 1) @@ -1131,7 +1129,7 @@ sleep(5) M.loc = pick(tdomeobserve) spawn(50) - M << " You have been sent to the Thunderdome." + M << " You have been sent to the Thunderdome." log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Observer.)") message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the thunderdome. (Observer.)", 1) @@ -1349,7 +1347,7 @@ log_admin("[key_name(H)] got their cookie, spawned by [key_name(src.owner)]") message_admins("[key_name(H)] got their cookie, spawned by [key_name(src.owner)]") feedback_inc("admin_cookies_spawned",1) - H << "Your prayers have been answered!! You received the best cookie!" + H << "Your prayers have been answered!! You received the best cookie!" else if(href_list["BlueSpaceArtillery"]) if(!check_rights(R_ADMIN|R_FUN)) return @@ -1617,6 +1615,15 @@ spawn(0) H.monkeyize() ok = 1 + if("allspecies") + var/result = input(usr, "Please choose a new species","Species") as null|anything in species_list + if(result) + log_admin("[key_name(usr)] turned all humans into [result]", 1) + message_admins("\blue [key_name_admin(usr)] turned all humans into [result]", 1) + var/newtype = species_list[result] + for(var/mob/living/carbon/human/H in mob_list) + H.dna.species = new newtype() + H.regenerate_icons() if("corgi") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","M") @@ -1638,19 +1645,19 @@ feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","P") log_admin("[key_name(usr)] made all areas powered", 1) - message_admins("[key_name_admin(usr)] made all areas powered", 1) + message_admins("[key_name_admin(usr)] made all areas powered", 1) power_restore() if("unpower") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","UP") log_admin("[key_name(usr)] made all areas unpowered", 1) - message_admins("[key_name_admin(usr)] made all areas unpowered", 1) + message_admins("[key_name_admin(usr)] made all areas unpowered", 1) power_failure() if("quickpower") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","QP") log_admin("[key_name(usr)] made all SMESs powered", 1) - message_admins("[key_name_admin(usr)] made all SMESs powered", 1) + message_admins("[key_name_admin(usr)] made all SMESs powered", 1) power_restore_quick() if("traitor_all") if(!ticker) @@ -1686,7 +1693,7 @@ A.mind.objectives += new_objective ticker.mode.greet_traitor(A.mind) ticker.mode.finalize_traitor(A.mind) - message_admins("[key_name_admin(usr)] used everyone is a traitor secret. Objective is [objective]", 1) + message_admins("[key_name_admin(usr)] used everyone is a traitor secret. Objective is [objective]", 1) log_admin("[key_name(usr)] used everyone is a traitor secret. Objective is [objective]") if("togglebombcap") feedback_inc("admin_secrets_fun_used",1) @@ -1822,11 +1829,11 @@ if("guns") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","SG") - usr.rightandwrong(0) + rightandwrong(0, usr) if("magic") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","SM") - usr.rightandwrong(1) + rightandwrong(1, usr) if("dorf") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","DF") diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 309c8106b5c..09e3cc4484c 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -85,7 +85,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," if(!mob) return //this doesn't happen var/ref_mob = "\ref[mob]" - msg = "HELP: [key_name(src, 1)] (?) (PP) (VV) (SM) (JMP) (CA) [ai_found ? " (CL)" : ""]: [msg]" + msg = "HELP: [key_name(src, 1)] (?) (PP) (VV) (SM) (JMP) (CA) [ai_found ? " (CL)" : ""]: [msg]" //send this msg to all admins var/admin_number_total = 0 //Total number of admins @@ -108,7 +108,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," X << msg //show it to the person adminhelping too - src << "PM to-Admins: [original_msg]" + src << "PM to-Admins: [original_msg]" var/admin_number_present = admin_number_total - admin_number_decrease //Number of admins who are neither afk nor invalid log_admin("HELP: [key_name(src)]: [original_msg] - heard by [admin_number_present] non-AFK admins who have +BAN.") diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index b8300e665e4..91cf7d75fb6 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -244,7 +244,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M:Alienize() feedback_add_details("admin_verb","MKAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] made [key_name(M)] into an alien.") - message_admins("[key_name_admin(usr)] made [key_name(M)] into an alien.", 1) + message_admins("[key_name_admin(usr)] made [key_name(M)] into an alien.", 1) else alert("Invalid mob") @@ -261,7 +261,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M:slimeize() feedback_add_details("admin_verb","MKMET") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] made [key_name(M)] into a slime.") - message_admins("[key_name_admin(usr)] made [key_name(M)] into a slime.", 1) + message_admins("[key_name_admin(usr)] made [key_name(M)] into a slime.", 1) else alert("Invalid mob") @@ -487,7 +487,7 @@ var/global/list/g_fancy_list_of_safe_types = null alert("Invalid mob") feedback_add_details("admin_verb","GFA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(src)] has granted [M.key] full access.") - message_admins("[key_name_admin(usr)] has granted [M.key] full access.", 1) + message_admins("[key_name_admin(usr)] has granted [M.key] full access.", 1) /client/proc/cmd_assume_direct_control(var/mob/M in mob_list) set category = "Admin" @@ -500,7 +500,7 @@ var/global/list/g_fancy_list_of_safe_types = null else var/mob/dead/observer/ghost = new/mob/dead/observer(M,1) ghost.ckey = M.ckey - message_admins("[key_name_admin(usr)] assumed direct control of [M].", 1) + message_admins("[key_name_admin(usr)] assumed direct control of [M].", 1) log_admin("[key_name(usr)] assumed direct control of [M].") var/mob/adminmob = src.mob M.ckey = src.ckey @@ -1005,7 +1005,7 @@ var/global/list/g_fancy_list_of_safe_types = null M.regenerate_icons() log_admin("[key_name(usr)] changed the equipment of [key_name(M)] to [dresscode].") - message_admins("[key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode]..", 1) + message_admins("[key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode]..", 1) return /client/proc/startSinglo() diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index eb4c446ec01..f03402416fb 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -12,7 +12,7 @@ if(T.active_hotspot) burning = 1 - usr << "@[target.x],[target.y]: O:[GM.oxygen] T:[GM.toxins] N:[GM.nitrogen] C:[GM.carbon_dioxide] w [GM.temperature] Kelvin, [GM.return_pressure()] kPa [(burning)?("\red BURNING"):(null)]" + usr << "@[target.x],[target.y]: O:[GM.oxygen] T:[GM.toxins] N:[GM.nitrogen] C:[GM.carbon_dioxide] w [GM.temperature] Kelvin, [GM.return_pressure()] kPa [(burning)?("\red BURNING"):(null)]" for(var/datum/gas/trace_gas in GM.trace_gases) usr << "[trace_gas.type]: [trace_gas.moles]" feedback_add_details("admin_verb","DAST") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/getlogs.dm b/code/modules/admin/verbs/getlogs.dm index e71244b9c25..4dafcd58c9d 100644 --- a/code/modules/admin/verbs/getlogs.dm +++ b/code/modules/admin/verbs/getlogs.dm @@ -106,6 +106,5 @@ else src << "Error: view_atk_log(): File not found/Invalid path([path])." return - usr << run( file(path) ) feedback_add_details("admin_verb","SSAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index efe38fa2172..5eee72c78c3 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -143,7 +143,6 @@ var/intercom_range_display_status = 0 src.verbs += /client/proc/kill_pipe_processing src.verbs += /client/proc/kill_air_processing src.verbs += /client/proc/disable_communication - src.verbs += /client/proc/disable_movement src.verbs += /client/proc/print_pointers src.verbs += /client/proc/count_movable_instances src.verbs += /client/proc/SDQL2_query @@ -267,18 +266,4 @@ var/global/say_disabled = 0 if(say_disabled) message_admins("[src.ckey] used 'Disable all communication verbs', killing all communication methods.") else - message_admins("[src.ckey] used 'Disable all communication verbs', restoring all communication methods.") - -//This proc is intended to detect lag problems relating to movement -var/global/movement_disabled = 0 -var/global/movement_disabled_exception //This is the client that calls the proc, so he can continue to run around to gauge any change to lag. -/client/proc/disable_movement() - set category = "Mapping" - set name = "Disable all movement" - - movement_disabled = !movement_disabled - if(movement_disabled) - message_admins("[src.ckey] used 'Disable all movement', killing all movement.") - movement_disabled_exception = usr.ckey - else - message_admins("[src.ckey] used 'Disable all movement', restoring all movement.") \ No newline at end of file + message_admins("[src.ckey] used 'Disable all communication verbs', restoring all communication methods.") \ No newline at end of file diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index dda963d91ce..cb99d40727b 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -148,35 +148,10 @@ client/proc/one_click_antag() return 0 /datum/admins/proc/makeWizard() - var/list/mob/dead/observer/candidates = list() - var/mob/dead/observer/theghost = null - var/time_passed = world.time + var/client/C = pick_from_candidates(BE_WIZARD) - for(var/mob/dead/observer/G in player_list) - if(!jobban_isbanned(G, "wizard") && !jobban_isbanned(G, "Syndicate")) - spawn(0) - switch(alert(G, "Do you wish to be considered for the position of Space Wizard Foundation 'diplomat'?","Please answer in 30 seconds!","Yes","No")) - if("Yes") - if((world.time-time_passed)>300)//If more than 30 game seconds passed. - return - candidates += G - if("No") - return - else - return - - sleep(300) - - if(candidates.len) - shuffle(candidates) - for(var/mob/i in candidates) - if(!i || !i.client) continue //Dont bother removing them from the list since we only grab one wizard - - theghost = i - break - - if(theghost) - var/mob/living/carbon/human/new_character=makeBody(theghost) + if(C) + var/mob/living/carbon/human/new_character=makeBody(C.mob) new_character.mind.make_Wizard() return 1 @@ -218,92 +193,59 @@ client/proc/one_click_antag() /datum/admins/proc/makeNukeTeam() - var/list/mob/dead/observer/candidates = list() + var/list/candidates = get_candidates(BE_OPERATIVE) + var/list/mob/dead/observer/chosen = list() - var/mob/dead/observer/theghost = null - var/time_passed = world.time - - for(var/mob/dead/observer/G in player_list) - if(!jobban_isbanned(G, "operative") && !jobban_isbanned(G, "Syndicate")) - spawn(0) - switch(alert(G,"Do you wish to be considered for a nuke team being sent in?","Please answer in 30 seconds!","Yes","No")) - if("Yes") - if((world.time-time_passed)>300)//If more than 30 game seconds passed. - return - candidates += G - if("No") - return - else - return - - sleep(300) + var/client/C = null if(candidates.len) var/numagents = 5 var/agentcount = 0 for(var/i = 0, i synd_spawn.len) + spawnpos = 2 //Ran out of spawns. Let's loop back to the first non-leader position + var/mob/living/carbon/human/new_character=makeBody(c) + if(!leader_chosen) + leader_chosen = 1 + new_character.mind.make_Nuke(synd_spawn[spawnpos],nuke_code,1) + else + new_character.mind.make_Nuke(synd_spawn[spawnpos],nuke_code) + spawnpos++ - for(var/datum/mind/synd_mind in ticker.mode.syndicates) - if(synd_mind.current) - if(synd_mind.current.client) - for(var/datum/mind/synd_mind_1 in ticker.mode.syndicates) - if(synd_mind_1.current) - var/I = image('icons/mob/mob.dmi', loc = synd_mind_1.current, icon_state = "synd") - synd_mind.current.client.images += I - - for (var/obj/machinery/nuclearbomb/bomb in world) - bomb.r_code = nuke_code // All the nukes are set to this code. + ticker.mode.update_all_synd_icons() return 1 @@ -321,34 +263,16 @@ client/proc/one_click_antag() // DEATH SQUADS /datum/admins/proc/makeDeathsquad() - var/list/mob/dead/observer/candidates = list() - var/time_passed = world.time var/mission = input("Assign a mission to the deathsquad", "Assign Mission", "Leave no witnesses.") - - //Generates a list of commandos from active ghosts. Then the user picks which characters to respawn as the commandos. - for(var/mob/dead/observer/G in player_list) - spawn(0) - switch(alert(G,"Do you wish to be considered for an elite Nanotrasen strike team being sent in?","Please answer in 30 seconds!","Yes","No")) - if("Yes") - if((world.time-time_passed)>300)//If more than 30 game seconds passed. - return - candidates += G - if("No") - return - else - return - sleep(300) - - for(var/mob/dead/observer/G in candidates) - if(!G.key) - candidates.Remove(G) + var/list/candidates = get_candidates(-1, "member of a Nanotrasen strike team") if(candidates.len >= 3) //Minimum 3 to be considered a squad //Pick the lucky players var/numagents = min(5,candidates.len) //How many commandos to spawn while(numagents && deathsquadspawn.len && candidates.len) var/spawnloc = deathsquadspawn[1] - var/mob/dead/observer/chosen_candidate = pick(candidates) + var/client/C = pick(candidates) + var/mob/dead/observer/chosen_candidate = C.mob candidates -= chosen_candidate if(!chosen_candidate.key) continue diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm index 03df9628c46..528fd97ba31 100644 --- a/code/modules/admin/verbs/onlyone.dm +++ b/code/modules/admin/verbs/onlyone.dm @@ -46,5 +46,5 @@ W.update_label(H.real_name) H.equip_to_slot_or_del(W, slot_wear_id) - message_admins("[key_name_admin(usr)] used THERE CAN BE ONLY ONE!", 1) + message_admins("[key_name_admin(usr)] used THERE CAN BE ONLY ONE!", 1) log_admin("[key_name(usr)] used there can be only one.") \ No newline at end of file diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 09fcefa8845..7841ef4e761 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -17,7 +17,7 @@ return var/image/cross = image('icons/obj/storage.dmi',"bible") - msg = "\icon[cross] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) (JMP) (CA) (SC): [msg]" + msg = "\icon[cross] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) (JMP) (CA) (SC): [msg]" for(var/client/C in admins) if(C.prefs.toggles & CHAT_PRAYER) @@ -29,10 +29,10 @@ /proc/Centcomm_announce(var/text , var/mob/Sender) var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN) - msg = " CENTCOM:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]" + msg = " CENTCOM:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]" admins << msg /proc/Syndicate_announce(var/text , var/mob/Sender) var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN) - msg = "SYNDICATE:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]" + msg = "SYNDICATE:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]" admins << msg diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index ebf5441a3d0..5690818169b 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -36,7 +36,7 @@ M << "\bold You hear a voice in your head... \italic [msg]" log_admin("SubtlePM: [key_name(usr)] -> [key_name(M)] : [msg]") - message_admins(" SubtleMessage: [key_name_admin(usr)] -> [key_name_admin(M)] : [msg]", 1) + message_admins(" SubtleMessage: [key_name_admin(usr)] -> [key_name_admin(M)] : [msg]", 1) feedback_add_details("admin_verb","SMS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_world_narrate() @@ -53,7 +53,7 @@ return world << "[msg]" log_admin("GlobalNarrate: [key_name(usr)] : [msg]") - message_admins(" GlobalNarrate: [key_name_admin(usr)] : [msg]
    ", 1) + message_admins(" GlobalNarrate: [key_name_admin(usr)] : [msg]
    ", 1) feedback_add_details("admin_verb","GLN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_direct_narrate(var/mob/M) @@ -77,7 +77,7 @@ M << msg log_admin("DirectNarrate: [key_name(usr)] to ([M.name]/[M.key]): [msg]") - message_admins(" DirectNarrate: [key_name(usr)] to ([M.name]/[M.key]): [msg]
    ", 1) + message_admins(" DirectNarrate: [key_name(usr)] to ([M.name]/[M.key]): [msg]
    ", 1) feedback_add_details("admin_verb","DIRN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_godmode(mob/M as mob in mob_list) @@ -87,7 +87,7 @@ src << "Only administrators may use this command." return M.status_flags ^= GODMODE - usr << "Toggled [(M.status_flags & GODMODE) ? "ON" : "OFF"]" + usr << "Toggled [(M.status_flags & GODMODE) ? "ON" : "OFF"]" log_admin("[key_name(usr)] has toggled [key_name(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]") message_admins("[key_name_admin(usr)] has toggled [key_name_admin(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]", 1) @@ -247,7 +247,7 @@ Traitors and the like can also be revived with the previous role mostly intact. G_found.mind.transfer_to(new_xeno) //be careful when doing stuff like this! I've already checked the mind isn't in use new_xeno.key = G_found.key new_xeno << "You have been fully respawned. Enjoy the game." - message_admins("[key_name_admin(usr)] has respawned [new_xeno.key] as a filthy xeno.", 1) + message_admins("[key_name_admin(usr)] has respawned [new_xeno.key] as a filthy xeno.", 1) return //all done. The ghost is auto-deleted //check if they were a monkey @@ -257,7 +257,7 @@ Traitors and the like can also be revived with the previous role mostly intact. G_found.mind.transfer_to(new_monkey) //be careful when doing stuff like this! I've already checked the mind isn't in use new_monkey.key = G_found.key new_monkey << "You have been fully respawned. Enjoy the game." - message_admins("[key_name_admin(usr)] has respawned [new_monkey.key] as a filthy xeno.", 1) + message_admins("[key_name_admin(usr)] has respawned [new_monkey.key] as a filthy xeno.", 1) return //all done. The ghost is auto-deleted @@ -367,7 +367,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if(alert(new_character,"Would you like an active AI to announce this character?",,"No","Yes")=="Yes") call(/mob/new_player/proc/AnnounceArrival)(new_character, new_character.mind.assigned_role) - message_admins("[admin] has respawned [player_key] as [new_character.real_name].", 1) + message_admins("[admin] has respawned [player_key] as [new_character.real_name].", 1) new_character << "You have been fully respawned. Enjoy the game." @@ -427,7 +427,7 @@ Traitors and the like can also be revived with the previous role mostly intact. else priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/AI/commandreport.ogg') - print_command_report(input,"[confirm=="Yes" ? "" : "Classified"] [command_name()] Update") + print_command_report(input,"[confirm=="Yes" ? "" : "Classified "][command_name()] Update") log_admin("[key_name(src)] has created a command report: [input]") message_admins("[key_name_admin(src)] has created a command report", 1) @@ -548,7 +548,7 @@ Traitors and the like can also be revived with the previous role mostly intact. mob.gib() log_admin("[key_name(usr)] used gibself.") - message_admins("[key_name_admin(usr)] used gibself.", 1) + message_admins("[key_name_admin(usr)] used gibself.", 1) feedback_add_details("admin_verb","GIBS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /* /client/proc/cmd_manual_ban() @@ -690,10 +690,9 @@ Traitors and the like can also be revived with the previous role mostly intact. return emergency_shuttle.incall() - priority_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.", null, 'sound/AI/shuttlecalled.ogg', "Priority") feedback_add_details("admin_verb","CSHUT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] admin-called the emergency shuttle.") - message_admins("[key_name_admin(usr)] admin-called the emergency shuttle.", 1) + message_admins("[key_name_admin(usr)] admin-called the emergency shuttle.", 1) return /client/proc/admin_cancel_shuttle() @@ -708,7 +707,7 @@ Traitors and the like can also be revived with the previous role mostly intact. emergency_shuttle.recall() feedback_add_details("admin_verb","CCSHUT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] admin-recalled the emergency shuttle.") - message_admins("[key_name_admin(usr)] admin-recalled the emergency shuttle.", 1) + message_admins("[key_name_admin(usr)] admin-recalled the emergency shuttle.", 1) return @@ -746,7 +745,7 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("Admin [key_name_admin(usr)] has forced the players to have random appearances.", 1) if(notifyplayers == "Yes") - world << "Admin [usr.key] has forced the players to have completely random identities!" + world << "Admin [usr.key] has forced the players to have completely random identities!" usr << "Remember: you can always disable the randomness by using the verb again, assuming the round hasn't started yet." diff --git a/code/modules/admin/verbs/tripAI.dm b/code/modules/admin/verbs/tripAI.dm index 07d97e39ef1..dd8d12d1b05 100644 --- a/code/modules/admin/verbs/tripAI.dm +++ b/code/modules/admin/verbs/tripAI.dm @@ -14,9 +14,9 @@ if(ticker.triai) ticker.triai = 0 usr << "Only one AI will be spawned at round start." - message_admins("[key_name_admin(usr)] has toggled off triple AIs at round start.", 1) + message_admins("[key_name_admin(usr)] has toggled off triple AIs at round start.", 1) else ticker.triai = 1 usr << "There will be an AI Triumvirate at round start." - message_admins("[key_name_admin(usr)] has toggled on triple AIs at round start.", 1) + message_admins("[key_name_admin(usr)] has toggled on triple AIs at round start.", 1) return diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index f17048048f6..af2f1a73b59 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -81,10 +81,6 @@ if(bombassembly) bombassembly.on_found(finder) -/obj/item/device/onetankbomb/hear_talk(mob/living/M as mob, msg) - if(bombassembly) - bombassembly.hear_talk(M, msg) - // ---------- Procs below are for tanks that are used exclusively in 1-tank bombs ---------- diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index d764c35ead0..b2bde69df19 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -19,8 +19,6 @@ /obj/item/device/assembly_holder/proc/process_activation(var/obj/item/device/D) return - - /obj/item/device/assembly_holder/IsAssemblyHolder() return 1 @@ -87,20 +85,12 @@ if(a_right) a_right.on_found(finder) - -/obj/item/device/assembly_holder/hear_talk(mob/living/M as mob, msg) - if(a_left) - a_left.hear_talk(M, msg) - if(a_right) - a_right.hear_talk(M, msg) - /obj/item/device/assembly_holder/Move() ..() if(a_left && a_right) a_left.holder_movement() a_right.holder_movement() - return - + return /obj/item/device/assembly_holder/attack_hand()//Perhapse this should be a holder_pickup proc instead, can add if needbe I guess if(a_left && a_right) @@ -166,13 +156,3 @@ if(master) master.receive_signal() return 1 - - - - - - - - - - diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 228c6128e9d..4b7d57e45ca 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -1,5 +1,3 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 - /obj/item/device/assembly/infra name = "infrared emitter" desc = "Emits a visible or invisible beam and is triggered when the beam is interrupted." @@ -13,8 +11,7 @@ var/on = 0 var/visible = 0 var/obj/effect/beam/i_beam/first = null - -/obj/item/device/assembly/infra/proc/trigger_beam() + var/obj/effect/beam/i_beam/last = null /obj/item/device/assembly/infra/describe() return "The infrared trigger is [on?"on":"off"]." @@ -25,7 +22,6 @@ update_icon() return 1 - /obj/item/device/assembly/infra/toggle_secure() secured = !secured if(secured) @@ -37,7 +33,6 @@ update_icon() return secured - /obj/item/device/assembly/infra/update_icon() overlays.Cut() attached_overlays = list() @@ -49,49 +44,35 @@ holder.update_icon() return - -/obj/item/device/assembly/infra/process()//Old code +/obj/item/device/assembly/infra/process() if(!on) if(first) qdel(first) return - if(first || !secured) return - var/turf/T = null - if(istype(loc,/turf)) - T = loc - else if (holder) - if (istype(holder.loc,/turf)) - T = holder.loc - else if (istype(holder.loc.loc,/turf)) //for onetankbombs and other tertiary builds with assemblies - T = holder.loc.loc - else if(istype(loc,/obj/item/weapon/grenade) && istype(loc.loc,/turf)) - T = loc.loc + if(!secured) + return + if(first && last) + last.process() + return + var/turf/T = get_turf(src) if(T) var/obj/effect/beam/i_beam/I = new /obj/effect/beam/i_beam(T) I.master = src I.density = 1 I.dir = dir + first = I step(I, I.dir) - if(I) + if(first) I.density = 0 - first = I I.vis_spread(visible) - spawn(0) - if(I) - //world << "infra: setting limit" - I.limit = 8 - //world << "infra: processing beam \ref[I]" - I.process() - return - return - + I.limit = 8 + I.process() /obj/item/device/assembly/infra/attack_hand() qdel(first) ..() return - /obj/item/device/assembly/infra/Move() var/t = dir ..() @@ -99,16 +80,15 @@ qdel(first) return - /obj/item/device/assembly/infra/holder_movement() if(!holder) return 0 // dir = holder.dir qdel(first) return 1 - -/obj/item/device/assembly/infra/trigger_beam() - if((!secured)||(!on)||(cooldown > 0)) return 0 +/obj/item/device/assembly/infra/proc/trigger_beam() + if((!secured)||(!on)||(cooldown > 0)) + return 0 pulse(0) visible_message("\icon[src] *beep* *beep*") cooldown = 2 @@ -116,7 +96,6 @@ process_cooldown() return - /obj/item/device/assembly/infra/interact(mob/user as mob)//TODO: change this this to the wire control panel if(!secured) return user.set_machine(src) @@ -127,34 +106,25 @@ onclose(user, "infra") return - /obj/item/device/assembly/infra/Topic(href, href_list) ..() if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) usr << browse(null, "window=infra") onclose(usr, "infra") return - if(href_list["state"]) on = !(on) update_icon() - if(href_list["visible"]) visible = !(visible) - spawn(0) - if(first) - first.vis_spread(visible) - + if(first) + first.vis_spread(visible) if(href_list["close"]) usr << browse(null, "window=infra") return - if(usr) attack_self(usr) - return - - /obj/item/device/assembly/infra/verb/rotate()//This could likely be better set name = "Rotate Infrared Laser" set category = "Object" @@ -172,6 +142,7 @@ icon = 'icons/obj/projectiles.dmi' icon_state = "ibeam" var/obj/effect/beam/i_beam/next = null + var/obj/effect/beam/i_beam/previous = null var/obj/item/device/assembly/infra/master = null var/limit = null var/visible = 0.0 @@ -180,32 +151,21 @@ /obj/effect/beam/i_beam/proc/hit() - //world << "beam \ref[src]: hit" if(master) - //world << "beam hit \ref[src]: calling master \ref[master].hit" master.trigger_beam() qdel(src) return /obj/effect/beam/i_beam/proc/vis_spread(v) - //world << "i_beam \ref[src] : vis_spread" visible = v - spawn(0) - if(next) - //world << "i_beam \ref[src] : is next [next.type] \ref[next], calling spread" - next.vis_spread(v) - return - return + if(next) + next.vis_spread(v) + /obj/effect/beam/i_beam/process() - //world << "i_beam \ref[src] : process" - if((loc.density || !(master))) - // world << "beam hit loc [loc] or no master [master], deleting" qdel(src) return - //world << "proccess: [src.left] left" - if(left > 0) left-- if(left < 1) @@ -216,40 +176,20 @@ else invisibility = 0 - - //world << "now [src.left] left" - var/obj/effect/beam/i_beam/I = new /obj/effect/beam/i_beam(loc) - I.master = master - I.density = 1 - I.dir = dir - //world << "created new beam \ref[I] at [I.x] [I.y] [I.z]" - step(I, I.dir) - - if(I) - //world << "step worked, now at [I.x] [I.y] [I.z]" - if(!(next)) - //world << "no next" + if(!next && (limit > 0)) + var/obj/effect/beam/i_beam/I = new /obj/effect/beam/i_beam(loc) + I.master = master + I.density = 1 + I.dir = dir + I.previous = src + next = I + step(I, I.dir) + if(next) I.density = 0 - //world << "spreading" I.vis_spread(visible) - next = I - spawn(0) - //world << "limit = [limit] " - if((I && limit > 0)) - I.limit = limit - 1 - //world << "calling next process" - I.process() - return - else - //world << "is a next: \ref[next], deleting beam \ref[I]" - qdel(I) - else - //world << "step failed, deleting \ref[next]" - qdel(next) - spawn(10) - process() - return - return + I.limit = limit - 1 + master.last = I + I.process() /obj/effect/beam/i_beam/Bump() qdel(src) @@ -257,16 +197,19 @@ /obj/effect/beam/i_beam/Bumped() hit() - return /obj/effect/beam/i_beam/Crossed(atom/movable/AM as mob|obj) if(istype(AM, /obj/effect/beam)) return - spawn(0) - hit() - return - return + hit() /obj/effect/beam/i_beam/Destroy() - qdel(next) + if(master.first == src) + master.first = null + if(next) + qdel(next) + next = null + if(previous) + previous.next = null + master.last = previous ..() diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index d8ee49932ce..d255db9b9bd 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -5,33 +5,36 @@ m_amt = 500 g_amt = 50 origin_tech = "magnets=1" + flags = HEAR var/listening = 0 - var/recorded //the activation message + var/recorded = "" //the activation message + +/obj/item/device/assembly/voice/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq) + if(speaker == src) + return -/obj/item/device/assembly/voice/hear_talk(mob/living/M as mob, msg) - if(listening) - recorded = msg + if(listening && !radio_freq) + recorded = raw_message listening = 0 - var/turf/T = get_turf(src) //otherwise it won't work in hand - T.visible_message("\icon[src] beeps, \"Activation message is '[recorded]'.\"") - else - if(findtext(msg, recorded)) + say("Activation message is '[recorded]'.") + else + if(findtext(raw_message, recorded)) pulse(0) - + /obj/item/device/assembly/voice/activate() if(secured) if(!holder) listening = !listening - var/turf/T = get_turf(src) - T.visible_message("\icon[src] beeps, \"[listening ? "Now" : "No longer"] recording input.\"") + say("[listening ? "Now" : "No longer"] recording input.") +/obj/machinery/vending/say_quote(text) + return "beeps, \"[text]\"" /obj/item/device/assembly/voice/attack_self(mob/user) if(!user) return 0 activate() return 1 - /obj/item/device/assembly/voice/toggle_secure() - . = ..() - listening = 0 \ No newline at end of file + . = ..() + listening = 0 diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 05ad085a961..2ad54d17ca7 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -218,6 +218,7 @@ datum/preferences dat += "Play lobby music: [(toggles & SOUND_LOBBY) ? "Yes" : "No"]
    " dat += "Ghost ears: [(toggles & CHAT_GHOSTEARS) ? "Nearest Creatures" : "All Speech"]
    " dat += "Ghost sight: [(toggles & CHAT_GHOSTSIGHT) ? "Nearest Creatures" : "All Emotes"]
    " + dat += "Ghost whispers: [(toggles & CHAT_GHOSTWHISPER) ? "Nearest Creatures" : "All Speech"]
    " dat += "Pull requests: [(toggles & CHAT_PULLR) ? "Yes" : "No"]
    " if(config.allow_Metadata) @@ -319,6 +320,9 @@ datum/preferences if((job_civilian_low & ASSISTANT) && (rank != "Assistant")) HTML += "[rank]" continue + if(config.enforce_human_authority && (rank in command_positions) && user.client.prefs.pref_species.id != "human") + HTML += "[rank] \[NON-HUMAN\]" + continue if((rank in command_positions) || (rank == "AI"))//Bold head jobs HTML += "[rank]" else @@ -739,6 +743,9 @@ datum/preferences if("ghost_sight") toggles ^= CHAT_GHOSTSIGHT + if("ghost_whispers") + toggles ^= CHAT_GHOSTWHISPER + if("pull_requests") toggles ^= CHAT_PULLR diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index 2fc6ef47c14..7e33cebffd0 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -17,6 +17,15 @@ prefs.save_preferences() feedback_add_details("admin_verb","TGS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/client/verb/toggle_ghost_whispers() + set name = "Show/Hide GhostWhispers" + set category = "Preferences" + set desc = ".Toggle between hearing all whispers, and only whispers of nearby mobs" + prefs.toggles ^= CHAT_GHOSTWHISPER + src << "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTWHISPER) ? "see all whispers in the world" : "only see whispers from nearby mobs"]." + prefs.save_preferences() + feedback_add_details("admin_verb","TGW") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + /client/proc/toggle_hear_radio() set name = "Show/Hide RadioChatter" set category = "Preferences" @@ -155,4 +164,13 @@ var/list/ghost_forms = list("ghost","ghostking","ghostian2","ghost_red","ghost_b prefs.ghost_form = new_form prefs.save_preferences() if(istype(mob,/mob/dead/observer)) - mob.icon_state = new_form \ No newline at end of file + mob.icon_state = new_form + +/client/verb/toggle_intent_style() + set name = "Toggle Intent Selection Style" + set category = "Preferences" + set desc = "Toggle between directly clicking the desired intent or clicking to rotate through." + prefs.toggles ^= INTENT_STYLE + src << "[(prefs.toggles & INTENT_STYLE) ? "Clicking directly on intents selects them." : "Clicking on intents rotates selection clockwise."]" + prefs.save_preferences() + feedback_add_details("admin_verb","ITENTS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! \ No newline at end of file diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 8b22d9da546..7405c3508b8 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -25,63 +25,12 @@ name = "Health Scanner HUD" desc = "A heads-up display that scans the humans in view and provides accurate data about their health status." icon_state = "healthhud" - proc - RoundHealth(health) - 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" +/obj/item/clothing/glasses/hud/health/process_hud(var/mob/M) + process_data_hud(M,DATA_HUD_MEDICAL,DATA_HUD_ADVANCED) - process_hud(var/mob/M) - if(!M) return - if(!M.client) return - var/client/C = M.client - var/image/holder - for(var/mob/living/carbon/human/patient in view(M)) - var/foundVirus = 0 - for(var/datum/disease/D in patient.viruses) - if(!D.hidden[SCANNER]) - foundVirus++ - if(!C) continue - - holder = patient.hud_list[HEALTH_HUD] - if(patient.stat == 2) - holder.icon_state = "hudhealth-100" - else - holder.icon_state = "hud[RoundHealth(patient.health)]" - C.images += holder - - 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" - C.images += holder - /obj/item/clothing/glasses/hud/health/night name = "Night Vision Health Scanner HUD" desc = "An advanced medical head-up display that allows doctors to find patients in complete darkness." @@ -123,44 +72,4 @@ invis_view = 2 /obj/item/clothing/glasses/hud/security/process_hud(var/mob/M) - if(!M) return - if(!M.client) return - var/client/C = M.client - var/image/holder - for(var/mob/living/carbon/human/perp in view(M)) - 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 - - - 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 - - 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 - continue - C.images += holder \ No newline at end of file + process_data_hud(M,DATA_HUD_SECURITY,DATA_HUD_ADVANCED) diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index cdb458b7a80..3be8a220a74 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -87,7 +87,7 @@ name = "gladiator helmet" desc = "Ave, Imperator, morituri te salutant." icon_state = "gladiator" - flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR + flags = HEADCOVERSEYES|BLOCKHAIR item_state = "gladiator" flags_inv = HIDEMASK|HIDEEARS|HIDEEYES diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index af4e34f1f84..1c473a51679 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -57,7 +57,7 @@ name = "cueball helmet" desc = "A large, featureless white orb mean to be worn on your head. How do you even see out of this thing?" icon_state = "cueball" - flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR + flags = HEADCOVERSEYES|BLOCKHAIR item_state="cueball" flags_inv = 0 @@ -80,7 +80,7 @@ desc = "A helmet made out of a box." icon_state = "cardborg_h" item_state = "cardborg_h" - flags = HEADCOVERSEYES | HEADCOVERSMOUTH + flags = HEADCOVERSEYES flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE /obj/item/clothing/head/justice @@ -88,7 +88,7 @@ desc = "fight for what's righteous!" icon_state = "justicered" item_state = "justicered" - flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR + flags = HEADCOVERSEYES|BLOCKHAIR /obj/item/clothing/head/justice/blue icon_state = "justiceblue" diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 653e21fd811..d16ac285b99 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -111,7 +111,7 @@ icon_state = "hardhat0_pumpkin" item_state = "hardhat0_pumpkin" item_color = "pumpkin" - flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR + flags = HEADCOVERSEYES | BLOCKHAIR flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE action_button_name = "Toggle Pumpkin Light" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 012b4872c18..e74532c2f24 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -53,6 +53,5 @@ /obj/item/clothing/mask/horsehead/speechModification(message) if(voicechange) - if(!(copytext(message, 1, 2) == "*" || (usr.mind && usr.mind.changeling && (copytext(message, 1, 3) == ":g" || copytext(message, 1, 3) == ":G" || copytext(message, 1, 3) == ":ï")))) - message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!") + message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!") return message diff --git a/code/modules/clothing/shoes/colour.dm b/code/modules/clothing/shoes/colour.dm index e1ed80a3d65..c1b5b18ff16 100644 --- a/code/modules/clothing/shoes/colour.dm +++ b/code/modules/clothing/shoes/colour.dm @@ -94,6 +94,8 @@ if ((istype(H, /obj/item/weapon/handcuffs) && !( src.chained ))) //H = null if (src.icon_state != "orange") return + if(istype(H, /obj/item/weapon/handcuffs/cable)) + return 0 qdel(H) src.chained = 1 src.slowdown = 15 diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm index c4c82a9cf45..b96f2d5472e 100644 --- a/code/modules/events/alien_infestation.dm +++ b/code/modules/events/alien_infestation.dm @@ -32,7 +32,7 @@ if(temp_vent.network.normal_members.len > 20) //Stops Aliens getting stuck in small networks. See: Security, Virology vents += temp_vent - var/list/candidates = get_candidates(BE_ALIEN, ALIEN_AFK_BRACKET) + var/list/candidates = get_candidates(BE_ALIEN) while(spawncount > 0 && vents.len && candidates.len) var/obj/vent = pick_n_take(vents) diff --git a/code/modules/events/event_manager.dm b/code/modules/events/event_manager.dm index 0174bda76b3..41196389a01 100644 --- a/code/modules/events/event_manager.dm +++ b/code/modules/events/event_manager.dm @@ -9,6 +9,7 @@ var/datum/controller/event/events var/frequency_upper = 9000 //15 minutes upper bound. Basically an event will happen every 15 to 30 minutes. var/holiday //This will be a string of the name of any realworld holiday which occurs today (GMT time) + var/wizardmode = 0 //If the summon events spell is in effect this is true //Initial controller setup. /datum/controller/event/New() @@ -20,7 +21,7 @@ var/datum/controller/event/events for(var/type in typesof(/datum/round_event_control)) var/datum/round_event_control/E = new type() - if(!E.typepath) + if(!E.typepath || E.typepath in typesof(/datum/round_event/wizard/)) continue //don't want this one! leave it for the garbage collector control += E //add it to the list of all events (controls) reschedule() diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm index ebf598eda53..567e61bdf31 100644 --- a/code/modules/events/immovable_rod.dm +++ b/code/modules/events/immovable_rod.dm @@ -19,37 +19,10 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 priority_announce("What the fuck was that?!", "General Alert") /datum/round_event/immovable_rod/start() - var/startx = 0 - var/starty = 0 - var/endy = 0 - var/endx = 0 var/startside = pick(cardinal) - - switch(startside) - if(NORTH) - starty = 187 - startx = rand(41, 199) - endy = 38 - endx = rand(41, 199) - if(EAST) - starty = rand(38, 187) - startx = 199 - endy = rand(38, 187) - endx = 41 - if(SOUTH) - starty = 38 - startx = rand(41, 199) - endy = 187 - endx = rand(41, 199) - else - starty = rand(38, 187) - startx = 41 - endy = rand(38, 187) - endx = 199 - - //rod time! - new /obj/effect/immovablerod(locate(startx, starty, 1), locate(endx, endy, 1)) - + var/turf/startT = spaceDebrisStartLoc(startside, 1) + var/turf/endT = spaceDebrisFinishLoc(startside, 1) + new /obj/effect/immovablerod(startT, endT) /obj/effect/immovablerod name = "Immovable Rod" diff --git a/code/modules/events/ninja.dm b/code/modules/events/ninja.dm index 6e25cb211f5..6390d3ea352 100644 --- a/code/modules/events/ninja.dm +++ b/code/modules/events/ninja.dm @@ -42,10 +42,9 @@ //selecting a candidate player if(!key) - var/list/candidates = get_candidates(BE_NINJA) - if(!candidates.len) + var/client/C = pick_from_candidates(BE_NINJA) + if(!C) return kill() - var/client/C = pick(candidates) key = C.key if(!key) return kill() @@ -374,6 +373,7 @@ ________________________________________________________________________________ equip_to_slot_or_del(new /obj/item/clothing/gloves/space_ninja(src), slot_gloves) equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/space_ninja(src), slot_head) equip_to_slot_or_del(new /obj/item/clothing/mask/gas/voice/space_ninja(src), slot_wear_mask) + equip_to_slot_or_del(new /obj/item/clothing/glasses/night(src), slot_glasses) equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_belt) equip_to_slot_or_del(new /obj/item/weapon/plastique(src), slot_r_store) equip_to_slot_or_del(new /obj/item/weapon/plastique(src), slot_l_store) @@ -2521,7 +2521,6 @@ ________________________________________________________________________________ /obj/item/clothing/mask/gas/voice/space_ninja/New() verbs += /obj/item/clothing/mask/gas/voice/space_ninja/proc/togglev - verbs += /obj/item/clothing/mask/gas/voice/space_ninja/proc/switchm //This proc is linked to human life.dm. It determines what hud icons to display based on mind special role for most mobs. /obj/item/clothing/mask/gas/voice/space_ninja/proc/assess_targets(list/target_list, mob/living/carbon/U) @@ -2586,46 +2585,8 @@ ________________________________________________________________________________ voice = "Unknown" return -/obj/item/clothing/mask/gas/voice/space_ninja/proc/switchm() - set name = "Switch Mode" - set desc = "Switches between Night Vision, Meson, or Thermal vision modes." - set category = "Ninja Equip" - //Have to reset these manually since life.dm is retarded like that. Go figure. - //This will only work for humans because only they have the appropriate code for the mask. - var/mob/U = loc - switch(mode) - if(0) - mode=1 - U << "Switching mode to Night Vision." - if(1) - mode=2 - U.see_in_dark = 2 - U << "Switching mode to Thermal Scanner." - if(2) - mode=3 - U.see_invisible = SEE_INVISIBLE_LIVING - U.sight &= ~SEE_MOBS - U << "Switching mode to Meson Scanner." - if(3) - mode=0 - U.sight &= ~SEE_TURFS - U << "Switching mode to Scouter." - /obj/item/clothing/mask/gas/voice/space_ninja/examine() - set src in view() ..() - - var/mode - switch(mode) - if(0) - mode = "Scouter" - if(1) - mode = "Night Vision" - if(2) - mode = "Thermal Scanner" - if(3) - mode = "Meson Scanner" - usr << "[mode] is active."//Leaving usr here since it may be on the floor or on a person. usr << "Voice mimicking algorithm is set [!vchange?"inactive":"active"]." /* diff --git a/code/modules/events/wizard/aid.dm b/code/modules/events/wizard/aid.dm new file mode 100644 index 00000000000..8c215e0fbe0 --- /dev/null +++ b/code/modules/events/wizard/aid.dm @@ -0,0 +1,47 @@ +//in this file: Various events that directly aid the wizard. This is the "lets entice the wizard to use summon events!" file. + +/datum/round_event_control/wizard/robelesscasting //EI NUDTH! + name = "Robeless Casting" + weight = 2 + typepath = /datum/round_event/wizard/robelesscasting/ + max_occurrences = 1 + earliest_start = 0 + +/datum/round_event/wizard/robelesscasting/start() + + for(var/mob/living/L in mob_list) //Hey if a corgi has magic missle he should get the same benifit as anyone + if(L.mind && L.mind.spell_list.len != 0) + var/spell_improved = 0 + for(var/obj/effect/proc_holder/spell/S in L.mind.spell_list) + if(S.clothes_req) + S.clothes_req = 0 + spell_improved = 1 + if(spell_improved) + L << "You suddenly feel like you never needed those garish robes in the first place..." + +//--// + +/datum/round_event_control/wizard/improvedcasting //blink x5 disintergrate x5 here I come! + name = "Improved Casting" + weight = 3 + typepath = /datum/round_event/wizard/improvedcasting/ + max_occurrences = 4 //because that'd be max level spells + earliest_start = 0 + +/datum/round_event/wizard/improvedcasting/start() + for(var/mob/living/L in mob_list) + if(L.mind && L.mind.spell_list.len != 0) + for(var/obj/effect/proc_holder/spell/S in L.mind.spell_list) + S.name = initial(S.name) + S.spell_level++ + S.charge_max = round(initial(S.charge_max) - S.spell_level * (initial(S.charge_max) - S.cooldown_min)/ S.level_max) + if(S.charge_max < S.charge_counter) + S.charge_counter = S.charge_max + switch(S.spell_level) + if(1) S.name = "Efficient [S.name]" + if(2) S.name = "Quickened [S.name]" + if(3) S.name = "Free [S.name]" + if(4) S.name = "Instant [S.name]" + if(5) S.name = "Ludicrous [S.name]" + + L << "You suddenly feel more competent with your casting!" diff --git a/code/modules/events/wizard/blobies.dm b/code/modules/events/wizard/blobies.dm new file mode 100644 index 00000000000..aff93fccaa7 --- /dev/null +++ b/code/modules/events/wizard/blobies.dm @@ -0,0 +1,11 @@ +/datum/round_event_control/wizard/blobies //avast! + name = "Zombie Outbreak" + weight = 3 + typepath = /datum/round_event/wizard/blobies/ + max_occurrences = 3 + earliest_start = 0 + +/datum/round_event/wizard/blobies/start() + + for(var/mob/living/carbon/human/H in dead_mob_list) + new /mob/living/simple_animal/hostile/blobspore(H.loc) diff --git a/code/modules/events/wizard/curseditems.dm b/code/modules/events/wizard/curseditems.dm new file mode 100644 index 00000000000..340e3a0c268 --- /dev/null +++ b/code/modules/events/wizard/curseditems.dm @@ -0,0 +1,49 @@ +/datum/round_event_control/wizard/cursed_items //fashion disasters + name = "Cursed Items" + weight = 3 + typepath = /datum/round_event/wizard/cursed_items/ + max_occurrences = 3 + earliest_start = 0 + +//Note about adding items to this: Because of how NODROP works if an item spawned to the hands can also be equiped to a slot +//it will be able to be put into that slot from the hand, but then get stuck there. To avoid this make a new subtype of any +//item you want to equip to the hand, and set its slots_flags = null. Only items equiped to hands need do this. + +/datum/round_event/wizard/cursed_items/start() + var/item_set = pick("wizardmimic", "swords", "bigfatdoobie", "boxing", "voicemodulators", "headphones") + var/list/wearslots = list(slot_wear_suit, slot_shoes, slot_head, slot_wear_mask, slot_r_hand, slot_gloves, slot_ears) + var/list/loadout = list() + var/ruins_spaceworthiness + loadout.len = 7 + + switch(item_set) + if("wizardmimic") + loadout = list(/obj/item/clothing/suit/wizrobe, /obj/item/clothing/shoes/sandal, /obj/item/clothing/head/wizard) + ruins_spaceworthiness = 1 + if("swords") loadout[5] = /obj/item/weapon/katana/cursed + if("bigfatdoobie") + loadout[4] = /obj/item/clothing/mask/cigarette/rollie/trippy/ + ruins_spaceworthiness = 1 + if("boxing") + loadout[4] = /obj/item/clothing/mask/luchador + loadout[6] = /obj/item/clothing/gloves/boxing + ruins_spaceworthiness = 1 + if("voicemodulators") loadout[4] = /obj/item/clothing/mask/gas/voice + if("headphones") loadout[7] = /obj/item/clothing/ears/earmuffs + + for(var/mob/living/carbon/human/H in living_mob_list) + if(ruins_spaceworthiness && (H.z != 1 || istype(H.loc, /turf/space))) continue //#savetheminers + var/list/slots = list(H.wear_suit, H.shoes, H.head, H.wear_mask, H.r_hand, H.gloves, H.ears) //add new slots as needed to back + for(var/i = 1, i <= loadout.len, i++) + if(loadout[i]) + var/obj/item/J = loadout[i] + var/obj/item/I = new J //dumb but required because of byond throwing a fit anytime new gets too close to a list + H.unEquip(slots[i]) + H.equip_to_slot_or_del(I, wearslots[i]) + I.flags |= NODROP + I.name = "cursed " + I.name + + for(var/mob/living/carbon/human/H in living_mob_list) + var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + smoke.set_up(max(1,1), 0, H.loc) + smoke.start() \ No newline at end of file diff --git a/code/modules/events/wizard/departmentrevolt.dm b/code/modules/events/wizard/departmentrevolt.dm new file mode 100644 index 00000000000..68c9d68e430 --- /dev/null +++ b/code/modules/events/wizard/departmentrevolt.dm @@ -0,0 +1,53 @@ +/datum/round_event_control/wizard/deprevolt //stationwide! + name = "Departmental Uprising" + weight = 2 + typepath = /datum/round_event/wizard/deprevolt/ + max_occurrences = 1 + earliest_start = 0 + +/datum/round_event/wizard/deprevolt/start() + + var/list/tidecolor + var/list/jobs_to_revolt = list() + var/nation + var/list/citizens = list() + + tidecolor = pick("grey", "white", "yellow", "purple", "brown", "whatevercolorrepresentstheservicepeople") + switch(tidecolor) + if("grey") //God help you + jobs_to_revolt = list("Assistant") + nation = pick("Assa", "Mainte", "Tunnel", "Gris", "Grey", "Liath", "Grigio", "Ass", "Assi") + if("white") + jobs_to_revolt = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Virologist") + nation = pick("Mede", "Healtha", "Recova", "Chemi", "Geneti", "Viro", "Psych") + if("yellow") + jobs_to_revolt = list("Chief Engineer", "Station Engineer", "Atmospheric Technician") + nation = pick("Atomo", "Engino", "Power", "Teleco") + if("purple") + jobs_to_revolt = list("Research Director","Scientist", "Roboticist") + nation = pick("Sci", "Griffa", "Explosi", "Mecha", "Xeno") + if("brown") + jobs_to_revolt = list("Quartermaster", "Cargo Technician", "Shaft Miner") + nation = pick("Cargo", "Guna", "Suppli", "Mule", "Crate", "Ore", "Mini", "Shaf") + if("whatevercolorrepresentstheservicepeople") //the few, the proud, the technically aligned + jobs_to_revolt = list("Bartender", "Chef", "Botanist", "Clown", "Mime", "Janitor", "Chaplain") + nation = pick("Honka", "Boozo", "Fatu", "Danka", "Mimi", "Libra", "Jani", "Religi") + + nation += pick("stan", "topia", "land", "nia", "ca", "tova", "dor", "ador", "tia", "sia", "ano", "tica", "tide", "cis", "marea", "co", "taoide", "slavia", "stotzka") + + for(var/mob/living/carbon/human/H in mob_list) + if(H.mind) + var/datum/mind/M = H.mind + if(M.assigned_role && !(M in ticker.mode.traitors)) + for(var/job in jobs_to_revolt) + if(M.assigned_role == job) + citizens += H + ticker.mode.traitors += M + M.special_role = "separatist" + H.attack_log += "\[[time_stamp()]\] Was made into a separatist, long live [nation]!" + H << "You are a separatist! [nation] forever! Protect the soverignty of your newfound land with your comrades in arms!" + if(citizens.len) + var/message + for(var/job in jobs_to_revolt) + message += "[job]," + message_admins("The nation of [nation] has been formed. Affected jobs are [message]") diff --git a/code/modules/events/wizard/fakeexplosion.dm b/code/modules/events/wizard/fakeexplosion.dm new file mode 100644 index 00000000000..893b6d2e95b --- /dev/null +++ b/code/modules/events/wizard/fakeexplosion.dm @@ -0,0 +1,12 @@ +/datum/round_event_control/wizard/fake_explosion //Oh no the station is gone! + name = "Fake Explosion" + weight = 2 + typepath = /datum/round_event/wizard/fake_explosion/ + max_occurrences = 1 + earliest_start = 0 + +/datum/round_event/wizard/fake_explosion/start() + for(var/mob/M in player_list) + M << 'sound/machines/Alarm.ogg' + sleep(100) + ticker.station_explosion_cinematic(1,"fake") //:o) \ No newline at end of file diff --git a/code/modules/events/wizard/ghost.dm b/code/modules/events/wizard/ghost.dm new file mode 100644 index 00000000000..bb60ee25214 --- /dev/null +++ b/code/modules/events/wizard/ghost.dm @@ -0,0 +1,27 @@ +/datum/round_event_control/wizard/ghost //The spook is real + name = "G-G-G-Ghosts!" + weight = 3 + typepath = /datum/round_event/wizard/ghost/ + max_occurrences = 5 + earliest_start = 0 + +/datum/round_event/wizard/ghost/start() + for(var/mob/dead/observer/G in player_list) + G.invisibility = 0 + G << "You suddenly feel extremely obvious..." + + +//--// + +/datum/round_event_control/wizard/possession //Oh shit + name = "Possessing G-G-G-Ghosts!" + weight = 2 + typepath = /datum/round_event/wizard/possession + max_occurrences = 5 + earliest_start = 0 + +/datum/round_event/wizard/possession/start() + for(var/mob/dead/observer/G in player_list) + G.verbs += /mob/dead/observer/verb/boo + G.verbs += /mob/dead/observer/verb/possess + G << "You suddenly feel a welling of new spooky powers..." diff --git a/code/modules/events/wizard/greentext.dm b/code/modules/events/wizard/greentext.dm new file mode 100644 index 00000000000..6ac5ad460ee --- /dev/null +++ b/code/modules/events/wizard/greentext.dm @@ -0,0 +1,81 @@ +/datum/round_event_control/wizard/greentext //Gotta have it! + name = "Greentext" + weight = 4 + typepath = /datum/round_event/wizard/greentext/ + max_occurrences = 1 + earliest_start = 0 + +/datum/round_event/wizard/greentext/start() + + var/list/holder_canadates = player_list + for(var/mob/M in holder_canadates) + if(!ishuman(M)) + holder_canadates -= M + if(!holder_canadates) //Very unlikely, but just in case + return 0 + + var/mob/living/carbon/human/H = pick(holder_canadates) + new /obj/item/weapon/greentext(H.loc) + H << "The mythical greentext appear at your feet! Pick it up if you dare..." + + +/obj/item/weapon/greentext/ + name = "greentext" + desc = "for some the pursuit of greentext is the greatest calling in life..." + w_class = 4.0 + icon = 'icons/obj/wizard.dmi' + icon_state = "greentext" + var/mob/living/last_holder + var/mob/living/new_holder + var/list/color_altered_mobs = list() + +/obj/item/weapon/greentext/equipped(mob/living/user as mob) + user << "So long as you leave this place with greentext in hand you know will be happy..." + if(user.mind && user.mind.objectives.len > 0) + user << "... so long as you still perform your other objectives that is!" + new_holder = user + if(!last_holder) + last_holder = user + if(!(user in color_altered_mobs)) + color_altered_mobs += user + user.color = "#00FF00" + processing_objects.Add(src) + ..() + +/obj/item/weapon/greentext/dropped(mob/living/user as mob) + if(user in color_altered_mobs) + user << "A sudden wave of failure washes over you..." + user.color = "#FF0000" //ya blew it + last_holder = null + new_holder = null + processing_objects.Remove(src) + ..() + +/obj/item/weapon/greentext/process() + if(new_holder && new_holder.z == 2)//you're winner! + new_holder << "At last it feels like victory is assured!" + if(!(new_holder in ticker.mode.traitors)) + ticker.mode.traitors += new_holder.mind + new_holder.mind.special_role = "winner" + var/datum/objective/O = new /datum/objective("Succeed") + O.completed = 1 //YES! + O.owner = new_holder.mind + new_holder.mind.objectives += O + new_holder.attack_log += "\[[time_stamp()]\] Won with greentext!!!" + color_altered_mobs -= new_holder + Destroy() + + if(last_holder && last_holder != new_holder) //Somehow it was swiped without ever getting dropped + last_holder << "A sudden wave of failure washes over you..." + last_holder.color = "#FF0000" + last_holder = new_holder //long live the king + +/obj/item/weapon/greentext/Destroy() + for(var/mob/M in mob_list) + var/message = "A dark temptation has passed from this world" + if(M in color_altered_mobs) + message += " and you're finally able to forgive yourself" + M.color = initial(M.color) + message += "..." + M << message + ..() \ No newline at end of file diff --git a/code/modules/events/wizard/imposter.dm b/code/modules/events/wizard/imposter.dm new file mode 100644 index 00000000000..d12f57e3d7c --- /dev/null +++ b/code/modules/events/wizard/imposter.dm @@ -0,0 +1,51 @@ +/datum/round_event_control/wizard/imposter //Mirror Mania + name = "Imposter Wizard" + weight = 1 + typepath = /datum/round_event/wizard/imposter/ + max_occurrences = 1 + earliest_start = 0 + +/datum/round_event/wizard/imposter/start() + + for(var/datum/mind/M in ticker.mode.wizards) + if(!ishuman(M.current)) continue + var/mob/living/carbon/human/W = M.current + var/list/candidates = get_candidates(BE_WIZARD) + if(!candidates) return //Sad Trombone + var/client/C = pick(candidates) + + new /obj/effect/effect/harmless_smoke(W.loc) + + var/mob/living/carbon/human/I = new /mob/living/carbon/human(W.loc) + I.real_name = W.real_name + I.dna.unique_enzymes = W.dna.unique_enzymes + I.name = W.real_name + I.dna.blood_type = W.dna.blood_type + I.dna.uni_identity = W.dna.uni_identity + I.dna.struc_enzymes = W.dna.struc_enzymes + updateappearance(I) + if(W.ears) I.equip_to_slot_or_del(new W.ears.type, slot_ears) + if(W.w_uniform) I.equip_to_slot_or_del(new W.w_uniform.type , slot_w_uniform) + if(W.shoes) I.equip_to_slot_or_del(new W.shoes.type, slot_shoes) + if(W.wear_suit) I.equip_to_slot_or_del(new W.wear_suit.type, slot_wear_suit) + if(W.head) I.equip_to_slot_or_del(new W.head.type, slot_head) + if(W.back) I.equip_to_slot_or_del(new W.back.type, slot_back) + I.key = C.key + + //Operation: Fuck off and scare people + I.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null) + I.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink(null) + I.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null) + + ticker.mode.traitors += I.mind + I.mind.special_role = "imposter" + + var/datum/objective/protect/protect_objective = new /datum/objective/protect + protect_objective.owner = I.mind + protect_objective.target = W.mind + protect_objective.explanation_text = "Protect [W.real_name], the wizard." + I.mind.objectives += protect_objective + + I.attack_log += "\[[time_stamp()]\] Is an imposter!" + I << "You are an imposter! Trick and confuse the crew to misdirect malice from your handsome original!" + I << sound('sound/effects/magic.ogg') diff --git a/code/modules/events/wizard/invincible.dm b/code/modules/events/wizard/invincible.dm new file mode 100644 index 00000000000..b2cc9a803b2 --- /dev/null +++ b/code/modules/events/wizard/invincible.dm @@ -0,0 +1,12 @@ +/datum/round_event_control/wizard/invincible //Boolet Proof + name = "Invincibility" + weight = 3 + typepath = /datum/round_event/wizard/invincible/ + max_occurrences = 5 + earliest_start = 0 + +/datum/round_event/wizard/invincible/start() + + for(var/mob/living/carbon/human/H in living_mob_list) + H.reagents.add_reagent("adminordrazine", 40) //100 ticks of absolute invinciblity (barring gibs) + H << "You feel invincible, nothing can hurt you!" \ No newline at end of file diff --git a/code/modules/events/wizard/lava.dm b/code/modules/events/wizard/lava.dm new file mode 100644 index 00000000000..9817430850c --- /dev/null +++ b/code/modules/events/wizard/lava.dm @@ -0,0 +1,42 @@ +/datum/round_event_control/wizard/lava //THE LEGEND NEVER DIES + name = "The Floor Is LAVA!" + weight = 2 + typepath = /datum/round_event/wizard/lava/ + max_occurrences = 3 + earliest_start = 0 + +/datum/round_event/wizard/lava/ + + endWhen = 30 //half a minutes + +/datum/round_event/wizard/lava/start() + + for(var/turf/simulated/floor/F in world) + if(F.z == 1) + F.name = "lava" + F.desc = "The floor is LAVA!" + F.overlays += "lava" + F.lava = 1 + +/datum/round_event/wizard/lava/tick() + + for(var/mob/living/carbon/L in living_mob_list) + if(istype(L.loc, /turf/simulated/floor)) // Are they on LAVA?! + var/turf/simulated/floor/F = L.loc + if(F.lava) + var/safe = 0 + for(var/obj/structure/O in F.contents) + if(O.level > F.level && !istype(O, /obj/structure/window)) // Something to stand on and it isn't under the floor! + safe = 1 + if(!safe) + L.adjustFireLoss(3) + +/datum/round_event/wizard/lava/end() + + for(var/turf/simulated/floor/F in world) // Reset everything. + if(F.z == 1) + F.name = initial(F.name) + F.desc = initial(F.desc) + F.overlays.Cut() + F.lava = 0 + F.update_icon() \ No newline at end of file diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm new file mode 100644 index 00000000000..aba0bccfb45 --- /dev/null +++ b/code/modules/events/wizard/magicarp.dm @@ -0,0 +1,54 @@ +/datum/round_event_control/wizard/magicarp //these fish is loaded + name = "Magicarp" + weight = 1 + typepath = /datum/round_event/wizard/magicarp/ + max_occurrences = 1 + earliest_start = 0 + +/datum/round_event/wizard/magicarp/ + announceWhen = 3 + startWhen = 50 + +/datum/round_event/wizard/magicarp/setup() + startWhen = rand(40, 60) + +/datum/round_event/wizard/magicarp/announce() + priority_announce("Unknown magical entities have been detected near [station_name()], please stand-by.", "Lifesign Alert") + +/datum/round_event/wizard/magicarp/start() + for(var/obj/effect/landmark/C in landmarks_list) + if(C.name == "carpspawn") + if(prob(5)) + new /mob/living/simple_animal/hostile/carp/ranged/chaos(C.loc) + else + new /mob/living/simple_animal/hostile/carp/ranged(C.loc) + +/mob/living/simple_animal/hostile/carp/ranged + name = "magicarp" + desc = "50% magic, 50% carp, 100% horrible." + icon_state = "magicarp" + icon_living = "magicarp" + icon_dead = "magicarp_dead" + icon_gib = "magicarp_gib" + ranged = 1 + retreat_distance = 2 + minimum_distance = 0 //Between shots they can and will close in to nash + projectiletype = /obj/item/projectile/magic + projectilesound = 'sound/weapons/emitter.ogg' + maxHealth = 50 + health = 50 + +/mob/living/simple_animal/hostile/carp/ranged/New() + projectiletype = pick(typesof(initial(projectiletype))) + ..() + +/mob/living/simple_animal/hostile/carp/ranged/chaos + name = "chaos magicarp" + desc = "50% carp, 100% magic, 150% horrible." + color = "#00FFFF" + maxHealth = 75 + health = 75 + +/mob/living/simple_animal/hostile/carp/ranged/chaos/Shoot() + projectiletype = pick(typesof(initial(projectiletype))) + ..() \ No newline at end of file diff --git a/code/modules/events/wizard/petsplosion.dm b/code/modules/events/wizard/petsplosion.dm new file mode 100644 index 00000000000..d99793778d3 --- /dev/null +++ b/code/modules/events/wizard/petsplosion.dm @@ -0,0 +1,17 @@ +/datum/round_event_control/wizard/petsplosion //the horror + name = "Petsplosion" + weight = 2 + typepath = /datum/round_event/wizard/petsplosion/ + max_occurrences = 1 //Exponential growth is nothing to sneeze at! + earliest_start = 0 + +/datum/round_event/wizard/petsplosion/ + endWhen = 61 //1 minute (+1 tick for endWhen not to interfere with tick) + var/countdown = 0 + +/datum/round_event/wizard/petsplosion/tick() + if(activeFor >= 30 * countdown) // 0 seconds : 2 animals | 30 seconds : 4 animals | 1 minute : 8 animals + countdown += 1 + for(var/mob/living/simple_animal/F in living_mob_list) //If you cull the heard before the next replication, things will be easier for you + if(!istype(F, /mob/living/simple_animal/hostile)) + new F.type(F.loc) \ No newline at end of file diff --git a/code/modules/events/wizard/race.dm b/code/modules/events/wizard/race.dm new file mode 100644 index 00000000000..a28dab20daf --- /dev/null +++ b/code/modules/events/wizard/race.dm @@ -0,0 +1,22 @@ +/datum/round_event_control/wizard/race //Lizard Wizard? Lizard Wizard. + name = "Race Swap" + weight = 2 + typepath = /datum/round_event/wizard/race/ + max_occurrences = 5 + earliest_start = 0 + +/datum/round_event/wizard/race/start() + + var/all_the_same = 0 + var/all_species = typesof(/datum/species) - /datum/species + var/new_species = pick(all_species) + + if(prob(50)) + all_the_same = 1 + + for(var/mob/living/carbon/human/H in mob_list) //yes, even the dead + if(H.dna) + H.dna.species = new new_species + H.regenerate_icons() + if(!all_the_same) + new_species = pick(all_species) diff --git a/code/modules/events/wizard/shuffle.dm b/code/modules/events/wizard/shuffle.dm new file mode 100644 index 00000000000..e49d9be5368 --- /dev/null +++ b/code/modules/events/wizard/shuffle.dm @@ -0,0 +1,96 @@ +/datum/round_event/wizard/shuffle/start() + + +/datum/round_event_control/wizard/shuffleloc //Somewhere an AI is crying + name = "Change Places!" + weight = 2 + typepath = /datum/round_event/wizard/shuffleloc/ + max_occurrences = 5 + earliest_start = 0 + +/datum/round_event/wizard/shuffleloc/start() + var/list/moblocs = list() + var/list/mobs = list() + + for(var/mob/living/carbon/human/H in living_mob_list) + if(H.z != 1) continue //lets not try to strand people in space or stuck in the wizards den + moblocs += H.loc + mobs += H + + if(!mobs) return + + shuffle(moblocs) + shuffle(mobs) + + for(var/mob/living/carbon/human/H in mobs) + if(!moblocs) break //locs aren't always unique, so this may come into play + H.loc = moblocs[moblocs.len] + moblocs.len -= 1 + + for(var/mob/living/carbon/human/H in living_mob_list) + var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + smoke.set_up(max(1,1), 0, H.loc) + smoke.start() + +//---// + +/datum/round_event_control/wizard/shufflenames //Face/off joke + name = "Change Faces!" + weight = 4 + typepath = /datum/round_event/wizard/shufflenames/ + max_occurrences = 5 + earliest_start = 0 + +/datum/round_event/wizard/shufflenames/start() + var/list/mobnames = list() + var/list/mobs = list() + + for(var/mob/living/carbon/human/H in living_mob_list) + mobnames += H.name + mobs += H + + if(!mobs) return + + shuffle(mobnames) + shuffle(mobs) + + for(var/mob/living/carbon/human/H in mobs) + if(!mobnames) break + H.name = mobnames[mobnames.len] + mobnames.len -= 1 + + for(var/mob/living/carbon/human/H in living_mob_list) + var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + smoke.set_up(max(1,1), 0, H.loc) + smoke.start() + +//---// + +/datum/round_event_control/wizard/shuffleminds //Basically Mass Ranged Mindswap + name = "Change Minds!" + weight = 1 + typepath = /datum/round_event/wizard/shuffleminds/ + max_occurrences = 3 + earliest_start = 0 + +/datum/round_event/wizard/shuffleminds/start() + var/list/mobs = list() + + for(var/mob/living/carbon/human/H in living_mob_list) + if(!H.mind || H.mind in ticker.mode.wizards) continue //the wizard(s) are spared on this one + mobs += H + + if(!mobs) return + + shuffle(mobs) + + var/obj/effect/proc_holder/spell/targeted/mind_transfer/swapper = new /obj/effect/proc_holder/spell/targeted/mind_transfer/ + for(var/mob/living/carbon/human/H in mobs) + swapper.cast(list(H), mobs[mobs.len], 1) + mobs.len -= 1 + if(mobs.len <= 1) break + + for(var/mob/living/carbon/human/H in living_mob_list) + var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + smoke.set_up(max(1,1), 0, H.loc) + smoke.start() diff --git a/code/modules/events/wizard/summons.dm b/code/modules/events/wizard/summons.dm new file mode 100644 index 00000000000..b6ea39cef65 --- /dev/null +++ b/code/modules/events/wizard/summons.dm @@ -0,0 +1,19 @@ +/datum/round_event_control/wizard/summonguns //The Classic + name = "Summon Guns" + weight = 1 + typepath = /datum/round_event/wizard/summonguns/ + max_occurrences = 1 + earliest_start = 0 + +/datum/round_event/wizard/summonguns/start() + rightandwrong(0) + +/datum/round_event_control/wizard/summonmagic //The Somewhat Less Classic + name = "Summon Magic" + weight = 1 + typepath = /datum/round_event/wizard/summonmagic/ + max_occurrences = 1 + earliest_start = 0 + +/datum/round_event/wizard/summonmagic/start() + rightandwrong(1) \ No newline at end of file diff --git a/code/modules/food&drinks/drinks/drinks/drinkingglass.dm b/code/modules/food&drinks/drinks/drinks/drinkingglass.dm index 6320f340a6d..294118333ec 100644 --- a/code/modules/food&drinks/drinks/drinks/drinkingglass.dm +++ b/code/modules/food&drinks/drinks/drinks/drinkingglass.dm @@ -91,7 +91,7 @@ name = "glass of vodka" desc = "The glass contain wodka. Xynta." if("goldschlager") - icon_state = "ginvodkaglass" + icon_state = "goldschlagerglass" name = "glass of Goldschlager" desc = "100 proof that teen girls will drink anything with gold in it." if("wine") diff --git a/code/modules/food&drinks/kitchen machinery/microwave.dm b/code/modules/food&drinks/kitchen machinery/microwave.dm index 76fa9c72d56..8eca9a923cc 100644 --- a/code/modules/food&drinks/kitchen machinery/microwave.dm +++ b/code/modules/food&drinks/kitchen machinery/microwave.dm @@ -183,6 +183,8 @@ return 0 /obj/machinery/microwave/attack_hand(mob/user as mob) + if(..()) + return user.set_machine(src) interact(user) diff --git a/code/modules/food&drinks/kitchen machinery/smartfridge.dm b/code/modules/food&drinks/kitchen machinery/smartfridge.dm index 30b4a4fbce2..ea28ba2f3c1 100644 --- a/code/modules/food&drinks/kitchen machinery/smartfridge.dm +++ b/code/modules/food&drinks/kitchen machinery/smartfridge.dm @@ -107,7 +107,7 @@ item_quants[n]++ else item_quants[n] = 1 - item_quants = sortAssoc(item_quants) + sortList(item_quants) /obj/machinery/smartfridge/attack_paw(mob/user as mob) return src.attack_hand(user) diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index d3c5fdea595..54fb349d79d 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -257,7 +257,7 @@ obj/machinery/hydroponics/update_icon() overlays += image('icons/obj/hydroponics.dmi', icon_state = "[myseed.species]-grow[myseed.growthstages]") // Same if(waterlevel <= 10) - overlays += image('icons/obj/hydroponics.dmi', icon_state =" over_lowwater3") + overlays += image('icons/obj/hydroponics.dmi', icon_state = "over_lowwater3") if(nutrilevel <= 2) overlays += image('icons/obj/hydroponics.dmi', icon_state = "over_lownutri3") if(health <= (myseed.endurance / 2)) @@ -838,6 +838,8 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob) //dna stuff hardset_dna(podman, ui, se, null, null, null, !prob(potency) ? /datum/species/plant/pod : null, "#59CE00") //makes sure podman has dna and sets the dna's ui/se/mutantrace/real_name etc variables + podman.set_cloned_appearance() + else //else, one packet of seeds. maybe two var/seed_count = 1 if(prob(getYield() * 20)) diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index 63454894ebb..3bcd85faca7 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -591,7 +591,7 @@ health += 10 user << "You repair some of the armor on [src]." return - if(istype(I, /obj/item/device/mining_scanner)) + if(istype(I, /obj/item/device/t_scanner/mining_scanner)) user << "You instruct [src] to drop any collected ore." DropOre() return @@ -725,45 +725,46 @@ usr << "The display on [src] seems to be flickering." /**********************Mining Scanner**********************/ -/obj/item/device/mining_scanner +/obj/item/device/t_scanner/mining_scanner desc = "A scanner that checks surrounding rock for useful minerals, it can also be used to stop gibtonite detonations. Requires you to wear mesons to work properly." name = "mining scanner" - icon_state = "mining" + icon_state = "mining0" item_state = "analyzer" w_class = 2.0 flags = CONDUCT slot_flags = SLOT_BELT var/cooldown = 0 -/obj/item/device/mining_scanner/attack_self(mob/user) - if(!user.client) - return +/obj/item/device/t_scanner/mining_scanner/scan() if(!cooldown) cooldown = 1 - spawn(40) + spawn(100) cooldown = 0 - var/client/C = user.client + var/turf/t = get_turf(src) + var/list/mobs = recursive_mob_check(t, 1,0,0) + if(!mobs.len) + return var/list/L = list() var/turf/simulated/mineral/M - for(M in range(7, user)) + for(M in range(7, t)) if(M.scan_state) L += M - if(!L.len) - user << "[src] reports that nothing was detected nearby." - return - else - for(M in L) - var/turf/T = get_turf(M) - var/image/I = image('icons/turf/walls.dmi', loc = T, icon_state = M.scan_state, layer = 18) - C.images += I - spawn(30) - if(C) - C.images -= I + if(L.len) + for(var/mob/user in mobs) + if(user.client) + var/client/C = user.client + for(M in L) + var/turf/T = get_turf(M) + var/image/I = image('icons/turf/walls.dmi', loc = T, icon_state = M.scan_state, layer = 18) + C.images += I + spawn(30) + if(C) + C.images -= I //Debug item to identify all ore spread quickly -/obj/item/device/mining_scanner/admin +/obj/item/device/t_scanner/mining_scanner/admin -/obj/item/device/mining_scanner/admin/attack_self(mob/user) +/obj/item/device/t_scanner/mining_scanner/admin/attack_self(mob/user) for(var/turf/simulated/mineral/M in world) if(M.scan_state) M.icon_state = M.scan_state diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index 81c682355d5..645dd8d9772 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -40,7 +40,7 @@ else if(istype(inserted_id)) //There's an ID in there. dat += text("ID: [inserted_id.registered_name] Eject ID.
    ") dat += text("Points Collected:[inserted_id.points]
    ") - dat += text("Point Quota: [inserted_id.goal ? inserted_id.goal : "Unlimited"] - Reach your quota to earn your release
    ") + dat += text("Point Quota: [inserted_id.goal] - Reach your quota to earn your release
    ") dat += text("Unclaimed Collection Points: [machine.points]. Claim points.
    ") else //No ID in sight. Complain about it. dat += text("No ID inserted. Insert ID.
    ") @@ -157,7 +157,7 @@ var/obj/item/weapon/card/id/prisoner/prisoner_id = I user << "ID: [prisoner_id.registered_name]" user << "Points Collected:[prisoner_id.points]" - user << "Point Quota: [prisoner_id.goal ? prisoner_id.goal : "Unlimited"]" + user << "Point Quota: [prisoner_id.goal]" user << "Collect points by bringing smelted minerals to the Labor Shuttle stacking machine. Reach your quota to earn your release." else user << "Error: Invalid ID" diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index f660ba1c7f9..d4545caaebd 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -30,7 +30,7 @@ new /obj/item/clothing/under/rank/miner(src) new /obj/item/clothing/gloves/fingerless(src) new /obj/item/clothing/shoes/sneakers/black(src) - new /obj/item/device/mining_scanner(src) + new /obj/item/device/t_scanner/mining_scanner(src) new /obj/item/weapon/storage/bag/ore(src) new /obj/item/device/flashlight/lantern(src) new /obj/item/weapon/shovel(src) diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 85218ee2e5b..8ce2cf50a52 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -204,7 +204,7 @@ ..() /turf/simulated/mineral/gibtonite/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/device/mining_scanner) && stage == 1) + if(istype(I, /obj/item/device/t_scanner/mining_scanner) && stage == 1) user.visible_message("You use [I] to locate where to cut off the chain reaction and attempt to stop it...") defuse() if(istype(I, /obj/item/weapon/pickaxe)) @@ -372,7 +372,7 @@ /turf/simulated/mineral/attackby(obj/item/weapon/W as obj, mob/user as mob) - 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 @@ -597,22 +597,6 @@ /turf/simulated/mineral/updateMineralOverlays() return - - /turf/proc/fullUpdateMineralOverlays() for (var/turf/t in range(1,src)) t.updateMineralOverlays() - -/turf/simulated/floor/plating/asteroid/Entered(atom/movable/M as mob|obj) - ..() - if(istype(M,/mob/living/silicon/robot)) - var/mob/living/silicon/robot/R = M - if(istype(R.module, /obj/item/weapon/robot_module/miner)) - if(istype(R.module_state_1,/obj/item/weapon/storage/bag/ore)) - src.attackby(R.module_state_1,R) - else if(istype(R.module_state_2,/obj/item/weapon/storage/bag/ore)) - src.attackby(R.module_state_2,R) - else if(istype(R.module_state_3,/obj/item/weapon/storage/bag/ore)) - src.attackby(R.module_state_3,R) - else - return diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 67f3f0095be..c0e88d1df5b 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -13,7 +13,7 @@ if(W.remove_fuel(15)) new refined_type(get_turf(src.loc)) qdel(src) - else + else if(W.isOn()) user << "Not enough fuel to smelt [src]." ..() @@ -114,7 +114,7 @@ if(istype(I, /obj/item/weapon/pickaxe) || istype(I, /obj/item/weapon/resonator)) GibtoniteReaction(user) return - if(istype(I, /obj/item/device/mining_scanner) && primed) + if(istype(I, /obj/item/device/t_scanner/mining_scanner) && primed) primed = 0 user.visible_message("The chain reaction was stopped! ...The ore's quality went down.") icon_state = "Gibtonite ore" diff --git a/code/modules/mob/dead/observer/login.dm.bak b/code/modules/mob/dead/observer/login.dm.bak deleted file mode 100644 index b71c51271eb..00000000000 --- a/code/modules/mob/dead/observer/login.dm.bak +++ /dev/null @@ -1,14 +0,0 @@ -/mob/observer/Login() - ..() - if (!src.start) - src.start = 1 - var/A = locate(/area/start) - var/list/L = list( ) - for(var/turf/T in A) - L += T - src.loc = pick(L) - src.client.screen = null - if (!isturf(src.loc)) - src.client.eye = src.loc - src.client.perspective = EYE_PERSPECTIVE - return \ No newline at end of file diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 982545d4381..c88b3628ec8 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -10,6 +10,7 @@ blinded = 0 anchored = 1 // don't get pushed around invisibility = INVISIBILITY_OBSERVER + languages = ALL var/can_reenter_corpse var/datum/hud/living/carbon/hud = null // hud var/bootime = 0 @@ -17,6 +18,7 @@ //If you died in the game and are a ghsot - this will remain as null. //Note that this is not a reliable way to determine if admins started as observers, since they change mobs a lot. var/atom/movable/following = null + var/fun_verbs = 0 /mob/dead/observer/New(mob/body) sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF @@ -47,6 +49,11 @@ if(!name) //To prevent nameless ghosts name = random_name(gender) real_name = name + + if(!fun_verbs) + verbs -= /mob/dead/observer/verb/boo + verbs -= /mob/dead/observer/verb/possess + ..() /mob/dead/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) @@ -231,7 +238,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp A.loc = T else A << "This mob is not located in the game world." -/* + /mob/dead/observer/verb/boo() set category = "Ghost" set name = "Boo!" @@ -245,7 +252,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return //Maybe in the future we can add more spooky code here! return -*/ + /mob/dead/observer/memory() set hidden = 1 @@ -262,4 +269,30 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if (see_invisible == SEE_INVISIBLE_OBSERVER_NOLIGHTING) see_invisible = SEE_INVISIBLE_OBSERVER else - see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING \ No newline at end of file + see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING + +/mob/dead/observer/verb/possess() + set category = "Ghost" + set name = "Possess!" + set desc= "Take over the body of a mindless creature!" + + var/list/possessible = list() + for(var/mob/living/L in living_mob_list) + if(!(L in player_list) && !L.mind) + possessible += L + + var/mob/living/target = input("Your new life begins today!", "Possess Mob", null, null) as null|anything in possessible + + if(!target) + return 0 + if(can_reenter_corpse || (mind && mind.current)) + if(alert(src, "Your soul is still tied to your former life as [mind.current.name], if you go foward there is no going back to that life. Are you sure you wish to continue?", "Move On", "Yes", "No") == "No") + return 0 + if(target.key) + src << "Someone has taken this body while you were choosing!" + return 0 + + target.key = key + return 1 + + diff --git a/code/modules/mob/dead/observer/observer.dm.bak b/code/modules/mob/dead/observer/observer.dm.bak deleted file mode 100644 index 766b14c1fa7..00000000000 --- a/code/modules/mob/dead/observer/observer.dm.bak +++ /dev/null @@ -1,170 +0,0 @@ -/mob/observer/New(mob/corpse) - set invisibility = 10 - - ..() - - if(corpse) - src.corpse = corpse - src.loc = get_turf(corpse.loc) - src.real_name = corpse.real_name - src.name = corpse.real_name - - src.sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS - src.see_invisible = 10 - src.see_in_dark = 100 - src.verbs += /mob/observer/proc/dead_tele - src.verbs += /mob/observer/proc/reenter_corpse - -/mob/proc/ghostize() - set name = "Ghost" - set desc = "You cannot be revived as a ghost" - if(src.client) - src.client.mob = new/mob/observer(src) - return - -/mob/observer/Move(NewLoc, direct) - if(NewLoc) - src.loc = NewLoc - return - if((direct & NORTH) && src.y < world.maxy) - src.y++ - if((direct & SOUTH) && src.y > 1) - src.y-- - if((direct & EAST) && src.x < world.maxx) - src.x++ - if((direct & WEST) && src.x > 1) - src.x-- - -/mob/observer/examine() - if(usr) usr << src.desc - -/mob/observer/can_use_hands() return 0 -/mob/observer/is_active() return 0 - -/mob/observer/Stat() - ..() - statpanel("Status") - if (src.client.statpanel == "Status") - if(ticker && ticker.mode) - if (ticker.timeleft) - stat(null, "ETA-[ticker.timeleft / 600 % 60]:[ticker.timeleft / 100 % 6][ticker.timeleft / 100 % 10]") - - if(ticker.mode.name == "Corporate Restructuring" && ticker.target) - var/icon = ticker.target.name - var/icon2 = ticker.target.real_name - var/area = get_area(ticker.target) - stat(null, text("Target: [icon2] (as [icon]) is in [area]")) - - if(ticker.mode.name == "AI malfunction" && ticker.processing) - stat(null, text("Time until all [station_name()]'s systems are taken over: [(ticker.AIwin - ticker.AItime) / 600 % 60]:[(ticker.AIwin - ticker.AItime) / 100 % 6][(ticker.AIwin - ticker.AItime) / 10 % 10]")) - - if (ticker.mode.name == "ctf") - stat(null, text("Red Team - [ticker.red_score]")) - stat(null, text("Green Team - [ticker.green_score]")) - -/mob/observer/proc/reenter_corpse() - set category = "Special Verbs" - set name = "Re-enter Corpse" - if(!corpse) - alert("You don't have a corpse!") - return - if(corpse.stat == 2) - alert("Your body is dead!") - return - if(src.client && src.client.holder && src.client.holder.state == 2) - var/rank = src.client.holder.rank - src.client.clear_admin_verbs() - src.client.holder.state = 1 - src.client.update_admins(rank) - src.client.mob = corpse - del(src) - -/mob/observer/proc/dead_tele() - set category = "Special Verbs" - set name = "Teleport" - set desc= "Teleport" - if((usr.stat != 2) || !istype(usr, /mob/observer)) - usr << "Not when you're not dead!" - return - var/A - usr.verbs -= /mob/observer/proc/dead_tele - spawn(50) - usr.verbs += /mob/observer/proc/dead_tele - A = input("Area to jump to", "BOOYEA", A) in list("Engine","Hallways","Toxins","Storage","Maintenance","Crew Quarters","Medical","Security","Chapel","Bridge") - - switch (A) - if ("Engine") - var/list/L = list() - for(var/area/B in world) - if(istype(B, /area/engine) && !istype(B, /area/engine/combustion) && !istype(B, /area/engine/engine_walls)) - L += B - A = pick(L) - if ("Hallways") - var/list/L = list() - for(var/area/B in world) - if(istype(B, /area/hallway)) - L += B - A = pick(L) - if ("Toxins") - var/list/L = list() - for(var/area/B in world) - if(istype(B, /area/toxins) && !istype(B, /area/toxins/test_chamber)) - L += B - A = pick(L) - if ("Storage") - var/list/L = list() - for(var/area/B in world) - if(istype(B, /area/storage)) - L += B - A = pick(L) - if ("Maintenance") - var/list/L = list() - for(var/area/B in world) - if(istype(B, /area/maintenance)) - L += B - A = pick(L) - if ("Crew Quarters") - var/list/L = list() - for(var/area/B in world) - if(istype(B, /area/crew_quarters)) - L += B - A = pick(L) - if ("Medical") - var/list/L = list() - for(var/area/B in world) - if(istype(B, /area/medical)) - L += B - A = pick(L) - if ("Security") - var/list/L = list() - for(var/area/B in world) - if(istype(B, /area/security)) - L += B - A = pick(L) - if ("Chapel") - var/list/L = list() - for(var/area/B in world) - if(istype(B, /area/chapel)) - L += B - A = pick(L) - if ("Bridge") - var/list/L = list() - for(var/area/B in world) - if(istype(B, /area/bridge)) - L += B - A = pick(L) - - var/list/L = list() - for(var/turf/T in A) - if(!T.density) - var/clear = 1 - for(var/obj/O in T) - if(O.density) - clear = 0 - break - if(clear) - L+=T - - usr.loc = pick(L) - - diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm index 51f5fb8a1ea..37831db6f0a 100644 --- a/code/modules/mob/dead/observer/say.dm +++ b/code/modules/mob/dead/observer/say.dm @@ -1,6 +1,3 @@ -/mob/dead/observer/say_understands(var/other) - return 1 - /mob/dead/observer/say(var/message) message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) @@ -18,6 +15,10 @@ return . = src.say_dead(message) + +/mob/dead/observer/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq) + src << message + /* for (var/mob/M in hearers(null, null)) if (!M.stat) diff --git a/code/modules/mob/dead/observer/say.dm.bak b/code/modules/mob/dead/observer/say.dm.bak deleted file mode 100644 index 5f330b2ab93..00000000000 --- a/code/modules/mob/dead/observer/say.dm.bak +++ /dev/null @@ -1,30 +0,0 @@ -/mob/observer/say_understands(var/other) - return 1 - -/mob/observer/say(var/message) - message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) - - if (!message) - return - - world.log_say("Ghost/[src.key] : [message]") - - if (src.muted) - return - - . = src.say_dead(message) - - for (var/mob/M in hearers(null, null)) - if (!M.stat) - if(M.job == "Chaplain") - if (prob (49)) - M.show_message("You hear muffled speech... but nothing is there...", 2) - else - M.show_message("[stutter(message)]", 2) - else - if (prob(50)) - return - else if (prob (95)) - M.show_message("You hear muffled speech... but nothing is there...", 2) - else - M.show_message("[stutter(message)]", 2) diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 0263237a03d..cae772dd6bf 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -5,19 +5,17 @@ /mob/living/carbon/alien name = "alien" voice_name = "alien" - voice_message = "hisses" say_message = "hisses" icon = 'icons/mob/alien.dmi' gender = NEUTER dna = null faction = list("alien") ventcrawler = 2 - + languages = ALIEN + nightvision = 1 var/storedPlasma = 250 var/max_plasma = 500 - alien_talk_understand = 1 - var/obj/item/weapon/card/id/wear_id = null // Fix for station bounced radios -- Skie var/has_fine_manipulation = 0 @@ -195,6 +193,21 @@ playsound(C, 'sound/voice/hiss5.ogg', 40, 1, 1) //Alien roars when breaking free. ..() +/mob/living/carbon/alien/verb/nightvisiontoggle() + set name = "Toggle Night Vision" + set category = "Alien" + + if(!nightvision) + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_MINIMUM + nightvision = 1 + hud_used.nightvisionicon.icon_state = "nightvision1" + else if(nightvision == 1) + see_in_dark = 4 + see_invisible = 45 + nightvision = 0 + hud_used.nightvisionicon.icon_state = "nightvision0" + /*---------------------------------------- Proc: AddInfectionImages() Des: Gives the client of the alien an image on each infected mob. diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index 80cb1fdc642..3bb33028ea0 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -138,20 +138,18 @@ Doesn't work on other aliens/AI.*/ return /mob/living/carbon/alien/humanoid/proc/resin() - set name = "Secrete Resin (75)" + set name = "Secrete Resin (55)" set desc = "Secrete tough malleable resin." set category = "Alien" - if(powerc(75)) - var/choice = input("Choose what you wish to shape.","Resin building") as null|anything in list("resin door","resin wall","resin membrane","resin nest") //would do it through typesof but then the player choice would have the type path and we don't want the internal workings to be exposed ICly - Urist - if(!choice || !powerc(75)) return - adjustToxLoss(-75) + if(powerc(55)) + var/choice = input("Choose what you wish to shape.","Resin building") as null|anything in list("resin wall","resin membrane","resin nest") //would do it through typesof but then the player choice would have the type path and we don't want the internal workings to be exposed ICly - Urist + if(!choice || !powerc(55)) return + adjustToxLoss(-55) src << "You shape a [choice]." for(var/mob/O in viewers(src, null)) O.show_message(text("[src] vomits up a thick purple substance and begins to shape it!"), 1) switch(choice) - if("resin door") - new /obj/structure/mineral_door/resin(loc) if("resin wall") new /obj/structure/alien/resin/wall(loc) if("resin membrane") @@ -172,4 +170,4 @@ Doesn't work on other aliens/AI.*/ A.loc = loc //Paralyse(10) src.visible_message("[src] hurls out the contents of their stomach!") - return \ No newline at end of file + return diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 2c29857b305..ac4ac556d85 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -116,12 +116,12 @@ if ("help") help_shake_act(M) else - if (is_muzzled()) + if (M.is_muzzled()) return - if (health > 0) - playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - visible_message("[M.name] bites [src]!", \ - "[M.name] bites [src]!") + playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) + visible_message("[M.name] bites [src]!", \ + "[M.name] bites [src]!") + if (health > -100) adjustBruteLoss(rand(1, 3)) updatehealth() return @@ -134,7 +134,7 @@ if(M.Victim) return // can't attack while eating! - if (health > -100) + if (stat > -100) visible_message("The [M.name] glomps [src]!", \ "The [M.name] glomps [src]!") @@ -309,6 +309,28 @@ In all, this is a lot like the monkey code. /N return +/mob/living/carbon/alien/humanoid/attack_larva(mob/living/carbon/alien/larva/L as mob) + + switch(L.a_intent) + if("help") + visible_message("[L] rubs its head against [src].") + + + else + if (health > 0) + playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) + var/damage = rand(1, 3) + visible_message("[L.name] bites [src]!!", \ + "[L.name] bites [src]!!") + + adjustBruteLoss(damage) + updatehealth() + else + L << "[name] is too injured for that." + return + + + /mob/living/carbon/alien/humanoid/restrained() if (handcuffed) return 1 diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm index 71ad1de7810..0f9b45ee478 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/life.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/life.dm @@ -194,7 +194,7 @@ if(breath.temperature > (T0C+66) && !(COLD_RESISTANCE in mutations)) // Hot air hurts :( if(prob(20)) - src << "You feel a searing heat in your lungs!>/span>" + src << "You feel a searing heat in your lungs!" fire_alert = max(fire_alert, 1) else fire_alert = 0 @@ -389,8 +389,12 @@ sight |= SEE_MOBS sight &= ~SEE_TURFS sight &= ~SEE_OBJS - see_in_dark = 4 - see_invisible = SEE_INVISIBLE_LEVEL_TWO + if(nightvision) + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_MINIMUM + else if(!nightvision) + see_in_dark = 4 + see_invisible = 45 if(see_override) see_invisible = see_override diff --git a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm index d13c7984cee..da27c428b5c 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm @@ -18,9 +18,14 @@ //If we mostly took damage from fire if(fireloss > 125) icon_state = "alien[caste]_husked" + pixel_y = 0 else icon_state = "alien[caste]_dead" - else if(stat == UNCONSCIOUS || lying || resting) + pixel_y = 0 + else if(stat == UNCONSCIOUS) + icon_state = "alien[caste]_unconscious" + pixel_y = 0 + else if(lying || resting) icon_state = "alien[caste]_sleep" else if(m_intent == "run") icon_state = "alien[caste]_running" diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index 997fa314919..892a68b5344 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -117,6 +117,8 @@ if(M.melee_damage_upper == 0) M.emote("[M.friendly] [src]") else + if(M.attack_sound) + playsound(loc, M.attack_sound, 50, 1, 1) visible_message("[M] [M.attacktext] [src]!", \ "[M] [M.attacktext] [src]!") var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) @@ -142,12 +144,12 @@ if ("help") help_shake_act(M) else - if (is_muzzled()) + if (M.is_muzzled()) return - if (health > 0) - playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - visible_message("[M.name] bites [src]!", \ - "[M.name] bites [src]!") + playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) + visible_message("[M.name] bites [src]!", \ + "[M.name] bites [src]!") + if (health > -100) adjustBruteLoss(rand(1, 3)) updatehealth() return @@ -158,13 +160,12 @@ M << "You cannot attack people before the game has started." return - if(M.Victim) return // can't attack while eating! - - if (health > -100) + if(M.Victim) + return // can't attack while eating! + if (stat != DEAD) visible_message("The [M.name] glomps [src]!", \ "The [M.name] glomps [src]!") - var/damage = rand(1, 3) if(M.is_adult) @@ -172,9 +173,8 @@ else damage = rand(5, 35) + adjustBruteLoss(damage) - - updatehealth() return @@ -259,7 +259,7 @@ else if (health > 0) playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - var/damage = rand(1, 3) + var/damage = 1 visible_message("[M.name] bites [src]!", \ "[M.name] bites [src]!") adjustBruteLoss(damage) diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index b7f6cb35a41..f0a4f1278a0 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -301,8 +301,12 @@ sight |= SEE_MOBS sight &= ~SEE_TURFS sight &= ~SEE_OBJS - see_in_dark = 4 - see_invisible = SEE_INVISIBLE_LEVEL_TWO + if(nightvision) + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_MINIMUM + else if(!nightvision) + see_in_dark = 4 + see_invisible = 45 if(see_override) see_invisible = see_override diff --git a/code/modules/mob/living/carbon/alien/say.dm b/code/modules/mob/living/carbon/alien/say.dm index a8e2a3e0034..a65299adfc1 100644 --- a/code/modules/mob/living/carbon/alien/say.dm +++ b/code/modules/mob/living/carbon/alien/say.dm @@ -1,35 +1,7 @@ -/mob/living/carbon/alien/say_understands(var/other) - if (istype(other, /mob/living/carbon/alien)) - return 1 - return ..() - /mob/living/carbon/alien/say(var/message) - - if (silent) - return - - if (length(message) >= 2) - if (copytext(message, 1, 3) == ":a" || copytext(message, 1, 3) == "#a" || copytext(message, 1, 3) == ".a" ) - message = copytext(message, 3) - message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) - if (stat == 2) - return say_dead(message) - else - alien_talk(message) - else - if (copytext(message, 1, 2) != "*" && !stat) - playsound(loc, "hiss", 25, 1, 1)//So aliens can hiss while they hiss yo/N - return ..(message, "A") - else - -// ~lol~ -/mob/living/carbon/alien/say_quote(var/text) -// var/ending = copytext(text, length(text)) - - return "[say_message], \"[text]\""; + return ..(message, "A") /mob/living/proc/alien_talk(var/message) - log_say("[key_name(src)] : [message]") message = trim(message) @@ -38,42 +10,17 @@ var/message_a = say_quote(message) var/rendered = "Hivemind, [name] [message_a]" - for (var/mob/living/S in player_list) - if(!S.stat) - if(S.alien_talk_understand) - if(S.alien_talk_understand == alien_talk_understand) - S.show_message(rendered, 2) - else if (S.hivecheck()) - S.show_message(rendered, 2) + for(var/mob/S in player_list) + if((!S.stat && (S.hivecheck())) || (S.stat == DEAD && !istype(S, /mob/new_player))) + S << rendered - var/list/listening = hearers(1, src) - listening -= src - listening += src +/mob/living/carbon/alien/handle_inherent_channels(message, message_mode) + if(!..()) + if(message_mode == MODE_ALIEN) + if(hivecheck()) + alien_talk(message) + return 1 + return 0 - var/list/heard = list() - for (var/mob/M in listening) - if(!istype(M, /mob/living/carbon/alien) && !M.alien_talk_understand) - heard += M - - - if (length(heard)) - var/message_b - - message_b = "hsssss" - message_b = say_quote(message_b) - message_b = "[message_b]" - - rendered = "[voice_name] [message_b]" - - for (var/mob/M in heard) - M.show_message(rendered, 2) - - message = say_quote(message) - - rendered = "Hivemind, [name] [message_a]" - - for (var/mob/M in player_list) - if (istype(M, /mob/new_player)) - continue - if (M.stat > 1) - M.show_message(rendered, 2) \ No newline at end of file +/mob/living/carbon/alien/hivecheck() + return 1 diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm index b895068c1c2..5c2d03085cf 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -9,6 +9,7 @@ var/const/ALIEN_AFK_BRACKET = 450 // 45 seconds icon_state = "larva0_dead" var/mob/living/affected_mob var/stage = 0 + var/polling_ghosts = 0 /obj/item/alien_embryo/New() if(istype(loc, /mob/living)) @@ -70,23 +71,20 @@ var/const/ALIEN_AFK_BRACKET = 450 // 45 seconds affected_mob << "You feel something tearing its way out of your stomach..." affected_mob.adjustToxLoss(10) affected_mob.updatehealth() - if(prob(50)) + if(prob(50) && !polling_ghosts) AttemptGrow() /obj/item/alien_embryo/proc/AttemptGrow(var/gib_on_success = 1) - var/list/candidates = get_candidates(BE_ALIEN, ALIEN_AFK_BRACKET) - var/client/C = null + polling_ghosts = 1 + var/client/C = pick_from_candidates(BE_ALIEN) + polling_ghosts = 0 // To stop clientless larva, we will check that our host has a client // if we find no ghosts to become the alien. If the host has a client // he will become the alien but if he doesn't then we will set the stage // to 2, so we don't do a process heavy check everytime. - if(candidates.len) - C = pick(candidates) - else if(affected_mob.client) - C = affected_mob.client - else + if(!C) stage = 4 // Let's try again later. return diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index df9a0e26887..c59d83cd26e 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -17,6 +17,7 @@ var/const/MAX_ACTIVE_TIME = 400 w_class = 1 //note: can be picked up by aliens unlike most other items of w_class below 4 flags = MASKCOVERSMOUTH | MASKCOVERSEYES | MASKINTERNALS throw_range = 5 + tint = 3 var/stat = CONSCIOUS //UNCONSCIOUS is the idle state in this case @@ -115,6 +116,7 @@ var/const/MAX_ACTIVE_TIME = 400 if(loc == L) return 0 if(stat != CONSCIOUS) return 0 + if(locate(/obj/item/alien_embryo) in L) return 0 if(!sterile) L.take_organ_damage(strength,0) //done here so that even borgs and humans in helmets take damage L.visible_message("[src] leaps at [L]'s face!") @@ -128,7 +130,6 @@ var/const/MAX_ACTIVE_TIME = 400 if(iscarbon(M)) var/mob/living/carbon/target = L - if(target.wear_mask) if(prob(20)) return 0 var/obj/item/clothing/W = target.wear_mask diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index 6b5196a25c9..2f0d259284c 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -1,6 +1,7 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 /mob/living/carbon/brain + languages = HUMAN var/obj/item/container = null var/timeofhostdeath = 0 var/emp_damage = 0//Handles a type of MMI damage @@ -16,35 +17,7 @@ death(1) //Brains can die again. AND THEY SHOULD AHA HA HA HA HA HA ghostize() //Ghostize checks for key so nothing else is necessary. ..() - -/mob/living/carbon/brain/say_understands(var/other)//Goddamn is this hackish, but this say code is so odd - if (istype(other, /mob/living/silicon/ai)) - if(!(container && istype(container, /obj/item/device/mmi))) - return 0 - else - return 1 - if (istype(other, /mob/living/silicon/decoy)) - if(!(container && istype(container, /obj/item/device/mmi))) - return 0 - else - return 1 - if (istype(other, /mob/living/silicon/pai)) - if(!(container && istype(container, /obj/item/device/mmi))) - return 0 - else - return 1 - if (istype(other, /mob/living/silicon/robot)) - if(!(container && istype(container, /obj/item/device/mmi))) - return 0 - else - return 1 - if (istype(other, /mob/living/carbon/human)) - return 1 - if (istype(other, /mob/living/carbon/slime)) - return 1 - return ..() - - + /mob/living/carbon/brain/update_canmove() if(in_contents_of(/obj/mecha)) canmove = 1 else canmove = 0 diff --git a/code/modules/mob/living/carbon/brain/say.dm b/code/modules/mob/living/carbon/brain/say.dm index 4b8174cc21b..5c9d10c9ae5 100644 --- a/code/modules/mob/living/carbon/brain/say.dm +++ b/code/modules/mob/living/carbon/brain/say.dm @@ -1,7 +1,4 @@ /mob/living/carbon/brain/say(var/message) - if (silent) - return - if(!(container && istype(container, /obj/item/device/mmi))) return //No MMI, can't speak, bucko./N else @@ -10,8 +7,14 @@ return else message = Gibberish(message, (emp_damage*6))//scrambles the message, gets worse when emp_damage is higher - if(istype(container, /obj/item/device/mmi/radio_enabled)) - var/obj/item/device/mmi/radio_enabled/R = container - if(R.radio) - spawn(0) R.radio.hear_talk(src, sanitize(message)) - ..() \ No newline at end of file + ..() + +/mob/living/carbon/brain/radio(message, message_mode) + if(message_mode && istype(container, /obj/item/device/mmi/radio_enabled)) + var/obj/item/device/mmi/radio_enabled/R = container + if(R.radio) + R.radio.talk_into(src, sanitize(message)) + return ITALICS | REDUCE_RANGE + +/mob/living/carbon/brain/lingcheck() + return 0 diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 13c0fcc5e78..bd6c513cd66 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -128,7 +128,7 @@ return shock_damage -/mob/living/carbon/proc/swap_hand() +/mob/living/carbon/swap_hand() var/obj/item/item_in_hand = src.get_active_hand() if(item_in_hand) //this segment checks if the item in your hand is twohanded. if(istype(item_in_hand,/obj/item/weapon/twohanded)) @@ -149,7 +149,7 @@ src.hands.dir = SOUTH*/ return -/mob/living/carbon/proc/activate_hand(var/selhand) //0 or "r" or "right" for right hand; 1 or "l" or "left" for left hand. +/mob/living/carbon/activate_hand(var/selhand) //0 or "r" or "right" for right hand; 1 or "l" or "left" for left hand. if(istext(selhand)) selhand = lowertext(selhand) @@ -205,7 +205,7 @@ src << "You're completely exhausted." else src << "You feel fatigued." - if(dna && (dna.species == /datum/species/skeleton) && !H.w_uniform && !H.wear_suit) + if(dna && dna.species.id && dna.species.id == "skeleton" && !H.w_uniform && !H.wear_suit) H.play_xylophone() else if(ishuman(src)) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 45bbc8d1884..fe05d3e038c 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -108,13 +108,10 @@ now_pushing = 1 if (!AM.anchored) + if(pulling == AM) + stop_pulling() var/t = get_dir(src, AM) - if (istype(AM, /obj/structure/window)) - if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST) - for(var/obj/structure/window/win in get_step(AM,t)) - now_pushing = 0 - return - step(AM, t) + AM.Move(get_step(AM, t)) now_pushing = 0 /mob/living/carbon/human/Stat() @@ -237,6 +234,27 @@ if(armor >= 2) return +/mob/living/carbon/human/attack_larva(mob/living/carbon/alien/larva/L as mob) + + switch(L.a_intent) + if("help") + visible_message("[L] rubs its head against [src].") + + + else + + var/damage = rand(1, 3) + visible_message("[L] bites [src]!", \ + "[L] bites [src]!") + playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) + + if(stat != DEAD) + L.amount_grown = min(L.amount_grown + damage, L.max_grown) + var/obj/item/organ/limb/affecting = get_organ(ran_zone(L.zone_sel.selecting)) + var/armor_block = run_armor_check(affecting, "melee") + apply_damage(damage, BRUTE, affecting, armor_block) + + /mob/living/carbon/human/attack_slime(mob/living/carbon/slime/M as mob) if(M.Victim) return // can't attack while eating! @@ -564,7 +582,7 @@ //Check for ID var/obj/item/weapon/card/id/idcard = get_idcard() - if(judgebot.idcheck && !idcard) + if(judgebot.idcheck && !idcard && name=="Unknown") threatcount += 4 //Check for weapons @@ -604,6 +622,17 @@ //Agent cards lower threatlevel. if(istype(idcard, /obj/item/weapon/card/id/syndicate)) - threatcount -= 2 + threatcount -= 5 return threatcount + + +//Used for new human mobs created by cloning/goleming/podding +/mob/living/carbon/human/proc/set_cloned_appearance() + if(gender == MALE) + facial_hair_style = "Full Beard" + else + facial_hair_style = "Shaved" + hair_style = pick("Bedhead", "Bedhead 2", "Bedhead 3") + underwear = "Nude" + regenerate_icons() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_attackpaw.dm b/code/modules/mob/living/carbon/human/human_attackpaw.dm index 17d1e721587..95eaeb61ec3 100644 --- a/code/modules/mob/living/carbon/human/human_attackpaw.dm +++ b/code/modules/mob/living/carbon/human/human_attackpaw.dm @@ -3,11 +3,12 @@ if (M.a_intent == "help") help_shake_act(M) else - if (is_muzzled()) + if (M.is_muzzled()) return visible_message("[M.name] bites [src]!", \ "[M.name] bites [src]!") + playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) var/damage = rand(1, 3) var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg") diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 3fffa8a5958..cd5c6e591e5 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -1,4 +1,5 @@ /mob/living/carbon/human + languages = HUMAN //Hair colour and style var/hair_color = "000" var/hair_style = "Bald" diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 1184b881c8d..ae583d7d2a6 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -594,9 +594,7 @@ /mob/living/carbon/human/proc/handle_regular_hud_updates() if(!client) return 0 - for(var/image/hud in client.images) - if(copytext(hud.icon_state,1,4) == "hud") //ugly, but icon comparison is worse, I believe - client.images.Remove(hud) + regular_hud_updates() //For MED/SEC HUD icon deletion client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask) @@ -696,8 +694,8 @@ if(lastpuke >= 25) // about 25 second delay I guess Stun(5) - for(var/mob/O in viewers(world.view, src)) - O.show_message("[O] throws up!") + visible_message("[src] throws up!", \ + "[src] throws up!") playsound(loc, 'sound/effects/splat.ogg', 50, 1) var/turf/location = loc diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index be98cf67ed9..1d1faa53c25 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -1,50 +1,4 @@ /mob/living/carbon/human/say(var/message) - - if(silent) - return - - // Needed so when they die they can talk in dead chat normally without needing to ghost. - if(stat != DEAD) - - //Mimes dont speak! Changeling hivemind and emotes are allowed. - if(!IsVocal()) - if(length(message) >= 2) - if(mind && mind.changeling) - if(copytext(message, 1, 2) != "*" && copytext(message, 1, 3) != ":g" && copytext(message, 1, 3) != ":G" && copytext(message, 1, 3) != ":ï") - return - else - return ..(message) - if(stat == DEAD) - return ..(message) - - if(length(message) >= 1) //In case people forget the '*help' command, this will slow them the message and prevent people from saying one letter at a time - if (copytext(message, 1, 2) != "*") - return - - if(dna) - message = dna.species.handle_speech(message,src) - - if(viruses.len) - for(var/datum/disease/pierrot_throat/D in viruses) - var/list/temp_message = text2list(message, " ") //List each word in the message - var/list/pick_list = list() - for(var/i = 1, i <= temp_message.len, i++) //Create a second list for excluding words down the line - pick_list += i - for(var/i=1, ((i <= D.stage) && (i <= temp_message.len)), i++) //Loop for each stage of the disease or until we run out of words - if(prob(3 * D.stage)) //Stage 1: 3% Stage 2: 6% Stage 3: 9% Stage 4: 12% - var/H = pick(pick_list) - if(findtext(temp_message[H], "*") || findtext(temp_message[H], ";") || findtext(temp_message[H], ":")) continue - temp_message[H] = "HONK" - pick_list -= H //Make sure that you dont HONK the same word twice - message = list2text(temp_message, " ") - - if(wear_mask) - message = wear_mask.speechModification(message) - - if ((HULK in mutations) && health >= 25 && length(message)) - if(copytext(message, 1, 2) != "*") - message = "[uppertext(replacetext(message, ".", "!"))]!!" //because I don't know how to code properly in getting vars from other files -Bro - ..(message) /mob/living/carbon/human/say_quote(text) @@ -67,12 +21,105 @@ return "says, \"[text]\""; -/mob/living/carbon/human/proc/forcesay(list/append) +/mob/living/carbon/human/treat_message(message) + if(dna) + message = dna.species.handle_speech(message,src) + + if ((HULK in mutations) && health >= 25 && length(message)) + message = "[uppertext(replacetext(message, ".", "!"))]!!" //because I don't know how to code properly in getting vars from other files -Bro + + if(viruses.len) + for(var/datum/disease/pierrot_throat/D in viruses) + var/list/temp_message = text2list(message, " ") //List each word in the message + var/list/pick_list = list() + for(var/i = 1, i <= temp_message.len, i++) //Create a second list for excluding words down the line + pick_list += i + for(var/i=1, ((i <= D.stage) && (i <= temp_message.len)), i++) //Loop for each stage of the disease or until we run out of words + if(prob(3 * D.stage)) //Stage 1: 3% Stage 2: 6% Stage 3: 9% Stage 4: 12% + var/H = pick(pick_list) + if(findtext(temp_message[H], "*") || findtext(temp_message[H], ";") || findtext(temp_message[H], ":")) continue + temp_message[H] = "HONK" + pick_list -= H //Make sure that you dont HONK the same word twice + message = list2text(temp_message, " ") + + message = ..(message) + + return message + +/mob/living/carbon/human/GetVoice() + if(istype(src.wear_mask, /obj/item/clothing/mask/gas/voice)) + var/obj/item/clothing/mask/gas/voice/V = src.wear_mask + if(V.vchange) + return V.voice + else + return real_name + if(mind && mind.changeling && mind.changeling.mimicing) + return mind.changeling.mimicing + if(GetSpecialVoice()) + return GetSpecialVoice() + return real_name + +/mob/living/carbon/human/IsVocal() + if(mind) + return !mind.miming + return 1 + +/mob/living/carbon/human/proc/SetSpecialVoice(var/new_voice) + if(new_voice) + special_voice = new_voice + return + +/mob/living/carbon/human/proc/UnsetSpecialVoice() + special_voice = "" + return + +/mob/living/carbon/human/proc/GetSpecialVoice() + return special_voice + +/mob/living/carbon/human/binarycheck() + if(ears) + var/obj/item/device/radio/headset/dongle = ears + if(!istype(dongle)) return 0 + if(dongle.translate_binary) return 1 + +/mob/living/carbon/human/radio(message, message_mode) + . = ..() + if(. != 0) + return . + + switch(message_mode) + if(MODE_HEADSET) + if (ears) + ears.talk_into(src, message) + return ITALICS | REDUCE_RANGE + + if(MODE_SECURE_HEADSET) + if (ears) + ears.talk_into(src, message, 1) + return ITALICS | REDUCE_RANGE + + if(MODE_DEPARTMENT) + if (ears) + ears.talk_into(src, message, message_mode) + return ITALICS | REDUCE_RANGE + + if(message_mode in radiochannels) + if(ears) + ears.talk_into(src, message, message_mode) + return ITALICS | REDUCE_RANGE + + return 0 + +/mob/living/carbon/human/get_alt_name() + if(name != GetVoice()) + return " (as [get_id_name("Unknown")])" + +/mob/living/carbon/human/proc/forcesay(list/append) //this proc is at the bottom of the file because quote fuckery makes notepad++ cri if(stat == CONSCIOUS) if(client) var/virgin = 1 //has the text been modified yet? var/temp = winget(client, "input", "text") - if(findtextEx(temp, "Say \"", 1, 7) && length(temp) > 5) //case sensitive means + if(findtextEx(temp, "Say \"", 1, 7) && length(temp) > 5) //"case sensitive means temp = replacetext(temp, ";", "") //general radio @@ -97,52 +144,3 @@ say(temp) winset(client, "input", "text=[null]") - - -/mob/living/carbon/human/say_understands(var/other) - if (istype(other, /mob/living/silicon/ai)) - return 1 - if (istype(other, /mob/living/silicon/decoy)) - return 1 - if (istype(other, /mob/living/silicon/pai)) - return 1 - if (istype(other, /mob/living/silicon/robot)) - return 1 - if (istype(other, /mob/living/carbon/brain)) - return 1 - if (istype(other, /mob/living/carbon/slime)) - return 1 - return ..() - - -/mob/living/carbon/human/GetVoice() - if(istype(src.wear_mask, /obj/item/clothing/mask/gas/voice)) - var/obj/item/clothing/mask/gas/voice/V = src.wear_mask - if(V.vchange) - return V.voice - else - return name - if(mind && mind.changeling && mind.changeling.mimicing) - return mind.changeling.mimicing - if(GetSpecialVoice()) - return GetSpecialVoice() - return real_name - -/mob/living/carbon/human/IsVocal() - if(mind) - return !mind.miming - return 1 - -/mob/living/carbon/human/proc/SetSpecialVoice(var/new_voice) - if(new_voice) - special_voice = new_voice - return - - -/mob/living/carbon/human/proc/UnsetSpecialVoice() - special_voice = "" - return - - -/mob/living/carbon/human/proc/GetSpecialVoice() - return special_voice \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 1315cd09dc5..f0c5fe46444 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -443,27 +443,6 @@ else H.hud_used.lingchemdisplay.invisibility = 101 - if(istype(H.wear_mask, /obj/item/clothing/mask/gas/voice/space_ninja)) - var/obj/item/clothing/mask/gas/voice/space_ninja/O = H.wear_mask - switch(O.mode) - if(0) - var/target_list[] = list() - for(var/mob/living/target in oview(H)) - if( target.mind&&(target.mind.special_role||issilicon(target)) )//They need to have a mind. - target_list += target - if(target_list.len)//Everything else is handled by the ninja mask proc. - O.assess_targets(target_list, H) - H.see_invisible = SEE_INVISIBLE_LIVING - if(1) - H.see_in_dark = 5 - H.see_invisible = SEE_INVISIBLE_LIVING - if(2) - H.sight |= SEE_MOBS - H.see_invisible = SEE_INVISIBLE_LEVEL_TWO - if(3) - H.sight |= SEE_TURFS - H.see_invisible = SEE_INVISIBLE_LIVING - if(H.glasses) if(istype(H.glasses, /obj/item/clothing/glasses)) var/obj/item/clothing/glasses/G = H.glasses @@ -1286,7 +1265,7 @@ return var/datum/gas_mixture/G = H.loc.return_air() // Check if we're standing in an oxygenless environment if(G.oxygen < 1) - ExtinguishMob() //If there's no oxygen in the tile we're on, put out the fire + ExtinguishMob(H) //If there's no oxygen in the tile we're on, put out the fire return var/turf/location = get_turf(H) location.hotspot_expose(700, 50, 1) diff --git a/code/modules/mob/living/carbon/human/whisper.dm b/code/modules/mob/living/carbon/human/whisper.dm index cd48a67b575..f3b6baae554 100644 --- a/code/modules/mob/living/carbon/human/whisper.dm +++ b/code/modules/mob/living/carbon/human/whisper.dm @@ -1,44 +1,28 @@ /mob/living/carbon/human/whisper(message as text) - if(!IsVocal()) return if(say_disabled) //This is here to try to identify lag problems usr << "Speech is currently admin-disabled." return - + message = trim(copytext(strip_html_simple(message), 1, MAX_MESSAGE_LEN)) - - if (!message || silent) + if(!can_speak(message)) return - + + message = "[message]" log_whisper("[src.name]/[src.key] : [message]") if (src.client) if (src.client.prefs.muted & MUTE_IC) src << "You cannot whisper (muted)." - return + return - if (src.client.handle_spam_prevention(message,MUTE_IC)) - return + log_whisper("[src.name]/[src.key] : [message]") - - if (src.stat == DEAD) - return src.say_dead(message) - - var/alt_name = "" - if (src.name != GetVoice()) - alt_name = " (as [get_id_name("Unknown")])" - // Mute disability - if (src.sdisabilities & MUTE) - return - - if (is_muzzled()) - return + var/alt_name = get_alt_name() var/whispers = "whispers" - - var/critical = InCritical() // We are unconscious but not in critical, so don't allow them to whisper. @@ -54,99 +38,36 @@ message = Ellipsis(message, 10, 1) whispers = "whispers in their final breath" - var/italics = 1 - var/message_range = 1 + message = treat_message(message) - if(src.wear_mask) - message = wear_mask.speechModification(message) + var/list/listening_dead = list() + for(var/mob/M in player_list) + if(M.stat == DEAD && ((M.client.prefs.toggles & CHAT_GHOSTWHISPER) || (get_dist(M, src) <= 7))) + listening_dead |= M - if (src.stuttering) - message = stutter(message) - - for (var/obj/O in view(message_range, src)) - spawn (0) - if (O) - O.hear_talk(src, message) - - var/list/listening = hearers(message_range, src) - listening -= src - if(!critical) - listening += src + var/list/listening = get_hear(1, src) + listening |= listening_dead var/list/eavesdropping = hearers(2, src) - eavesdropping -= src eavesdropping -= listening var/list/watching = hearers(5, src) - watching -= src watching -= listening watching -= eavesdropping - var/list/heard_a = list() // understood us - var/list/heard_b = list() // didn't understand us + var/rendered - for (var/mob/M in listening) - if (M.say_understands(src)) - heard_a += M - else - heard_b += M - - var/rendered = null - - for (var/mob/M in watching) - if (M.say_understands(src)) - rendered = "[src.name] [whispers] something." - else - rendered = "[src.voice_name] [whispers] something." + rendered = "[src.name] [whispers] something." + for(var/mob/M in watching) M.show_message(rendered, 2) - if (length(heard_a)) - var/message_a = message - - if (italics) - message_a = "[message_a]" - //This appears copied from carbon/living say.dm so the istype check for mob is probably not needed. Appending for src is also not needed as the game will check that automatically. - rendered = "[GetVoice()][alt_name] [whispers], \"[message_a]\"" - - for (var/mob/M in heard_a) - M.show_message(rendered, 2) - - if (length(heard_b)) - var/message_b - - if (src.voice_message) - message_b = src.voice_message - else - message_b = stars(message) - - if (italics) - message_b = "[message_b]" - - rendered = "[src.voice_name] [whispers], \"[message_b]\"" - - for (var/mob/M in heard_b) - M.show_message(rendered, 2) - - for (var/mob/M in eavesdropping) - if (M.say_understands(src)) - var/message_c - message_c = stars(message) - rendered = "[GetVoice()][alt_name] [whispers], \"[message_c]\"" - M.show_message(rendered, 2) - else - rendered = "[src.voice_name] [whispers] something." - M.show_message(rendered, 2) - - if (italics) - message = "[message]" rendered = "[GetVoice()][alt_name] [whispers], \"[message]\"" - for (var/mob/M in dead_mob_list) - if (!(M.client)) - continue - if (M.stat > 1 && !(M in heard_a)) - M.show_message(rendered, 2) + for(var/mob/M in listening) + M.Hear(rendered, src, languages, message) - // We whispered our final breath, now we die and show the message you have sent - // since it might have been cut off and it would be annoying not being able to know. - if(critical) - src << rendered + message = stars(message) + rendered = "[GetVoice()][alt_name] [whispers], \"[message]\"" + for(var/mob/M in eavesdropping) + M.Hear(rendered, src, languages, message) + + if(critical) //Dying words. succumb(1) diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 51d5fbd1bc7..54ac2c99ec8 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -1,12 +1,12 @@ /mob/living/carbon/monkey name = "monkey" voice_name = "monkey" - voice_message = "chimpers" say_message = "chimpers" icon = 'icons/mob/monkey.dmi' icon_state = "monkey1" gender = NEUTER pass_flags = PASSTABLE + languages = MONKEY update_icon = 0 ///no need to call regenerate_icon ventcrawler = 1 @@ -74,14 +74,15 @@ if (M.a_intent == "help") help_shake_act(M) else - if (M.a_intent == "harm" && !is_muzzled()) - if ((prob(75) && health > 0)) + if (M.a_intent == "harm" && !M.is_muzzled()) + if (prob(75)) playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) visible_message("[M.name] bites [name]!", \ "[M.name] bites [name]!") var/damage = rand(1, 5) - adjustBruteLoss(damage) - health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() + if (health > -100) + adjustBruteLoss(damage) + health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() for(var/datum/disease/D in M.viruses) contract_disease(D,1,0) else @@ -89,6 +90,24 @@ "[M.name] has attempted to bite [name]!") return +/mob/living/carbon/monkey/attack_larva(mob/living/carbon/alien/larva/L as mob) + + switch(L.a_intent) + if("help") + visible_message("[L] rubs its head against [src].") + + + else + + var/damage = rand(1, 3) + visible_message("[L] bites [src]!", \ + "[L] bites [src]!") + playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) + + if(stat != DEAD) + L.amount_grown = min(L.amount_grown + damage, L.max_grown) + adjustBruteLoss(damage) + /mob/living/carbon/monkey/attack_hand(mob/living/carbon/human/M as mob) if (!ticker) M << "You cannot attack people before the game has started." @@ -181,8 +200,9 @@ else visible_message("[M] has slashed [name]!", \ "[M] has slashed [name]!") - adjustBruteLoss(damage) - updatehealth() + if (stat != DEAD) + adjustBruteLoss(damage) + updatehealth() else playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1) visible_message("[M] has attempted to lunge at [name]!", \ @@ -353,6 +373,10 @@ return 10 //Everyone is a criminal! var/threatcount = 0 + //Securitrons can't identify monkeys + if(judgebot.idcheck) + threatcount += 4 + //Lasertag bullshit if(lasercolor) if(lasercolor == "b")//Lasertag turrets target the opposing team, how great is that? -Sieve diff --git a/code/modules/mob/living/carbon/monkey/say.dm b/code/modules/mob/living/carbon/monkey/say.dm index b2136593683..58cfe0e35f8 100644 --- a/code/modules/mob/living/carbon/monkey/say.dm +++ b/code/modules/mob/living/carbon/monkey/say.dm @@ -1,8 +1,2 @@ -/mob/living/carbon/monkey/say(var/message) - if (silent) - return - else - return ..() - /mob/living/carbon/monkey/say_quote(var/text) - return "[src.say_message], \"[text]\""; + return "[say_message], \"[text]\""; diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm new file mode 100644 index 00000000000..9f218605c01 --- /dev/null +++ b/code/modules/mob/living/carbon/say.dm @@ -0,0 +1,11 @@ +/mob/living/carbon/treat_message(message) + message = ..(message) + if(wear_mask) + message = wear_mask.speechModification(message) + + return message + +/mob/living/carbon/can_speak_basic(message) + if(silent) + return 0 + return ..() diff --git a/code/modules/mob/living/carbon/slime/hud.dm b/code/modules/mob/living/carbon/slime/hud.dm index 24a0a6e112b..ad8ac6a00f6 100644 --- a/code/modules/mob/living/carbon/slime/hud.dm +++ b/code/modules/mob/living/carbon/slime/hud.dm @@ -1,2 +1,2 @@ -/mob/living/carbon/slime/proc/regular_hud_updates() +/mob/living/carbon/slime/regular_hud_updates() return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/slime/powers.dm b/code/modules/mob/living/carbon/slime/powers.dm index e474e32523c..ef91582c3ec 100644 --- a/code/modules/mob/living/carbon/slime/powers.dm +++ b/code/modules/mob/living/carbon/slime/powers.dm @@ -217,7 +217,7 @@ var/mob/living/carbon/slime/new_slime = pick(babies) new_slime.a_intent = "harm" - new_slime.universal_speak = universal_speak + new_slime.languages = languages if(src.mind) src.mind.transfer_to(new_slime) else diff --git a/code/modules/mob/living/carbon/slime/say.dm b/code/modules/mob/living/carbon/slime/say.dm index 9c2a59dbe94..0ede0e1d1bf 100644 --- a/code/modules/mob/living/carbon/slime/say.dm +++ b/code/modules/mob/living/carbon/slime/say.dm @@ -1,8 +1,5 @@ /mob/living/carbon/slime/say(var/message) - if (silent) - return - else - return ..() + ..() /mob/living/carbon/slime/say_quote(var/text) var/ending = copytext(text, length(text)) @@ -14,8 +11,10 @@ return "telepathically chirps, \"[text]\""; -/mob/living/carbon/slime/say_understands(var/other) - if (istype(other, /mob/living/carbon/slime)) - return 1 - return ..() - +/mob/living/carbon/slime/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq) + if(speaker != src && !radio_freq) + if (speaker in Friends) + speech_buffer = list() + speech_buffer += speaker.name + speech_buffer += lowertext(html_decode(message)) + ..() diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm index e038ddc8bfe..3d1a66a3702 100644 --- a/code/modules/mob/living/carbon/slime/slime.dm +++ b/code/modules/mob/living/carbon/slime/slime.dm @@ -3,10 +3,10 @@ icon = 'icons/mob/slimes.dmi' icon_state = "grey baby slime" pass_flags = PASSTABLE - voice_message = "bleb!" say_message = "hums" ventcrawler = 2 var/is_adult = 0 + languages = SLIME | HUMAN layer = 5 @@ -246,20 +246,16 @@ if (Victim) return // can't attack while eating! + visible_message(" The [M.name] has glomped [src]!", \ + " The [M.name] has glomped [src]!") + var/damage = rand(1, 3) + attacked += 5 + if(M.is_adult) + damage = rand(1, 6) + else + damage = rand(1, 3) if (health > -100) - - visible_message(" The [M.name] has glomped [src]!", \ - " The [M.name] has glomped [src]!") - var/damage = rand(1, 3) - attacked += 5 - - if(M.is_adult) - damage = rand(1, 6) - else - damage = rand(1, 3) - adjustBruteLoss(damage) - updatehealth() return @@ -279,7 +275,7 @@ /mob/living/carbon/slime/attack_paw(mob/living/carbon/monkey/M as mob) if(!(istype(M, /mob/living/carbon/monkey))) - return // Fix for aliens receiving double messages when attacking other aliens. + return // Fix for aliens receiving double messages when attacking slimes. if (!ticker) M << "You cannot attack people before the game has started." @@ -296,17 +292,38 @@ if ("help") help_shake_act(M) else - if (is_muzzled()) + if (M.is_muzzled()) return - if (health > 0) - attacked += 10 - //playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - visible_message("[M.name] has attacked [src]!", \ - "[M.name] has attacked [src]!") + + attacked += 10 + playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) + visible_message("[M.name] bites [src]!", \ + "[M.name] bites [src]!") + if (health > -100) adjustBruteLoss(rand(1, 3)) updatehealth() return +/mob/living/carbon/slime/attack_larva(mob/living/carbon/alien/larva/L as mob) + + switch(L.a_intent) + + if("help") + visible_message("[L] rubs its head against [src].") + + + else + + attacked += 10 + visible_message("[L] bites [src]!", \ + "[L] bites [src]!") + playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) + + if(stat != DEAD) + var/damage = rand(1, 3) + L.amount_grown = min(L.amount_grown + damage, L.max_grown) + adjustBruteLoss(damage) + /mob/living/carbon/slime/attack_hand(mob/living/carbon/human/M as mob) if (!ticker) @@ -416,8 +433,9 @@ visible_message("[M] has punched [src]!", \ "[M] has punched [src]!") - adjustBruteLoss(damage) - updatehealth() + if (health > -100) + adjustBruteLoss(damage) + updatehealth() else playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) visible_message("[M] has attempted to punch [src]!") @@ -446,13 +464,15 @@ var/damage = rand(15, 30) if (damage >= 25) damage = rand(20, 40) - visible_message("[M] has attacked [name]!", \ - "[M] has attacked [name]!") + visible_message("[M] has slashed [name]!", \ + "[M] has slashed [name]!") else visible_message("[M] has wounded [name]!", \ ")[M] has wounded [name]!") - adjustBruteLoss(damage) - updatehealth() + + if (health > -100) + adjustBruteLoss(damage) + updatehealth() else playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1) visible_message("[M] has attempted to lunge at [name]!", \ @@ -920,6 +940,8 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 var/mob/living/carbon/human/G = new /mob/living/carbon/human if(prob(50)) G.gender = "female" hardset_dna(G, null, null, null, null, /datum/species/golem/adamantine) + + G.set_cloned_appearance() G.real_name = text("Adamantine Golem ([rand(1, 1000)])") G.dna.species.auto_equip(G) G.loc = src.loc diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 33e41fb2775..854232a2162 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -330,11 +330,10 @@ t7 = null if ((t7 && (pulling && ((get_dist(src, pulling) <= 1 || pulling.loc == loc) && (client && client.moving))))) var/turf/T = loc - var/turf/P = pulling.loc . = ..() if (pulling && pulling.loc) - if(!isturf(pulling.loc) || pulling.loc != P) + if(!isturf(pulling.loc)) stop_pulling() return else @@ -362,7 +361,6 @@ if (istype(G, /obj/item/weapon/grab)) for(var/mob/O in viewers(M, null)) O.show_message(text("[] has been pulled from []'s grip by []", G.affecting, G.assailant, src), 1) - //G = null qdel(G) else ok = 0 @@ -397,17 +395,12 @@ if(check_dna_integrity(M)) //blood DNA var/mob/living/carbon/DNA_helper = pulling H.blood_DNA[DNA_helper.dna.unique_enzymes] = DNA_helper.dna.blood_type - step(pulling, get_dir(pulling.loc, T)) + pulling.Move(T) if(M) M.start_pulling(t) else if (pulling) - if (istype(pulling, /obj/structure/window)) - if(pulling:ini_dir == NORTHWEST || pulling:ini_dir == NORTHEAST || pulling:ini_dir == SOUTHWEST || pulling:ini_dir == SOUTHEAST) - for(var/obj/structure/window/win in get_step(pulling,get_dir(pulling.loc, T))) - stop_pulling() - if (pulling) - step(pulling, get_dir(pulling.loc, T)) + pulling.Move(T) else stop_pulling() . = ..() diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index a1de3adb051..508e9505895 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -1,5 +1,6 @@ /mob/living see_invisible = SEE_INVISIBLE_LIVING + languages = HUMAN //Health and life related vars var/maxHealth = 100 //Maximum health that should be possible. @@ -38,3 +39,4 @@ var/ventcrawler = 0 //0 No vent crawling, 1 vent crawling in the nude, 2 vent crawling always var/floating = 0 + var/nightvision = 0 diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index adc313a9c40..4c4ee69543c 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -1,3 +1,21 @@ +//bitflag #defines for radio return. +#define ITALICS 1 +#define REDUCE_RANGE 2 +#define NOPASS 4 + +//message modes. you're not supposed to mess with these. +#define MODE_HEADSET "headset" +#define MODE_ROBOT "robot" +#define MODE_R_HAND "right hand" +#define MODE_L_HAND "left hand" +#define MODE_INTERCOM "intercom" +#define MODE_BINARY "binary" +#define MODE_WHISPER "whisper" +#define MODE_SECURE_HEADSET "secure headset" +#define MODE_DEPARTMENT "department" +#define MODE_ALIEN "alientalk" +#define MODE_HOLOPAD "holopad" +#define MODE_CHANGELING "changeling" var/list/department_radio_keys = list( ":r" = "right hand", "#r" = "right hand", ".r" = "right hand", @@ -53,340 +71,99 @@ var/list/department_radio_keys = list( ":ï" = "changeling", "#ï" = "changeling", ".ï" = "changeling" ) -/mob/living/proc/binarycheck() - if (istype(src, /mob/living/silicon/pai)) - return - if (issilicon(src)) - return 1 - if (!ishuman(src)) - return - var/mob/living/carbon/human/H = src - if (H.ears) - var/obj/item/device/radio/headset/dongle = H.ears - if(!istype(dongle)) return - if(dongle.translate_binary) return 1 +/mob/proc/binarycheck() + return 0 -/mob/living/proc/IsVocal() - return 1 - -/mob/living/proc/hivecheck() - if (isalien(src)) return 1 - if (!ishuman(src)) return - var/mob/living/carbon/human/H = src - if (H.ears) - var/obj/item/device/radio/headset/dongle = H.ears - if(!istype(dongle)) return - if(dongle.translate_hive) return 1 - -/mob/living/say(var/message, var/bubble_type) +/mob/living/say(message, bubble_type) message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) - if (!message) + if(stat == DEAD) + say_dead(message) return - if (stat == 2) - return say_dead(message) - - if (src.client) - if(client.prefs.muted & MUTE_IC) - src << "You cannot speak in IC (muted)." - return - if (src.client.handle_spam_prevention(message,MUTE_IC)) - return - - // stat == 2 is handled above, so this stops transmission of uncontious messages - if (stat) + if(stat) return - // Mute disability - if (sdisabilities & MUTE) + if(check_emote(message)) return - // emotes - if (copytext(message, 1, 2) == "*" && !stat) - return emote(copytext(message, 2)) + if(!can_speak_basic(message)) //Stat is seperate so I can handle whispers properly. + return - var/alt_name = "" - if (istype(src, /mob/living/carbon/human) && name != GetVoice()) - var/mob/living/carbon/human/H = src - alt_name = " (as [H.get_id_name("Unknown")])" - var/italics = 0 - var/message_range = null - var/message_mode = null + var/message_mode = get_message_mode(message) - if (getBrainLoss() >= 60 && prob(50)) - if (ishuman(src)) - message_mode = "headset" - // Special message handling - else if (copytext(message, 1, 2) == ";") - if (ishuman(src)) - message_mode = "headset" - else if(ispAI(src) || isrobot(src)) - message_mode = "pAI" + if(message_mode == MODE_HEADSET || message_mode == MODE_ROBOT) + message = copytext(message, 2) + else if(message_mode) + message = copytext(message, 3) + if(findtext(message, " ", 1, 2)) message = copytext(message, 2) - else if (length(message) >= 2) - var/channel_prefix = copytext(message, 1, 3) - - message_mode = department_radio_keys[channel_prefix] - //world << "channel_prefix=[channel_prefix]; message_mode=[message_mode]" - if (message_mode) - message = trim(copytext(message, 3)) - if (!(ishuman(src) || istype(src, /mob/living/simple_animal/parrot) || isrobot(src)) && (message_mode=="department" || (message_mode in radiochannels))) // If they're not a human, parrot, or robot, and they're trying to use a radio channel - message_mode = null //only humans can use headsets - // Check changed so that parrots can use headsets. Other simple animals do not have ears and will cause runtimes. - // And borgs -Sieve - - if (!message) + if(handle_inherent_channels(message, message_mode)) //Hiveminds, binary chat & holopad. return - // :downs: - if (getBrainLoss() >= 60) - message = derpspeech(message, stuttering) - - if (stuttering) - message = stutter(message) - -/* //qw do not have beesease atm. - if(virus) - if(virus.name=="beesease" && virus.stage>=2) - if(prob(virus.stage*10)) - var/bzz = length(message) - message = "B" - for(var/i=0,i[mind.changeling.changelingID]: [message]" - return - - if (message_mode == "alientalk") - if(alien_talk_understand || hivecheck()) - //message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) //seems redundant - alien_talk(message) + if(!can_speak_vocal(message)) return - if(is_muzzled()) // Intentionally after changeling hivemind check + message = treat_message(message) + + if(!message || message == "") return - var/list/obj/item/used_radios = new - - switch (message_mode) - if ("headset") - if (src:ears) - src:ears.talk_into(src, message) - used_radios += src:ears - - message_range = 1 - italics = 1 - - - if ("secure headset") - if (src:ears) - src:ears.talk_into(src, message, 1) - used_radios += src:ears - - message_range = 1 - italics = 1 - - if ("right hand") - if (r_hand) - r_hand.talk_into(src, message) - used_radios += src:r_hand - - message_range = 1 - italics = 1 - - if ("left hand") - if (l_hand) - l_hand.talk_into(src, message) - used_radios += src:l_hand - - message_range = 1 - italics = 1 - - if ("intercom") - for (var/obj/item/device/radio/intercom/I in view(1, null)) - I.talk_into(src, message) - used_radios += I - - message_range = 1 - italics = 1 - - //I see no reason to restrict such way of whispering - if ("whisper") - whisper(message) - return - - if ("binary") - if(robot_talk_understand || binarycheck()) - //message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) //seems redundant - robot_talk(message) - return - - if ("department") - if (src:ears) - src:ears.talk_into(src, message, message_mode) - used_radios += src:ears - message_range = 1 - italics = 1 - - if ("pAI") - if (src:radio) - src:radio.talk_into(src, message) - used_radios += src:radio - message_range = 1 - italics = 1 - -////SPECIAL HEADSETS START - else - //world << "SPECIAL HEADSETS" - if (message_mode in radiochannels) - if(isrobot(src))//Seperates robots to prevent runtimes from the ear stuff - var/mob/living/silicon/robot/R = src - if(R.radio)//Sanityyyy - R.radio.talk_into(src, message, message_mode) - used_radios += R.radio - else - if (src:ears) - src:ears.talk_into(src, message, message_mode) - used_radios += src:ears - message_range = 1 - italics = 1 -/////SPECIAL HEADSETS END - - if(!IsVocal()) + var/message_range = 7 + var/radio_return = radio(message, message_mode) + if(radio_return & NOPASS) //There's a whisper() message_mode, no need to continue the proc if that is called return + if(radio_return & ITALICS) + message = "[message]" + if(radio_return & REDUCE_RANGE) + message_range = 1 - var/list/listening + send_speech(message, message_range, src, bubble_type) - listening = get_mobs_in_view(message_range, src) + log_say("[name]/[key] : [message]") + +/mob/living/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq) + if(!client) + return + var/deaf_message + var/deaf_type + if(speaker != src) + if(!radio_freq) //These checks have to be seperate, else people talking on the radio will make "You can't hear yourself!" appear when hearing people over the radio while deaf. + deaf_message = "[speaker] talks but you cannot hear them." + deaf_type = 1 + else + deaf_message = "You can't hear yourself!" + deaf_type = 2 // Since you should be able to hear yourself without looking + if(!(message_langs & languages) || force_compose) //force_compose is so AIs don't end up without their hrefs. + message = compose_message(speaker, message_langs, raw_message, radio_freq) + show_message(message, 2, deaf_message, deaf_type) + return message + +/mob/living/send_speech(message, message_range = 7, obj/source = src, bubble_type) + var/list/listening = get_hearers_in_view(message_range, source) + var/list/listening_dead = list() for(var/mob/M in player_list) - if (!M.client) - continue //skip monkeys and leavers - if (istype(M, /mob/new_player)) - continue - if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTEARS) && src.client) // src.client is so that ghosts don't have to listen to mice - listening|=M + if(M.stat == DEAD && ((M.client.prefs.toggles & CHAT_GHOSTEARS) || (get_dist(M, src) <= 7))&& client) // client is so that ghosts don't have to listen to mice + listening_dead |= M - var/turf/T = get_turf(src) - var/list/W = hear(message_range, T) + listening -= listening_dead //so ghosts dont hear stuff twice - for (var/obj/O in ((W | contents)-used_radios)) - W |= O + var/rendered = compose_message(src, languages, message) + for(var/atom/movable/AM in listening) + AM.Hear(rendered, src, languages, message) - for (var/mob/M in W) - W |= M.contents - - for (var/atom/A in W) - if(istype(A, /mob/living/simple_animal/parrot)) //Parrot speech mimickry - if(A == src) - continue //Dont imitate ourselves - - var/mob/living/simple_animal/parrot/P = A - if(P.speech_buffer.len >= 10) - P.speech_buffer.Remove(pick(P.speech_buffer)) - P.speech_buffer.Add(html_decode(message)) - - if(isslime(A)) //Slimes answering to people - if (A == src) - continue - - var/mob/living/carbon/slime/S = A - if (src in S.Friends) - S.speech_buffer = list() - S.speech_buffer.Add(src) - S.speech_buffer.Add(lowertext(html_decode(message))) - - if(istype(A, /obj/)) //radio in pocket could work, radio in backpack wouldn't --rastaf0 - var/obj/O = A - spawn (0) - if(O && !istype(O.loc, /obj/item/weapon/storage)) - O.hear_talk(src, message) - - -/* Commented out as replaced by code above from BS12 - for (var/obj/O in ((V | contents)-used_radios)) //radio in pocket could work, radio in backpack wouldn't --rastaf0 - spawn (0) - if (O) - O.hear_talk(src, message) -*/ - -/* if(isbrain(src))//For brains to properly talk if they are in an MMI..or in a brain. Could be extended to other mobs I guess. - for(var/obj/O in loc)//Kinda ugly but whatever. - if(O) - spawn(0) - O.hear_talk(src, message) -*/ - - - var/list/heard_a = list() // understood us - var/list/heard_b = list() // didn't understand us - - for (var/M in listening) - if(hascall(M,"say_understands")) - if (M:say_understands(src)) - heard_a += M - else - heard_b += M - - var/rendered = null - if (length(heard_a)) - var/message_a = say_quote(message) - - if (italics) - message_a = "[message_a]" - - rendered = "[GetVoice()][alt_name] [message_a]" - - for (var/M in heard_a) - if(hascall(M,"show_message")) - var/deaf_message = "" - var/deaf_type = 1 - if(M != src) - deaf_message = "[name][alt_name] talks but you cannot hear them." - else - deaf_message = "You cannot hear yourself!" - deaf_type = 2 // Since you should be able to hear yourself without looking - M:show_message(rendered, 2, deaf_message, deaf_type) - - if (length(heard_b)) - var/message_b - - if (voice_message) - message_b = voice_message - else - message_b = stars(message) - message_b = say_quote(message_b) - - if (italics) - message_b = "[message_b]" - - rendered = "[voice_name] [message_b]" - - - for (var/M in heard_b) - if(hascall(M,"show_message")) - M:show_message(rendered, 2) + for(var/mob/M in listening_dead) + M.Hear(rendered, src, languages, message) //speech bubble var/list/speech_bubble_recipients = list() - for(var/mob/M in heard_a + heard_b) + for(var/mob/M in (listening + listening_dead)) if(M.client) speech_bubble_recipients.Add(M.client) spawn(0) flick_overlay(image('icons/mob/talk.dmi', src, "h[bubble_type][say_test(message)]",MOB_LAYER+1), speech_bubble_recipients, 30) - log_say("[name]/[key] : [message]") - -/mob/living/proc/GetVoice() - return name - /mob/living/proc/say_test(var/text) var/ending = copytext(text, length(text)) if (ending == "?") @@ -394,3 +171,118 @@ var/list/department_radio_keys = list( else if (ending == "!") return "2" return "0" + +/mob/living/can_speak(message) //For use outside of Say() + if(can_speak_basic(message) && can_speak_vocal(message)) + return 1 + +/mob/living/proc/can_speak_basic(message) //Check BEFORE handling of xeno and ling channels + if(!message || message == "") + return 0 + + if(client) + if(client.prefs.muted & MUTE_IC) + src << "You cannot speak in IC (muted)." + return 0 + if(client.handle_spam_prevention(message,MUTE_IC)) + return 0 + + return 1 + +/mob/living/proc/can_speak_vocal(message) //Check AFTER handling of xeno and ling channels + if(!message) + return 0 + + if(sdisabilities & MUTE) + return 0 + + if(is_muzzled()) + return 0 + + if(!IsVocal()) + return 0 + + return 1 + +/mob/living/proc/check_emote(message) + if(copytext(message, 1, 2) == "*") + emote(copytext(message, 2)) + return 1 + +/mob/living/proc/get_message_mode(message) + if(copytext(message, 1, 2) == ";") + return MODE_HEADSET + else if(length(message) > 2) + return department_radio_keys[copytext(message, 1, 3)] + +/mob/living/proc/handle_inherent_channels(message, message_mode) + if(message_mode == MODE_CHANGELING) + switch(lingcheck()) + if(2) + var/msg = "[mind.changeling.changelingID]: [message]" + log_say("[mind.changeling.changelingID]/[src.key] : [message]") + for(var/mob/M in mob_list) + if(M.stat == DEAD && !istype(M, /mob/new_player)) + M << msg + else + switch(M.lingcheck()) + if(2) + M << msg + if(1) + if(prob(30)) + M << "We can faintly sense another of our kind trying to communicate through the hivemind..." + return 1 + if(1) + src << "Our senses have not evolved enough to be able to communicate this way..." + return 1 + return 0 + +/mob/living/proc/treat_message(message) + if(getBrainLoss() >= 60) + message = derpspeech(message, stuttering) + + if(stuttering) + message = stutter(message) + + return message + +/mob/living/proc/radio(message, message_mode, steps) + switch(message_mode) + if(MODE_R_HAND) + if (r_hand) + r_hand.talk_into(src, message) + return ITALICS | REDUCE_RANGE + + if(MODE_L_HAND) + if (l_hand) + l_hand.talk_into(src, message) + return ITALICS | REDUCE_RANGE + + if(MODE_INTERCOM) + for (var/obj/item/device/radio/intercom/I in view(1, null)) + I.talk_into(src, message) + return ITALICS | REDUCE_RANGE + + if(MODE_BINARY) + if(binarycheck()) + robot_talk(message) + return ITALICS | REDUCE_RANGE //Does not return 0 since this is only reached by humans, not borgs or AIs. + + if(MODE_WHISPER) + whisper(message) + return NOPASS + return 0 + +/mob/living/lingcheck() //Returns 1 if they are a changeling. Returns 2 if they are a changeling that can communicate through the hivemind + if(mind && mind.changeling) + if(mind.changeling.changeling_speak) + return 2 + return 1 + return 0 + +/mob/living/say_quote() + if (stuttering) + return "stammers, \"[text]\"" + if (getBrainLoss() >= 60) + return "gibbers, \"[text]\"" + return ..() diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index b634a85b137..ceea1384d12 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -19,6 +19,7 @@ var/list/ai_list = list() anchored = 1 density = 1 status_flags = CANSTUN|CANPARALYSE|CANPUSH + force_compose = 1 //This ensures that the AI always composes it's own hear message. Needed for hrefs and job display. var/list/network = list("SS13") var/obj/machinery/camera/current = null var/list/connected_robots = list() diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index 1faa3934eac..b5e313bb050 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -26,7 +26,7 @@ //Holopad if(istype(ai.current, /obj/machinery/hologram/holopad)) var/obj/machinery/hologram/holopad/H = ai.current - H.move_hologram() + H.move_hologram(ai) /mob/camera/aiEye/Move() return 0 diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 615b2433726..ea50f2e80b1 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -163,6 +163,11 @@ sleep(50) theAPC = null + regular_hud_updates() + + if(sensor_mode) //Data HUDs, such as Security or Medical HUDS. Passes the AI's eye since it seems from that instead of itself. + process_data_hud(src,sensor_mode,DATA_HUD_BASIC,src.eyeobj) + /mob/living/silicon/ai/updatehealth() if(status_flags & GODMODE) health = maxHealth diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index d6906b3e2d2..132d880a65a 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -1,22 +1,23 @@ /mob/living/silicon/ai/say(var/message) - if(parent && istype(parent) && parent.stat != 2) + if(parent && istype(parent) && parent.stat != 2) //If there is a defined "parent" AI, it is actually an AI, and it is alive, anything the AI tries to say is said by the parent instead. parent.say(message) return - //If there is a defined "parent" AI, it is actually an AI, and it is alive, anything the AI tries to say is said by the parent instead. ..(message) -/mob/living/silicon/ai/say_understands(var/other) - if (istype(other, /mob/living/carbon/human)) - return 1 - if (istype(other, /mob/living/silicon/robot)) - return 1 - if (istype(other, /mob/living/silicon/decoy)) - return 1 - if (istype(other, /mob/living/carbon/brain)) - return 1 - if (istype(other, /mob/living/silicon/pai)) - return 1 - return ..() +/mob/living/silicon/ai/compose_track_href(atom/movable/speaker, message_langs, raw_message, radio_freq) + //this proc assumes that the message originated from a radio. if the speaker is not a virtual speaker this will probably fuck up hard. + var/mob/M = speaker.GetSource() + var/obj/item/device/radio = speaker.GetRadio() + if(M) + var/faketrack = "byond://?src=\ref[radio];track2=\ref[src];track=\ref[M]" + if(speaker.GetTrack()) + faketrack = "byond://?src=\ref[radio];track2=\ref[src];faketrack=\ref[M]" + return "" + return "" + +/mob/living/silicon/ai/compose_job(atom/movable/speaker, message_langs, raw_message, radio_freq) + //Also includes the for AI hrefs, for convenience. + return " [radio_freq ? "(" + speaker.GetJob() + ")" : ""]" + "[speaker.GetSource() ? "" : ""]" /mob/living/silicon/ai/say_quote(var/text) var/ending = copytext(text, length(text)) @@ -31,6 +32,39 @@ /mob/living/silicon/ai/IsVocal() return !config.silent_ai +/mob/living/silicon/ai/get_message_mode(message) + if(copytext(message, 1, 3) in list(":h", ":H", ".h", ".H", "#h", "#H")) + return MODE_HOLOPAD + else + return ..() + +/mob/living/silicon/ai/handle_inherent_channels(message, message_mode) + . = ..() + if(.) + return . + + if(message_mode == MODE_HOLOPAD) + holopad_talk(message) + return 1 + +//For holopads only. Usable by AI. +/mob/living/silicon/ai/proc/holopad_talk(var/message) + log_say("[key_name(src)] : [message]") + + message = trim(message) + + if (!message) + return + + var/obj/machinery/hologram/holopad/T = current + if(istype(T) && T.masters[src])//If there is a hologram and its master is the user. + send_speech(message, 7, T, "R") + src << "Holopad transmitted, [real_name] \"[message]\""//The AI can "hear" its own message. + else + src << "No holopad connected." + return + + // Make sure that the code compiles with AI_VOX undefined #ifdef AI_VOX diff --git a/code/modules/mob/living/silicon/decoy/death.dm b/code/modules/mob/living/silicon/decoy/death.dm deleted file mode 100644 index d3996e2fa70..00000000000 --- a/code/modules/mob/living/silicon/decoy/death.dm +++ /dev/null @@ -1,10 +0,0 @@ -/mob/living/silicon/decoy/death(gibbed) - if(stat == DEAD) return - stat = DEAD - icon_state = "ai-crash" - spawn(10) - explosion(loc, 3, 6, 12, 15) - - for(var/obj/machinery/ai_status_display/O in world) //change status - O.mode = 2 - return ..(gibbed) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/decoy/decoy.dm b/code/modules/mob/living/silicon/decoy/decoy.dm deleted file mode 100644 index 5881e860eeb..00000000000 --- a/code/modules/mob/living/silicon/decoy/decoy.dm +++ /dev/null @@ -1,32 +0,0 @@ -/mob/living/silicon/decoy - name = "AI" - icon = 'icons/mob/AI.dmi'// - icon_state = "ai" - anchored = 1 - canmove = 0 - -/mob/living/silicon/decoy/New() - ..() - src.icon = 'icons/mob/AI.dmi' - src.icon_state = "ai" - src.anchored = 1 - src.canmove = 0 - -/mob/living/silicon/decoy/say_understands(var/other) - if (istype(other, /mob/living/carbon/human)) - return 1 - if (istype(other, /mob/living/silicon/robot)) - return 1 - if (istype(other, /mob/living/silicon/ai)) - return 1 - return ..() - -/mob/living/silicon/decoy/say_quote(var/text) - var/ending = copytext(text, length(text)) - - if (ending == "?") - return "queries, \"[text]\""; - else if (ending == "!") - return "declares, \"[copytext(text, 1, length(text))]\""; - - return "states, \"[text]\""; \ No newline at end of file diff --git a/code/modules/mob/living/silicon/decoy/life.dm b/code/modules/mob/living/silicon/decoy/life.dm deleted file mode 100644 index 8a336b8353b..00000000000 --- a/code/modules/mob/living/silicon/decoy/life.dm +++ /dev/null @@ -1,15 +0,0 @@ -/mob/living/silicon/decoy/Life() - if (src.stat == 2) - return - else - if (src.health <= config.health_threshold_dead && src.stat != 2) - death() - return - - -/mob/living/silicon/decoy/updatehealth() - if(status_flags & GODMODE) - health = maxHealth - stat = CONSCIOUS - return - health = maxHealth - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() diff --git a/code/modules/mob/living/silicon/pai/hud.dm b/code/modules/mob/living/silicon/pai/hud.dm deleted file mode 100644 index 395c75c64a0..00000000000 --- a/code/modules/mob/living/silicon/pai/hud.dm +++ /dev/null @@ -1,82 +0,0 @@ -/mob/living/silicon/pai/proc/regular_hud_updates() - if(client) - for(var/image/hud in client.images) - if(copytext(hud.icon_state,1,4) == "hud") - client.images -= hud - -/mob/living/silicon/pai/proc/securityHUD() - if(client) - var/image/holder - var/turf/T = get_turf(src.loc) - for(var/mob/living/carbon/human/perp in view(T)) - holder = perp.hud_list[ID_HUD] - holder.icon_state = "hudno_id" - if(perp.wear_id) - holder.icon_state = "hud[ckey(perp:wear_id:GetJobName())]" - client.images += 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 - continue - client.images += holder - -/mob/living/silicon/pai/proc/medicalHUD() - if(client) - var/image/holder - var/turf/T = get_turf(src.loc) - for(var/mob/living/carbon/human/patient in view(T)) - - var/foundVirus = 0 - for(var/datum/disease/D in patient.viruses) - if(!D.hidden[SCANNER]) - foundVirus = 1 - - holder = patient.hud_list[HEALTH_HUD] - if(patient.stat == 2) - holder.icon_state = "hudhealth-100" - client.images += holder - else - holder.icon_state = "hud[RoundHealth(patient.health)]" - client.images += holder - - 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" - client.images += holder - -/mob/living/silicon/pai/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(20 to 30) - return "health25" - if(5 to 15) - return "health10" - if(1 to 5) - return "health1" - if(-99 to 0) - return "health0" - else - return "health-100" - return "0" diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm index 728db940163..f8a7d0c2ef1 100644 --- a/code/modules/mob/living/silicon/pai/life.dm +++ b/code/modules/mob/living/silicon/pai/life.dm @@ -10,10 +10,10 @@ cable = null regular_hud_updates() - if(src.secHUD == 1) - src.securityHUD() - if(src.medHUD == 1) - src.medicalHUD() + if(secHUD == 1) + process_data_hud(src, DATA_HUD_SECURITY,DATA_HUD_ADVANCED) + if(medHUD == 1) + process_data_hud(src, DATA_HUD_MEDICAL,DATA_HUD_ADVANCED) if(silence_time) if(world.timeofday >= silence_time) silence_time = null diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 820f646421f..042f0430361 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -4,8 +4,6 @@ mouse_opacity density = 0 - robot_talk_understand = 0 - var/network = "SS13" var/obj/machinery/camera/current = null @@ -13,7 +11,6 @@ var/list/software = list() var/userDNA // The DNA string of our assigned user var/obj/item/device/paicard/card // The card we inhabit - var/obj/item/device/radio/radio // Our primary radio var/speakStatement = "states" var/speakExclamation = "declares" diff --git a/code/modules/mob/living/silicon/pai/say.dm b/code/modules/mob/living/silicon/pai/say.dm index d314224682b..4b1cd2c1626 100644 --- a/code/modules/mob/living/silicon/pai/say.dm +++ b/code/modules/mob/living/silicon/pai/say.dm @@ -1,18 +1,3 @@ -/mob/living/silicon/pai/say_understands(var/other) - if (istype(other, /mob/living/carbon/human)) - return 1 - if (istype(other, /mob/living/silicon/robot)) - return 1 - if (istype(other, /mob/living/silicon/pai)) - return 1 - if (istype(other, /mob/living/silicon/ai)) - return 1 - if (istype(other, /mob/living/silicon/decoy)) - return 1 - if (istype(other, /mob/living/carbon/brain)) - return 1 - return ..() - /mob/living/silicon/pai/say_quote(var/text) var/ending = copytext(text, length(text)) @@ -27,4 +12,7 @@ if(silence_time) src << "Communication circuits remain unitialized." else - ..(msg) \ No newline at end of file + ..(msg) + +/mob/living/silicon/pai/binarycheck() + return 0 diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index b3f4a4e35de..a344f31aaeb 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -242,7 +242,7 @@ src.medHUD = !src.medHUD if("translator") if(href_list["toggle"]) - src.universal_speak = !src.universal_speak + languages = languages == ALL ? HUMAN & ROBOT : ALL if("doorjack") if(href_list["jack"]) if(src.cable && src.cable.machine) @@ -301,7 +301,7 @@ if(s == "medical HUD") dat += "Medical Analysis Suite[(src.medHUD) ? " On" : " Off"]
    " if(s == "universal translator") - dat += "Universal Translator[(src.universal_speak) ? " On" : " Off"]
    " + dat += "Universal Translator[(languages == ALL) ? " On" : " Off"]
    " if(s == "projection array") dat += "Projection Array
    " if(s == "camera jack") @@ -454,7 +454,7 @@ /mob/living/silicon/pai/proc/softwareTranslator() . = {"

    Universal Translator


    When enabled, this device will automatically convert all spoken and written language into a format that any known recipient can understand.

    - The device is currently [ (src.universal_speak) ? "en" : "dis" ]abled.
    + The device is currently [ (languages == ALL) ? "en" : "dis" ]abled.
    Toggle Device
    "} return . @@ -625,7 +625,7 @@ [(pda.silent) ? " \[Off\]" : " \[On\]"]

    "} dat += " + + +
    +

    19 September 2013

    +

    Malkevin updated:

    +
      +
    • Juggernaut's ablative armor has been adjusted. They have a greater chance to reflect lasers however on reflection they take half damage instead of no damage, basically this adjustment means you should be able to kill a Juggernaut with two laser guns instead of four! Also their reflection spread has been greatly widened, enjoy the lightshow
    • +
    • Cargo can now order exile implants.
    • +
    • Checking a collector's last power output via analyzers has been moved to multitools, because that actually made sense (betcha didn't know this existed, I know I didn't)
    • +
    • Analyzers can now be used to check the gas level of the tank in a loaded radiation collector (yay no more crowbars), you can also use them on pipes to check gas levels (yay no more pipe meters)
    • +
    +
    -
    -

    21 September 2013

    -

    Malkevin updated:

    -
      -
    • Due to complaints about Security not announcing themselves before making arrests NT has now issued it's Sec team with loud hailer integrated gas masks, found in their standard equipment lockers. Users can adjust the mask's level of aggression with a screwdriver.
    • -
    • The sprites could be shaded better. Think you can do better? Post your submissions here.
    • -
    -
    +
    +

    17 September 2013

    +

    SuperSayu updated:

    +
      +
    • You can no longer strip people through windows and windoors
    • +
    • You can open doors by hand even if there is a firedoor in the way, making firedoor+airlock no longer an unbeatable combination
    • +
    • Ghosts can now click on anything to examine it, or double click to jump to a turf. Double clicking a mob, bot, or (heaven forbid) singularity/Nar-Sie will let you follow it. Double clicking your own corpse re-enters it.
    • +
    • AI can double click a mob to follow it, as well as double clicking turfs to jump.
    • +
    • Ventcrawling mobs can alt-click a vent to start ventcrawling.
    • +
    • Telekinesis is now part of the click system. You can click on buttons, items, etc, without having a telekinetic throw in hand; the throw will appear when you click on something you can move (with your mind).
    • +
    +
    +
    +

    13 September 2013

    +

    JJRcop updated:

    +
      +
    • We at Nanotrasen would like to assure you that we know the pain of waiting five minutes for the emergency shuttle to be dispatched in a high-alert situation due to our confirmation-of-distress policy. Therefore, we have amended our confirmation-of-distress policy so that, in the event of a red alert, the distress confirmation period is shortened to three minutes and we will hurry in preparing the shuttle for transit. This totals to 6 minutes, in hope that it will give our very expensive equipment a better chance of recovery.
    • +
    +
    -
    -

    19 September 2013

    -

    Malkevin updated:

    -
      -
    • Juggernaut's ablative armor has been adjusted. They have a greater chance to reflect lasers however on reflection they take half damage instead of no damage, basically this adjustment means you should be able to kill a Juggernaut with two laser guns instead of four! Also their reflection spread has been greatly widened, enjoy the lightshow
    • -
    • Cargo can now order exile implants.
    • -
    • Checking a collector's last power output via analyzers has been moved to multitools, because that actually made sense (betcha didn't know this existed, I know I didn't)
    • -
    • Analyzers can now be used to check the gas level of the tank in a loaded radiation collector (yay no more crowbars), you can also use them on pipes to check gas levels (yay no more pipe meters)
    • -
    -
    +
    +

    12 September 2013

    +

    AndroidSFV updated:

    +
      +
    • AI Photography: AIs now have two new verbs, Take Picture and View Picture. The pictures the AI takes are centered on the AI's eyeobj. You can use these pictures on a newscaster, and print them at a photocopier.
    • +
    +
    -
    -

    17 September 2013

    -

    SuperSayu updated:

    -
      -
    • You can no longer strip people through windows and windoors
    • -
    • You can open doors by hand even if there is a firedoor in the way, making firedoor+airlock no longer an unbeatable combination
    • -
    • Ghosts can now click on anything to examine it, or double click to jump to a turf. Double clicking a mob, bot, or (heaven forbid) singularity/Nar-Sie will let you follow it. Double clicking your own corpse re-enters it.
    • -
    • AI can double click a mob to follow it, as well as double clicking turfs to jump.
    • -
    • Ventcrawling mobs can alt-click a vent to start ventcrawling.
    • -
    • Telekinesis is now part of the click system. You can click on buttons, items, etc, without having a telekinetic throw in hand; the throw will appear when you click on something you can move (with your mind).
    • -
    -
    +
    +

    03 September 2013

    +

    Cael_Aislinn updated:

    +
      +
    • Terbs Fun Week Day 5: Chef gets a Nanotrasen-issued icecream machine with four pre-approved icecream flavours and two official cone types.
    • +
    +
    +
    +

    02 September 2013

    +

    Cael_Aislinn updated:

    +
      +
    • Terbs Fun Week Day 4: Humans, aliens and cyborgs now show speech bubbles when they talk.
    • +
    +
    -
    -

    13 September 2013

    -

    JJRcop updated:

    -
      -
    • We at Nanotrasen would like to assure you that we know the pain of waiting five minutes for the emergency shuttle to be dispatched in a high-alert situation due to our confirmation-of-distress policy. Therefore, we have amended our confirmation-of-distress policy so that, in the event of a red alert, the distress confirmation period is shortened to three minutes and we will hurry in preparing the shuttle for transit. This totals to 6 minutes, in hope that it will give our very expensive equipment a better chance of recovery.
    • -
    -
    +
    +

    01 September 2013

    +

    Cael_Aislinn updated:

    +
      +
    • Terbs Fun Week Day 3: Detective can reskin his gun to one of five variants: Leopard Spots, Gold Trim, Black Panther, Peacemaker and the Original.
    • +
    +
    +
    +

    31 August 2013

    +

    Cael_Aislinn updated:

    +
      +
    • Terbs Fun Week Day 2: RD, lawyers and librarians now spawn with a laser pointer. Don't point them in anyone's eyes!
    • +
    +
    -
    -

    3 September 2013

    -

    Cael_Aislinn updated:

    -
      -
    • Terbs Fun Week Day 5: Chef gets a Nanotrasen-issued icecream machine with four pre-approved icecream flavours and two official cone types.
    • -
    -
    +
    +

    30 August 2013

    +

    Cael_Aislinn updated:

    +
      +
    • Terbs Fun Week Day 1: Added ghost chilis as a mutation of chili plants. Be careful, they're one of the hottest foods in the galaxy!
    • +
    +
    +
    +

    21 August 2013

    +

    Dumpdavidson updated:

    +
      +
    • Replaced the EMP grenades from the uplink with an EMP kit. The kit contains a grenade, an implant and a flashlight with 5 uses that can EMP any object or mob in melee range.
    • +
    +
    -
    -

    2 September 2013

    -

    Cael_Aislinn updated:

    -
      -
    • Terbs Fun Week Day 4: Humans, aliens and cyborgs now show speech bubbles when they talk.
    • -
    -
    +
    +

    18 August 2013

    +

    Delicious updated:

    +
      +
    • Made time and date consistent across medical and security records, mecha logs and detective scanner reports
    • +
    • Added date to PDA
    • +
    +
    +
    +

    13 August 2013

    +

    Giacom updated:

    +
      +
    • Malf AIs now have a new power which will spawn a "borging machine". This machine will turn living humans into loyal cyborgs which the AI can use to take over the station with. The AI will limit themselves by using this ability, such as no shunting, and the machine will have a long cooldown usage.
    • +
    +
    -
    -

    1 September 2013

    -

    Cael_Aislinn updated:

    -
      -
    • Terbs Fun Week Day 3: Detective can reskin his gun to one of five variants: Leopard Spots, Gold Trim, Black Panther, Peacemaker and the Original.
    • -
    -
    +
    +

    12 August 2013

    +

    Giacom updated:

    +
      +
    • Changed the blob balance to make the blob start strong but grow slower, resulting in rounds where the blob doesn't instantly get killed off if found out and doesn't immediately dominate after being left alone long enough. AIs no longer have to quarantine the station.
    • +
    +
    +
    +

    10 August 2013

    +

    Malkevin updated:

    +
      +
    • Cargo Overhaul: Phase 1
    • +
    • Ported Bay's cargo computer categoy system
    • +
    • Crates have been tweaked significantly. Crates have been reduced to single item types where possible, namely with expensive crates such as weapons and armor. A total of 28 new crates have been added, including chemical and tracking implants, and raw materials can also be bought from cargo for a significant number of points (subject to change)
    • +
    • This was a pretty large edit of repetitive data, so no doubt I've made a mistake or two. Please report any bugs to the usual place
    • +
    +
    -
    -

    12 September 2013

    -

    AndroidSFV updated:

    -
      -
    • AI Photography: AIs now have two new verbs, Take Picture and View Picture. The pictures the AI takes are centered on the AI's eyeobj. You can use these pictures on a newscaster, and print them at a photocopier. -
    -
    +
    +

    06 August 2013

    +

    Giacom updated:

    +
      +
    • NTSL no longer allows you to use a function within another function parameter. This was changed to help prevent server crashes; if your working script no longer compiles this is why.
    • +
    +
    +
    +

    05 August 2013

    +

    Kaze Espada updated:

    +
      +
    • Nanotrasen has recentely had to change its provider of alcoholic beverages to a provider of lower quality. Cases of the old ailment known as alcohol poisoning have returned. Bar goers are to be weary of this new condition.
    • +
    +
    -
    -

    31 August 2013

    -

    Cael_Aislinn updated:

    -
      -
    • Terbs Fun Week Day 2: RD, lawyers and librarians now spawn with a laser pointer. Don't point them in anyone's eyes!
    • -
    -
    +
    +

    04 August 2013

    +

    Giacom updated:

    +
      +
    • Nanotrasen has re-arranged the station blueprint designs to have non-essential APCs moved to the maintenance hallways. Non-essential rooms that aren't connected to a maintenance hallway will have their APC remain. Station Engineers will now have easy access to a room's APC without needing access themselves. Nanotrasen also wishes to remind you that you should not sabotage these easy to access APCs to cause distractions or to lockdown someone in a location. Thank you for reading.
    • +
    +
    +
    +

    31 July 2013

    +

    Ricotez updated:

    +
      +
    • Atmospherics now has its own hardsuit. Instead of radiation protection it offers fire protection.
    • +
    +
    -
    -

    30 August 2013

    -

    Cael_Aislinn updated:

    -
      -
    • Terbs Fun Week Day 1: Added ghost chilis as a mutation of chili plants. Be careful, they're one of the hottest foods in the galaxy!
    • -
    -
    +
    +

    21 July 2013

    +

    Cheridan updated:

    +
      +
    • Instead of a level-up system where it is possible to acquire all the skills, each skill now costs 1 point, and you can pick up to 5.Husking people, instead of giving you more XP to buy skills, now gives you a skill reset, allowing you to pick new ones.
    • +
    • DNA Extract Sting is now free, and is your main mode of acquiring DNA. You can hold up to 5 DNAs, and as you acquire more, the oldest one is removed. If you're currently using the oldest DNA strand, you will be required to transform before gaining more.
    • +
    • New abilities! An UI indicator for chemical storage! Fun!
    • +
    +

    Malkevin updated:

    +
      +
    • Cultists now start with two words each, and the starting talisman no longer damages you when you use it
    • +
    +
    +
    +

    16 July 2013

    +

    Malkevin updated:

    +
      +
    • Summary of my recent changes: Added a muzzle and a box of Prisoner ID cards to the perma wing, RnD can make a new combined gas mask with welding visor, added some atmos analyzers to atmospherics, air alarm circuit boards have their own sprites, package wrapped objects will now loop back round to the mail chute instead of auto-rerouting to disposals, and the detective and captain have access to securitrons through their PDA cartridges.
    • +
    +
    -
    -

    21 August 2013

    -

    Dumpdavidson updated:

    -
      -
    • Replaced the EMP grenades from the uplink with an EMP kit. The kit contains a grenade, an implant and a flashlight with 5 uses that can EMP any object or mob in melee range.
    • -
    -
    +
    +

    15 July 2013

    +

    Giacom updated:

    +
      +
    • A new item has been added to the syndicate catalog. The AI detector is a device disguised as a multitool; it is not only able to be used as a real multitool but when it detects an AI looking at it, or it's holder, it will turn red to indicate to the holder that he should cease supiscious activities. A great and cheap, to produce, tool for undercover operations involving an AI as the security system.
    • +
    +
    +
    +

    07 July 2013

    +

    Giacom updated:

    +
      +
    • Revamped blob mode and the blob random event to spawn a player controlled overmind that can expand the blob and upgrade pieces that perform particular functions. This will use resources which the core can slowly generate or you can place blob pieces that will give you more resources.
    • +
    +
    -
    -

    18 August 2013

    -

    Delicious updated:

    -
      -
    • Made time and date consistent across medical and security records, mecha logs and detective scanner reports
    • -
    • Added date to PDA
    • -
    -
    +
    +

    27 June 2013

    +

    Ikarrus updated:

    +
      +
    • Nanotrasen R&D; released a new firmware patch for their station AIs. Included among the changes is the new ability for AIs to interact with fire doors. R&D; officials state they feel giving station AIs more influence could only lead to good things.
    • +
    +
    +
    +

    16 June 2013

    +

    Khub updated:

    +
      +
    • Job preferences menu now not only allows you to left-click the level (i.e. [Medium]) to raise it, but also to right-click it to lower it. That means you don't have to cycle through all the levels to get rid of a [Low].
    • +
    +
    -
    -

    13 August 2013

    -

    Giacom updated:

    -
      -
    • Malf AIs now have a new power which will spawn a "borging machine". This machine will turn living humans into loyal cyborgs which the AI can use to take over the station with. The AI will limit themselves by using this ability, such as no shunting, and the machine will have a long cooldown usage.
    • -
    -
    +
    +

    15 June 2013

    +

    Carnie updated:

    +
      +
    • DNA-scanner pods (DNA-modifier + cloning), now open and close in a similar fashion to closets. This means you click on them to open/close them. This change was to fix a number of issues, like items being lost in the scanner-pods.
    • +
    • As a side-effect, borgs can now clone humans. No harm can become a dead human, so they are not necessarily lawbound to clone them, and such tasks are probably best left to qualified genetics staff.
    • +
    +

    Petethegoat updated:

    +
      +
    • Updated chemical grenades. The build process is much the same, except they require an igniter-X assembly instead of a single assembly item. You can also just use a cable coil to get regular grenade behaviour.
    • +
    +
    +
    +

    09 June 2013

    +

    Ikarrus updated:

    +
      +
    • Server operators may now allow latejoiners to become antagonists. Check game_options.txt for more information.
    • +
    • Server operators may now set how traitors and changelings scale to population. Check game_options.txt for more information.
    • +
    +
    - +
    +

    06 June 2013

    +

    Giacom updated:

    +
      +
    • Emptying someone's pockets won't display a message. In theory you can now pickpocket!
    • +
    +
    +
    +

    04 June 2013

    +

    Dumpdavidson updated:

    +
      +
    • Headsets can no longer broadcast into a channel that is disabled.
      Headsets now have a button to turn off the power instead of the speaker. This button disables all communication functions.
      EMPs now force affected radios off for about 20 seconds.

    • +
    +
    -
    -

    12 August 2013

    -

    Giacom updated:

    -
      -
    • Changed the blob balance to make the blob start strong but grow slower, resulting in rounds where the blob doesn't instantly get killed off if found out and doesn't immediately dominate after being left alone long enough. AIs no longer have to quarantine the station.
    • -
    -
    +
    +

    02 June 2013

    +

    Ikarrus updated:

    +
      +
    • To reduce costs of security equipment, mounted flashers have been adjusted to use common handheld flashes as their flashbulbs. Although these flashbulbs are more prone to burnout, they can easily be replaced with wirecutters.
    • +
    +
    +
    +

    25 May 2013

    +

    Ikarrus updated:

    +
      +
    • CentCom announced some minor restructuring within Space Station 13's command structure. Most notable of these changes is the removal of the Head of Personnel's access to the security radio channel. CentCom officials have stated the intention was to make the HoP's role more specialized and less partial towards security.
    • +
    +
    -
    -

    10 August 2013

    -

    Malkevin updated:

    -
      -
    • Cargo Overhaul: Phase 1
    • -
    • Ported Bay's cargo computer categoy system
    • -
    • Crates have been tweaked significantly. Crates have been reduced to single item types where possible, namely with expensive crates such as weapons and armor. A total of 28 new crates have been added, including chemical and tracking implants, and raw materials can also be bought from cargo for a significant number of points (subject to change)
    • -
    • This was a pretty large edit of repetitive data, so no doubt I've made a mistake or two. Please report any bugs to the usual place
    • -
    -
    - - -
    -

    6 August 2013

    -

    Giacom updated:

    -
      -
    • NTSL no longer allows you to use a function within another function parameter. This was changed to help prevent server crashes; if your working script no longer compiles this is why.
    • -
        -
    - - -
    -

    5 August 2013

    -

    Kaze Espada updated:

    -
      -
    • Nanotrasen has recentely had to change its provider of alcoholic beverages to a provider of lower quality. Cases of the old ailment known as alcohol poisoning have returned. Bar goers are to be weary of this new condition.
    • -
    -
    - - -
    -

    4 August 2013

    -

    Giacom updated:

    -
      -
    • Nanotrasen has re-arranged the station blueprint designs to have non-essential APCs moved to the maintenance hallways. Non-essential rooms that aren't connected to a maintenance hallway will have their APC remain. Station Engineers will now have easy access to a room's APC without needing access themselves. Nanotrasen also wishes to remind you that you should not sabotage these easy to access APCs to cause distractions or to lockdown someone in a location. Thank you for reading.
    • -
    -
    - - -
    -

    31 July 2013

    -

    Ricotez updated:

    -
      -
    • Atmospherics now has its own hardsuit. Instead of radiation protection it offers fire protection.
    • -
    -
    - - -
    -

    21 July 2013

    -

    Malkevin updated:

    -
      -
    • Cultists now start with two words each, and the starting talisman no longer damages you when you use it
    • -
    -
    - - - -
    -

    21 July 2013

    -

    Cheridan updated:

    -
      -
    • Instead of a level-up system where it is possible to acquire all the skills, each skill now costs 1 point, and you can pick up to 5.Husking people, instead of giving you more XP to buy skills, now gives you a skill reset, allowing you to pick new ones.
    • -
    • DNA Extract Sting is now free, and is your main mode of acquiring DNA. You can hold up to 5 DNAs, and as you acquire more, the oldest one is removed. If you're currently using the oldest DNA strand, you will be required to transform before gaining more.
    • -
    • New abilities! An UI indicator for chemical storage! Fun!
    • -
    -
    - - -
    -

    16 July 2013

    -

    Malkevin updated:

    -
      -
    • Summary of my recent changes: Added a muzzle and a box of Prisoner ID cards to the perma wing, RnD can make a new combined gas mask with welding visor, added some atmos analyzers to atmospherics, air alarm circuit boards have their own sprites, package wrapped objects will now loop back round to the mail chute instead of auto-rerouting to disposals, and the detective and captain have access to securitrons through their PDA cartridges.
    • -
    -
    - -
    -

    15 July 2013

    -

    Giacom updated:

    -
      -
    • A new item has been added to the syndicate catalog. The AI detector is a device disguised as a multitool; it is not only able to be used as a real multitool but when it detects an AI looking at it, or it's holder, it will turn red to indicate to the holder that he should cease supiscious activities. A great and cheap, to produce, tool for undercover operations involving an AI as the security system.
    • -
    -
    - - -
    -

    7 July 2013

    -

    Giacom updated:

    -
      -
    • Revamped blob mode and the blob random event to spawn a player controlled overmind that can expand the blob and upgrade pieces that perform particular functions. This will use resources which the core can slowly generate or you can place blob pieces that will give you more resources.
    • -
    -
    - -
    -

    27 June 2013

    -

    Ikarrus updated:

    -
      -
    • Nanotrasen R&D released a new firmware patch for their station AIs. Included among the changes is the new ability for AIs to interact with fire doors. R&D officials state they feel giving station AIs more influence could only lead to good things.
    • -
    -
    - -
    -

    16 June 2013

    -

    Khub updated:

    -
      -
    • Job preferences menu now not only allows you to left-click the level (i.e. [Medium]) to raise it, but also to right-click it to lower it. That means you don't have to cycle through all the levels to get rid of a [Low].
    • -
    -
    - - -
    -

    15 June 2013

    -

    Carnie updated:

    -
      -
    • DNA-scanner pods (DNA-modifier + cloning), now open and close in a similar fashion to closets. This means you click on them to open/close them. This change was to fix a number of issues, like items being lost in the scanner-pods.
    • -
    • As a side-effect, borgs can now clone humans. No harm can become a dead human, so they are not necessarily lawbound to clone them, and such tasks are probably best left to qualified genetics staff.
    • -
    -

    Petethegoat updated:

    -
      -
    • Updated chemical grenades. The build process is much the same, except they require an igniter-X assembly instead of a single assembly item. You can also just use a cable coil to get regular grenade behaviour.
    • -
    -
    - -
    -

    9 June 2013

    -

    Ikarrus updated:

    -
      -
    • Server operators may now allow latejoiners to become antagonists. Check game_options.txt for more information.
    • -
    • Server operators may now set how traitors and changelings scale to population. Check game_options.txt for more information.
    • -
    -
    - -
    -

    6 June 2013

    -

    Giacom updated:

    -
      -
    • Emptying someone's pockets won't display a message. In theory you can now pickpocket!
    • -
    -
    - - -
    -

    4 June 2013

    -

    Dumpdavidson updated:

    -
      -
    • Headsets can no longer broadcast into a channel that is disabled.
      Headsets now have a button to turn off the power instead of the speaker. This button disables all communication functions.
      EMPs now force affected radios off for about 20 seconds.
    • -
    -
    - -
    -

    2 June 2013

    -

    Ikarrus updated:

    -
      -
    • To reduce costs of security equipment, mounted flashers have been adjusted to use common handheld flashes as their flashbulbs. Although these flashbulbs are more prone to burnout, they can easily be replaced with wirecutters.
    • -
    -
    - -
    -

    25 May 2013

    -

    Ikarrus updated:

    -
      -
    • CentCom announced some minor restructuring within Space Station 13's command structure. Most notable of these changes is the removal of the Head of Personnel's access to the security radio channel. CentCom officials have stated the intention was to make the HoP's role more specialized and less partial towards security.
    • -
    -
    - -
    -

    14 May 2013

    -

    Ikarrus updated:

    -
      -
    • Nanotrasen seeks to further cut operating costs on experimental cyborg units. +
      +

      14 May 2013

      +

      Ikarrus updated:

      +
        +
      • Nanotrasen seeks to further cut operating costs on experimental cyborg units.
        -Cyborg chassis will now be made from a cheaper but less durable design.
        -RCDs found on engineering models have been replaced with a smaller model to make room for a metal rods module.
        -Cyborg arms will no longer be long enough to allow for self-repairs. -
        NOTE: A cyborg's individual modules have been found to become non-operational should the unit sustain too much structural damage.
      • -
      -
      +
      NOTE: A cyborg's individual modules have been found to become non-operational should the unit sustain too much structural damage.



    • +
    +
    -
    -

    11 May 2013

    -

    Malkevin updated:

    -
      -
    • SecHuds now check for valid clearance before allowing you to change someone's arrest status. There is only one way to bypass the ID check, and its not the usual way.
    • -
    +
    +

    11 May 2013

    +

    Malkevin updated:

    +
      +
    • SecHuds now check for valid clearance before allowing you to change someone's arrest status. There is only one way to bypass the ID check, and its not the usual way.
    • +
    +
    -
    +
    +

    07 May 2013

    +

    Ikarrus updated:

    +
      +
    • As a part of the most recent round of budget cuts, toolboxes will now be made with a cheaper but heavier alloy. HR reminds employees to avoid being struck with toolboxes, as toolbox-related injuries are not covered under the company's standard health plan.
    • +
    +
    -
    -

    7 May 2013

    -

    Ikarrus updated:

    -
      -
    • As a part of the most recent round of budget cuts, toolboxes will now be made with a cheaper but heavier alloy. HR reminds employees to avoid being struck with toolboxes, as toolbox-related injuries are not covered under the company's standard health plan.
    • -
    -
    +
    +

    05 May 2013

    +

    Rolan7 updated:

    +
      +
    • Cargo manifests from CentComm may contain errors. Stamp them DENIED for refunds. Doesn't apply to secure or large crates. Check the orders console for CentComm feedback.
    • +
    +
    -
    -

    5 May 2013

    -

    Rolan7 updated:

    -
      -
    • Cargo manifests from CentComm may contain errors. Stamp them DENIED for refunds. Doesn't apply to secure or large crates. Check the orders console for CentComm feedback.
    • -
    -
    +
    +

    02 May 2013

    +

    Malkevin updated:

    +
      +
    • You can now weld four floor tiles together to make a metal sheet
    • +
    • The All-In-One Grinder can now grind Metal, Plasteel, Glass, Reinforced Glass, and Wood sheets
    • +
    • Made grey backpacks slightly less ugly
    • +
    +
    -
    -

    2 May 2013

    -

    Malkevin updated:

    -
      -
    • You can now weld four floor tiles together to make a metal sheet
    • -
    • The All-In-One Grinder can now grind Metal, Plasteel, Glass, Reinforced Glass, and Wood sheets
    • -
    • Made grey backpacks slightly less ugly
    • -
    -
    +
    +

    30 April 2013

    +

    Ikarrus updated:

    +
      +
    • Researchers have discovered that glass shards are, in fact, dangerous due to their typically sharp nature. Our internal Safety Committee advises that glass shards only be handled while using Nanotrasen-approved hand-protective equipment.
    • +
    +
    -
    -

    30 April 2013

    -

    Ikarrus updated:

    -
      -
    • Researchers have discovered that glass shards are, in fact, dangerous due to their typically sharp nature. Our internal Safety Committee advises that glass shards only be handled while using Nanotrasen-approved hand-protective equipment.
    • -
    -
    +
    +

    26 April 2013

    +

    Aranclanos updated:

    +
      +
    • Exosuit fabricators will now need to be manually updated
    • +
    +

    Ikarrus updated:

    +
      +
    • Commanding Officers of Nanotrasen Stations have been issued a box of medals to be awarded to crew members who display exemplary conduct.
    • +
    +
    -
    -

    24 April 2013

    -

    Carnie updated:

    -
      -
    • DNA reworked: All SE blocks are randomised. DNA-modifier emitter strength affects the size of the change in the hex-character hit. Emitter duration makes it more likely to hit the character you click on. Almost all DNA-modifier functions are on one screen.
      Balancing -will- be off a bit. Is getting halk to hard/easy? Please report bugs/balancing issues/concerns here: http://forums.nanotrasen.com/viewtopic.php?f=15&t=13083 <3
    • -
    -
    +
    +

    24 April 2013

    +

    Carnie updated:

    +
      +
    • DNA reworked: All SE blocks are randomised. DNA-modifier emitter strength affects the size of the change in the hex-character hit. Emitter duration makes it more likely to hit the character you click on. Almost all DNA-modifier functions are on one screen.
      Balancing -will- be off a bit. Is getting halk to hard/easy? Please report bugs/balancing issues/concerns here: http://forums.nanotrasen.com/viewtopic.php?f=15&t;=13083 <3
    • +
    +
    -
    -

    26 April 2013

    -

    Aranclanos updated:

    -
      -
    • Exosuit fabricators will now need to be manually updated
    • -
    -

    Ikarrus updated:

    -
      -
    • Commanding Officers of Nanotrasen Stations have been issued a box of medals to be awarded to crew members who display exemplary conduct.
    • -
    -
    +
    +

    23 April 2013

    +

    Malkevin updated:

    +
      +
    • Replaced the captain's run of the mill armored vest with his very own unique vest. Offers slightly better bullet protection.
    • +
    +
    +
    +

    22 April 2013

    +

    Cheridan updated:

    +
      +
    • Stungloves removed 5eva.
    • +
    • Don't rage yet. Makeshift stunprods(similar in function to stungloves) and spears are now craftable. Make them by using a rod on cable restraits, then adding something.
    • +
    • Stun batons/prods now work off power cells, which can be removed and replaced! Use a screwdriver to remove the battery.
    • +
    +

    Malkevin updated:

    +
      +
    • Overhauled the thermal insulation system
    • +
    • All clothing that protected from one side of the thermal spectrum now protects from the other.
    • +
    • Armor (although most don't have full coverage) protects between 160 to 600 kelvin
    • +
    • Firesuits protect between 60 to 30,000 kelvin (Note: Hotspot damage still exists)
    • +
    • CE's hardsuit got its firesuit level protection back
    • +
    • Bomb suits function as ghetto riot gear
    • +
    +
    -
    -

    23 April 2013

    -

    Malkevin updated:

    -
      -
    • Replaced the captain's run of the mill armored vest with his very own unique vest. Offers slightly better bullet protection.
    • -
    -
    +
    +

    17 April 2013

    +

    Giacom updated:

    +
      +
    • If the configuration option is enabled, AIs and or Cyborgs will not be able to communicate vocally. This means they cannot talk normally and need to use alternative methods to do so
    • +
    +
    +
    +

    10 April 2013

    +

    Cheridan updated:

    +
      +
    • You can now condense capsaicin into pepper spray with chemistry.
    • +
    • Pepper spray made slightly more effective.
    • +
    • Teargas grenades can be obtained in Weapons and Riot crates.
    • +
    • Riot crate comes with 2 sets of gear instead of 3, made cheaper. Beanbag crate removed entirely. Just make more at the autolathe instead. Bureaucracy crate cheaper, now has film roll.
    • +
    • NT bluespace engineers have ironed-out that little issue with the teleporter occasionally malfunctioning and dropping users into deep space. Please note, however, that bluespace teleporters are still sensitive experimental technology, and should be Test Fired before use to ensure proper function.
    • +
    +
    -
    -

    22 April 2013

    -

    Malkevin updated:

    -
      -
    • Overhauled the thermal insulation system
    • -
    • All clothing that protected from one side of the thermal spectrum now protects from the other.
    • -
    • Armor (although most don't have full coverage) protects between 160 to 600 kelvin
    • -
    • Firesuits protect between 60 to 30,000 kelvin (Note: Hotspot damage still exists)
    • -
    • CE's hardsuit got its firesuit level protection back
    • -
    • Bomb suits function as ghetto riot gear
    • -
    -
    +
    +

    09 April 2013

    +

    Ikarrus updated:

    +
      +
    • Liquid Plasma have been found to have strange and unexpected results on virion cultures. The executive chief science officer urges virologists to explore the possibilities this new discovery could bring.
    • +
    • After years or research, our scientists have engineered this cutting-edge technology born from the science of shaving. The Electric Space-Razor 5000! It uses moisturizers to refuel your face while you shave with not three, not four, but FIVE lazer-precise inner blades for maximum comfort.
    • +
    +
    -
    -

    22 April 2013

    -

    Cheridan updated:

    -
      -
    • Stungloves removed 5eva.
    • -
    • Don't rage yet. Makeshift stunprods(similar in function to stungloves) and spears are now craftable. Make them by using a rod on cable restraits, then adding something.
    • -
    • Stun batons/prods now work off power cells, which can be removed and replaced! Use a screwdriver to remove the battery.
    • -
    -
    +
    +

    04 April 2013

    +

    Cheridan updated:

    +
      +
    • When an AI shunts into an APC, the pinpointer will begin tracking it. When the AI returns to its core, the pinpointer will go back to locating the nuke disc.
    • +
    • New sechud icons for sec officers/HoS, medical doctors, and loyalty implants.
    • +
    +
    +
    +

    28 March 2013

    +

    Carnie updated:

    +
      +
    • Empty character slots in your preferences screen will now randomize. So they won't initialise as bald, diaper-clad, white-guys.
    • +
    • Reworked the savefile versioning/updating code. Your preferences data is less likely to be lost.
    • +
    +
    -
    -

    17 April 2013

    -

    Giacom updated:

    -
      -
    • If the configuration option is enabled, AIs and or Cyborgs will not be able to communicate vocally. This means they cannot talk normally and need to use alternative methods to do so
    • -
    -
    +
    +

    14 March 2013

    +

    Major_sephiroth updated:

    +
      +
    • You can now light cigarettes with other cigarettes, and candles. And cigars. Light a cigar with a candle! It's possible now!
    • +
    +
    +
    +

    13 March 2013

    +

    Elo001 updated:

    +
      +
    • You can now open and close job slots for some jobs at any IDcomputer. There is a cooldown when opening or closing a position.
    • +
    +
    -
    -

    10 April 2013

    -

    Cheridan updated:

    -
      -
    • You can now condense capsaicin into pepper spray with chemistry.
    • -
    • Pepper spray made slightly more effective.
    • -
    • Teargas grenades can be obtained in Weapons and Riot crates.
    • -
    • Riot crate comes with 2 sets of gear instead of 3, made cheaper. Beanbag crate removed entirely. Just make more at the autolathe instead. Bureaucracy crate cheaper, now has film roll.
    • -
    • NT bluespace engineers have ironed-out that little issue with the teleporter occasionally malfunctioning and dropping users into deep space. Please note, however, that bluespace teleporters are still sensitive experimental technology, and should be Test Fired before use to ensure proper function.
    • -
    -
    +
    +

    08 March 2013

    +

    Kor updated:

    +
      +
    • You can now construct/destroy bookcases. This is super exciting and game changing.
    • +
    +
    +
    +

    06 March 2013

    +

    Petethegoat updated:

    +
      +
    • Petethegoat says, "Added a new feature involvi-GLORF"
    • +
    • Overhauled how grabs work. There aren't any interesting mechanical differences yet, but they should be a lot more effective already. You don't have to double click them anymore. Report any bugs with grabbing directly to me, or on the issue tracker.
    • +
    +
    -
    -

    9 April 2013

    -

    Ikarrus updated:

    -
      -
    • Liquid Plasma have been found to have strange and unexpected results on virion cultures. The executive chief science officer urges virologists to explore the possibilities this new discovery could bring.
    • -
    • After years or research, our scientists have engineered this cutting-edge technology born from the science of shaving. The Electric Space-Razor 5000! It uses moisturizers to refuel your face while you shave with not three, not four, but FIVE lazer-precise inner blades for maximum comfort.
    • -
    -
    - -
    -

    4 April 2013

    -

    Cheridan updated:

    -
      -
    • When an AI shunts into an APC, the pinpointer will begin tracking it. When the AI returns to its core, the pinpointer will go back to locating the nuke disc.
    • -
    • New sechud icons for sec officers/HoS, medical doctors, and loyalty implants.
    • -
    -
    - -
    -

    28 March 2013

    -

    Carnie updated:

    -
      -
    • Empty character slots in your preferences screen will now randomize. So they won't initialise as bald, diaper-clad, white-guys.
    • -
    • Reworked the savefile versioning/updating code. Your preferences data is less likely to be lost.
    • -
    -
    - -
    -

    14 March 2013

    -

    Major_sephiroth updated:

    -
      -
    • You can now light cigarettes with other cigarettes, and candles. And cigars. Light a cigar with a candle! It's possible now!
    • -
    -
    - -
    -

    13 March 2013

    -

    Elo001 updated:

    -
      -
    • You can now open and close job slots for some jobs at any IDcomputer. There is a cooldown when opening or closing a position.
    • -
    -
    - -
    -

    8 March 2013

    -

    Kor updated:

    -
      -
    • You can now construct/destroy bookcases. This is super exciting and game changing.
    • -
    -
    - -
    -

    6 March 2013

    -

    Petethegoat updated:

    -
      -
    • Petethegoat says, "Added a new feature involvi-GLORF"
    • -
    • Overhauled how grabs work. There aren't any interesting mechanical differences yet, but they should be a lot more effective already. You don't have to double click them anymore. Report any bugs with grabbing directly to me, or on the issue tracker.
    • -
    -
    - -
    -

    24 February 2013

    -

    Ikarrus updated:

    -
      -
    • AI has been moved back to the center of the station. Telecoms has been moved to engineering.
    • -
    -

    Faerdan updated:

    -
      -
    • Competely new UI overhaul! Most user interface have been converted.
    • -
    +
    +

    24 February 2013

    +

    Faerdan updated:

    +
      +
    • Competely new UI overhaul! Most user interface have been converted.
    • +
    +

    Ikarrus updated:

    +
      +
    • AI has been moved back to the center of the station. Telecoms has been moved to engineering.
    • +
    +
    GoonStation 13 Development Team
    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml new file mode 100644 index 00000000000..7d36875e07d --- /dev/null +++ b/html/changelogs/.all_changelog.yml @@ -0,0 +1,1847 @@ +DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. +--- +2013-02-24: + !!python/unicode 'Faerdan': + - !!python/unicode 'rscadd': !!python/unicode 'Competely new UI overhaul! Most user + interface have been converted.' + !!python/unicode 'Ikarrus': + - !!python/unicode 'tweak': !!python/unicode 'AI has been moved back to the center + of the station. Telecoms has been moved to engineering.' +2013-03-06: + !!python/unicode 'Petethegoat': + - !!python/unicode 'rscadd': !!python/unicode 'Petethegoat says, "Added a new feature + involvi-GLORF"' + - !!python/unicode 'tweak': !!python/unicode 'Overhauled how grabs work. There aren''t + any interesting mechanical differences yet, but they should be a lot more effective + already. You don''t have to double click them anymore. Report any bugs with + grabbing directly to me, or on the issue tracker.' +2013-03-08: + !!python/unicode 'Kor': + - !!python/unicode 'rscadd': !!python/unicode 'You can now construct/destroy bookcases. + This is super exciting and game changing.' +2013-03-13: + !!python/unicode 'Elo001': + - !!python/unicode 'rscadd': !!python/unicode 'You can now open and close job slots + for some jobs at any IDcomputer. There is a cooldown when opening or closing + a position.' +2013-03-14: + !!python/unicode 'Major_sephiroth': + - !!python/unicode 'rscadd': !!python/unicode 'You can now light cigarettes with + other cigarettes, and candles. And cigars. Light a cigar with a candle! It''s + possible now!' +2013-03-28: + !!python/unicode 'Carnie': + - !!python/unicode 'tweak': !!python/unicode 'Empty character slots in your preferences + screen will now randomize. So they won''t initialise as bald, diaper-clad, white-guys.' + - !!python/unicode 'tweak': !!python/unicode 'Reworked the savefile versioning/updating + code. Your preferences data is less likely to be lost.' +2013-04-04: + !!python/unicode 'Cheridan': + - !!python/unicode 'tweak': !!python/unicode 'When an AI shunts into an APC, the + pinpointer will begin tracking it. When the AI returns to its core, the pinpointer + will go back to locating the nuke disc.' + - !!python/unicode 'tweak': !!python/unicode 'New sechud icons for sec officers/HoS, + medical doctors, and loyalty implants.' +2013-04-09: + !!python/unicode 'Ikarrus': + - !!python/unicode 'rscadd': !!python/unicode 'Liquid Plasma have been found to + have strange and unexpected results on virion cultures. The executive chief + science officer urges virologists to explore the possibilities this new discovery + could bring.' + - !!python/unicode 'rscadd': !!python/unicode 'After years or research, our scientists + have engineered this cutting-edge technology born from the science of shaving. + The Electric Space-Razor 5000! It uses moisturizers to refuel your face while + you shave with not three, not four, but FIVE lazer-precise inner blades for + maximum comfort.' +2013-04-10: + !!python/unicode 'Cheridan': + - !!python/unicode 'rscadd': !!python/unicode 'You can now condense capsaicin into + pepper spray with chemistry.' + - !!python/unicode 'tweak': !!python/unicode 'Pepper spray made slightly more effective.' + - !!python/unicode 'tweak': !!python/unicode 'Teargas grenades can be obtained in + Weapons and Riot crates.' + - !!python/unicode 'tweak': !!python/unicode 'Riot crate comes with 2 sets of gear + instead of 3, made cheaper. Beanbag crate removed entirely. Just make more at + the autolathe instead. Bureaucracy crate cheaper, now has film roll. ' + - !!python/unicode 'tweak': !!python/unicode 'NT bluespace engineers have ironed-out + that little issue with the teleporter occasionally malfunctioning and dropping + users into deep space. Please note, however, that bluespace teleporters are + still sensitive experimental technology, and should be Test Fired before use + to ensure proper function.' +2013-04-17: + !!python/unicode 'Giacom': + - !!python/unicode 'rscadd': !!python/unicode 'If the configuration option is enabled, + AIs and or Cyborgs will not be able to communicate vocally. This means they + cannot talk normally and need to use alternative methods to do so' +2013-04-22: + !!python/unicode 'Cheridan': + - !!python/unicode 'rscdel': !!python/unicode 'Stungloves removed 5eva.' + - !!python/unicode 'rscadd': !!python/unicode 'Don''t rage yet. Makeshift stunprods(similar + in function to stungloves) and spears are now craftable. Make them by using + a rod on cable restraits, then adding something.' + - !!python/unicode 'rscadd': !!python/unicode 'Stun batons/prods now work off power + cells, which can be removed and replaced! Use a screwdriver to remove the battery.' + !!python/unicode 'Malkevin': + - !!python/unicode 'tweak': !!python/unicode 'Overhauled the thermal insulation + system' + - !!python/unicode 'rscadd': !!python/unicode 'All clothing that protected from + one side of the thermal spectrum now protects from the other.' + - !!python/unicode 'wip': !!python/unicode 'Armor (although most don''t have full + coverage) protects between 160 to 600 kelvin' + - !!python/unicode 'wip': !!python/unicode 'Firesuits protect between 60 to 30,000 + kelvin (Note: Hotspot damage still exists)' + - !!python/unicode 'rscadd': !!python/unicode 'CE''s hardsuit got its firesuit level + protection back' + - !!python/unicode 'tweak': !!python/unicode 'Bomb suits function as ghetto riot + gear' +2013-04-23: + !!python/unicode 'Malkevin': + - !!python/unicode 'imageadd': !!python/unicode 'Replaced the captain''s run of + the mill armored vest with his very own unique vest. Offers slightly better + bullet protection.' +2013-04-24: + !!python/unicode 'Carnie': + - !!python/unicode 'experiment': !!python/unicode 'DNA reworked: All SE blocks are + randomised. DNA-modifier emitter strength affects the size of the change in + the hex-character hit. Emitter duration makes it more likely to hit the character + you click on. Almost all DNA-modifier functions are on one screen.
    Balancing + -will- be off a bit. Is getting halk to hard/easy? Please report bugs/balancing + issues/concerns here: http://forums.nanotrasen.com/viewtopic.php?f=15&t;=13083 + <3
    ' +2013-04-26: + !!python/unicode 'Aranclanos': + - !!python/unicode 'tweak': !!python/unicode 'Exosuit fabricators will now need + to be manually updated' + !!python/unicode 'Ikarrus': + - !!python/unicode 'rscadd': !!python/unicode 'Commanding Officers of Nanotrasen + Stations have been issued a box of medals to be awarded to crew members who + display exemplary conduct.' +2013-04-30: + !!python/unicode 'Ikarrus': + - !!python/unicode 'rscadd': !!python/unicode 'Researchers have discovered that + glass shards are, in fact, dangerous due to their typically sharp nature. Our + internal Safety Committee advises that glass shards only be handled while using + Nanotrasen-approved hand-protective equipment.' +2013-05-02: + !!python/unicode 'Malkevin': + - !!python/unicode 'rscadd': !!python/unicode 'You can now weld four floor tiles + together to make a metal sheet' + - !!python/unicode 'rscadd': !!python/unicode 'The All-In-One Grinder can now grind + Metal, Plasteel, Glass, Reinforced Glass, and Wood sheets' + - !!python/unicode 'tweak': !!python/unicode 'Made grey backpacks slightly less + ugly' +2013-05-05: + !!python/unicode 'Rolan7': + - !!python/unicode 'rscadd': !!python/unicode 'Cargo manifests from CentComm may + contain errors. Stamp them DENIED for refunds. Doesn''t apply to secure or + large crates. Check the orders console for CentComm feedback.' +2013-05-07: + !!python/unicode 'Ikarrus': + - !!python/unicode 'tweak': !!python/unicode 'As a part of the most recent round + of budget cuts, toolboxes will now be made with a cheaper but heavier alloy. + HR reminds employees to avoid being struck with toolboxes, as toolbox-related + injuries are not covered under the company''s standard health plan.' +2013-05-11: + !!python/unicode 'Malkevin': + - !!python/unicode 'rscadd': !!python/unicode 'SecHuds now check for valid clearance + before allowing you to change someone''s arrest status. There is only one way + to bypass the ID check, and its not the usual way.' +2013-05-14: + !!python/unicode 'Ikarrus': + - !!python/unicode 'tweak': !!python/unicode "Nanotrasen seeks to further cut operating\ + \ costs on experimental cyborg units. \n\t\t
    -Cyborg chassis will now be\ + \ made from a cheaper but less durable design. \n\t\t
    -RCDs found on engineering\ + \ models have been replaced with a smaller model to make room for a metal rods\ + \ module.\n\t\t
    -Cyborg arms will no longer be long enough to allow for self-repairs.\n\ + \t\t
    NOTE: A cyborg's individual modules have been found to become non-operational\ + \ should the unit sustain too much structural damage.



    " +2013-05-25: + !!python/unicode 'Ikarrus': + - !!python/unicode 'rscdel': !!python/unicode 'CentCom announced some minor restructuring + within Space Station 13''s command structure. Most notable of these changes + is the removal of the Head of Personnel''s access to the security radio channel. + CentCom officials have stated the intention was to make the HoP''s role more + specialized and less partial towards security.' +2013-06-02: + !!python/unicode 'Ikarrus': + - !!python/unicode 'tweak': !!python/unicode 'To reduce costs of security equipment, + mounted flashers have been adjusted to use common handheld flashes as their + flashbulbs. Although these flashbulbs are more prone to burnout, they can easily + be replaced with wirecutters.' +2013-06-04: + !!python/unicode 'Dumpdavidson': + - !!python/unicode 'tweak': !!python/unicode 'Headsets can no longer broadcast into + a channel that is disabled.
    Headsets now have a button to turn off the power + instead of the speaker. This button disables all communication functions.
    EMPs + now force affected radios off for about 20 seconds.

    ' +2013-06-06: + !!python/unicode 'Giacom': + - !!python/unicode 'rscadd': !!python/unicode 'Emptying someone''s pockets won''t + display a message. In theory you can now pickpocket!' +2013-06-09: + !!python/unicode 'Ikarrus': + - !!python/unicode 'rscadd': !!python/unicode 'Server operators may now allow latejoiners + to become antagonists. Check game_options.txt for more information.' + - !!python/unicode 'rscadd': !!python/unicode 'Server operators may now set how + traitors and changelings scale to population. Check game_options.txt for more + information.' +2013-06-15: + !!python/unicode 'Carnie': + - !!python/unicode 'bugfix': !!python/unicode 'DNA-scanner pods (DNA-modifier + + cloning), now open and close in a similar fashion to closets. This means you + click on them to open/close them. This change was to fix a number of issues, + like items being lost in the scanner-pods.' + - !!python/unicode 'rscadd': !!python/unicode 'As a side-effect, borgs can now clone + humans. No harm can become a dead human, so they are not necessarily lawbound + to clone them, and such tasks are probably best left to qualified genetics staff.' + !!python/unicode 'Petethegoat': + - !!python/unicode 'tweak': !!python/unicode 'Updated chemical grenades. The build + process is much the same, except they require an igniter-X assembly instead + of a single assembly item. You can also just use a cable coil to get regular + grenade behaviour.' +2013-06-16: + !!python/unicode 'Khub': + - !!python/unicode 'rscadd': !!python/unicode 'Job preferences menu now not only + allows you to left-click the level (i.e. [Medium]) to raise it, but also to + right-click it to lower it. That means you don''t have to cycle through all + the levels to get rid of a [Low].' +2013-06-27: + !!python/unicode 'Ikarrus': + - !!python/unicode 'rscadd': !!python/unicode 'Nanotrasen R&D; released a new + firmware patch for their station AIs. Included among the changes is the new + ability for AIs to interact with fire doors. R&D; officials state they feel + giving station AIs more influence could only lead to good things.' +2013-07-07: + !!python/unicode 'Giacom': + - !!python/unicode 'rscadd': !!python/unicode 'Revamped blob mode and the blob random + event to spawn a player controlled overmind that can expand the blob and upgrade + pieces that perform particular functions. This will use resources which the + core can slowly generate or you can place blob pieces that will give you more + resources.' +2013-07-15: + !!python/unicode 'Giacom': + - !!python/unicode 'rscadd': !!python/unicode 'A new item has been added to the + syndicate catalog. The AI detector is a device disguised as a multitool; it + is not only able to be used as a real multitool but when it detects an AI looking + at it, or it''s holder, it will turn red to indicate to the holder that he should + cease supiscious activities. A great and cheap, to produce, tool for undercover + operations involving an AI as the security system.' +2013-07-16: + !!python/unicode 'Malkevin': + - !!python/unicode 'tweak': !!python/unicode 'Summary of my recent changes: Added + a muzzle and a box of Prisoner ID cards to the perma wing, RnD can make a new + combined gas mask with welding visor, added some atmos analyzers to atmospherics, + air alarm circuit boards have their own sprites, package wrapped objects will + now loop back round to the mail chute instead of auto-rerouting to disposals, + and the detective and captain have access to securitrons through their PDA cartridges.' +2013-07-21: + !!python/unicode 'Cheridan': + - !!python/unicode 'rscadd': !!python/unicode 'Instead of a level-up system where + it is possible to acquire all the skills, each skill now costs 1 point, and + you can pick up to 5.Husking people, instead of giving you more XP to buy skills, + now gives you a skill reset, allowing you to pick new ones.' + - !!python/unicode 'rscadd': !!python/unicode 'DNA Extract Sting is now free, and + is your main mode of acquiring DNA. You can hold up to 5 DNAs, and as you acquire + more, the oldest one is removed. If you''re currently using the oldest DNA strand, + you will be required to transform before gaining more.' + - !!python/unicode 'rscadd': !!python/unicode 'New abilities! An UI indicator for + chemical storage! Fun!' + !!python/unicode 'Malkevin': + - !!python/unicode 'rscadd': !!python/unicode 'Cultists now start with two words + each, and the starting talisman no longer damages you when you use it' +2013-07-31: + !!python/unicode 'Ricotez': + - !!python/unicode 'rscadd': !!python/unicode 'Atmospherics now has its own hardsuit. + Instead of radiation protection it offers fire protection.' +2013-08-04: + !!python/unicode 'Giacom': + - !!python/unicode 'rscadd': !!python/unicode 'Nanotrasen has re-arranged the station + blueprint designs to have non-essential APCs moved to the maintenance hallways. + Non-essential rooms that aren''t connected to a maintenance hallway will have + their APC remain. Station Engineers will now have easy access to a room''s APC + without needing access themselves. Nanotrasen also wishes to remind you that + you should not sabotage these easy to access APCs to cause distractions or to + lockdown someone in a location. Thank you for reading.' +2013-08-05: + !!python/unicode 'Kaze Espada': + - !!python/unicode 'rscadd': !!python/unicode 'Nanotrasen has recentely had to change + its provider of alcoholic beverages to a provider of lower quality. Cases of + the old ailment known as alcohol poisoning have returned. Bar goers are to be + weary of this new condition.' +2013-08-06: + !!python/unicode 'Giacom': + - !!python/unicode 'bugfix': !!python/unicode 'NTSL no longer allows you to use + a function within another function parameter. This was changed to help prevent + server crashes; if your working script no longer compiles this is why.' +2013-08-10: + !!python/unicode 'Malkevin': + - !!python/unicode 'wip': !!python/unicode 'Cargo Overhaul: Phase 1' + - !!python/unicode 'rscadd': !!python/unicode 'Ported Bay''s cargo computer categoy + system' + - !!python/unicode 'tweak': !!python/unicode 'Crates have been tweaked significantly. + Crates have been reduced to single item types where possible, namely with expensive + crates such as weapons and armor. A total of 28 new crates have been added, + including chemical and tracking implants, and raw materials can also be bought + from cargo for a significant number of points (subject to change)' + - !!python/unicode 'bugfix': !!python/unicode 'This was a pretty large edit of repetitive + data, so no doubt I''ve made a mistake or two. Please report any bugs to the + usual place' +2013-08-12: + !!python/unicode 'Giacom': + - !!python/unicode 'tweak': !!python/unicode 'Changed the blob balance to make the + blob start strong but grow slower, resulting in rounds where the blob doesn''t + instantly get killed off if found out and doesn''t immediately dominate after + being left alone long enough. AIs no longer have to quarantine the station.' +2013-08-13: + !!python/unicode 'Giacom': + - !!python/unicode 'rscadd': !!python/unicode 'Malf AIs now have a new power which + will spawn a "borging machine". This machine will turn living humans into loyal + cyborgs which the AI can use to take over the station with. The AI will limit + themselves by using this ability, such as no shunting, and the machine will + have a long cooldown usage.' +2013-08-18: + !!python/unicode 'Delicious': + - !!python/unicode 'tweak': !!python/unicode 'Made time and date consistent across + medical and security records, mecha logs and detective scanner reports' + - !!python/unicode 'rscadd': !!python/unicode 'Added date to PDA' +2013-08-21: + !!python/unicode 'Dumpdavidson': + - !!python/unicode 'rscadd': !!python/unicode 'Replaced the EMP grenades from the + uplink with an EMP kit. The kit contains a grenade, an implant and a flashlight + with 5 uses that can EMP any object or mob in melee range.' +2013-08-30: + !!python/unicode 'Cael_Aislinn': + - !!python/unicode 'rscadd': !!python/unicode 'Terbs Fun Week Day 1: Added ghost + chilis as a mutation of chili plants. Be careful, they''re one of the hottest + foods in the galaxy!' +2013-08-31: + !!python/unicode 'Cael_Aislinn': + - !!python/unicode 'rscadd': !!python/unicode 'Terbs Fun Week Day 2: RD, lawyers + and librarians now spawn with a laser pointer. Don''t point them in anyone''s + eyes!' +2013-09-01: + !!python/unicode 'Cael_Aislinn': + - !!python/unicode 'rscadd': !!python/unicode 'Terbs Fun Week Day 3: Detective can + reskin his gun to one of five variants: Leopard Spots, Gold Trim, Black Panther, + Peacemaker and the Original.' +2013-09-02: + !!python/unicode 'Cael_Aislinn': + - !!python/unicode 'rscadd': !!python/unicode 'Terbs Fun Week Day 4: Humans, aliens + and cyborgs now show speech bubbles when they talk.' +2013-09-03: + !!python/unicode 'Cael_Aislinn': + - !!python/unicode 'rscadd': !!python/unicode 'Terbs Fun Week Day 5: Chef gets a + Nanotrasen-issued icecream machine with four pre-approved icecream flavours + and two official cone types.' +2013-09-12: + !!python/unicode 'AndroidSFV': + - !!python/unicode 'rscadd': !!python/unicode "AI Photography: AIs now have two\ + \ new verbs, Take Picture and View Picture. The pictures the AI takes are centered\ + \ on the AI's eyeobj. You can use these pictures on a newscaster, and print\ + \ them at a photocopier.\n\t" +2013-09-13: + !!python/unicode 'JJRcop': + - !!python/unicode 'rscadd': !!python/unicode 'We at Nanotrasen would like to assure + you that we know the pain of waiting five minutes for the emergency shuttle + to be dispatched in a high-alert situation due to our confirmation-of-distress + policy. Therefore, we have amended our confirmation-of-distress policy so that, + in the event of a red alert, the distress confirmation period is shortened to + three minutes and we will hurry in preparing the shuttle for transit. This totals + to 6 minutes, in hope that it will give our very expensive equipment + a better chance of recovery.' +2013-09-17: + !!python/unicode 'SuperSayu': + - !!python/unicode 'bugfix': !!python/unicode 'You can no longer strip people through + windows and windoors' + - !!python/unicode 'bugfix': !!python/unicode 'You can open doors by hand even if + there is a firedoor in the way, making firedoor+airlock no longer an unbeatable + combination' + - !!python/unicode 'rscadd': !!python/unicode 'Ghosts can now click on anything + to examine it, or double click to jump to a turf. Double clicking a mob, bot, + or (heaven forbid) singularity/Nar-Sie will let you follow it. Double clicking + your own corpse re-enters it.' + - !!python/unicode 'rscadd': !!python/unicode 'AI can double click a mob to follow + it, as well as double clicking turfs to jump.' + - !!python/unicode 'rscadd': !!python/unicode 'Ventcrawling mobs can alt-click a + vent to start ventcrawling.' + - !!python/unicode 'wip': !!python/unicode 'Telekinesis is now part of the click + system. You can click on buttons, items, etc, without having a telekinetic + throw in hand; the throw will appear when you click on something you can move + (with your mind).' +2013-09-19: + !!python/unicode 'Malkevin': + - !!python/unicode 'tweak': !!python/unicode 'Juggernaut''s ablative armor has been + adjusted. They have a greater chance to reflect lasers however on reflection + they take half damage instead of no damage, basically this adjustment means + you should be able to kill a Juggernaut with two laser guns instead of four! + Also their reflection spread has been greatly widened, enjoy the lightshow' + - !!python/unicode 'rscadd': !!python/unicode 'Cargo can now order exile implants.' + - !!python/unicode 'tweak': !!python/unicode 'Checking a collector''s last power + output via analyzers has been moved to multitools, because that actually made + sense (betcha didn''t know this existed, I know I didn''t)' + - !!python/unicode 'rscadd': !!python/unicode 'Analyzers can now be used to check + the gas level of the tank in a loaded radiation collector (yay no more crowbars), + you can also use them on pipes to check gas levels (yay no more pipe meters)' +2013-09-21: + !!python/unicode 'Malkevin': + - !!python/unicode 'rscadd': !!python/unicode 'Due to complaints about Security + not announcing themselves before making arrests NT has now issued it''s Sec + team with loud hailer integrated gas masks, found in their standard equipment + lockers. Users can adjust the mask''s level of aggression with a screwdriver. ' + - !!python/unicode 'wip': !!python/unicode 'The sprites could be shaded better. + Think you can do better? Post + your submissions here. ' +2013-09-26: + !!python/unicode 'Cheridan': + - !!python/unicode 'rscadd': !!python/unicode "Nanotrasen Anomaly Primer:
    \n\ + \t\tUnstable anomalies have been spotted in your region of space. These anomalies\ + \ can be hazardous and destructive, though our initial encounters with these\ + \ space oddities has discovered a method of neutralization. Method follows.
    \n\ +

    Step 1. Upon confirmation of an anomaly sighting, report its location. Early\ + \ detection is key.
    \n\t\tStep 2. Using an atmospheric analyzer at short\ + \ range, determine the frequency that the anomaly's core is fluctuating at.
    \n\ + \t\tStep 3. Send a signal through the frequency using a radio signaller. Note\ + \ that non-specialized signaller devices may possibly lack the frequency range\ + \ needed.

    \n\t\tWith the anomaly neutralized and the station brought\ + \ out of danger, inspect the area for any remnants of the anomaly. Properly\ + \ researched, we believe these events could provide vast amounts of valuable\ + \ data.
    \nDid you find this report helpful?


    " +2013-09-28: + !!python/unicode 'Ergovisavi': + - !!python/unicode 'rscadd': !!python/unicode 'Mobs can now be lit on fire. Wearing + a full firesuit (or similar) will protect you. Extinguishers, Showers, Space, + Cryo, Resisting, being splashed with water can all extinguish you. Being splashed + with fuel/ethanol/plasma makes you more flammable. Water makes you less flammable.' +2013-09-29: + !!python/unicode 'RobRichards': + - !!python/unicode 'rscadd': !!python/unicode 'Nanotrasen Cyborg Upgrades:
    + + Standard issue Engineering cyborgs now come equipped with replacement floor + tiles which they can replenish at recharge stations.
    ' +2013-10-06: + !!python/unicode 'Ergovisavi': + - !!python/unicode 'rscadd': !!python/unicode 'Entering a Hotspot will cause you + to ignite, but hot air was slightly reduced in deadliness. For every hotspot + you enter, you get a little bit harder to be put out, so be wary.' + !!python/unicode 'Giacom': + - !!python/unicode 'rscadd': !!python/unicode 'New blob features!' + - !!python/unicode 'rscadd': !!python/unicode 'The blob will glow when it is being + pulsed from a core/node. Resource/factories have depended on being pulsed to + work, but you couldn''t see; well now you can.' + - !!python/unicode 'rscadd': !!python/unicode 'Overminds can talk! But only to other + overminds, but ghosts can hear their conversations.' + - !!python/unicode 'rscadd': !!python/unicode 'As a blob overmind you can now use + shortcuts to help robust that assistant with the welding tank dangerously close + to your core.' + - !!python/unicode 'rscadd': !!python/unicode 'Expand = CTRL Click - Rally = Middle + Mouse Click - Create Shield = Alt Click' +2013-10-08: + !!python/unicode 'Cael_Aislinn': + - !!python/unicode 'rscadd': !!python/unicode 'Terbs Fun Week Day 6: Centcomm will + ask borrow the cargo shuttle for top secret shenanigans. They''ll always return + it though, and sometimes they''ll even clean it too (new random event).' +2013-10-14: + !!python/unicode 'Giacom': + - !!python/unicode 'rscadd': !!python/unicode 'AIs can now use alt click to get + a list of items on the tile, allowing the AI to interact with objects under + it. They can also use this to bookmark tiles with valuable equipment, such as + APCs, allowing them easy access to the tile, to interact with or to jump to. ' + - !!python/unicode 'rscadd': !!python/unicode 'New Malf Power: Malf AIs can override + a single machine''s programming to cause it to rise up and attack everyone in + sight.' +2013-10-26: + !!python/unicode 'Giacom': + - !!python/unicode 'rscadd': !!python/unicode 'Service Cyborgs now have a violin + module.' + - !!python/unicode 'rscadd': !!python/unicode 'You can now examine Cyborgs to see + their active module.' +2013-10-27: + !!python/unicode 'Giacom': + - !!python/unicode 'rscadd': !!python/unicode 'Added the Female VOX AI Announcement + System; a vocal announcement system for the AI to announce things on!' + - !!python/unicode 'soundadd': !!python/unicode 'Thanks to /vg/ for the sounds and + to JJRCop for trimming down the silence to make them sound natural(er).' + - !!python/unicode 'experiment': !!python/unicode 'The VOX Announcement system isn''t + to be abused, admins should warn AIs who misuse it and ban AIs who misuse it + after being warned. ' +2013-11-02: + !!python/unicode 'Drovidi Corv': + - !!python/unicode 'rscadd': !!python/unicode "Added a forced labor camp to mining.\ + \ A quota can be assigned to a prisoner's ID at a prisoner management console\ + \ before he is sent to serve his sentence in the secure area of the labor camp\ + \ shuttle. Laborers are advised that breaching space from the asteroid may\ + \ be unwise.\n\t" +2013-11-06: + !!python/unicode 'Cheridan': + - !!python/unicode 'wip': !!python/unicode 'Nuke Ops will now get an amount of telecrystals + that scales with the round populaton. Their staging area has been equipped with + telecrystal management consoles, which allow to transfer their TC among themselves. + Try out the new items available in your uplink!' +2013-11-09: + !!python/unicode 'Yota': + - !!python/unicode 'rscadd': !!python/unicode 'Along with a NanoUI upgrade, the + human interface lock of APCs can now be toggled by the AI.' + - !!python/unicode 'tweak': !!python/unicode 'NanoUI dialogs will no longer steal + keyboard focus when opened.' +2013-11-11: + !!python/unicode 'Fleure': + - !!python/unicode 'rscadd': !!python/unicode 'Players can now escape from containers + of various kinds, such as sleepers, mechs, gibbers, spider cocoons etc with + the resist verb. In some cases this is the only way to escape and overrides + movement or older eject verbs. ' +2013-11-15: + !!python/unicode 'Giacom': + - !!python/unicode 'rscadd': !!python/unicode 'Added bluespace crystals, mysterious + crystals which have strange properties when you crush them in your hand or throw + them at someone. You can make bluespace crystals via slimes or research.' + - !!python/unicode 'rscadd': !!python/unicode 'Telescience Update! The telescience + doesn''t start 100% effecient anymore and you need to create bluespace crystals + and put them into the telescience computer.' + - !!python/unicode 'rscadd': !!python/unicode 'The telepad is now more random, along + with power, bearing and angle will be randomly offset a bit.' +2013-11-16: + !!python/unicode 'Kyrahabattoir': + - !!python/unicode 'rscadd': !!python/unicode 'Added restocking units for the snack, + softdrinks, cigarettes, booze and hot drinks vending machines, can be ordered + in cargo.' + - !!python/unicode 'tweak': !!python/unicode 'Vending machines need their service + screwed on in order to dispense products.' +2013-11-17: + !!python/unicode 'Laharl Montgommery': + - !!python/unicode 'rscadd': !!python/unicode 'AI can now anchor and unanchor itself. + In short, it means the AI can be dragged, if it wants to.' +2013-11-27: + !!python/unicode 'RobRichards': + - !!python/unicode 'rscadd': !!python/unicode 'Nanotrasen surgeons are now certified + to perform Limb replacements, The robotic parts used in construction of Nanotrasen + Cyborgs are the only parts authorized for crew augmentation, these replacement + limbs can be repaired with standard welding tools and cables.' +2013-11-28: + !!python/unicode 'Malkevin': + - !!python/unicode 'tweak': !!python/unicode 'Made the suit storage on the Captain''s + Tunic more useful than just a place to store your e-o2 tank. You can now store + the nuke disk, stamps, medal box, flashes and melee weapons (mainly intended + for the Chain of Command), and of course - smoking paraphernalia' +2013-11-30: + !!python/unicode 'Yota': + - !!python/unicode 'tweak': !!python/unicode 'The identification console will now + require that ID and job names follow the same restrictions as player names.' + - !!python/unicode 'bugfix': !!python/unicode 'NTSL scripts and parrots should now + handle apostrophes and such properly. It&#39;s about time.' + - !!python/unicode 'bugfix': !!python/unicode 'NTSL scripts now have a better sense + of time.' +2013-12-01: + !!python/unicode 'cookingboy3': + - !!python/unicode 'rscadd': !!python/unicode 'Added three new buttons to the sandbox + panel.' + - !!python/unicode 'tweak': !!python/unicode 'Removed canister menu, replaced it + with buttons.' + - !!python/unicode 'tweak': !!python/unicode 'Players can no longer spawn "dangerous" + canisters in sandbox, such as Plasma, N20, CO2, and Nitrogen.' +2013-12-02: + !!python/unicode 'Giacom': + - !!python/unicode 'rscadd': !!python/unicode 'A less annoying virology system! + From now on, you can only get low level virus symptoms from virus food, medium + level virus symptoms from unstable mutagen and high level virus symptoms from + liquid plasma. You can find a list of symptoms, and which chemicals are required + to get them, here: http://wiki.ss13.eu/index.php/Infections#Symptoms_Table ' + - !!python/unicode 'tweak': !!python/unicode 'The virologist starts with a bottle + of plasma in his smart fridge.' + - !!python/unicode 'tweak': !!python/unicode 'Made it so you cannot accidentally + click in the gaps between chem masters.' +2013-12-05: + !!python/unicode 'Razharas': + - !!python/unicode 'tweak': !!python/unicode 'Reworked how ling stings are done, + now when you click a sting in the changeling tab it becomes current active sting, + the icon of that sting appears under the chem counter, alt+clicking anyone will + sting them with current sting, clicking the icon of the sting will unset it.' + - !!python/unicode 'tweak': !!python/unicode 'Monkeys have ling chem counter and + active sting icons in their UI.' + - !!python/unicode 'tweak': !!python/unicode 'Going monkey -> human will try + to equip the human with everything on the ground below it.' +2013-12-08: + !!python/unicode 'Rolan7': + - !!python/unicode 'tweak': !!python/unicode 'Leather gloves can be used to removes + lights.' + - !!python/unicode 'rscadd': !!python/unicode 'Plant, ore, and trash bags have a + new option to pick up all items of single type' + - !!python/unicode 'tweak': !!python/unicode 'Creating astroturf now works like + sandstone, converting all the grass at once.' + - !!python/unicode 'tweak': !!python/unicode 'Uranium and radium can be used instead + of mutagen. 10 can mutate species, 5 or 2 mutate traits. Highly toxic.' + - !!python/unicode 'experiment': !!python/unicode 'Plants require a little light + to live. Mushroom require even less (2 units vs 4) and take less damage.' +2013-12-09: + !!python/unicode 'Giacom': + - !!python/unicode 'imageadd': !!python/unicode 'New colourful ghost sprites for + BYOND members. Sprites by anonus.' +2013-12-14: + !!python/unicode 'Incoming': + - !!python/unicode 'rscadd': !!python/unicode 'Magic Mania! Powerful new magical + tools and skills for wizard and crew alike!' + - !!python/unicode 'rscadd': !!python/unicode 'Beware the new Summon Magic spell, + which will grant the crew access to magical tools and spells and cause some + to misuse it!' + - !!python/unicode 'rscadd': !!python/unicode "One Time Spellbooks that can be spawned\ + \ during summon magic that can teach a low level magic skill to anyone!\ + \ Beware the effects of reading pre-owned books, the magical rights management\ + \ is potent!\n\t\t
  • Magical Wands that can be spawned during\ + \ Summon Magic! They come in a variety of effects that mimic both classical\ + \ wizard spells and all new ones. They come precharged but lack the means to\ + \ refill them once their magical energy is depleted... Fire efficently!
  • \n\ +
  • Be aware of the new Charge spell, which can take normally\ + \ useless spent wands and give them new life! This mysterious effect has been\ + \ found to wear down the overall magical potency of wands over time however.\ + \ Beyond wands the clever magical user can find ways to use this spell on other\ + \ things that may benefit from a magical charge...
  • \n
  • The Staff of Resurrection, which holds intense healing magics able to defeat\ + \ death itself! Look out for this invaluable magical tool during castings of\ + \ Summon Magic.
  • \n
  • Be on the lookout for a new apprentice!\ + \ This noble mage is a different beast from most wizards, trained in the arts\ + \ of defending and healing. Too bad he still works for the wizard!
  • \n" +2013-12-18: + !!python/unicode 'Adrinus': + - !!python/unicode 'rscadd': !!python/unicode 'Playing cards, just like the real + thing! Play poker, blackjack, go fish, the limits are limitless! Recommended + to use space cash as the poker chips for now' + !!python/unicode 'Giacom': + - !!python/unicode 'rscadd': !!python/unicode 'THE REALISM: Injectors such as syringes, + parapens and hypos will not penetrate coveralls with thick material, this includes + space suits, biosuits, bombsuits, and their head slot equivalent. Injectors + now also consider where you aim, if you aim for the head it will try to use + it through the head slot, otherwise it will aim for the body. To clarify, if + you are wearing a space helmet and a doctor tries to inject you while aiming + at your head, it will protect you until they aim for the unprotected body; same + story for wearing a space suit and not a helmet.' + - !!python/unicode 'tweak': !!python/unicode 'The syndicate shuttle has been heavily + upgraded with a brand new technology which allows the blast doors to the entrance + of the shuttle to AUTOMATICALLY close. Whoa. This brand new technology will + help keep out those snoopy crew members.' + - !!python/unicode 'tweak': !!python/unicode 'Lowered the cooldown of creating virus + cultures to 5 seconds. You now only need to mix one unit of synaptizine, in + a blood full of an advance virus, to get it to remove a random symptom.' + !!python/unicode 'Incoming': + - !!python/unicode 'tweak': !!python/unicode 'Rounds will no longer end when the + wizard dies and there are still apprentices or traitors/survivors..' + !!python/unicode 'JJRcop': + - !!python/unicode 'tweak': !!python/unicode 'Transit tube tweaks. You can now put + someone into a transit tube pod using grabs and you can empty a transit tube + pod by clicking on it.' + !!python/unicode 'Jordie0608': + - !!python/unicode 'tweak': !!python/unicode 'Replaced the digital valves in atmospherics + with pumps.' +2013-12-21: + !!python/unicode 'Bobylein': + - !!python/unicode 'tweak': !!python/unicode 'Labcoats can now store bottles, beakers, + pills, pill bottles and paper.' + !!python/unicode 'Giacom': + - !!python/unicode 'rscadd': !!python/unicode 'The Labor Camp has been changed based + on feedback. Ore boxes added, internals added, safety pickaxes/shovels (might + revert if unliked).' + - !!python/unicode 'tweak': !!python/unicode 'Labor Camp prisoners, who have earned + enough points for freedom, will now have to be alone in the shuttle to move + it and to open the middle door; this is in order to prevent free''d prisoners + from releasing their comrades.' + - !!python/unicode 'tweak': !!python/unicode 'Monkeys no longer walk away when being + pulled or grabbed.' + - !!python/unicode 'tweak': !!python/unicode 'Anti-breach shield generators have + a greater range, and will cover more exposed space tiles.' + !!python/unicode 'Jordie': + - !!python/unicode 'tweak': !!python/unicode 'Blowing up borgs from the Robotics + Console will now actually make them explode. Emagged Cyborgs will explode even + more.' + !!python/unicode 'Nienhaus': + - !!python/unicode 'rscadd': !!python/unicode 'Added more poster.' + !!python/unicode 'Perakp': + - !!python/unicode 'tweak': !!python/unicode 'You can no longer slip while laying + down.' + !!python/unicode 'RobRichards, Validsalad': + - !!python/unicode 'rscadd': !!python/unicode 'Added new sprites for the sec-hailer, + SWAT gear and riot armour.' +2013-12-27: + !!python/unicode 'Giacom': + - !!python/unicode 'tweak': !!python/unicode 'Light explosions will no longer gib + dead bodies anymore. C4 will function the same and gib anything attached.' + - !!python/unicode 'tweak': !!python/unicode 'Syringe gun projectiles will now display + a message when shots are deflected by space suits, biosuits and etc...' + - !!python/unicode 'tweak': !!python/unicode 'You can now move out of sleepers by + moving, again.' + !!python/unicode 'Miauw': + - !!python/unicode 'tweak': !!python/unicode 'Monkeys now have a resist button on + their HUD.' +2013-12-31: + !!python/unicode 'Fleure': + - !!python/unicode 'bugfix': !!python/unicode 'Paper no longer appears with words + on it when blank input written or photocopied' + - !!python/unicode 'bugfix': !!python/unicode 'Vending machine speaker toggle button + now works' + - !!python/unicode 'bugfix': !!python/unicode 'Building arcade machines works again' +2014-01-01: + !!python/unicode 'Errorage': + - !!python/unicode 'tweak': !!python/unicode 'The damage overlay for humans starts + a little later than before. It used to start at 10 points of fire + brute damage, + it now starts at 35.' +2014-01-02: + !!python/unicode 'Demas': + - !!python/unicode 'tweak': !!python/unicode 'Added different colours to departmental + radio frequencies. Now you''ll be able to filter out or pay attention to each + frequency a lot easier.' + !!python/unicode 'Fleure': + - !!python/unicode 'bugfix': !!python/unicode 'Fixed bruisepacks and ointments not + working.' + - !!python/unicode 'bugfix': !!python/unicode 'Fixed injecting/stabbing mouth or + eyes when only thick suit worn.' +2014-01-04: + !!python/unicode 'Razharas': + - !!python/unicode 'rscadd': !!python/unicode 'Constructable machines now depend + on R&D; parts!' + - !!python/unicode 'rscadd': !!python/unicode 'DNA scanner: Laser quality lessens + irradiation. Manipulator quality drastically improves precision (9x for best + part) and scanner quality allows you to scan suicides/ling husks, with the best + part enabling the cloner''s autoprocess button, making it scan people in the + scanner automatically.' + - !!python/unicode 'rscadd': !!python/unicode 'Clone pod: Manipulator quality improves + the speed of cloning. Scanning module quality affects with how much health people + will be ejected, will they get negative mutation/no mutations/clean of all mutations/random + good mutation, at best quality will enable clone console''s autoprocess button + and will try to clone all the dead people in records automatically, together + with best DNA scanner parts cloning console will be able to work in full automatic + regime autoscanning people and autocloning them.' + - !!python/unicode 'rscadd': !!python/unicode 'Borg recharger: Capacitors'' quality + and powercell max charge affect the speed at which borgs recharge. Manipulator + quality allows borg to be slowly repaired while inside the recharges, best manipulator + allows even fire damage to be slowly repaired.' + - !!python/unicode 'rscadd': !!python/unicode 'Portable power generators: Capacitors'' + quality produce more power. Better lasers consume less fuel and reduce heat + production PACMAN with best parts can keep whole station powered with about + sheet of plamsa per minute (approximately, wasn''t potent enough to test).' + - !!python/unicode 'rscadd': !!python/unicode 'Autolathe: Better manipulator reduces + the production time and lowers the cost of things(they will also have less m_amt + and g_amt to prevent production of infinity metal), stacks'' cant be reduced + in cost, because thatll make production of infinity metal/glass easy' + - !!python/unicode 'rscadd': !!python/unicode 'Protolathe: Manipulators quality + affects the cost of things(they will also have less m_amt and g_amt to prevent + production of infinity metal), best manipulators reduces the cost 5 times (!)' + - !!python/unicode 'rscadd': !!python/unicode 'Circuit imprinter: Manipulator quality + affects the cost, best manipulator reduce cost(acid insluded) 4 times, i.e. + 20 boards per 100 units of acid' + - !!python/unicode 'rscadd': !!python/unicode 'Destructive analyzer: Better parts + allow items with less reliability in. Redone how reliability is handled, you + now see item reliability in the deconstruction menu and deconstructing items + that has same or one point less research type level will rise the reliability + of all known designs that has one or more research type requirements as the + deconstructed item. Designs of the same type raise in reliability more. Critically + broken things rise reliability of the design drastically. Whole reliability + system is not used a lot but now at least on the R&D; part it finally matters. ' +2014-01-07: + !!python/unicode 'Fleure': + - !!python/unicode 'tweak': !!python/unicode 'Janitor now spawns with a service + headset.' + - !!python/unicode 'tweak': !!python/unicode 'Backpack watertank slowdown decreased.' +2014-01-10: + !!python/unicode 'ChuckTheSheep': + - !!python/unicode 'rscadd': !!python/unicode 'Morgue Trays can detect players in + their bodies and will now change colour depending on a few things. Red = Dead + body with no player inside. Orange = No body but items. Green = A dead body + with a player inside.' + !!python/unicode 'Giacom': + - !!python/unicode 'rscadd': !!python/unicode 'You can whisper while in critical, + but you will immediately die afterwards DRAMATICALLY. The closer you are to + death, the less you can say.' + - !!python/unicode 'tweak': !!python/unicode 'The wizard won''t spawn so much smoke + after they blink.' + - !!python/unicode 'tweak': !!python/unicode 'The detective''s forensic scanner + was upgraded so that it can now scan from afar.' + - !!python/unicode 'bugfix': !!python/unicode 'Made the ghost''s follow button less + buggy. Please make an issue report if it still bugs out.' + !!python/unicode 'Rumia29, Nienhaus': + - !!python/unicode 'imageadd': !!python/unicode 'A new alt RD uniform spawns in + his locker.' +2014-01-11: + !!python/unicode 'Cheridan': + - !!python/unicode 'rscadd': !!python/unicode 'You can now upgrade laser pointers + with micro laser parts. It will increase the chance of blinding people.' + !!python/unicode 'Errorage': + - !!python/unicode 'rscadd': !!python/unicode 'Cyborg modules now use a new UI, + which is much quicker than a menu.' + !!python/unicode 'Giacom': + - !!python/unicode 'experiment': !!python/unicode 'The game will now have all background + operations disabled, this will result in smoother gameplay but may result in + some spike lags, before being set back to normal. The gradually increasing lag + should now be gone.' + - !!python/unicode 'rscadd': !!python/unicode 'You can now emag the crusher, in + disposals, to remove the safety. You can use a screwdriver to reset it to the + default factory settings.' + - !!python/unicode 'bugfix': !!python/unicode 'The toxin compensation symptom will + stop giving you toxin damage while at full health.' + !!python/unicode 'JJRCop': + - !!python/unicode 'rscadd': !!python/unicode 'The new nuke toy can now be found + in your local arcade machine.' +2014-01-12: + !!python/unicode 'VistaPOWA': + - !!python/unicode 'rscadd': !!python/unicode 'Added Syndicate Cyborgs.' + - !!python/unicode 'rscadd': !!python/unicode 'They can be ordered for 25 telecrystals + by Nuclear Operatives. A ghost / observer with "Be Operative" ticked in their + game options will be chosen to control it.' + - !!python/unicode 'rscadd': !!python/unicode 'Their loadout is: Crowbar, Flash, + Emag, Esword, Ebow, Laser Rifle. Each weapon costs 100 charge to fire, except + the Esword, which has a 500 charge hitcost. Each borg is equipped with a 25k + cell by default.' + - !!python/unicode 'rscadd': !!python/unicode 'Syndicate borgs can hear the binary + channel, but they won''t show up on the Robotics Control computer or be visible + to the AI. Their lawset is the standard emag one.' + - !!python/unicode 'rscadd': !!python/unicode 'Added two cyborg recharging stations + to the Syndicate Shuttle.' +2014-01-14: + !!python/unicode 'Fleure': + - !!python/unicode 'rscadd': !!python/unicode 'Added spider butchery.' + - !!python/unicode 'rscadd': !!python/unicode 'Added spider meat, legs, and edible + eggs.' + - !!python/unicode 'rscadd': !!python/unicode 'Added new spider related meals.' + !!python/unicode 'Giacom': + - !!python/unicode 'tweak': !!python/unicode 'Because of an emagged cyborg''s explosion, + the MMI will die with it.' + - !!python/unicode 'bugfix': !!python/unicode 'The self-respiration symptom will + now properly keep you from dying of oxygen loss.' + - !!python/unicode 'bugfix': !!python/unicode 'The Stimulant symptom''s activation + chance was increased so you had a constant flow of hyperzine.' + !!python/unicode 'Incoming': + - !!python/unicode 'rscadd': !!python/unicode 'A new training bomb has been added + to the armoury, which will allow you to train your wire cutting skills to disarm + real syndicate bombs.' + !!python/unicode 'ManeaterMildred': + - !!python/unicode 'rscadd': !!python/unicode 'Updated research designs.' + - !!python/unicode 'rscadd': !!python/unicode 'The Protolathe can now build a Ion + Rifle.' + - !!python/unicode 'rscadd': !!python/unicode 'The Exosuit Fabricator can now build + a Mech Ion Rifle, a Mech Carbine and a Mech-Mounted Missile Rack.' + !!python/unicode 'SirBayer': + - !!python/unicode 'experiment': !!python/unicode 'Armor now reduces damage by the + protection percentage, instead of randomly deciding to half or full block damage + by those percentages.' + - !!python/unicode 'rscadd': !!python/unicode 'Shotguns, with buckshot shells, will + fire a spread of pellets at your target, like a real shotgun blast.' +2014-01-15: + !!python/unicode 'Dumpdavidson': + - !!python/unicode 'bugfix': !!python/unicode 'EMPs affect the equipment of a human + again.' + - !!python/unicode 'tweak': !!python/unicode 'EMP flashlight now recharges over + time and its description no longer reveals the illegal nature of the device.' + - !!python/unicode 'tweak': !!python/unicode 'EMP implant now has two uses.
    + EMP kit now contains two grenades.
    ' +2014-01-17: + !!python/unicode 'ManeaterMildred': + - !!python/unicode 'tweak': !!python/unicode 'Changed the way the Gygax worked. + It now has less defense and shot deflection, but is faster and have less battery + drain per step.' + - !!python/unicode 'tweak': !!python/unicode 'Nerfed the Carbine''s brute damage + and renamed it to FNX-99 "Hades" Carbine.' + - !!python/unicode 'tweak': !!python/unicode "Nerfed the Gygax defense from 300\ + \ to 250.
    \n\t\t\t\t\t\t Nerfed the Gygax projectile deflection chance from\ + \ 15 to 5.
    \n\t\t\t\t\t\t Buffed the Gygax speed from 3 to 2, making it\ + \ faster.
    \n\t\t\t\t\t\t Reduced the battery use when moving from 5 to 3.
    \n\ +
    \n\t\t\t\t\t\t The Mech Ion Rifle now has a faster cooldown, from 40 to\ + \ 20.
    \n\t\t\t\t\t\t Nerfed the carbine's Brute Damage from 20 to 5.
    \n\ +
    \n\t\t\t\t\t\t Please post feedback to these changes on the forums.\n\t\ + \t







    " +2014-01-19: + !!python/unicode 'KazeEspada': + - !!python/unicode 'tweak': !!python/unicode 'The water cooler is now stocked with + paper cups. You can refill the cups by putting paper in it.' + !!python/unicode 'Rolan7': + - !!python/unicode 'rscadd': !!python/unicode 'You can now sell mutant seeds, from + hydroponics, to Centcom via the supply shuttle.' + - !!python/unicode 'bugfix': !!python/unicode 'Fixes powersinks causing APCs to + stop automatically recharging.' +2014-01-21: + !!python/unicode 'MrPerson': + - !!python/unicode 'rscadd': !!python/unicode 'Mobs now lie down via turning icons + rather than preturned sprites.' + - !!python/unicode 'rscadd': !!python/unicode 'You can lie down facing up or down + and the turn can be 90 degrees clockwise or counterclockwise.' + - !!python/unicode 'tweak': !!python/unicode 'Resting will always make you lie to + the right so you look good on beds.' + - !!python/unicode 'wip': !!python/unicode 'Please report any bugs you find with + this system.' +2014-01-24: + !!python/unicode 'Ergovisavi': + - !!python/unicode 'rscadd': !!python/unicode 'Gibtonite, the explosive ore, can + now be found on the asteroid. It''s very hard to tell between it and diamonds, + at first glance.' + - !!python/unicode 'rscadd': !!python/unicode 'Gibtonite deposits will blow up after + a countdown when you attempt to mine it, but you can stop it with an analyzer + at any time. It makes for a good mining explosive.' + - !!python/unicode 'rscadd': !!python/unicode 'The closer you were to the explosion + when you analyze the Gibtonite deposit, the better the Gibtonite you can get + from it.' + - !!python/unicode 'rscadd': !!python/unicode 'Once extracted, it must be struck + with a pickaxe or drill to activate it, where it will go through its countdown + again to explode!' + - !!python/unicode 'tweak': !!python/unicode 'Explosives will no longer destroy + the ore inside of asteroid walls or lying on the floor.' +2014-01-25: + !!python/unicode 'Miauw': + - !!python/unicode 'rscadd': !!python/unicode 'Adds changeling arm blades that cost + 20 chems and do 25 brute damage.' + - !!python/unicode 'rscadd': !!python/unicode 'Arm blades can pry open unpowered + doors, replace surgical saws in brain removal, slice tables and smash computers.' +2014-01-26: + !!python/unicode 'Balrog': + - !!python/unicode 'rscadd': !!python/unicode 'Syndicate Playing Cards can now be + found on the Syndicate Mothership and purchased from uplinks for 1 telecrystal.' + - !!python/unicode 'rscadd': !!python/unicode 'Syndicate Playing Cards are lethal + weapons both in melee and when thrown, but make the user''s true allegiance + to the Syndicate obvious.' + - !!python/unicode 'imageadd': !!python/unicode 'Sprites are courtesy of Nienhaus.' +2014-01-28: + !!python/unicode 'Demas': + - !!python/unicode 'rscadd': !!python/unicode 'Adds thud sounds to falling over' + - !!python/unicode 'wip': !!python/unicode 'Known bug: Thuds play when cloning initialises + or someone is put into cryo. This will be fixed.' +2014-01-30: + !!python/unicode 'Balrog': + - !!python/unicode 'rscadd': !!python/unicode 'Syndicate Playing Cards can now be + found on the Syndicate Mothership and purchased from uplinks for 1 telecrystal.' + - !!python/unicode 'rscadd': !!python/unicode 'Syndicate Playing Cards are lethal + weapons both in melee and when thrown, but make the user''s true allegiance + to the Syndicate obvious.' + - !!python/unicode 'imageadd': !!python/unicode 'Sprites are courtesy of Nienhaus.' + !!python/unicode 'Demas': + - !!python/unicode 'rscadd': !!python/unicode 'Adds thud sounds to falling over' + - !!python/unicode 'wip': !!python/unicode 'Known bug: Thuds play when cloning initialises + or someone is put into cryo. This will be fixed.' + !!python/unicode 'Ergovisavi': + - !!python/unicode 'rscadd': !!python/unicode 'Gibtonite, the explosive ore, can + now be found on the asteroid. It''s very hard to tell between it and diamonds, + at first glance.' + - !!python/unicode 'rscadd': !!python/unicode 'Gibtonite deposits will blow up after + a countdown when you attempt to mine it, but you can stop it with an analyzer + at any time. It makes for a good mining explosive.' + - !!python/unicode 'rscadd': !!python/unicode 'The closer you were to the explosion + when you analyze the Gibtonite deposit, the better the Gibtonite you can get + from it.' + - !!python/unicode 'rscadd': !!python/unicode 'Once extracted, it must be struck + with a pickaxe or drill to activate it, where it will go through its countdown + again to explode!' + - !!python/unicode 'tweak': !!python/unicode 'Explosives will no longer destroy + the ore inside of asteroid walls or lying on the floor.' + !!python/unicode 'Miauw': + - !!python/unicode 'rscadd': !!python/unicode 'Adds changeling arm blades that cost + 20 chems and do 25 brute damage.' + - !!python/unicode 'rscadd': !!python/unicode 'Arm blades can pry open unpowered + doors, replace surgical saws in brain removal, slice tables and smash computers.' + !!python/unicode 'MrPerson': + - !!python/unicode 'rscadd': !!python/unicode 'Mobs now lie down via turning icons + rather than preturned sprites.' + - !!python/unicode 'rscadd': !!python/unicode 'You can lie down facing up or down + and the turn can be 90 degrees clockwise or counterclockwise.' + - !!python/unicode 'tweak': !!python/unicode 'Resting will always make you lie to + the right so you look good on beds.' + - !!python/unicode 'wip': !!python/unicode 'Please report any bugs you find with + this system.' + !!python/unicode 'Petethegoat': + - !!python/unicode 'tweak': !!python/unicode 'Increased the walk speed. Legcuffed + speed is unaffected, and is still suffering.' + - !!python/unicode 'tweak': !!python/unicode 'Sped up alien drones, they are now + the same speed as sentinels.' +2014-02-01: + !!python/unicode 'Ergovisavi': + - !!python/unicode 'rscadd': !!python/unicode 'Walking Mushrooms will now attack + and eat each other! They''re all a little unique from each other, no two shrooms + are exactly alike, and a better quality harvest means stronger Walking Shrooms. + Pit them against each other for your entertainment.' + - !!python/unicode 'rscadd': !!python/unicode 'Each mushroom will have a different + colored cap to identify them. When mushrooms eat each other, they get stronger. + The resulting mushroom will drop more slices when cut down to harvest, and will + have better quality slices.' + - !!python/unicode 'rscadd': !!python/unicode 'Don''t hurt them yourself, though, + or you''ll bruise them, and mushrooms won''t get stronger from eating a bruised + mushroom. If your mushroom faints, feed it a mushroom such as a plump helmet + to get it back on its feet. It will slowly regenerate to full health eventually.' +2014-02-02: + !!python/unicode 'Demas': + - !!python/unicode 'rscadd': !!python/unicode 'Attack sounds for all melee weapons! + No more silent attacks. ' + - !!python/unicode 'tweak': !!python/unicode 'The volume of an object''s attack + sound is based on the weapon''s force and/or weight class.' + - !!python/unicode 'rscadd': !!python/unicode 'Welders, lighters, matches, cigarettes, + energy swords and energy axes have different attack sounds based on whether + they''re on or off.' + - !!python/unicode 'rscadd': !!python/unicode 'Weapons that do no damage play a + tap sound. The exceptions are the bike horn, which still honks, and the banhammer, + which plays adminhelp.ogg. Surely nothing can go wrong with that last one.' + - !!python/unicode 'tweak': !!python/unicode 'When you tap someone with an object, + the message now uses "tapped" or "patted" instead of attacked. The horn still + uses HONKED, and the banhammer still uses BANNED.' + - !!python/unicode 'bugfix': !!python/unicode 'You won''t get the "armour has blocked + an attack" message for harmless attacks anymore.' + - !!python/unicode 'rscadd': !!python/unicode 'Adds 5 force to the lighter when + it''s lit. Same as when you accidentally burn yourself lighting it.' + - !!python/unicode 'rscadd': !!python/unicode 'Removes boldness from item attack + messages on non-human mobs. The attack is bolded for a player controlling a + non-human mob. Now your eyes won''t jump to the chat when it''s Pun Pun who''s + being brutalised.' + - !!python/unicode 'bugfix': !!python/unicode 'Blood will no longer come out of + non-human mobs if the attack is harmless.' + - !!python/unicode 'tweak': !!python/unicode 'Adds a period at the end of the catatonic + human examine message. That''s been bugging me for years.' + - !!python/unicode 'tweak': !!python/unicode 'The activation and deactivation sounds + of toy swords, energy swords and energy shields are slightly quieter. Energy + swords and shields are now slightly louder than toys.' + - !!python/unicode 'bugfix': !!python/unicode 'You can no longer light things with + burnt matches.' + - !!python/unicode 'tweak': !!python/unicode 'Match, cigarette and lighter attack + verbs, forces and damage types change based on whether the object is lit or + not.' + - !!python/unicode 'bugfix': !!python/unicode 'Fixes a bug with the energy blade + that kept it at weight class 5 after it was deactivated. Who cares, it disappears + upon deactivation.' + - !!python/unicode 'tweak': !!python/unicode 'Changes the welder out of fuel message + slightly to be less fragmented.' + - !!python/unicode 'tweak': !!python/unicode 'Removes dead air from a lot of weapon + sound effects to make them more responsive. In other words, the fire extinguisher + attack sound will play a lot sooner after you attack than before. ' + - !!python/unicode 'tweak': !!python/unicode 'Equalised the peak volumes of most + weapon sounds to be -0.1dB in an attempt to make volumes based on force more + consistent across different sounds.' +2014-02-03: + !!python/unicode 'Demas': + - !!python/unicode 'tweak': !!python/unicode 'Changes windoor and newscaster attack + messages to be consistent with windows and grilles. This removes the distracting + boldness from windoor attack messages, which is reserved for userdanger, and + names the attacker.' + - !!python/unicode 'rscadd': !!python/unicode 'Thrown items now play a sound effect + on impact. The volume of the sound is based on the item''s throwforce and/or + weight class.' + - !!python/unicode 'tweak': !!python/unicode 'The fireaxe now has 15 throwforce, + when previously it had only 1. But why would you throw it away, anyway?' + - !!python/unicode 'rscadd': !!python/unicode 'Projectiles now play a sound upon + impact. The volume of the sound depends on the damage done by the projectile. + Damageless projectiles such as electrodes have static volumes. Practise laser + and laser tag beams have no impact sound.' + - !!python/unicode 'soundadd': !!python/unicode 'Added sear.ogg for the impacts + of damaging beams such as lasers. It may be replaced if player feedback proves + negative.' +2014-02-05: + !!python/unicode 'Yota': + - !!python/unicode 'tweak': !!python/unicode 'Handling a couple flashlights will + no longer transform you into the sun. Each light source will have deminishing + returns.' + - !!python/unicode 'bugfix': !!python/unicode 'Inserting lights into containers + should no longer dim other lights.' +2014-02-08: + !!python/unicode 'MrPerson': + - !!python/unicode 'rscadd': !!python/unicode 'Added a NanoUI for the SMES' + !!python/unicode 'Razharas': + - !!python/unicode 'rscadd': !!python/unicode 'Adds more constructible and deconstructable + machines!' + - !!python/unicode 'rscadd': !!python/unicode 'Added constructible miniature chemical + dispensers, upgradable' + - !!python/unicode 'rscadd': !!python/unicode 'Sleepers are now constructible and + upgradable, open and close like DNA scanners, and don''t require a console' + - !!python/unicode 'rscadd': !!python/unicode 'Cryogenic tubes are now constructible + and upgradable, open and close like DNA scanners, and you can set the cryogenic + tube''s pipe''s direction by opening its panel and wrenching it to connect it + to piping' + - !!python/unicode 'rscadd': !!python/unicode 'Telescience pads are now constructible + and upgradable' + - !!python/unicode 'rscadd': !!python/unicode 'Telescience consoles are now constructible' + - !!python/unicode 'rscadd': !!python/unicode 'Telescience tweaked (you can save + data on GPS units now)' + - !!python/unicode 'rscadd': !!python/unicode 'Teleporters are now constructible + and upgradable, the console has a new interface and you can lock onto places + saved to GPS units in telescience' + - !!python/unicode 'tweak': !!python/unicode 'Teleporters start unconnected. You + need to manually reconnect the console, station and hub by opening the panel + of the station and applying wire cutters to it.' + - !!python/unicode 'rscadd': !!python/unicode 'Biogenerators are now constructible + and upgradable' + - !!python/unicode 'rscadd': !!python/unicode 'Atmospherics heaters and freezers + are now constructible and upgradable and can be rotated with a wrench when their + panel is open to connect them to pipes. Screw the board to switch between heater + and freezer.' + - !!python/unicode 'rscadd': !!python/unicode 'Mech chargers are now constructible + and upgradable' + - !!python/unicode 'rscadd': !!python/unicode 'Microwaves are now constructible + and upgradable' + - !!python/unicode 'rscadd': !!python/unicode 'All kitchen machinery can now be + wrenched free' + - !!python/unicode 'rscadd': !!python/unicode 'SMES are now constructible' + - !!python/unicode 'rscadd': !!python/unicode 'Dragging a human''s sprite to a cryogenic + tube or sleeper will put them inside and activate it if it''s cryo' + - !!python/unicode 'rscadd': !!python/unicode 'Constructible newscasters, their + frames are made with autolathes' + - !!python/unicode 'rscadd': !!python/unicode 'Constructible pandemics' + - !!python/unicode 'rscadd': !!python/unicode 'Constructible power turbines and + their computers' + - !!python/unicode 'rscadd': !!python/unicode 'Constructible power compressors' + - !!python/unicode 'rscadd': !!python/unicode 'Constructible vending machines. Screw + the board to switch vendor type.' + - !!python/unicode 'rscadd': !!python/unicode 'Constructible hydroponics trays' + - !!python/unicode 'imageadd': !!python/unicode 'Sprites for all this' + - !!python/unicode 'wip': !!python/unicode 'This update will have unforeseen bugs, + please report those you find at https://github.com/tgstation/-tg-station/issues/new + if you want them fixed.' + - !!python/unicode 'rscadd': !!python/unicode 'As usual, machines are deconstructed + by screwing open their panels and crowbarring them. While constructing machines, + examining them will tell you what parts you''re missing.' +2014-02-09: + !!python/unicode 'ADamDirtyApe': + - !!python/unicode 'rscadd': !!python/unicode 'The lawyer now spawns with a Sec + Headset. ' + !!python/unicode 'Demas': + - !!python/unicode 'rscadd': !!python/unicode 'Banana peel size is based on banana + size. ' + - !!python/unicode 'rscadd': !!python/unicode 'Bigger peels slip for longer than + smaller ones. Remember that produce size is based on potency.' + - !!python/unicode 'tweak': !!python/unicode 'The clown now spawns with a decent + sized banana.' + - !!python/unicode 'tweak': !!python/unicode 'The banana mortar now shoots 65 potency + peels.' + !!python/unicode 'Giacom': + - !!python/unicode 'rscadd': !!python/unicode 'A new hostile statue mob, can only + move when not being observed, tends to break lights and cause blindness. ' + !!python/unicode 'Incoming5643': + - !!python/unicode 'rscadd': !!python/unicode 'Blob Zombies! When a Blob Spore moves + over a dead human body it will infect the body and revive it as a more powerful + varient of the spore. Has double the health and deals more damage. ' + !!python/unicode 'Neerti': + - !!python/unicode 'rscadd': !!python/unicode 'Sec Belts can now hold Stun Batons. ' + - !!python/unicode 'tweak': !!python/unicode 'Stun Batons now only take 10 seconds + to fully recharge. ' + !!python/unicode 'Razharas': + - !!python/unicode 'tweak': !!python/unicode 'Tables can now be used as an alternative + way to craft makeshift items. Simply click-drag table to yourself bring up a + list. ' + !!python/unicode 'adrix89': + - !!python/unicode 'tweak': !!python/unicode 'Spray Bottles can no longer wet up + to three tiles with water. ' + - !!python/unicode 'tweak': !!python/unicode 'Spray Bottles have a third higher + release volume that wets a single tile. ' + - !!python/unicode 'tweak': !!python/unicode 'Water slip times are reduced to the + same stun times as soap. ' +2014-02-17: + !!python/unicode 'Ergovisavi': + - !!python/unicode 'rscadd': !!python/unicode 'Mining has been significantly overhauled. + Hostile alien life has infested the western asteroid! Miners are given an equipment + voucher to obtain equipment to protect themselves. There is a spare voucher + in the HoP''s office, should someone want to switch to mining mid-shift.' + - !!python/unicode 'rscadd': !!python/unicode 'The Ore Redemption Machine has been + added just outside of the Science wing. Ore goes in, Sheets go out, and points + are tallied on the machine. Insert your ID to claim points, then spend them + on goods at Mining Equipment Lockers. You require specific accesses to tell + the Ore Redemption Machine to unload its sheets.' + - !!python/unicode 'rscadd': !!python/unicode 'Should you not care for being eaten + alive by horrible alien life, it is suggested you stick to the eastern asteroid, + where there is no hostile alien life... though the yield on ore is not as good.' + - !!python/unicode 'rscadd': !!python/unicode 'Most ore is no longer visible to + the naked eye. You must ping it with a Mining Scanner (Available in all mining + lockers) to locate nearby ore. Make sure to equip your mesons first, or it won''t + be visible.' + - !!python/unicode 'tweak': !!python/unicode 'Mesons no longer remove the darkness + overlay, you must properly light your environment. Hull breaches to space can + still be clearly seen, and it will still protect you from the singulo.' + - !!python/unicode 'tweak': !!python/unicode 'Mineral spawn rates have been significantly + tweaked to cut down on unnecessary inflation of mineral economy.' + - !!python/unicode 'tweak': !!python/unicode 'The asteroid no longer has ambient + power on the entire asteroid. AI''s who go onto asteroid turf will slowly die + of power loss. Mining outposts are unaffected.' + - !!python/unicode 'bugfix': !!python/unicode 'Fixed an issue where projectiles + shot by simple mobs or thrown would hit multiple times.' + !!python/unicode 'Fleure': + - !!python/unicode 'tweak': !!python/unicode 'Reduced chicken crates to contain + 1-3 chicks, down from 3-6' + - !!python/unicode 'tweak': !!python/unicode 'Increased fertile chicken egg chance + from 10% to 25%' + !!python/unicode 'Yota': + - !!python/unicode 'tweak': !!python/unicode 'Photograph now rendered crisp and + clean, so that we may enjoy them in their 0.009 megapixel goodness.' + - !!python/unicode 'bugfix': !!python/unicode 'Cameras should now capture more of + what they should, and less of what they shouldn''t.' +2014-02-19: + !!python/unicode 'Aranclanos': + - !!python/unicode 'bugfix': !!python/unicode 'Removed the chance of your hat falling + off when slipping. ' + !!python/unicode 'Perakp': + - !!python/unicode 'imageadd': !!python/unicode 'Added Iatot''s cyborg module selection + transformation animations. ' +2014-02-24: + !!python/unicode 'Ergovisavi': + - !!python/unicode 'rscadd': !!python/unicode 'Added Advanced Mesons and Night Vision + Goggles to the protolathe. ' + !!python/unicode 'Giacom': + - !!python/unicode 'bugfix': !!python/unicode 'Silicons no longer stop statues from + moving when in sight. ' + - !!python/unicode 'wip': !!python/unicode 'Increased the health of statues. ' + - !!python/unicode 'wip': !!python/unicode 'Increased the range of statues''s blinding + spell. ' + !!python/unicode 'HornyGranny': + - !!python/unicode 'sounddel': !!python/unicode 'Reduced the range of Violin notes. ' + - !!python/unicode 'soundadd': !!python/unicode 'Low quality violin midi-notes replaced + with better .ogg-notes. ' + !!python/unicode 'Incoming5643': + - !!python/unicode 'tweak': !!python/unicode 'Improved the Syndicate Implant bundle + to contain freedom, uplink, EMP, adrenalin and explosive implanters. ' + - !!python/unicode 'tweak': !!python/unicode 'Added Mineral Storeroom to R&D; + containing the Ore Redemption Machine; no more assistants stealing your ore + in the open hallway. ' + !!python/unicode 'Miauw': + - !!python/unicode 'bugfix': !!python/unicode 'No more removing cursed horseheads. ' + !!python/unicode 'Razharas': + - !!python/unicode 'bugfix': !!python/unicode 'Fixed infinite telecrystal exploit. ' +2014-02-25: + !!python/unicode 'Incoming5643': + - !!python/unicode 'rscadd': !!python/unicode 'Colored burgers! Include a crayon + in your microwave when cooking a burger and it''ll come out just like a Pretty + Pattie. ' + - !!python/unicode 'bugfix': !!python/unicode 'Fixed AI''s being able to interact + with syndicate bombs. ' +2014-02-26: + !!python/unicode 'Incoming5643': + - !!python/unicode 'rscadd': !!python/unicode 'Color blending Kitty Ears have returned. ' +2014-03-03: + !!python/unicode 'ChuckTheSheep': + - !!python/unicode 'rscadd': !!python/unicode 'Round-end report now shows what items + were bought with a traitor''s or nuke-op''s uplink and how many TCs they used.' + !!python/unicode 'Drovidi Corv': + - !!python/unicode 'bugfix': !!python/unicode 'Facehuggers no longer die to zero-force + weapons or projectiles like lasertag beams. ' + !!python/unicode 'Incoming5643': + - !!python/unicode 'tweak': !!python/unicode 'Improved blob spores to zombify people + adjacent to their tile. ' + - !!python/unicode 'bugfix': !!python/unicode 'If a hand-teleporter is activated + while you''re stuck inside a wall, you''ll automatically go through it. ' + !!python/unicode 'Miauw': + - !!python/unicode 'tweak': !!python/unicode 'Decreased the lethality of Mutagen + in small doses. ' + !!python/unicode 'TZK13': + - !!python/unicode 'rscadd': !!python/unicode 'Added Incendiary Shotgun Shells made + at a hacked autolathe; Xenos be wary. ' +2014-03-05: + !!python/unicode 'Various Coders': + - !!python/unicode 'rscadd': !!python/unicode 'Ling rounds are LINGIER, with more + lings at a given population.' + - !!python/unicode 'rscadd': !!python/unicode 'Many simple animals can ventcrawl, + including bats. All ventcrawlers must alt-click to ventcrawl. ' + - !!python/unicode 'rscadd': !!python/unicode 'An automatic tool to store and replace + machine parts has been added to R&D.;' + - !!python/unicode 'rscadd': !!python/unicode 'Most stuns have been reduced in from + 10+ to 5 ticks in duration.' + - !!python/unicode 'rscadd': !!python/unicode 'Shoes no longer speed you up.' + - !!python/unicode 'rscadd': !!python/unicode 'Added fancy suits, which can be orderd + from cargo.' + - !!python/unicode 'rscadd': !!python/unicode 'Added sombrerors and ponches.' + - !!python/unicode 'rscadd': !!python/unicode 'Cuff application time reduced 25%.' + - !!python/unicode 'rscadd': !!python/unicode 'Fire will cause fuel tanks to explode.' + - !!python/unicode 'rscadd': !!python/unicode 'Mutagen has been reduced in lethality. + Notably, 15 units are not guaranteed to crit the recipient.' +2014-03-10: + !!python/unicode 'Giacom': + - !!python/unicode 'rscadd': !!python/unicode 'Added two new plasma-level disease + symptoms, both are very !FUN! and mess with your genetics.' + - !!python/unicode 'tweak': !!python/unicode 'Virologists now only need to use a + single unit of virus food, mutagen or plasma to generate symptoms. You can take + a single unit by using a dropper, if you change its unit transfer amount in + the object tab..' + - !!python/unicode 'tweak': !!python/unicode 'Changed the map to make it harder + to escape from the Labor Camp. Please continue using it.' + !!python/unicode 'Miauw': + - !!python/unicode 'rscadd': !!python/unicode 'Added changeling space suits. These + allow changelings to survive in space, internals are not needed. They do not + provide any sort of armor and slow your chemical regeneration.' +2014-03-12: + !!python/unicode 'Yota': + - !!python/unicode 'bugfix': !!python/unicode 'Cameras finally capture the direction + you are facing.' +2014-03-14: + !!python/unicode 'Ikarrus and Nienhaus': + - !!python/unicode 'imageadd': !!python/unicode 'Nanotrasen Corporate announced + a revised dress codes primarily affecting senior station officers. A new uniform + for Heads of Personnel will be shipped out to all NT Research stations.' +2014-03-15: + !!python/unicode 'Steelpoint/Validsalad': + - !!python/unicode 'tweak': !!python/unicode 'After a review with CentCom, all Security + Officers will now begin their shifts with a Stun Baton in their backpack. To + avoid inflating costs however all Stun Batons have been removed from Security + lockers except from the brig.' + - !!python/unicode 'imageadd': !!python/unicode 'After decades of usage CentCom + has replaced the Security Uniform, Armor, Belt and Helmet with a newer, more + modern design.' +2014-03-17: + !!python/unicode 'Giacom': + - !!python/unicode 'tweak': !!python/unicode 'Machines that had their programming + overriden by a Malf AI will no longer attack loyal cyborgs; they will still + attack cyborgs that aren''t loyal, to the Malf AI that hacked them, though.' + - !!python/unicode 'tweak': !!python/unicode 'You only require a single unit of + blood to mutate viruses now, instead of 5.' +2014-03-18: + !!python/unicode 'Ikarrus': + - !!python/unicode 'rscadd': !!python/unicode 'NT R&D; releases AI Patch version + 2553.03.18, allowing all Nanotrasen AIs to override the access restrictions + on any airlock in case of emergency. Nanotrasen airlocks have been outfitted + with new amber warning lights that will flash while the override is active. + Should maintenance teams need to restore an airlock''s restrictions without + using the AI, pulsing the airlock''s ID Scanner wire will reset the override.' +2014-03-22: + !!python/unicode 'Giacom': + - !!python/unicode 'rscadd': !!python/unicode 'Gravity is no longer beamed from + CentCom! Instead, there is a new gravity generator stored near Engineering that + will provide all the gravity for the station and the z level. Please remember + that it gives off a lot of radiation when charging or discharging, so wear protection.' + !!python/unicode 'MrPerson': + - !!python/unicode 'rscadd': !!python/unicode 'Added a new, somewhat experimental + system to delete things. This is basically a port from /vg/, so big thanks to + N3X15.' + - !!python/unicode 'rscadd': !!python/unicode 'As a result, bombs and the singularity + should be much less laggy.' + - !!python/unicode 'experiment': !!python/unicode 'There may be issues with "phantom + objects" or other problems with stuff that''s suppoed to be deleted or objects + interacting with deleted objects. Please report any issues right away!' +2014-03-25: + !!python/unicode 'Ikarrus': + - !!python/unicode 'tweak': !!python/unicode "A security review committee has approved\ + \ an update to all Nanotrasen airlocks to better resist cryptographic attacks\ + \ by the enemy.\n\t\t\t

    *New internal wiring will be able to withstand\ + \ attacks, and panel wires will no longer be left unusable after an attack.\n\ + \t\t\t
    *Welding tools will now be able to cut through welded doors that have\ + \ been damaged.\n\t\t\t
    *Damaged electronics are now removable and replaceable\ + \ following standard procedure.\n\t\t\t
    *Airlocks will not be able to operate\ + \ autonomously until the electronics are replaced.




    " + - !!python/unicode 'imageadd': !!python/unicode 'Hair sprites have been given a + visual lift. For best results, set your hair color to be slightly lighter than + how you want it to look. For dark hair, do not use a color darker than 80% black.' +2014-03-28: + !!python/unicode 'Aranclanos': + - !!python/unicode 'tweak': !!python/unicode 'Workaround with the click cooldowns. + They should feel faster. If you think that anything needs a click cooldown (like + grilles, mobs, etc.), report it to me.' + - !!python/unicode 'experiment': !!python/unicode 'Here''s the fun part, this is + a test for the community and players, I hope I won''t be forced to revert this + and hear "this is why we can''t have nice things". Again, if anything needs + a cooldown, report it to me. Have fun with your fast clicks spessmans.' +2014-03-31: + !!python/unicode 'Ikarrus': + - !!python/unicode 'rscadd': !!python/unicode 'Fabricator blueprints for cyborg + parts have been updated to allow the debugging of cyborg units prior to boot. + To access the debug functions, assemble a cyborg following standard procedure. + Before inserting the MMI, use a multitool on the cyborg body. Note that this + update also moves designation data into the system files, so pens can no longer + be used to name cyborgs.' + !!python/unicode 'MrPerson': + - !!python/unicode 'rscadd': !!python/unicode 'Toggling the "Play admin midis" preference + will pause any playing songs. Turning midis back on will resume the current + song where it was.' + - !!python/unicode 'rscadd': !!python/unicode 'If there''s a song playing while + you have midis off and you then turn midis on, the current song will begin playing + for you.' +2014-04-01: + !!python/unicode 'Aranclanos': + - !!python/unicode 'tweak': !!python/unicode 'Made combat more hardcore for hardcore + players like myself. This won''t be reverted.' + !!python/unicode 'Malkevin': + - !!python/unicode 'experiment': !!python/unicode 'Sacrifice Cult - Cult has + received a massive overhaul to how it works, focusing more on cult magics and + sacrificing unbelievers. The most important changes are:' + - !!python/unicode 'tweak': !!python/unicode 'Cult starts off with alot more cultists, + 6 cultists below 30 players and 9 above. The HoP can no longer be a round start + cultist but is still convertible.' + - !!python/unicode 'tweak': !!python/unicode 'Cultists start off with join, blood, + self, and hell. These give the runes for the sacrifice and convert.' + - !!python/unicode 'tweak': !!python/unicode 'Conversions now require three cultists + and converts no longer reward words, words must be obtained via sacrifice' + - !!python/unicode 'tweak': !!python/unicode 'Sacrificing players traps their soul + in a soul stone, which can then be used on construct shells to implant the souls + in them' + - !!python/unicode 'tweak': !!python/unicode 'Constructs shells can be summoned + via a new rune (travel, hell, technology)' + - !!python/unicode 'bugfix': !!python/unicode 'You can no longer convert the sacrifice + target, you dozzy sods' + - !!python/unicode 'experiment': !!python/unicode 'Summoning Narsie when she is + not an objective leads to !!FUN!!' + - !!python/unicode 'wip': !!python/unicode 'Wrote a system to allow all mob types + to be sacrificable - currently only corgis are in the new system' + - !!python/unicode 'experiment': !!python/unicode 'Holy Water will DECONVERT cultists, + takes around 35 units and two minutes to succeed' + - !!python/unicode 'experiment': !!python/unicode 'Hitting a mob that contains holy + water with a tome will convert that water to unholy water, conversely hitting + any container that contains unholy water with a bible as chaplain will ''cleanse'' + the taint.' + - !!python/unicode 'experiment': !!python/unicode 'Unholy water works like a combination + synaptazine and hyperzine, with a twist of branes dimarge and highly toxic to + non-cultists' + - !!python/unicode 'rscadd': !!python/unicode 'Cargo can order a religious supplies + crate - it contains flasks of holy water, candles, bibles, and robes ' + - !!python/unicode 'experiment': !!python/unicode 'Cultists have an innate ability + to communicate to the cult hive mind (BE AWARE - THIS DOES A LOT OF DAMAGE), + cultists can also communicate via the new Commune option on their tomes (the + Read Tome option has been shifted under the Notes option)' + !!python/unicode 'MrStonedOne': + - !!python/unicode 'rscadd': !!python/unicode 'Cyborgs can now use AI click shortcuts. + (shift click on doors opens them, etc) (including ones added below)' + - !!python/unicode 'rscadd': !!python/unicode 'New silicon click shortcut: Control+Shift + click on doors toggles access override' + - !!python/unicode 'rscadd': !!python/unicode 'New silicon click shortcut: Control + click turret controls toggles them on or off' + - !!python/unicode 'rscadd': !!python/unicode 'New silicon click shortcut: Alt click + turret controls toggles lethal on or off' + - !!python/unicode 'tweak': !!python/unicode 'Cyborg hotkey mode was massively improved. + 1-3 selects module slot, q unloads the active module. use hotkeys-help as cyborg + for more details' +2014-04-02: + !!python/unicode 'Giacom': + - !!python/unicode 'rscadd': !!python/unicode 'The syndicate suit is now black and + red, because black and red is the new red.' + - !!python/unicode 'rscadd': !!python/unicode 'The Ruskie DJ Station now has a classy + orange syndicate suit.' + - !!python/unicode 'rscadd': !!python/unicode 'Security officers have been equipped + with the latest in flashlight technology. You can find a SecLite™ inside + your security belt or you can dispense one from the security vending machine.' + !!python/unicode 'Ikarrus': + - !!python/unicode 'wip': !!python/unicode 'Nanotrasen Construction division + is pleased to announce the unveiling of our brand now state-of-the-art Space + Station 13 v2.1.3!' + - !!python/unicode 'rscadd': !!python/unicode '-Scaffolding used during construction + has been repurposed as an expanded maintenance around the station.' + - !!python/unicode 'tweak': !!python/unicode '-Our new Emergency Transport Shuttle + Mk III will be making its debut in times of crisis. Includes a new cargo area + and extra security features.' + - !!python/unicode 'tweak': !!python/unicode '-A redesigned brig will give security + staff more peace of mind with added security features' + - !!python/unicode 'rscadd': !!python/unicode '-The armory is now protected by a + motion alarm.' + - !!python/unicode 'rscadd': !!python/unicode '-The armory is now equipped with + security hardsuits.' + - !!python/unicode 'rscadd': !!python/unicode '-A new command EVA wing has been + added to EVA Storage. Station heads of staff will be able to make use of suits + stored here.' + - !!python/unicode 'rscadd': !!python/unicode '-A new garden area will be made publicly + available for everyone to enjoy some R&R; during their company-endorsed + break periods' + - !!python/unicode 'rscadd': !!python/unicode '-A new Testing Lab has been added + to the Science department for any field experiments that need to be run.' + - !!python/unicode 'tweak': !!python/unicode '-The mining ore redemption machine + has been relocated to the Cargo Delivery Office.' +2014-04-03: + !!python/unicode 'Ikarrus': + - !!python/unicode 'rscadd': !!python/unicode 'NT AI Firmware version 2554.03.03 + includes a function to notify the master AI when a new cyborg is slaved to it.' +2014-04-10: + !!python/unicode 'Ikarrus': + - !!python/unicode 'rscadd': !!python/unicode 'Centcom officials have announced + a new initiative to combat misuse of their Emergency Shuttle Service. After + the shuttle has been recalled several times over the course of a simple work + shift, Centcom will attempt to trace the signal origin and pinpoint its source + for station authorities.' + !!python/unicode 'Steelpoint': + - !!python/unicode 'rscadd': !!python/unicode "Thanks to Nanotrasen's Construction\ + \ division, the brig has recieved a overhaul in its design, to increase ease\ + \ of movement, including an addition of a \"prisioner release room\" and a insanity\ + \ ward.\n\t\t
  • Furthing concerns among commentators, Nanotrasen\ + \ has shipped out additional security equipment to station armories, including\ + \ Riot Shotguns, tear gas grenades, additional securitron units and military\ + \ grade Ion Guns.
  • \n
  • JaniCo have released a new unique\ + \ product called the JaniBelt. Capable of holding most standard issue janitorial\ + \ equipment, designed to help relive inventory management among station janitors.\ + \ In addition the Jani Water Tank has had its reserve of space clenaer increased\ + \ to 500 units, up from 250.\n\t
  • " + !!python/unicode 'Validsalad': + - !!python/unicode 'tweak': !!python/unicode "After concerns raised by security\ + \ personel, new armor has been shipped that covers the lower waist and readjusts\ + \ the helmet for comfort.\n\t\t
  • In addition, the aging riot\ + \ shield has been replaced with a newer, more modern, apperance. \n\t
  • " +2014-04-11: + !!python/unicode 'Jordie0608': + - !!python/unicode 'rscadd': !!python/unicode 'Wood planks can be used to make wood + walls and airlocks; flammability not included' +2014-04-20: + !!python/unicode 'Gun Hog': + - !!python/unicode 'rscadd': !!python/unicode 'NanoTrasen Emergency Alerts System + 4.20 has been released!' + - !!python/unicode 'rscadd': !!python/unicode 'In the unfortunate event of any nuclear + device being armed, the station will enter Code Delta Alert.' + - !!python/unicode 'rscadd': !!python/unicode 'Should the nuclear explosive be disarmed, + the station shall automatically return to its previous alert level.' + !!python/unicode 'Steelpoint': + - !!python/unicode 'wip': !!python/unicode 'A new AI satellite has been constructed + in orbit of Space Station 13!' + - !!python/unicode 'rscadd': !!python/unicode 'The satellite exclusivly is used + to hold a station''s Artifical Intelligence Unit, the satellite contains a miried + of turret and motion sensor defences. A transit tube network is used to connect + the satellite to the station, with the transit room being located at engineering + south of the engi escape pod.' + - !!python/unicode 'rscadd': !!python/unicode 'The AI Upload however has been moved + north slightly and is connected directly to the bridge.' + - !!python/unicode 'rscadd': !!python/unicode 'In addition, the Gravity Generator + has been relocated from its prior position in engineering to the location of + the old AI Upload, increasing its defence and logical positioning.' +2014-04-22: + !!python/unicode 'Ikarrus': + - !!python/unicode 'rscadd': !!python/unicode 'ID Computers have been modified to + allow Station Heads of Staff to assign and remove access to their departments, + as well as stripping the rank of their subordinates. An ID computer on the bridge + is available for the use of this function.' +2014-04-27: + !!python/unicode 'Ikarrus': + - !!python/unicode 'imageadd': !!python/unicode 'NT Human Resources announces an + expansion of the List of Company-Approved Hair Styles, as well as more relaxed + gender restrictions on hair styles. Check with your local company-sponsored + hairstylist to learn more.' +2014-04-30: + !!python/unicode 'Giacom': + - !!python/unicode 'imageadd': !!python/unicode 'You now have to give a reason when + calling the shuttle.' + - !!python/unicode 'imageadd': !!python/unicode 'The amount of time it takes for + the shuttle to refuel is now a config option, the default is 20 minutes.' + !!python/unicode 'Gun Hog': + - !!python/unicode 'rscadd': !!python/unicode 'Certain Enemies of the Corporation + have discovered a critical exploit in the firmware of several NanoTrasen robots + that could prevent the safe shutdown of units corrupted by illegally modified + ID cards, dubbed "cryptographic sequencers".' + - !!python/unicode 'rscadd': !!python/unicode 'NanoTrasen requires more research + into this exploit, this we have issued a patch for AI and Cyborg software to + simulate this malfunction. All NanoTrasen AI units are advised to only allow + testing in a safe and contained environment. The robot can safely be reset at + any time.' + - !!python/unicode 'experiment': !!python/unicode 'Unfortunately, a robot corrupted + by a "cryptographic sequencer" still cannot be reset by any means. NanoTrasen + urges regular maintenance and care of all robots to reduce replacement costs.' +2014-05-07: + !!python/unicode '/Tg/station Code Management': + - !!python/unicode 'wip': !!python/unicode '/tg/station code is now under a feature + freeze until 7th June 2014. This means that the team will be concentrating on + fixing bugs instead of adding features for the month.' + - !!python/unicode 'bugfix': !!python/unicode 'You can find more information about + the feature freeze here. http://tgstation13.org/phpBB/viewtopic.php?f=5&t;=273' + - !!python/unicode 'bugfix': !!python/unicode 'This is the perfect time to report + bugs, which you can do so here. https://github.com/tgstation/-tg-station/issues/new' +2014-05-14: + !!python/unicode 'Ikarrus': + - !!python/unicode 'rscadd': !!python/unicode 'A recent breakthrough in Plasma Materials + Research has led to the development of a stronger, tougher plasteel alloy that + can better resist extreme heat by up to four times. A live demonstration preformed + during a press conference earlier today showed a segment of reinforced wall + resisting an attack by Thermite. The corporation also announces that upgrades + to its existing stations is already underway.' +2014-05-16: + !!python/unicode 'Menshin': + - !!python/unicode 'rscadd': !!python/unicode 'Thanks to Nanotrasen''s Engineering + division, the power wiring of the station has a received a complete overhaul. + Here are the highlight features in CentCom report : ' + - !!python/unicode 'tweak': !!python/unicode 'Improved way of connecting cables! + Finished is the time of "laying and praying" : it''s now as simple as matching + ends of each cables! ' + - !!python/unicode 'tweak': !!python/unicode 'Unified way of connecting machines! + Every machine is connected to a powernet through a node cable (it still needs + to be anchored to receive power though)!' + - !!python/unicode 'tweak': !!python/unicode 'Lots of improvements in the cable + cutting tools! Gone is the odd magic of physically separated yet still connected + powernets (contact CentCom Engineering Division if you still witness something + weird, we always have a fired form ready for our engineers!)!' + - !!python/unicode 'rscadd': !!python/unicode 'Any conscientious (or not!) Station + Engineer may check an "updated wiring manual" at http://www.tgstation13.org/wiki/Wiring#Power_Wires' +2014-05-20: + !!python/unicode 'Kelenius': + - !!python/unicode 'rscadd': !!python/unicode 'After the years of extensive research + into xenobiology, and thousands of scientists lost to the slimes, we have finally + come to admitting that we don''t have a clue how they work. However, we''ve + outlined a few facts, and managed to breed a new kind of slimes. They will be + shipped to your station on the next shifts. They are different from the ones + they are used to in the following:' + - !!python/unicode 'rscadd': !!python/unicode 'Their sight is better than ever, + and now they can finally see things that are not directly pressed against them. + Beware, they may appear more aggressive!' + - !!python/unicode 'rscadd': !!python/unicode 'Their memory has also become better, + and they will now remember the people who fed them. As a note, you need to grab + the monkey or push it to show to the slime that you''re giving it to them, and + it''s not just walking in.' + - !!python/unicode 'rscadd': !!python/unicode 'Apparently, not only we have studied + them, but they have also studied us. Slimes are now capable of showing various + emotions, mimicking humans. Use it to your advantage.' + - !!python/unicode 'rscadd': !!python/unicode 'There are reports of slimes showing + signs of sentience. Further research is recommended.' + - !!python/unicode 'rscadd': !!python/unicode 'One of the reported signs is their + speech capability. Following facts have been gathered: they talk more often + to those who feed them; they react to being called by the number, but ''slimes'' + is also acceptable; they are able to understand being ordered to "follow" someone, + or "stop". There is a report of slime releasing the assistant after a scientist + shouted at it, and then calmly ordered a slime to stop.' + - !!python/unicode 'rscadd': !!python/unicode 'We''ve made a modification of a health + scanner that is intended for the use on slimes. Two are available in the smartfridge.' + - !!python/unicode 'tweak': !!python/unicode 'We''ve come to a conclusion that 5 + units of reagents are not necessary to cause slime core reactions. You actually + only need one unit.' +2014-06-06: + !!python/unicode 'Gun Hog': + - !!python/unicode 'rscadd': !!python/unicode 'Nanotrasen programmers have discovered + a potential exploit involving a station''s door control networks. With sufficient + computing power, the network can be overloaded and forced to open or bolt closed + every airlock at once.' + - !!python/unicode 'experiment': !!python/unicode 'Some reports suggest that the + latest firmware update to Artifical Intelligence units installed in our research + stations may contain this exploit. Any such reports that state that should a + station''s AI unit "malfunction", it may gain the ability to use this exploit + to initate a full lockdown of the station. Fire locks and blast doors are also + said to be affected.' + - !!python/unicode 'rscadd': !!python/unicode 'Nanotrasen officially holds no validity + to these reports. We recommend that station personnel disregard such rumors.' +2014-06-11: + !!python/unicode 'Ikarrus': + - !!python/unicode 'bugfix': !!python/unicode 'Having the nuke disk will no longer + prevent you from using teleporters or crossing Z-levels. Leaving the Z-level + however, will cause you to "suddenly lose" the disk.' + - !!python/unicode 'rscadd': !!python/unicode 'Pulled objects will now transition + with you when as you transition Z-levels in space.' + !!python/unicode 'Malkevin': + - !!python/unicode 'rscdel': !!python/unicode 'IEDs have been removed' + - !!python/unicode 'rscadd': !!python/unicode 'Firebombs have been added' + - !!python/unicode 'experiment': !!python/unicode 'They''re as reliable and predictable + as you would expect from a soda can filled with flammable liquid and set off + with an igniter contected to two wires. Use your branes and take proper precautions + or leave a charred corpse, your choice.' +2014-06-12: + !!python/unicode 'Cheridan': + - !!python/unicode 'tweak': !!python/unicode 'NT Baton Refurbishment Team Notice: + ''Released'' option in security records has been renamed ''Discharged'', and + the sechud icon has been changed from a blue R to a blue D. Stop beating your + released prisoners, dummies; they''re not revheads.' + - !!python/unicode 'tweak': !!python/unicode 'NT Entertainment Department Notice: + The prize-dispensing mechanism in Arcade machines has been replaced with a cheaper + gas-powered motor. It should still be completely safe, unless an electromagnetic + field disrupts it!' + - !!python/unicode 'tweak': !!python/unicode 'Pill code tweaked. In short, you can + feed monkeys pills now #whoa' + - !!python/unicode 'rscadd': !!python/unicode 'Casings ejected from guns will now + spin #wow' +2014-06-20: + !!python/unicode 'Ikarrus': + - !!python/unicode 'tweak': !!python/unicode 'The ''Enter Exosuit'' button was removed, + and you have to click + drag yourself to enter a mech now; like you would to + enter a disposal unit.' +2014-07-01: + !!python/unicode 'Ikarrus': + - !!python/unicode 'wip': !!python/unicode 'Central Security has approved an + upgrade of the Securitron line of bots to a newer model.
    Highlights + include:
    ' + - !!python/unicode 'rscadd': !!python/unicode '-An optional setting to arrest personnel + without an ID on their uniform (Disabled by default)' + - !!python/unicode 'rscadd': !!python/unicode '-An optional setting to notify security + personnel of arrests made by the bots (Enabled by default)' + - !!python/unicode 'rscadd': !!python/unicode '-A new "Weapon Permit" access type + that securitrons will use during their weapons checks. Personnel who work with + weapons will be granted this access by default. More can be assigned by the + station''s Head of Security and Personnel.' + - !!python/unicode 'tweak': !!python/unicode '-A more robust threat assessment algorithm + to improve accuracy in identifying perpetrators.' + !!python/unicode 'Rolan7': + - !!python/unicode 'rscadd': !!python/unicode 'Fixed the irrigation system in hydroponics + trays. Adding at least 30 units of liquid at once will activate the system, + sharing the reagents between all connected trays.' + - !!python/unicode 'bugfix': !!python/unicode 'Changelings can communicate while + muzzled or monkified, and being monkified doesn''t stop them from taking human + form.' + - !!python/unicode 'bugfix': !!python/unicode 'Mimes cannot break the laws of physics + unless their vow is currently active.' + - !!python/unicode 'rscadd': !!python/unicode 'Trays are rewritten to make sense + and so borgs can actually use them. Service borgs can discretely carry small + objects, hint hint. The items are easily knocked out of them.' +2014-07-03: + !!python/unicode 'Miauw': + - !!python/unicode 'rscadd': !!python/unicode 'Added slot machines to the game' + - !!python/unicode 'rscadd': !!python/unicode 'Slot machines use reels. All prizes + except for jackpots can be won on all lines' + - !!python/unicode 'rscadd': !!python/unicode 'Simply put a coin into one of the + slot machines in the bar to play!' + - !!python/unicode 'rscadd': !!python/unicode 'Slot machines can also be emagged.' +2014-07-05: + !!python/unicode 'Firecage': + - !!python/unicode 'rscadd': !!python/unicode 'Recently the Space Wizard Federation, + with some assistance from the Cult of Nar-Sie, recently created a new strain + of Killer Tomato. A sad side effect is this effected all current and future + Killer Tomato strains in our galaxy. They are now reported to be extremely violent + and deadly, use extreme caution when growing them.' +2014-07-07: + !!python/unicode 'Firecage': + - !!python/unicode 'rscadd': !!python/unicode 'We, of the NanoTrasen Botany Research + and Developent(NTBiRD), has some important announcements for the Botany staff + aboard our stations.' + - !!python/unicode 'rscadd': !!python/unicode 'We have recently released a new strain + of Tower Cap. It is now ensured that more planks can be gotten from a single + log.' + - !!python/unicode 'rscadd': !!python/unicode 'Head Scientist [REDACTED] is thanked + for his new strain of Blood Tomatoes. It now not only contains human blood, + but also chunks of human flesh!' + - !!python/unicode 'rscadd': !!python/unicode 'We have also discovered a way to + replant the infamous Cash Trees and ''Eggy'' plants. We can now harvest their + seeds, and the rare products are inside the fruit shells.' + - !!python/unicode 'rscadd': !!python/unicode 'Similar to the new variety of Tower + Caps, it is now possible to get various grass flooring depending on the plants + potency!' + - !!python/unicode 'rscadd': !!python/unicode 'Our sponsors at Knitters United has + released a new variation of the botany Aprons and Coveralls which can hold a + larger variety of items!' + - !!python/unicode 'rscadd': !!python/unicode 'A new version of Plant-B-Gone was + produced which are much more lethal to plants, yet at the same time has no extra + effect on humans besides the norm.' + !!python/unicode 'Paprika': + - !!python/unicode 'tweak': !!python/unicode 'Tweaked mining turf mineral droprates + and reverted mesons to the ''old'' style of mesons. This means mesons will be + more powerful with the added side effect of not being able to track individual + light sources through walls and such. This is a trial run; please provide feedback + on the /tg/ codebase section of the forum.' +2014-07-14: + !!python/unicode 'Miauw': + - !!python/unicode 'rscadd': !!python/unicode 'Added a new mutetoxin that can be + made with 2 parts uranium, 1 part water and 1 part carbon and makes people mute + temporarily' + - !!python/unicode 'rscdel': !!python/unicode 'Parapens were renamed to sleepy pens + and now contain 30 units of mutetoxin and 30 units of sleeptoxin instead of + zombie powder.' + - !!python/unicode 'rscdel': !!python/unicode 'C4 can no longer be attached to mobs' + - !!python/unicode 'tweak': !!python/unicode 'Reduced the C4 price to 1 telecrystal' +2014-08-11: + !!python/unicode 'Ikarrus': + - !!python/unicode 'tweak': !!python/unicode "Boxstation map updates:
    \n\ + \t\t-Singularity engine walled from from outer space
    \n\t\t-Shutters for\ + \ exterior Science windows
    \n\t\t-Teleporter board moved from RD's Office\ + \ to Tech Storage now that the teleporter can be built again.
    \n\t\t-Security\ + \ Deputy Armbands (red) added in HoS's Office



    " +2014-08-15: + !!python/unicode 'AndroidSFV': + - !!python/unicode 'rscadd': !!python/unicode 'AI photography has been extended + to Cyborgs. While connected to an AI, all images taken by cyborgs will be placed + in the AI''s album, and viewable by the AI and all linked Cyborgs.' + - !!python/unicode 'rscadd': !!python/unicode 'When a Cyborgs AI link wire is pulsed, + the images from the Cyborgs image album will be synced with the AI it gets linked + to.' + - !!python/unicode 'rscadd': !!python/unicode "Additonally, Cyborgs are able to\ + \ attach images to newscaster feeds from whichever album is active for them.\ + \ Cyborgs are also mobile, inefficent, printers of same images.\n\t" +2014-08-18: + !!python/unicode 'Iamgoofball': + - !!python/unicode 'rscadd': !!python/unicode "25 new hairstyles have been added.\n\ + \t" +2014-08-19: + !!python/unicode 'Ikarrus': + - !!python/unicode 'rscadd': !!python/unicode 'Brig cells and labour shuttle have + both been modified to send a message to all security HUDs whenever a prisoner + is automatically released.' + - !!python/unicode 'rscadd': !!python/unicode 'The labour camp has been outfitted + with a points checking console to allow prisoners to check their quota progress + easier and better explain the punishment system of forced labour.' +2014-08-20: + !!python/unicode 'Cheridan': + - !!python/unicode 'rscadd': !!python/unicode 'Three new shotgun shells added. Create + them by first researching and printing an unloaded tech shell in R&D.; Afterwards, + use table-crafting with the appropriate components with a screwdriver in-hand.' + - !!python/unicode 'rscadd': !!python/unicode 'Meteorshot: tech shell + compressed + matter cartridge + micro(or better) manipulator.' + - !!python/unicode 'rscadd': !!python/unicode 'Pulse Slug: tech shell + advanced + capacitor + ultra micro-laser.' + - !!python/unicode 'rscadd': !!python/unicode 'Dragonsbreath: tech shell + 5 phosphorus + (in container).' + - !!python/unicode 'tweak': !!python/unicode 'Incendiary rounds now leave a blazing + trail as they pass. This includes existing incendiary rounds, new dragonsbreath + rounds, and the Dark Gygax''s carbine.' +2014-08-21: + !!python/unicode 'Ikarrus': + - !!python/unicode 'tweak': !!python/unicode 'The Phase Shift ability will no longer + instantly gib players. Instead, they will be knocked out for a few seconds. + Mechas will be damaged.' + - !!python/unicode 'tweak': !!python/unicode 'The Phase Slayer ability will no longer + instantly gib players. Instead, they will be dealt 190 brute damage. Mechas + will be dealt 380 damage.' + - !!python/unicode 'tweak': !!python/unicode 'ADMIN: Most Event buttons have been + moved out of the secrets menu and into a Fun verb.' +2014-08-24: + !!python/unicode 'Ikarrus': + - !!python/unicode 'rscadd': !!python/unicode 'Ore redemption machine can now smelt + plasteel.' + - !!python/unicode 'tweak': !!python/unicode 'Mulebot speed has been vastly increased + by up to 300%.' + - !!python/unicode 'bugfix': !!python/unicode 'Removed exploit where false walls + can be used to cheese the AI chamber''s defenses' +2014-08-26: + !!python/unicode 'Ikarrus': + - !!python/unicode 'rscadd': !!python/unicode "Security forces are advised to increase\ + \ scrutiny on personnel coming into contact with AI systems. Central Intelligence\ + \ suggests that Syndicate terrorist groups may have begun targeting our AIs\ + \ for destruction.\n\t\t
  • For the preservation of corporate\ + \ assets, Central Command would like to remind all personnel that evacuating\ + \ during an emergency is mandatory. We suspect that terrorist groups may be\ + \ attempting to abduct marooned personnel who failed to evacuate.\n\t\t
  • R&D; teams have released an urgent update to station teleporters.\ + \ To eliminate the risk of mutation, personnel are advised to calibrate teleporters\ + \ before attempting each use.\n\t\t
  • Centcom has approved\ + \ the Captain's request to rig the display case in his office with a burglar\ + \ alarm. Any attempts to breach the case will now trigger a lockdown of the\ + \ room.\n\t\t
  • **Crew Monitoring Consoles now scan their\ + \ own Z-level for suit sensors, instead of only scanning Z1.\n\t\t
  • **Server operators can now set a name for the station in config.txt.\ + \ Simply add the line \"STATIONNAME Space Station 13\" anywhere on the text\ + \ file. Replace Space Station 13 with your station name of choice.
  • \n" +2014-08-30: + !!python/unicode 'Ikarrus': + - !!python/unicode 'rscadd': !!python/unicode "Space Station 13 has been authorized\ + \ to requisition additional Tank Transfer Valves from Centcom's supply lines\ + \ for the price of 60 cargo points.\n\t" +2014-08-31: + !!python/unicode 'Tokiko1': + - !!python/unicode 'rscadd': !!python/unicode "Adds two new hairstyles.\n\t" +2014-09-01: + !!python/unicode 'ChuckTheSheep': + - !!python/unicode 'rscadd': !!python/unicode "Adds preference toggle for intent\ + \ selection mode.\n\t\t
  • Direct selection mode switches intent\ + \ to the one you click on instead of cycling them.\n\t
  • " + !!python/unicode 'Ikarrus': + - !!python/unicode 'rscadd': !!python/unicode "New more detailed End-Round report.\n\ + \t\t
  • Removes count of readied players from the lobby.\n\t\ +
  • " + !!python/unicode 'Jordie0608': + - !!python/unicode 'rscadd': !!python/unicode "Virology has been made the right\ + \ color.\n\t" + !!python/unicode 'Miauw': + - !!python/unicode 'wip': !!python/unicode "A major rework of saycode has been completed\ + \ which fixes numerous issues and improves functionality.\n\t\t
  • Please report any issues you notice with any form of messaging to Github.\n\ + \t
  • " +2014-09-03: + !!python/unicode 'Ikarrus': + - !!python/unicode 'tweak': !!python/unicode "Cost of Syndicate bombs increased\ + \ to 6 telecrystals.\n\t" + !!python/unicode 'JStheguy': + - !!python/unicode 'rscadd': !!python/unicode "Many new posters have been added.\n\ + \t" +2014-09-04: + !!python/unicode 'KyrahAbattoir': + - !!python/unicode 'rscadd': !!python/unicode "All the objects found in BoxStation\ + \ maintenance are now randomized at round start.\n\t" +2014-09-06: + !!python/unicode 'Ikarrus': + - !!python/unicode 'rscadd': !!python/unicode "Tampered supply ordering consoles\ + \ can now order dangerous devices directly from the Syndicate for 140 points.\n\ + \t\t
  • Securitrons line units will no longer arrest individuals\ + \ without IDs if their faces can still be read. \n\t\t
  • Enemy\ + \ Agent ID cards have been reported to be able to interfere with the new securitron\ + \ threat assessment protocols.\n\t\t
  • The Syndicate base has\ + \ been modified to only allow the leading operative to launch the mission.\n\ + \t
  • " +2014-09-07: + !!python/unicode 'Gun Hog': + - !!python/unicode 'rscadd': !!python/unicode 'Nanotrasen scientists have released + a Heads-Up-Display (HUD) upgrade for all AI and Cyborg units! Cyborgs have had + Medical sensors and a Security datacore integrated into their core hardware, + replacing the need for a specific module.' + - !!python/unicode 'rscadd': !!python/unicode 'AI units are now able to have suit + sensor or crew manifest data displayed to them as a visual overlay. When viewing + a crewmember with suit sensors set to health monitoring, the health status will + be available on the AI''s medical HUD. In Security mode, the role as printed + on the crewmember''s ID card will be displayed to the AI.' + - !!python/unicode 'rscadd': !!python/unicode 'Any entity with a Security or Medical + HUD active will recieve appropriate messages on that HUD.' + !!python/unicode 'Ikarrus': + - !!python/unicode 'rscadd': !!python/unicode "Server Operators: A new config option\ + \ added to restrict command and security roles to humans only. Simply add/uncomment\ + \ the line ENFORCE_HUMAN_AUTHORITY in game_options.txt.\n\t\t
  • Players: To check if this config option is enabled on your server, type show-server-revision\ + \ into the game's command line.\n\t
  • " diff --git a/html/changelogs/Ikarrus.yml b/html/changelogs/Ikarrus.yml new file mode 100644 index 00000000000..84834636dc0 --- /dev/null +++ b/html/changelogs/Ikarrus.yml @@ -0,0 +1,7 @@ +author: Ikarrus + +#delete-after: True + +changes: + - wip: Adds Gang War, a new game mode still in alpha development. + - experiment: Developer Note: Gang mode is still in development and is not ready to be played reguarly in secret rotations. Server operators are asked to keep Gang mode's probability at 0, and only run it only as a playtest. \ No newline at end of file diff --git a/html/changelogs/Jordie0608-PR-4849.yml b/html/changelogs/Jordie0608-PR-4849.yml new file mode 100644 index 00000000000..b8728c0aab9 --- /dev/null +++ b/html/changelogs/Jordie0608-PR-4849.yml @@ -0,0 +1,6 @@ +author: Jordie0608 + +delete-after: True + +changes: + - tweak: Replaced all AI turrets with porta-turrets that work on LoS instead of area and can be individually configured \ No newline at end of file diff --git a/html/changelogs/RemieRichards-PR-4809.yml b/html/changelogs/RemieRichards-PR-4809.yml new file mode 100644 index 00000000000..58e57a38193 --- /dev/null +++ b/html/changelogs/RemieRichards-PR-4809.yml @@ -0,0 +1,6 @@ +author: RemieRichards, JJRcop + +delete-after: True + +changes: + - rscadd: New research in the area of robotics has been published on Maintenance Drones, little robots capable of repairing and improving the station. Unfortunately, all of the research was lost in a catastrophic server fire, but we know they can be made, so it's up to you to re-discover them! Make us proud! \ No newline at end of file diff --git a/html/changelogs/example.yml b/html/changelogs/example.yml new file mode 100644 index 00000000000..623ed962800 --- /dev/null +++ b/html/changelogs/example.yml @@ -0,0 +1,36 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscdel (general adding of nice things) +# rscadd (general deleting of nice things) +# imageadd +# imagedel +# spellcheck (typo fixes) +# experiment +# tgs (TG-ported fixes?) +################################# + +# Your name. +author: N3X15 + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +#delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +changes: + - rscadd: Added a changelog editing system that should cause fewer conflicts and more accurate timestamps. + - rscdel: Killed innocent kittens. diff --git a/html/templates/footer.html b/html/templates/footer.html new file mode 100644 index 00000000000..b5533610ac4 --- /dev/null +++ b/html/templates/footer.html @@ -0,0 +1,12 @@ + +GoonStation 13 Development Team +
    + Coders: Stuntwaffle, Showtime, Pantaloons, Nannek, Keelin, Exadv1, hobnob, Justicefries, 0staf, sniperchance, AngriestIBM, BrianOBlivion
    + Spriters: Supernorn, Haruhi, Stuntwaffle, Pantaloons, Rho, SynthOrange, I Said No
    +
    +
    +

    Creative Commons License
    Except where otherwise noted, Goon Station 13 is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 License.
    Rights are currently extended to SomethingAwful Goons only.

    +

    Some icons by Yusuke Kamiyamane. All rights reserved. Licensed under a Creative Commons Attribution 3.0 License.

    + + + diff --git a/html/templates/header.html b/html/templates/header.html new file mode 100644 index 00000000000..68c713ec038 --- /dev/null +++ b/html/templates/header.html @@ -0,0 +1,56 @@ + + + + /tg/ Station 13 Changelog + + + + + + + +
    + + + + +
    +
    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)